Re.从零开始使用Python构建本地大模型网页智慧聊天机器人
项目介绍利用StreamlitOllama以及Python从零开始构建简单的聊天机器人来巩固所学知识同时建立大模型学习兴趣项目演示项目技术架构后端模型利用 Ollama 平台的 Qwen 模型该模型具备出色的自然语言处理能力能够理解和生成自然语言文本为聊天机器人提供核心的对话处理功能。前端界面采用 Streamlit 框架搭建用户界面Streamlit 是一个简单易用的 Python 库能够快速创建美观、交互式的 Web 应用使用户能够通过网页与聊天机器人进行实时对话。对话交互用户可以通过 Streamlit 界面输入文本聊天机器人基于 Qwen 模型对输入内容进行理解和处理生成相应的回复并展示在界面上实现流畅的对话交互。模型调用后端服务负责将用户输入传递给 Qwen 模型并获取模型生成的回复然后将回复内容返回给前端界面进行展示确保对话的实时性和准确性。界面展示Streamlit 界面提供简洁明了的布局包括输入框、发送按钮和对话展示区域用户可以方便地输入问题并查看机器人的回答提升用户体验。项目开发环境操作系统支持主流操作系统如 Windows、macOS 和 Linux。依赖软件需要安装 Python 环境以及 Ollama 平台和 Streamlit 库。硬件要求推荐配置较高的处理器和足够的内存以确保模型的高效运行和良好的用户体验。项目准备本地需要先安装下依赖包.pip install ollamapip install langchain -i https://pypi.tuna.tsinghua.edu.cn/simplepip install langchain-community -i https://pypi.tuna.tsinghua.edu.cn/simplepip install langchain-classicpip install dashscope -i https://pypi.tuna.tsinghua.edu.cn/simplepip install streamlit1.32.0方式管理员打开Anaconda Promopt输入命令进行下载Streamlit简单介绍和使用Streamlit官方介绍能在几分钟内把Python脚本变成可分享的网站。只需使用纯Python无需前端经验。甚至你只需要懂markdown然后按照一定规则去做也能搞个网页出来。它还支持免费部署感动到落泪。官方网站https://streamlit.io/Streamlit安装首先你的电脑需要有python环境。有python环境后使用下面这条命令就可以安装streamlit。pip install streamlit1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple安装streamlit成功后可以使用下面这条命令看看能不能运行起来。streamlit hello基础语法标题使用st.title()可以设置标题内容。st.title(Streamlit教程)段落write段落就是HTML里的p元素在streamlit里使用st.write(内容)的方式去书写。import streamlit as st st.write(Hello)使用markdownstreamlit是支持使用markdown语法来写页面内容的只需使用单引号或者双引号的方式将内容包起来并且使用markdown的语法进行书写页面就会出现对应样式的内容。import streamlit as st # 1级标题 ## 2级标题 ### 3级标题 #### 4级标题 ##### 5级标题 ###### 6级标题图片渲染图片可以使用st.image()方法也可以使用markdown的语法。st.image(图片地址, [图片宽度])其中图片宽度不是必填项。import streamlit as st st.image(./avatar.jpg, width400)表格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)分割线分隔线就是HTML里的hr。在streamlit里使用st.divider()方法绘制分隔线。import streamlit as st st.divider()输入框知道怎么声明变量后可以使用一个变量接收输入框的内容。输入框又可以设置不同的类型比如普通的文本输入框、密码输入框。普通输入框输入框使用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)开始构建使用本地模型构建ollama本地模型下载安装部署见新建项目Pycharm新建项目chatbots使用安装了库的conda环境新建文件chat_utils.py以及chat_main.py构建chat_utils代码及注释# 自定义模块, 完成: 智聊机器人的 后端功能实现, 即: 接收前端Streamlit网页传过来的信息, 通过ollama调用底层大模型获取回复, 并返回. 构建一个基于大模型的本地智能聊天机器人利用其强大的自然语言处理和生成能力为用户提供高效、精准、个性化的对话服务。 该聊天机器人将集成先进的大规模预训练语言模型如GPT、Qwen等具备自然语言理解、多轮对话、情感分析、知识问答等核心功能 并可根据具体应用场景进行定制化扩展例如客服咨询、教育辅导、娱乐互动等。 项目采用模块化设计前端通过Streamlit等框架实现简洁易用的交互界面后端基于Ollama等平台进行模型部署和管理确保系统的高效性和可扩展性。 # 导包 import ollama # todo 1.定义函数, 接收提示词(prompt), 调用模型, 获取回复(response) # def get_response(prompt): # # 该函数功能: 接收提示词(prompt, 即: 用户提问的信息), 调用模型, 返回回复(response)信息 # :param prompt: 提示词(prompt) - 用户提问的问题 # :return: 回复(response) - 模型返回的答案 # # # 1. 调用大模型, 获取响应信息. # response ollama.chat(modelqwen2:1.5b, messages[{role: user, content: prompt}]) # messages prompt[-20:] # # # 2. 解析响应信息, 获取模型生成的答案, 并返回. # return response[message][content] # todo 2. 优化上述的函数, 因为Streamlit前端传过来的数据格式是: [{role:user, content:内容}, {role:assistant, content:内容}...] def get_response(prompt): 该函数功能: 接收提示词(prompt, 即: 用户提问的信息), 调用模型, 返回回复(response)信息 :param prompt: 提示词(prompt) - 用户提问的问题 :return: 回复(response) - 模型返回的答案 # 1. 调用大模型, 获取响应信息. if isinstance(prompt, str): messages [{role: user, content: prompt}] else: # 如果是消息列表只保留最近20条记录 messages prompt[-20:] response ollama.chat(modelqwen2:1.5b, messagesmessages) # 只关注最新的20条记录 # response ollama.chat(modelqwen2:1.5b, messagesprompt[-20:]) # 只关注最新的20条记录 # response ollama.chat(modeldeepseek-r1:8b, messagesprompt[-20:]) # 只关注最新的20条记录 # 2. 解析响应信息, 获取模型生成的答案, 并返回. return response[message][content] # todo 3. 测试上述的内容. if __name__ __main__: # 1. 定义用户的问题. prompt 你好你可以执行回答哪些问题? # 2. 调用上述的函数, 获取模型回复结果. response get_response(prompt) # 3. 打印结果 print(response)测试代码是否可以执行构建chat_main完整代码# 自定义模块, 完成: 智聊机器人的 前端功能实现, 即: 接收用户录入的问题, 调用接口, 获取答案, 输出答案 # 导包 import streamlit as st from chat_utils import get_response from langchain_classic.memory import ConversationBufferMemory # 1. 创建标题 st.title(基于Streamlit和Qwen2的智聊机器人) # 2. 判断会话管理对象中 是否有 messages信息, 如果没有, 说明是第一次玩儿, 就加入: 欢迎词. if memory not in st.session_state: # ConversationBufferMemory对象: 会话历史管理对象, 可以在前端显示所有的对话(聊天记录) st.session_state[memory] ConversationBufferMemory() # 添加欢迎词 st.session_state.messages [ {role: assistant, content: 你好, 我是卷心菜狗, 有什么可以帮助你的吗?♥️}, ] # 3. 遍历会话历史, 打印所有的会话信息. for message in st.session_state.messages: # message: 就是具体的每条会话信息, 格式为: {role:user, content:你认识周杰伦吗?} 或者 {role:assistant, content: 行, 都好哥们儿!} # 3.1 根据角色创建会话信息. with st.chat_message(message[role]): # 3.2 输出会话信息 st.write(message[content]) # 4. 提示用户录入他/她的问题, 并接收. prompt st.chat_input(请输入你的问题: ) # 5. 判断用户是否录入了问题, 如果不为空, 程序继续往下执行. if prompt: # 6. 把用户录入的问题, 添加到会话历史中. st.session_state.messages.append({role:user, content:prompt}) # 7. 显示用户录入的问题. st.chat_message(user).write(prompt) # 8. (可选)加入AI等待提示. with st.spinner(AI正在思考中...): # 9. 把(历史对话信息)传给大模型, 获取模型的回复信息. content get_response(st.session_state.messages) # 10. 把模型的回复信息添加到会话历史中, 并显示到前端. st.session_state.messages.append({role:assistant, content:content}) st.chat_message(assistant).write(content)测试功能新建命令框输入命令streamlit run .\chat_main.py项目成功运行快来自己玩一下吧