一.智聊机器人介绍1.项目介绍随着人工智能技术的飞速发展聊天机器人在多个领域得到了广泛应用如客户服务、教育辅导、娱乐互动等。然而现有的许多聊天机器人依赖于云端服务这不仅可能导致用户数据隐私泄露还可能因网络延迟影响用户体验。因此开发一款本地部署的聊天机器人显得尤为重要。本地聊天机器人能够在用户本地环境中运行确保数据的安全性和对话的实时性同时也能根据用户的个性化需求进行定制和优化。2.项目技术架构后端模型利用Ollama 平台的 Qwen 模型该模型具备出色的自然语言处理能力能够理解和生成自然语言文本为聊天机器人提供核心的对话处理功能。前端界面采用Streamlit 框架搭建用户界面Streamlit 是一个简单易用的 Python 库能够快速创建美观、交互式的 Web 应用使用户能够通过网页与聊天机器人进行实时对话。对话交互用户可以通过 Streamlit 界面输入文本聊天机器人基于 Qwen 模型对输入内容进行理解和处理生成相应的回复并展示在界面上实现流畅的对话交互。模型调用后端服务负责将用户输入传递给 Qwen 模型并获取模型生成的回复然后将回复内容返回给前端界面进行展示确保对话的实时性和准确性。界面展示Streamlit 界面提供简洁明了的布局包括输入框、发送按钮和对话展示区域用户可以方便地输入问题并查看机器人的回答提升用户体验。3.项目开发环境操作系统支持主流操作系统如 Windows、macOS 和 Linux。依赖软件需要安装 Python 环境以及 Ollama 平台和 Streamlit 库。硬件要求推荐配置较高的处理器和足够的内存以确保模型的高效运行和良好的用户体验。二.Ollama模块实现1.安装依赖包pip install ollamapip 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/simplepip install streamlit1.32.02.Qwen模型PythonAPI实现文本扩写import ollama response ollama.chat(modelqwen2: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(modelqwen2: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(modelqwen2: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 streamlit1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple安装streamlit成功后可以使用下面这条命令看看能不能运行起来。streamlit hello3.基础语法(1).标题使用st.title()可以设置标题内容。st.title(Streamlit教程)(2).段落write段落就是HTML里的p元素在streamlit里使用st.write(内容)的方式去书写。import streamlit as st st.write(Hello)(3).使用markdownstreamlit是支持使用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, width400)(5).表格streamlit有静态表格和可交互表格。表格在数据分析里属于常用组件所以streamlit的表格也支持pandas的DataFrame。静态表格 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()加多个类型typepassword。import streamlit as st pwd st.text_input(密码是多少, typepassword)数字输入框 number_input数字输入框需要使用number_inputimport streamlit as st age st.number_input(年龄) st.write(f你输入的年龄是{age}岁)众所周知正常表达年龄是不带小数位的所以可以设置st.number_input()的步长为1参数名叫step。# 省略部分代码 st.number_input(年龄, step1)这个步长可以根据需求来设置设置完后输入框右侧的加减号每点击一次就根据设置的步长相应的增加或者减少。还有一点人年龄不可能是负数通常也不会大于200。可以通过min_value和max_value设置最小值和最大值。同时还可以通过value设置默认值。st.number_input(年龄, value20, min_value0, max_value200, step1)多行文本框 text_area创建多行文本框使用的是st.text_area()用法和st.text_input()差不多。import streamlit as st paragraph st.text_area(多行内容)Chat ElementsChat文本输入框import streamlit as st prompt st.chat_input(Say something) if prompt: st.write(fUser 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, width200) # 宽高比 案例: 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(fname: {name}) # 密码输入框. pwd st.text_input(请录入您的密码: , typepassword) if pwd: print(fpwd: {pwd}) # 数字输入框, 参1: 标题; 参2: 最小值; 参3: 最大值; 参4: 默认值; 参5: 步长. age st.number_input(请录入您的年龄: , min_value0, max_value100, value18, step1) # 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(modelqwen2:0.5b, messages[{role: user, content: prompt}]) # # 2.2 返回模型处理后的结果(即: 聊天机器人的回答) # return response.message.content # 因为前端传过来的问题, 是 列表 字典的形式, 即: 已经符合Ollama API的格式了, 我们无需做处理, 直接用. def get_response(prompt): # 发起请求, 获取响应信息 response ollama.chat(modelqwen2:1.5b, messagesprompt[-20:]) # prompt[-20:] 只显示后20条 # response ollama.chat(modeldeepseek-r1:1.5b, messagesprompt[-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