【聊天机器人项目】7.结合Ollama,Streamlit实现聊天机器人

【聊天机器人项目】7.结合Ollama,Streamlit实现聊天机器人

一.智聊机器人介绍

1.项目介绍

随着人工智能技术的飞速发展,聊天机器人在多个领域得到了广泛应用,如客户服务、教育辅导、娱乐互动等。然而,现有的许多聊天机器人依赖于云端服务,这不仅可能导致用户数据隐私泄露,还可能因网络延迟影响用户体验。因此,开发一款本地部署的聊天机器人显得尤为重要。本地聊天机器人能够在用户本地环境中运行,确保数据的安全性和对话的实时性,同时也能根据用户的个性化需求进行定制和优化。

2.项目技术架构

  • 后端模型:利用Ollama 平台的 Qwen 模型,该模型具备出色的自然语言处理能力,能够理解和生成自然语言文本,为聊天机器人提供核心的对话处理功能。

  • 前端界面:采用Streamlit 框架搭建用户界面,Streamlit 是一个简单易用的 Python 库,能够快速创建美观、交互式的 Web 应用,使用户能够通过网页与聊天机器人进行实时对话。

  • 对话交互:用户可以通过 Streamlit 界面输入文本,聊天机器人基于 Qwen 模型对输入内容进行理解和处理,生成相应的回复并展示在界面上,实现流畅的对话交互。

  • 模型调用:后端服务负责将用户输入传递给 Qwen 模型,并获取模型生成的回复,然后将回复内容返回给前端界面进行展示,确保对话的实时性和准确性。

  • 界面展示:Streamlit 界面提供简洁明了的布局,包括输入框、发送按钮和对话展示区域,用户可以方便地输入问题并查看机器人的回答,提升用户体验。

3.项目开发环境

  • 操作系统:支持主流操作系统,如 Windows、macOS 和 Linux。

  • 依赖软件:需要安装 Python 环境以及 Ollama 平台和 Streamlit 库。

  • 硬件要求:推荐配置较高的处理器和足够的内存,以确保模型的高效运行和良好的用户体验。

二.Ollama模块实现

1.安装依赖包

pip install ollama

pip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simple pip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simple pip install dashscope -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install streamlit==1.32.0

2.Qwen模型PythonAPI实现文本扩写

import ollama response = ollama.chat(model='qwen2:0.5b',messages=[{'role': 'user', 'content': '白日依山尽,黄河入海流, 补充完整该诗句', },]) print(response.message.content) print(response['message']['content'])

2.Qwen模型PythonAPI实现文本问答

需求:构建一个简单的命令行交互程序,用户可以通过输入问题与AI模型进行对话。该程序将使用qwen2:0.5b语言模型。用户可以通过命令行输入问题,程序将调用AI模型生成回答,并将结果输出到终端

import ollama # 定义一个循环 while True: # 获取prompt提示词 prompt = input("请输入您的问题:") response = ollama.chat(model='qwen2:0.5b', messages=[{'role': 'user', 'content': prompt}]) # 调用模型,回答问题 result = response['message']['content'] # 打印回答 print(result)

3.Qwen模型PythonAPI实现编程代码

需求:构建一个基于AI模型的代码生成工具,用户可以通过输入自然语言描述所需功能,AI模型将自动生成相应的Python代码。该工具旨在帮助开发者快速获取代码片段,减少手动编写代码的时间。

# 获取prompt提示词 prompt = """ 请为以下功能生成一段Python代码: 求两个数的最大公约数 """ response = ollama.chat(model='qwen2:0.5b', messages=[{'role': 'user', 'content': prompt}, ]) # 调用模型,回答问题 result = response['message']['content'] # 打印回答 print(result)

三.Streamlit框架

1.介绍

Streamlit官方介绍:

能在几分钟内把Python脚本变成可分享的网站。只需使用纯Python,无需前端经验。甚至,你只需要懂markdown,然后按照一定规则去做也能搞个网页出来。它还支持免费部署

官方网站:https://streamlit.io/

2.Streamlit安装

首先电脑需要有python环境

python环境后,使用下面这条命令就可以安装streamlit

pip install streamlit==1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装streamlit成功后可以使用下面这条命令看看能不能运行起来。

streamlit hello

3.基础语法

(1).标题

使用st.title()可以设置标题内容。

st.title('Streamlit教程')

(2).段落write

段落就是HTML里的<p>元素,在streamlit里使用st.write('内容')的方式去书写。

import streamlit as st ​ st.write('Hello')

(3).使用markdown

streamlit是支持使用markdown语法来写页面内容的,只需使用单引号或者双引号的方式将内容包起来,并且使用markdown的语法进行书写,页面就会出现对应样式的内容。

import streamlit as st ​ "# 1级标题" "## 2级标题" "### 3级标题" "#### 4级标题" "##### 5级标题" "###### 6级标题"

(4).图片

渲染图片可以使用st.image()方法,也可以使用markdown的语法。

st.image(图片地址, [图片宽度]),其中图片宽度不是必填项。

import streamlit as st ​ st.image('./avatar.jpg', width=400)

(5).表格

streamlit有静态表格和可交互表格。表格在数据分析里属于常用组件,所以streamlit的表格也支持pandasDataFrame

静态表格 table

静态表格使用st.table()渲染,出来的效果就是HTML<table>

st.table()支持传入字典、pandas.DataFrame等数据。

import streamlit as st import pandas as pd ​ st.write('dict字典形式的静态表格') st.table(data={ 'name': ['张三', '李四', '王五'], 'age': [18, 20, 22], 'gender': ['男', '女', '男'] }) ​ st.write('pandas中dataframe形式的静态表格') ​ df = pd.DataFrame( { 'name': ['张三', '李四', '王五'], 'age': [18, 20, 22], 'gender': ['男', '女', '男'] } ) st.table(df)
可交互表格 dataframe

可交互表格使用st.dataframe()方法创建,和st.table()不同,st.dataframe()创建出来的表格支持按列排序、搜索、导出等功能。

import streamlit as st import pandas as pd ​ st.write('dict字典形式的可交互表格') st.dataframe(data={ 'name': ['张三', '李四', '王五'], 'age': [18, 20, 22], 'gender': ['男', '女', '男'] }) ​ st.write('pandas中dataframe形式的可交互表格') df = pd.DataFrame( { 'name': ['张三', '李四', '王五'], 'age': [18, 20, 22], 'gender': ['男', '女', '男'] } ) st.dataframe(df)

(6).分割线

分隔线就是HTML里的<hr>。在streamlit里使用st.divider()方法绘制分隔线。

import streamlit as st ​ st.divider()

(7).输入框

知道怎么声明变量后,可以使用一个变量接收输入框的内容。

输入框又可以设置不同的类型,比如普通的文本输入框、密码输入框。

  • 普通输入框

输入框使用st.text_input()渲染。

name = st.text_input('请输入你的名字:') ​ if name: st.write(f'你好,{name}')
密码

如果要使用密码框,可以给st.text_input()加多个类型type="password"

import streamlit as st ​ pwd = st.text_input('密码是多少?', type='password')
数字输入框 number_input

数字输入框需要使用number_input

import streamlit as st ​ age = st.number_input('年龄:') ​ st.write(f'你输入的年龄是{age}岁')

众所周知,正常表达年龄是不带小数位的,所以可以设置st.number_input()的步长为1,参数名叫step

# 省略部分代码 ​ st.number_input('年龄:', step=1)

这个步长可以根据需求来设置,设置完后,输入框右侧的加减号每点击一次就根据设置的步长相应的增加或者减少。

还有一点,人年龄不可能是负数,通常也不会大于200。可以通过min_valuemax_value设置最小值和最大值。同时还可以通过value设置默认值。

st.number_input('年龄:', value=20, min_value=0, max_value=200, step=1)
多行文本框 text_area

创建多行文本框使用的是st.text_area(),用法和st.text_input()差不多。

import streamlit as st ​ paragraph = st.text_area("多行内容:")
Chat Elements
  • Chat文本输入框
    import streamlit as st ​ prompt = st.chat_input("Say something") if prompt: st.write(f"User has sent the following prompt: {prompt}")
  • Chat Message
# 导入 Streamlit 库,Streamlit 是一个用于快速创建数据应用的 Python 库 import streamlit as st ​ # 使用 st.chat_input 创建一个聊天输入框,提示用户输入问题 prompt = st.chat_input('请输入您的问题: ') ​ st.write(f'您的问题是: {prompt}') ​ # 使用 st.chat_message 创建一个用户消息容器,用于显示用户的消息 # 'user' 表示这是用户发送的消息 with st.chat_message('user'): # 在用户消息容器中显示文本 'Hello ' st.write('Hello ') ​ # 使用 st.chat_message 创建一个消息容器,用于显示回复消息 message = st.chat_message('assistant') # 在消息容器中显示文本 'Hello Human',模拟助手的回复 message.write('Hello Human')

4.相关代码

""" 案例: 演示Streamlit的语法. Streamlit简介: 概述: 它是Python的1个库(模块), 可以实现用 Python代码开发网页, 且支持免费部署. 部署格式: 在终端中运行 streamlit run 你的模块名.py 即可 """ # 导包 import streamlit as st # 1.标题 st.title('Streamlit 标题演示') # 2.段落. st.write('白日依山尽') st.write('黄河入海流') # 3.标题标题. '# 1级标题' '## 2级标题' '### 3级标题' '#### 4级标题' '##### 5级标题' '###### 6级标题' st.write('# 1级标题') st.write('## 2级标题') st.write('### 3级标题') st.write('#### 4级标题') st.write('##### 5级标题') # 4.分割线. st.divider() # 5.演示markdown()函数, 作用类似于write(), 只不过可以使用markdown语法, 比write更精细. st.markdown('# 1级标题') st.markdown('## 2级标题') st.markdown('### 3级标题') st.markdown('#### 4级标题') st.markdown('##### 5级标题') st.markdown('###### 6级标题') # 6. 图片标签. st.image('./a.jpg', width=200) # 宽高比
""" 案例: streamlit 输入框相关. 使用步骤: 1. 导包. import streamlit as st 2. 通过 模块名.功能名() 的方式调用. st.title(...) """ import streamlit as st import pandas as pd # 1. 静态表格. 支持 字典+列表的方式, 且还支持 DataFrame数据形式. st.markdown('静态表格之 **字典 + 列表**') st.table({ 'name': ['乔峰', '虚竹', '段誉'], 'age': [38, 28, 18], 'gender': ['男', '男', '男'] }) # 扩展: 了解, 把上述的 字典 + 列表 封装成 df对象(DataFrame对象), 绘制 静态表格. st.markdown('静态表格之 **DataFrame对象**') df = pd.DataFrame({ 'name': ['乔峰', '虚竹', '段誉'], 'age': [38, 28, 18], 'gender': ['男', '男', '男'] }) st.table(df) st.divider() # 分割线 # 2. 可交互表格. # 2.1 支持 字典+列表的方式, 且还支持 DataFrame数据形式. st.markdown('可交互表格之 **字典 + 列表**') st.dataframe({ 'name': ['乔峰', '虚竹', '段誉'], 'age': [38, 28, 18], 'gender': ['男', '男', '男'] }) # 2.2 扩展: 了解, 把上述的 字典 + 列表 封装成 df对象(DataFrame对象), 绘制 可交互表格. st.markdown('可交互表格之 **DataFrame对象**') df = pd.DataFrame({ 'name': ['乔峰', '虚竹', '段誉'], 'age': [38, 28, 18], 'gender': ['男', '男', '男'] }) st.dataframe(df) st.divider() # 分割线 # 3. 文本框. # 普通输入框. name = st.text_input('请录入您的姓名: ') if name: # name如果为空则结果是: False, 否则是True print(f'name: {name}') # 密码输入框. pwd = st.text_input('请录入您的密码: ', type='password') if pwd: print(f'pwd: {pwd}') # 数字输入框, 参1: 标题; 参2: 最小值; 参3: 最大值; 参4: 默认值; 参5: 步长. age = st.number_input('请录入您的年龄: ', min_value=0, max_value=100, value=18, step=1) # 4. 多行文本. msg = st.text_area('请输入您的留言: ') # 5. 聊天信息框. prompt = st.chat_input('请输入你的问题') if prompt: st.write(f'你的问题是{prompt}') # 6. 角色信息框. chat_message() # 创建消息容器, 存储: 用户的信息. with st.chat_message('user'): st.write('Hello AI, 我是操作人员') # 创建消息容器, 存储: AI的信息. # with st.chat_message('assistant'): # st.write('Hello, 我是AI, 👋') # 作用如上, 除了写法不同, 其它都一样. msg = st.chat_message('assistant') msg.write('Hello, 我是AI, 👋')

Stream 展示

四.Ollama平台聊天机器人实现

1.需求

构建一个基于大模型的本地智能聊天机器人,利用其强大的自然语言处理和生成能力,为用户提供高效、精准、个性化的对话服务。该聊天机器人将集成先进的大规模预训练语言模型(如GPT、Qwen等),具备自然语言理解、多轮对话、情感分析、知识问答等核心功能,并可根据具体应用场景进行定制化扩展,例如客服咨询、教育辅导、娱乐互动等。

项目采用模块化设计,前端通过Streamlit等框架实现简洁易用的交互界面,后端基于Ollama等平台进行模型部署和管理,确保系统的高效性和可扩展性。项目目标是打造一个智能化、人性化的聊天机器人,提升用户体验,降低人工成本,并探索大模型技术在不同领域的创新应用。

2.模型调用

""" 该模块用于充当 聊天机器人的后端模块, 即: 接收前端(Streamlit)传过来的用户的问题, 交给大语言模型(Qwen, DeepSeek-r1等), 获取其相应结果, 并返回(给前端) """ # 1. 导包 import ollama # 2.定义函数, 给大语言模型发送请求, 并获取其处理结果(聊天机器人的回答) # def get_response(prompt): # # 2.1 发起请求, 获取响应信息 # response = ollama.chat(model='qwen2:0.5b', messages=[{'role': 'user', 'content': prompt}]) # # 2.2 返回模型处理后的结果(即: 聊天机器人的回答) # return response.message.content # 因为前端传过来的问题, 是 列表 + 字典的形式, 即: 已经符合Ollama API的格式了, 我们无需做处理, 直接用. def get_response(prompt): # 发起请求, 获取响应信息 response = ollama.chat(model='qwen2:1.5b', messages=prompt[-20:]) # prompt[-20:] 只显示后20条 # response = ollama.chat(model='deepseek-r1:1.5b', messages=prompt[-20:]) # 返回模型处理后的结果(即: 聊天机器人的回答) return response['message']['content'] if __name__ == '__main__': prompt = '今天是农历多少号?' response = get_response(prompt) print(response)

3.前端实现

""" 该模块用于充当 聊天机器人的前端模块, 即: 接收用户录入的问题, 调用 chat_utils模块的 get_response()函数, 获取模型处理结果. 并通过 streamlit 在前端页面展示即可. """ # 1. 导包 import streamlit as st # streamlit库: Python代码实现搭建前端页面 并 部署 from langchain.memory import ConversationBufferMemory # langchain库: 聊天机器人核心模块, ConversationBufferMemory: 聊天记录存储器(存储所有聊天信息的) from chat_utils import get_response # 自定义模块: 封装了模型处理函数, 获取模型处理结果 # 2. 标题. st.title('智聊机器人') # 3. 判断是否有 历史消息记录对象, 如果没有就创建, 并存储所有的消息记录. if 'memery' not in st.session_state: # session_state: 存储会话状态数据的字典, 用于存储会话数据. # 3.1 创建 ConversationBufferMemory 对象, 并存储到 session_state 中. st.session_state.memery = ConversationBufferMemory() st.session_state.messages = [{'role': 'assistant', 'content': '你好, 我是智聊机器人, 有什么可以帮助您的吗?👋'}] # 4.遍历 session_state.messages, 显示所有消息记录. for message in st.session_state.messages: # message的格式是: {'role':'assistant 或者 user', 'content': '内容'} # 4.1 通过 聊天消息容器, 用于显示 当前角色的内容. with st.chat_message(message['role']): # 4.2 显示当前角色的内容. st.markdown(message['content']) # 5. 接收用户录入的问题. prompt = st.chat_input('你的问题是:') # 6. 判断用户用户录入的问题不为空, 我们就继续向下执行. if prompt: # 7. 把用户的信息添加到 历史消息记录中, 并展示到前端页面. st.session_state.messages.append({'role': 'user', 'content': prompt}) st.chat_message('user').markdown(prompt) # 8. (细节: 加入延时等待提示组件) 调用自定义的 chat_util模块中的 get_response()函数, 获取模型的处理结果. with st.spinner('AI助理正在思考中...'): # 把请求的问题发送到get_response, 让ollama调用大模型分析 response = get_response(st.session_state.messages) # 9. 把模型的处理结果添加到 历史消息记录中, 并展示到前端页面. st.session_state.messages.append({'role': 'assistant', 'content': response}) st.chat_message('assistant').markdown(response)

【上一篇】【聊天机器人项目】6.python 相关知识讲解

【下一篇】【数据处理与统计分析】1.Python数据处理分析环境搭建&jupyter&配置PyCharm连接Anaconda