引言:本地化AI聊天机器人的崛起

在数据隐私愈发关键的当下,完全本地化的AI解决方案成为众多企业与开发者的优先选择。Ollama的问世,让在本地运行大语言模型变得轻而易举;LangChain提供了构建复杂AI应用的能力框架;而Streamlit则赋予这一切一个友好的用户界面。三者相结合,能够构建出功能强大、完全私有化的智能聊天机器人。

第一步、环境准备

1.1 安装Ollama

首先,在您的机器上安装Ollama:

# Windows用户:下载并运行安装程序
# https://ollama.com/download

# macOS用户
brew install ollama

# Linux用户
curl -fsSL https://ollama.com/install.sh | sh

Ollama支持多种模型,此处我们选取几个常用的:

# 拉取Llama 2(7B参数版本,适合大多数硬件)
ollama pull llama2

# 或者选择更小的模型(如3B参数)
ollama pull llama2:7b

# 中文优化模型(如果可用)
ollama pull qwen:7b
ollama pull chatglm3

# 查看已安装的模型
ollama list

若想深入了解Ollama,请访问:AI大模型初识及Ollama安装使用

1.2 安装必要的库

首先,确保您已安装Python 3.8及以上版本,然后通过pip安装必要的依赖:

# Streamlit
pip install streamlit==1.32.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
# Ollama工具包
pip install ollama -i https://mirrors.aliyun.com/pypi/simple/

# langchain工具包
# langchain建议根据本地的Python版本选择本地支持的版本安装
# 查找本地支持的langchain版本
conda search langchain 
# 指定版本安装langchain
pip install langchain==0.3.27 -i https://pypi.tuna.tsinghua.edu.cn/simple

第二部分、基础聊天机器人搭建

2.1 定义调用Ollama大模型的工具模块(chat_util.py)

# 该模块用于调用AI大模型,进行聊天问答,传入用户的问题,由大模型给返回信息

# 导入Ollama工具包
import ollama

# 调用大模型
def get_response(prompt):

    # 单条回复,不关联上下文
    # response = ollama.chat(model='deepseek-r1:1.5b', messages=[
    #     {
    #         'role': 'user',
    #         'content': prompt
    #     }
    # ])

    # 关联上下文
    # model是模型名称,messages传入的是聊天框的上下文内容,包含用户提问和AI打回答
    response = ollama.chat(model = 'deepseek-r1:1.5b', messages = prompt)
    # 接收返回信息
    return response['message']['content']

2.2 基于Streamlit生成前台聊天框界面,通过langchain.memory模块存储聊天的上下文(ChatBot.py):

# 导入相关工具包
import streamlit as st
from langchain.memory import ConversationBufferMemory

# 导入调用大模型的工具模块(chat_util)
from chat_util import get_response

# 标题
st.title('AI聊天机器人')

# 判断是否有历史消息记录对象,如果没有就创建,存储所有消息记录
# st.session_state存储会话数据状态数据的字典(存储会话数据)
if 'memory' not in st.session_state:
    # 创建一个对象 ConversationBufferMemory -> 存储到session_state中
    # langchain.memory.ConversationBufferMemory 专门存储和管理多轮对话历史
    st.session_state.memory = ConversationBufferMemory()

    # 添加机器人欢迎语
    # [{"role":"自己 / AI","content":"聊天的内容"},{"role":"自己 / AI","content":"聊天的内容"}]
    st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的AI助手,有什么可以帮助你的吗?"}]

# 遍历st.session_state.messages消息列表,把历史会话显示到界面上
for message in st.session_state.messages:
    # streamlit 提供了with语句,通过聊天消息容器,用来显示(用户/AI)的聊天内容,在网页上渲染出聊天消息框
    # chat_message具体显示对应的聊天消息框
    with st.chat_message(message["role"]):
        # 该角色的消息内容显示,可以用markdown / write
        st.markdown(message["content"])
        # st.write(message["content"])

# 聊天机器人,对话输入框
# 专用于聊天框的输入框,一直停留在界面下边
info = st.chat_input("请输入你的问题:")

# 如果用户有输入信息,保存用户发送的信息,然后调用大模型来处理用户消息,同时接收大模型返回的信息并保存到st.session_state.messages中
if info:
    st.session_state.messages.append({"role": "user", "content": info})
    st.chat_message("user").markdown(info)
    # 将当前的所有会话内容(st.session_state.messages)传给大模型
    # 用户等待时加载状态
    with st.spinner("我需要认真思考一下这个问题🤔"):
        # time.sleep(10)
        result = get_response(st.session_state.messages).replace('<think>', '').replace('</think>', '').strip()
        st.session_state.messages.append({"role": "assistant", "content": result})
        st.chat_message("assistant").markdown(result)

第三步、程序运行

在终端中运行程序:

# streamlit run 你的模块名.py
streamlit run ChatBot.py

如下图所示,即表示启动成功,启动成功后会自动打开浏览器访问网页;

若Streamlit是首次运行,会出现让输入邮箱的提示,您可输入邮箱后回车,也可直接回车。

第四步、测试

我的本地模型为轻量化模型,尚处于未开智状态,智能程度有限:

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐