1.环境准备
1.1 安装Streamlit
在安装Streamlit之前,请确保您的系统中已经正确安装了Python和pip。您可以在终端或命令行中运行以下命令来验证它们是否已安装
python --version
pip --version
一旦您已经准备好环境,现在可以使用pip来安装Streamlit了。在终端或命令行中运行以下命令:
pip install streamlit
安装完成后,您可以使用以下命令验证Streamlit是否成功安装:
streamlit version
Streamlit运行文件方式
streamlit run app.py
1.2 安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
可能会出现断传,建议下载模型文件然后手动安装
官网下载速度慢的话可以访问 国内下载地址 下载
- 直接下载后将压缩包 传到服务器上的文件夹上,解压到usr目录,输入:
sudo tar -C /usr -xzvf 你的压缩包所在位置
sudo systemctl daemon-reload
sudo systemctl enable ollama
服务启停
2.python程序
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=''
最终效果