本文主要介绍使用python:3.12
实现网页人机对话流式输出,类似page assist
的效果,使用的页面组件是streamlit:1.37
,大模型是使用ollama
跑起来的deepseek-R1
。
代码如下:
utils.py
工具类,主要是负责和ollama通信,获取deepseek-R1版本,调用ollama对话接口、获取响应流,注意这里不是获取完整的响应的内容,而是响应的一个个片段
import os
# 调用私有化的ollama
os.environ['OLLAMA_HOST'] = 'http://192.168.4.201:11434'
import ollama
def get_chat_response(messages, model):
# 调用ollama对话接口,以流的方式交互并直接返回
stream = ollama.chat(model= model, messages=messages, stream=True)
return stream
def get_model():
# 获取deepseek 模型版本
model_name = []
result = ollama.list().models
for a in result:
model_name.append(a.model)
return tuple(model_name)
streamlit_ollama.py
是streamlit run 执行的文件
import streamlit as st
from utils import get_chat_response, get_model
content = ''
# 这个方法是接收ollama的流,是一个generator,然后遍历这个generator,提取其中的content字段,
# 通过yield关键字重新生成一个generator,交给 write_stream()方法流式输出
def getContent(stream):
global content
for chunk in stream:
c = chunk['message']['content']
content += c
yield c
st.title("聊天机器人")
# 从导航栏选择要交互的模型版本
with st.sidebar:
model = st.selectbox('请选择你的对话模型:',get_model())
# 记录对话历史
if "messages" not in st.session_state:
st.session_state['messages'] = [{'role':'assistant', 'content':'你好,请问有什么可以帮助你?'}]
for message in st.session_state['messages']:
st.chat_message(message['role']).write(message['content'])
# 等待用户输入
prompt = st.chat_input()
if prompt:
st.session_state['messages'].append({'role':'user','content':prompt})
st.chat_message('user').write(prompt)
with st.spinner("思考中"):
stream = get_chat_response(st.session_state['messages'], model)
st.chat_message('assistant').write_stream(getContent(stream))
st.session_state['messages'].append({'role':'assistant','content':content})
content=''
效果如下:
很明显,这个页面相对于page asisst
还是有很多优化点的,比如怎么把think标签的收起等等。