Streamlit+Ollama 本地部署 Qwen 大模型智能聊天机器人完整实战教程

文章简介

本文完整讲解基于 Python Streamlit 前端 + Ollama 本地通义千问 Qwen 大模型搭建私有化聊天机器人项目,全程本地运行无需云端接口,保障对话数据隐私,支持多轮对话持久保存、流式等待提示、完整异常捕获,零基础可跟着实操复现全部功能,包含环境安装、Streamlit 页面开发、Ollama 模型调用、前后端整合完整源码。

项目技术栈:Python + Streamlit + Ollama + Qwen 通义千问本地大模型 适用系统:Windows / MacOS / Linux

一、项目整体概述

1.1 项目背景

市面上绝大多数 AI 聊天工具依赖第三方云端 API,存在两大痛点:

  1. 用户对话数据上传云端,存在隐私泄露风险;
  2. 网络波动、服务器限流会造成对话延迟、调用失败。

本地私有化聊天机器人使用 Ollama 在本机加载大模型,搭配 Streamlit 快速搭建 Web 交互页面,所有对话数据仅保存在本地,无网络依赖也可运行,支持自定义模型、定制对话逻辑。

1.2 整体技术架构

  1. 后端模型层:Ollama + Qwen 系列大模型(qwen2:0.5b /qwen2.5:7b),负责自然语言理解与回复生成;
  2. 前端交互层:Streamlit Python Web 框架,快速搭建聊天界面,实现多轮对话展示、用户输入交互;
  3. 数据存储:Streamlit SessionState 会话缓存,页面刷新不丢失历史对话记录。

1.3 开发前置环境准备

需要提前安装三类工具:

  1. Ollama 客户端,并提前拉取本地 Qwen 大模型;
  2. Python 解释器 + PyCharm 开发工具;
  3. Python 第三方库:streamlitollama

二、环境一键安装教程

2.1 Python 依赖库安装命令

打开 CMD / 终端执行镜像加速安装命令,避免下载缓慢:

# 安装streamlit(清华源)
pip install streamlit  -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装ollama调用库(阿里云镜像)
pip install ollama -i https://mirrors.aliyun.com/pypi/simple/

2.2 常见踩坑:PyCharm 路径含空格启动报错

如果 PyCharm 或项目路径存在空格,直接运行streamlit run xxx.py会识别失败,两种解决方案:

  1. 终端先 cd 进入项目根目录,再执行启动命令;
  2. 文件路径使用单引号包裹完整路径:
streamlit run 'C:\soft\PyCharm 2023\workspace\chatbot.py'

三、Streamlit 核心知识点讲解

3.1 Streamlit 框架优势

  1. 零前端基础:纯 Python 代码写网页,无需 HTML/CSS/JS;
  2. 热重载:修改代码自动刷新页面,不用重启服务;
  3. 内置丰富组件:标题、输入框、聊天框、按钮、加载动画开箱即用;
  4. SessionState 会话缓存:解决页面刷新数据丢失问题,实现多轮对话。

3.2 高频常用组件汇总

组件 功能说明
st.title() 页面大标题
st.divider() 分割横线
st.chat_message (角色) 对话气泡,role 分为 user/assistant
st.chat_input() 底部对话输入框
st.spinner() 加载等待动画(AI 思考中提示)
st.session_state 会话全局缓存,存储对话历史

3.3 入门案例:用户注册页面 Demo

基础表单交互示例,快速熟悉输入框、选择器、滑块等控件:

import streamlit as st
from datetime import date

# 设置页面标题
st.title("用户注册平台")
st.divider()

# 各类输入控件
username = st.text_input(label='请输入用户名:', max_chars=50)
password = st.text_input(label='请输入密码:', type='password', max_chars=50)
age = st.number_input(label='年龄', min_value=0, max_value=200, step=1)
gender = st.selectbox(label='性别', options=['请选择...', '男', '女'])
st.radio(label='是否已婚', options=['是', '否'], horizontal=True)
birthdate = st.date_input(label='出生日期', min_value=date(1900, 1, 1))
height = st.slider(label='身高', min_value=40.0, max_value=300.0, value=175.0)

# 提交按钮
submit_button = st.button(label='注册')
if submit_button:
    st.success(f"注册成功")
    print(f"用户名:{username},年龄:{age},性别:{gender}")

四、Ollama 本地大模型调用(后端核心)

4.1 Ollama 基础调用代码

通过ollama.Client连接本地 11434 端口服务,发起对话请求获取模型返回文本:

import ollama

# 连接本地ollama服务
client = ollama.Client(host='http://127.0.0.1:11434')
# 请求大模型对话
response = client.chat(
    model='qwen2.5:7b',
    messages=[{'role': 'user', 'content': '给我讲一个程序员笑话'}]
)
# 打印模型回复
print(response.message.content)

4.2 封装后端工具类(解耦前后端)

新建文件itcast_assistant_backend.py,封装模型调用函数,增加异常捕获,模型异常统一返回友好提示:

# itcast_assistant_backend.py
import ollama

def chat_message_response(request_content, host='http://127.0.0.1:11434', model='qwen2.5:7b', role='user'):
    response_content = ''
    try:
        # 创建ollama客户端
        ollama_client = ollama.Client(host)
        # 请求大模型
        result = ollama_client.chat(
            model=model,
            messages=[{"role": role, "content": request_content}]
        )
        response_content = result.message.content
    except Exception as e:
        print("模型调用异常:", e)
        response_content = '对不起,程序异常,请检查Ollama服务是否启动或模型是否拉取完成'
    finally:
        return response_content

# 本地测试入口
if __name__ == '__main__':
    res = chat_message_response("人工智能未来发展方向?")
    print(res)

五、完整聊天机器人前端页面代码

新建itcast_assistant_front.py,整合 Streamlit 页面 + 后端模型工具类,实现多轮对话持久保存

# itcast_assistant_front.py
import streamlit as st
# 导入后端模型调用函数
from itcast_assistant_backend import chat_message_response

# 页面基础配置
st.title('本地私有化智聊机器人')
st.divider()

# 初始化会话缓存,存储全部对话历史
if 'messages' not in st.session_state:
    st.session_state['messages'] = []
    # 机器人初始欢迎语
    st.session_state['messages'].append({
        'role': 'assistant',
        'content': '你好,我是本地部署的AI聊天机器人,有什么可以帮您?'
    })

# 循环渲染所有历史对话
for message_dict in st.session_state['messages']:
    st.chat_message(message_dict['role']).write(message_dict['content'])

# 底部对话输入框
prompt = st.chat_input('请输入你的问题...')
if prompt:
    # 1. 将用户提问存入会话缓存
    st.session_state['messages'].append({'role': 'user', 'content': prompt})
    # 2. 加载动画,提示AI正在思考
    with st.spinner("AI正在思考中,请稍等..."):
        # 调用本地Qwen大模型获取回答
        assistant_content = chat_message_response(prompt, model='qwen2.5:7b')
    # 3. 机器人回答存入会话缓存
    st.session_state['messages'].append({'role': 'assistant', 'content': assistant_content})
    # 页面自动刷新渲染最新对话

六、项目启动与运行步骤

  1. 打开 Ollama 软件,确保后台服务正常运行,提前执行ollama pull qwen2.5:7b拉取模型;
  2. PyCharm 打开项目,终端执行启动命令:
streamlit run itcast_assistant_front.py
  1. 自动弹出浏览器页面,即可和本地大模型进行多轮对话,刷新页面历史对话不会消失;
  2. 异常排查:
    • 提示连接失败:检查 Ollama 是否打开、端口 11434 是否占用;
    • 模型不存在:执行ollama list确认模型已下载;
    • 库导入报错:重新执行 pip 安装 streamlit 和 ollama。

七、项目核心知识点总结

  1. 文件操作基础回顾 open 文件三种模式 r/w/a,with 语句自动释放资源;try-except-finally 捕获文件读写异常;read/readline/readlines 三种读取方式区别。

  2. Streamlit 核心原理 每次交互完整重跑全部代码,依靠st.session_state全局字典缓存对话数据,实现多轮对话不丢失;st.chat_message区分用户 / 机器人对话气泡。

  3. Ollama 本地大模型核心 本地端口 11434 提供 API 服务,Python ollama 库封装请求;封装工具类实现前后端解耦,统一异常处理,提升程序健壮性。

  4. 项目优势 完全本地运行、数据不上传外网、无调用费用、可自由切换不同尺寸 Qwen 大模型、快速迭代 Web 交互页面。

八、拓展优化方向(可自行二次开发)

  1. 增加侧边栏模型切换选择框,支持一键切换 qwen2:0.5b、qwen2.5:7b 等模型;
  2. 实现对话记录导出 TXT 文件功能;
  3. 增加流式输出打字机效果,替代一次性返回完整回答;
  4. 增加上下文记忆优化,把完整历史 messages 传入 ollama.chat 实现连贯对话;
  5. 自定义页面 CSS 美化聊天界面、修改主题配色。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐