大模型入门实战: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 服务是否正常运行、模型是否已拉取,或参考官方文档排查错误。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐