AI大模型初体验 - 基于Streamlit和Ollama实现聊天机器人

一、 Streamlit框架

1. Streamlit框架简介

Streamlit是一个开源Python库。它旨在让数据科学家和工程师能够以最少的代码和配置,将他们的数据分析和模型展示转化为交互式的Web应用。Streamlit的设计目标是简单易用,同时保持高度的灵活性和可定制性。
streamlit官网

2. Streamlit安装

# 如果慢可以加上国内镜像(前面有总结)
pip install streamlit -i https://pypi.tuna.tsinghua.edu.cn/simple

# 可以通过简单代码查看,这里有很多示例
streamlit hello

在这里插入图片描述
在这里插入图片描述

官网中也有很多案例:streamlit官网文档
在这里插入图片描述

3. Streamlit框架特点

3.1 简单易用:

Streamlit的API非常简洁,只需要几行代码就可以创建一个基本的应用程序。
无需复杂的前端开发知识,Python代码直接决定了应用的界面和功能。

3.2 快速开发:

支持热重载,代码修改后自动更新应用,无需手动重启服务器。
丰富的内置组件和功能,可以快速实现常见的数据可视化和交互操作。

3.3 高度可定制:

支持自定义CSS样式,可以对应用的外观进行精细调整。
可以集成第三方库和框架,如Plotly、Altair、Pandas等,扩展应用的功能。

3.4 强大的社区支持:

官方文档详细且拥有一个活跃的社区,提供了大量的示例和教程,帮助用户快速上手。

4. Streamlit框架常见组件

Streamlit提供了许多内置组件,用于创建交互式界面:

4.1 文本和标题

st.write()、st.title()、st.header()、st.subheader()等

4.2 输入控件

st.text_input()、st.slider()、st.selectbox()、st.checkbox()、st.button()等

4.3 显示数据

st.dataframe()、st.table()、st.json()等

4.4 显示图表

st.pyplot()、st.altair_chart()、st.bokeh_chart()、st.plotly_chart()等

4.5 布局

st.sidebar()、st.columns()、st.expander()等

详见官网:streamlit官网文档

5. 用户注册案例

在这里插入图片描述

# Created by erainm on 2025/7/22 19:55.
# @Author erainm
# @Project: study_python
# @Description: TODO: streamlit 实现注册页面
import datetime
import streamlit as st

# 添加标题
st.title("用户注册")
# 添加分割线
st.divider()
# 添加文本输入框
username = st.text_input("请输入用户名:")
# 添加密码输入框
password = st.text_input("请输入密码:",type="password")
# 添加确认密码输入框
confirm_password = st.text_input("请再次输入密码:",type="password")
# 添加年龄输入框
age = st.number_input("请输入年龄:",value=18)
# 添加性别选择框
gender = st.radio("请选择性别:", options = ("男", "女","保密"),horizontal=True)
# 添加出生日期输入框
birth_date = st.date_input("请选择出生日期:", max_value=datetime.date(2025, 10, 1), min_value=datetime.date(1980, 1, 1),)
# 获取身高
height = st.slider("请输入身高:", 0, 300, 170)
# 添加注册按钮
def save_user_info(username, password, age, gender, birth_date, height):
    # 保存用户信息
    with open("../data/user_info.txt", "a") as f:
        f.write(f"{username},{password},{age},{gender},{birth_date},{height}\n")


if st.button("注册"):
    if password == confirm_password:
        # 保存到本地文件中
        save_user_info(username, password, age, gender, birth_date, height)
        st.success("注册成功!")
    else:
        st.error("密码不一致,请重新输入!")
# Created by erainm on 2025/7/22 20:21.
# @Author erainm
# @Project: study_python
# @Description: TODO: 执行streamlit

import os
# 启动streamlit
# os.system("streamlit run streamlit_register.py")
os.system(r"streamlit run /Users/erainm/Documents/application/dev/workSpace/study_python/day04/streamlit_register.py")

6. 构建AI智能聊天机器人页面

在这里插入图片描述

# Created by erainm on 2025/7/22 20:28.
# @Author erainm
# @Project: study_python
# @Description: TODO: 聊天机器人页面构建
import time

import streamlit as st

st.write("欢迎来到聊天机器人页面")
st.divider ()

# 构建AI和用户的会话框
# AI先说话
st.chat_message("AI").write("你好,我是一个聊天机器人,你可以向我提问任何问题。")
user_input = st.chat_input("请输入你的问题:")
if user_input:
    # 用户说话
    st.chat_message("用户").write(user_input)
    # AI回复
    st.chat_message("AI").write("我正在思考你的问题,请稍等...")
    # 模拟AI思考
    time.sleep(2)
    # AI回复
    st.chat_message("AI").write("我是AI智能聊天机器人")

二、 Ollama调用本地大模型

# Created by erainm on 2025/7/22 21:10.
# @Author erainm
# @Project: study_python
# @Description: TODO: 测试ollama调用本地大模型(大模型需是本地已下载安装的)
import ollama

def ask_ollama(message):
    res = ollama.chat(
        model="deepseek-r1:7b",
        messages=message
    )
    return res.message.content

if __name__ == '__main__':
    while True:
        print("提示:输入exit可退出程序")
        # 输入问题
        promt = input("请输入问题:")
        if promt == "exit":
            print("程序已退出,感谢您的使用~")
            break
        # 调用ollama封装消息
        message = [{"role": "user", "content":promt}]
        result = ask_ollama(message)
        print(f"答案为:{result}")

三、 实现AI智聊机器人

1. 创建Ollama调用大模型工具类

# Created by erainm on 2025/7/22 21:19.
# @Author erainm
# @Project: study_python
# @Description: TODO: ollama调用大模型工具类
"""
底层有client,默认使用本地ollama
修改远程ollama,new_ollama = ollama.Client(host="http://地址:11434")
"""

import ollama

new_allama = ollama.Client(host="http://127.0.0.1:11434")

def ask_ollama(message):
    response = ollama.chat(
        model="deepseek-r1:7b",
        messages=message
    )
    # return response.message.content
    return response["message"]["content"]

2. Streamlit创建聊天页面

# Created by erainm on 2025/7/22 21:19.
# @Author erainm
# @Project: study_python
# @Description: TODO: 使用Streamlit创建聊天页面
"""
    1. 解决用户提问了才回答,不会出现None
    2. 解决保存历史记录
    3. 解决可联系上下文
"""

import streamlit as st
from ollama_utils import ask_ollama

st.title("Ollama AI聊天机器人")
st.divider ()
if "message" not in st.session_state:
    st.session_state["message"] = []
    st.session_state["message"].append({"role":"assistant","content":"欢迎来到Ollama AI聊天机器人."})
# AI 先说话
for message in st.session_state["message"]:
    st.chat_message(message["role"]).write(message["content"])
# 用户说话
prompt = st.chat_input("请输入你的问题")
# 用户提问了才回答
if prompt:
    st.chat_message("user").write(prompt)
    st.session_state["message"].append({"role":"user","content":prompt})
    # AI回答
    result = ask_ollama(st.session_state["message"][-10:]) # 此处把最新的10条消息发送给大模型
    st.chat_message("assistant").write(result)
    st.session_state["message"].append({"role":"assistant","content":result})

3. 运行

# Created by erainm on 2025/7/22 21:27.
# @Author erainm
# @Project: study_python
# @Description: TODO: 执行streamlit页面
import os
os.system("streamlit run streamlit_page.py")

4. 最终效果展示

在这里插入图片描述
在这里插入图片描述

<think>我们参考了上述引用资料,特别是引用[2][3],它们提到了使用LangChain来集成Ollama模型并管理聊天历史记录。具体来说,引用[2]指出:-使用`ChatOllama`类来调用Ollama聊天模型。-使用`RunnableWithMessageHistory`来包装Runnable并管理聊天消息历史记录。-使用`StreamlitChatMessageHistory`将聊天消息历史记录存储在Streamlit的session_state中。同时,引用[3]提到可以使用LangFlow快速构建原型,然后转化为Streamlit应用。因此,实现多轮对话的关键在于维护聊天历史记录(messagehistory),并在每次交互时将历史记录传递给模型,这样模型才能根据上下文进行回复。下面我们提供一个在Streamlit中集成Ollama实现多轮对话的示例代码。我们将按照以下步骤进行:1.安装必要的库:streamlit,langchain,langchain-community,ollama(通过pip安装ollama可能不是必须的,因为通常我们直接使用ollama服务,但需要确保ollama服务在本地运行)。2.导入必要的模块。3.初始化消息历史记录,存储在Streamlit的session_state中。4.创建Ollama的聊天模型实例。5.使用RunnableWithMessageHistory来管理消息历史。6.创建Streamlit界面,显示历史消息,并处理用户输入。注意:请确保已经下载并运行了Ollama模型,例如`ollamarunllama3`(或其他模型),且Ollama服务在本地运行(默认地址为`http://localhost:11434`)。以下是示例代码:```pythonimportstreamlitasstfromlangchain_community.chat_modelsimportChatOllamafromlangchain_community.chat_message_historiesimportStreamlitChatMessageHistoryfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.runnables.historyimportRunnableWithMessageHistory#设置页面st.set_page_config(page_title="OllamaChat",page_icon="💬")st.title("OllamaChatwithStreamlit")#初始化消息历史记录(存储在session_state中)msgs=StreamlitChatMessageHistory(key="langchain_messages")iflen(msgs.messages)==0:msgs.add_ai_message("您好!我能为您做什么?")#显示所有消息formsginmsgs.messages:st.chat_message(msg.type).write(msg.content)#设置模型链model=ChatOllama(model="llama3",base_url="http://localhost:11434")#使用llama3模型,请确保已下载#提示模板,包含一个用于历史消息的占位符prompt=ChatPromptTemplate.from_messages([("system","你是一个乐于助人的AI助手。"),MessagesPlaceholder(variable_name="history"),("human","{input}"),])#创建链chain=prompt|model#使用消息历史的链chain_with_history=RunnableWithMessageHistory(chain,lambdasession_id:msgs,#返回我们存储在session_state中的消息历史input_messages_key="input",history_messages_key="history",)#处理用户输入ifprompt:=st.chat_input("请输入您的问题"):#添加用户消息并显示st.chat_message("human").write(prompt)#将用户输入添加到消息历史msgs.add_user_message(prompt)#调用链config={"configurable":{"session_id":"any"}}#这里我们使用固定session_id,因为单会话response=chain_with_history.invoke({"input":prompt},config)#添加AI回复并显示st.chat_message("ai").write(response.content)msgs.add_ai_message(response.content)```说明:1.我们使用`StreamlitChatMessageHistory`来在session_state中存储消息历史。2.我们创建了一个提示模板,其中包含一个系统消息、一个用于历史消息的占位符(`MessagesPlaceholder`)用户输入。3.`RunnableWithMessageHistory`包装了我们的链,并负责在调用时传递消息历史。注意,我们在调用`invoke`方法时,传递了一个固定的session_id(因为这里我们只处理一个会话)。4.当用户输入时,我们将用户消息添加到历史中,然后调用链得到回复,再将AI回复添加到历史并显示。注意:在实际运行时,请确保Ollama服务已经在本地运行(使用命令`ollamaserve`或在后台运行ollama应用)。同时,请根据您下载的模型修改`model`参数(比如`"llama3"`可以替换为`"mistral"`等)。如果您还没有下载所需模型,请先使用命令行下载,例如:```bashollamapullllama3```**参考文献**:[^1]:引用1提供了安装环境准备的相关信息。[^2]:引用2详细介绍了LangChain中用于管理聊天历史的关键类。[^3]:引用3提到了使用LangFlowOllama构建聊天机器人并转化为Streamlit应用。§§相关问题§§1.如何在本地运行Ollama服务并下载模型?2.Streamlit中如何管理多个会话的消息历史?3.如何为Ollama模型设置不同的参数(如温度)以控制生成文本的随机性?</think> 要在 Streamlit 中集成 Ollama 实现多轮对话功能,核心在于**维护聊天历史状态**并利用 LangChain 的对话管理工具。以下是完整实现方法: ### 实现方案 #### 1. 关键组件 - **`ChatOllama`**:LangChain 的 Ollama 模型封装器 - **`StreamlitChatMessageHistory`**:在 session_state 中存储对话历史 - **`RunnableWithMessageHistory`**:自动管理上下文对话历史 #### 2. 完整实现代码 ```python import streamlit as st from langchain_community.chat_models import ChatOllama from langchain_community.chat_message_histories import StreamlitChatMessageHistory from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory # 初始化设置 st.set_page_config(page_title="Ollama Chat") st.title("🧠 Ollama多轮对话演示") # 1. 创建消息历史存储 msgs = StreamlitChatMessageHistory(key="langchain_messages") # 2. 初始化Ollama模型(确保本地运行ollama服务) model = ChatOllama( model="llama3", # 替换为您使用的模型 base_url="http://localhost:11434" ) # 3. 配置对话模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个乐于助人的AI助手。使用中文回答用户问题并保留对话上下文。"), MessagesPlaceholder(variable_name="history"), ("human", "{input}") ]) # 4. 构建对话链 chain = prompt | model # 5. 配置历史管理器 chain_with_history = RunnableWithMessageHistory( chain, lambda session_id: msgs, input_messages_key="input", history_messages_key="history" ) # 初始化消息 if len(msgs.messages) == 0: msgs.add_ai_message("您好!我是Ollama助手,请问有什么可以帮您?") # 显示历史消息 for msg in msgs.messages: st.chat_message(msg.type).write(msg.content) # 6. 处理用户输入 if prompt := st.chat_input("请输入您的问题"): # 显示用户消息 st.chat_message("human").write(prompt) # 调用模型并获取响应(自动携带历史记录) config = {"configurable": {"session_id": "any"}} response = chain_with_history.invoke( {"input": prompt}, config=config ) # 显示AI回复 st.chat_message("ai").write(response.content) ``` ### 关键原理说明 1. **历史记录管理**: - `StreamlitChatMessageHistory` 自动将对话历史存储在 `st.session_state` 中 - 每次交互时都会将完整对话历史传递给模型 - Ollama 根据上下文生成连贯响应[^2] 2. **对话链工作流程**: ```mermaid graph LR A[用户输入] --> B{添加至历史} B --> C[创建包含历史的Prompt] C --> D[Ollama模型] D --> E[生成响应] E --> F{添加至历史} F --> G[显示响应] ``` 3. **模型调用优化**: - `RunnableWithMessageHistory` 自动处理历史记录注入 - 通过 `configurable` 参数实现多会话支持 - 默认使用 `llama3` 模型(可替换为其他 Ollama 模型) ### 验证步骤 1. 确保 Ollama 服务运行: ```bash ollama serve ``` 2. 下载所需模型(如未安装): ```bash ollama pull llama3 ``` 3. 启动 Streamlit 应用: ```bash streamlit run chat_app.py ``` ### 实际效果示例 ``` 用户: 你好,我是小明 AI: 你好小明!有什么我可以帮您的吗? 用户: 我上周买的手机型号是什么? AI: 抱歉,我无法访问您的购买记录... (后续可继续关于手机功能的对话) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

erainm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值