大模型入门实战:Ollama + Streamlit 快速搭建本地聊天机器人
·
大模型入门实战:Ollama + Streamlit 快速搭建本地聊天机器人
书接上文, 我开始接触大模型的学习,并会坚持写笔记记录,接下来要学习Python数据分析
前言
作为大模型入门的经典案例,本地聊天机器人的搭建能帮助快速理解「模型部署 + 前端交互」的完整流程。本文结合 Ollama(本地大模型运行框架)和 Streamlit(Python 快速网页框架),无需复杂前端开发,仅用 Python 代码就能实现可交互的聊天机器人,适合零基础入门大模型应用开发。
一、技术栈简介
1. Ollama
- 轻量级本地大模型管理工具,支持一键拉取、运行主流大模型(如 DeepSeek、Llama 3 等)。
- 提供简洁的 Python API,无需复杂配置即可调用本地模型进行对话交互。
- 默认服务地址:
http://localhost:11434,支持本地高效推理。
2. Streamlit
- 专为数据科学和机器学习打造的 Python 网页框架,无需前端知识(HTML/CSS/JS)。
- 核心优势:代码即界面,一行代码实现 UI 组件,自动实时刷新交互逻辑。
- 关键功能:聊天输入框、消息展示、加载状态提示、会话状态管理(持久化对话历史)。
二、环境准备
1. 安装 Ollama
- 官网下载对应系统版本:Ollama 官方文档
- 安装完成后,终端执行命令拉取模型(示例使用 DeepSeek-R1 7B 模型):
ollama pull deepseek-r1:7b - 启动 Ollama 服务(安装后默认自动启动,端口 11434)。
2. 安装 Python 依赖库
终端执行以下命令,安装 Streamlit 和 Ollama Python 客户端:
pip install streamlit ollama -i https://pypi.tuna.tsinghua.edu.cn/simple
三、完整代码实现
创建 chatbot.py 文件,复制以下代码(含详细注释):
# 导入核心库
import streamlit as st
import ollama
# 1. 初始化 Ollama 客户端(连接本地服务)
client = ollama.Client(host="http://localhost:11434")
# 2. 初始化 Streamlit 会话状态(持久化对话历史)
# 会话状态可在页面刷新/交互时保留数据,避免丢失对话记录
if 'message' not in st.session_state:
st.session_state['message'] = [] # 存储对话历史,格式:[{"role": "user/assistant", "content": "消息内容"}]
# 3. 构建网页 UI 界面
st.title("Ollama + Streamlit 本地聊天机器人") # 页面标题
st.divider() # 分割线,优化界面布局
# 4. 显示历史对话记录
for msg in st.session_state['message']:
st.chat_message(msg['role']).markdown(msg['content']) # 按角色展示消息(user/assistant)
# 5. 获取用户输入
prompt = st.chat_input("请输入你的问题...") # 聊天输入框
# 6. 处理用户输入并调用模型
if prompt:
# 记录用户消息到会话历史
st.session_state['message'].append({"role": "user", "content": prompt})
# 实时显示用户消息
st.chat_message("user").markdown(prompt)
# 模拟 AI 思考状态(加载提示)
with st.spinner("AI 思考中..."):
# 调用 Ollama 本地模型进行对话
response = client.chat(
model="deepseek-r1:7b", # 已拉取的本地模型名称
messages=st.session_state['message'] # 传入历史对话,支持多轮交互
)
# 提取 AI 回复内容
ai_response = response['message']['content']
# 记录 AI 消息到会话历史
st.session_state['message'].append({"role": "assistant", "content": ai_response})
# 显示 AI 回复
st.chat_message("assistant").markdown(ai_response)
四、运行与测试
1. 启动应用
终端进入代码所在目录,执行以下命令:
streamlit run chatbot.py
2. 交互测试
- 命令执行后,Streamlit 会自动打开浏览器(默认地址:
http://localhost:8501)。 - 在聊天输入框中输入问题(如「介绍一下自己」),即可看到 AI 回复,且对话历史会持续保留。
五、关键知识点解析
1. Ollama 核心 API 调用
ollama.Client(host="..."):初始化客户端,连接本地 Ollama 服务。client.chat(model, messages):核心对话方法,model为模型名称,messages为对话历史列表,支持多轮上下文。- 响应解析:
response['message']['content']提取 AI 回复内容。
2. Streamlit 会话状态(Session State)
- 用于在用户会话中持久化数据(如对话历史
message),避免页面刷新后数据丢失。 - 初始化方式:
if 'key' not in st.session_state: st.session_state['key'] = 默认值。
3. Streamlit 关键 UI 组件
st.title():设置页面标题。st.chat_input():创建聊天输入框,适合对话类应用。st.chat_message():消息容器,按角色(user/assistant)区分展示。st.spinner():加载状态提示,优化用户体验。
六、扩展与优化建议
1. 多模型支持
添加下拉框让用户选择不同本地模型(需提前拉取):
# 在初始化客户端后添加
model_options = ["deepseek-r1:7b", "llama3:8b", "mistral:7b"]
selected_model = st.sidebar.selectbox("选择模型", model_options)
# 调用时替换 model 参数为 selected_model
response = client.chat(model=selected_model, messages=st.session_state['message'])
2. 对话管理优化
- 添加「清空对话」按钮:
if st.sidebar.button("清空对话历史"): st.session_state['message'] = [] - 限制对话历史长度(避免内存占用过高):
# 当对话超过 10 轮时,删除最早的记录 if len(st.session_state['message']) > 20: # 10 轮(user+assistant 各算一条) st.session_state['message'].pop(0) st.session_state['message'].pop(0)
3. 错误处理
增加异常捕获,处理模型未启动、服务未连接等问题:
with st.spinner("AI 思考中..."):
try:
response = client.chat(model="deepseek-r1:7b", messages=st.session_state['message'])
ai_response = response['message']['content']
except Exception as e:
ai_response = f"出错啦:{str(e)},请检查 Ollama 服务是否启动或模型是否存在"
4. UI 美化
- 添加自定义 CSS 样式:
st.markdown(""" <style> .st-chat-message { max-width: 80%; } .st-chat-message-user { background-color: #f0f8ff; } </style> """, unsafe_allow_html=True) - 在侧边栏添加模型说明、使用指南等。
总结
本文通过 Ollama + Streamlit 实现了本地聊天机器人的快速搭建,核心流程为「环境准备 → 代码编写 → 运行测试」,全程无需前端开发,仅需 Python 基础即可上手。该案例不仅能帮助理解本地大模型的调用方式,还能熟悉 Streamlit 的快速开发流程,为后续复杂大模型应用(如知识库问答、工具调用)打下基础。
如果在部署过程中遇到问题,可检查 Ollama 服务是否正常运行、模型是否已拉取,或参考官方文档排查错误。
更多推荐

所有评论(0)