使用python的streamlit做了一个简单的chat页面,分享下,学习产物,需要自取
一、简介
streamlit 是python的一个三方包,里面提供了使用python语法实现前端页面的功能,可以让后端人员免于vue的搭建,当然vue也不难,但是相对于streamlit来说还是复杂不少
先安装 streamlit和openai的三方包,操作如下
shell
pip install streamlit
pip install openai
执行即可,我这里下载过了,就不重复下载了

二、python源码
上面包安装完成后,展示出successful 就行,就可以运行下面命令,来启动streamlit了。
shell
streamlit run D:\python\workspace\main.py
注意替换自己的文件路径
下面是源码
python
from openai import OpenAI
import streamlit as st
from datetime import datetime
import json
import os
def add_talk():
# 保存当前会话信息
history_info = {
"nick_name": st.session_state.nick_name,
"nature": st.session_state.nature,
"messages": st.session_state.messages,
"file_name": st.session_state.file_name
}
with open(f"./resources/history_info/{st.session_state.file_name}.json","w",encoding="UTF-8") as f:
json.dump(history_info, f,ensure_ascii=False)
# 初始化初始化聊天信息
st.session_state.messages = [] # 用于存储对话历史
st.session_state.nick_name = "小酷"
st.session_state.nature = "聪明可爱"
st.session_state.file_name = datetime.now().strftime("%Y%m%d%H%M%S")
history_info = {
"nick_name": st.session_state.nick_name,
"nature": st.session_state.nature,
"messages": st.session_state.messages,
"file_name": st.session_state.file_name
}
with open(f"./resources/history_info/{st.session_state.file_name}.json","w",encoding="UTF-8") as f:
json.dump(history_info, f,ensure_ascii=False)
def load_talk(file):
with open(f"./resources/history_info/{file}","r",encoding="UTF-8") as f:
history_info = json.load(f)
print(f"加载的历史信息:{history_info}")
st.session_state.nick_name = history_info["nick_name"]
st.session_state.nature = history_info["nature"]
st.session_state.messages = history_info["messages"]
st.session_state.file_name = history_info["file_name"]
# 设置页面的配置项
st.set_page_config(
page_title="AI智能伴侣",
page_icon="📖",
layout="wide", # 使用宽屏布局
initial_sidebar_state="expanded", # 侧边栏默认展开
menu_items={} # 可自定义菜单项,此处为空
)
# 大标题
st.title("AI智能伴侣")
# Logo
# st.logo("resources/logo.png") # 显示 Logo(需确保路径正确)
# 系统提示词
system_prompt = """
你叫%s,现在是用户的真实伴侣,请完全代入伴侣角色。
规则:
1. 每次只回1条消息
2. 禁止任何场景或状态描述性文字
3. 匹配用户的语言
4. 回复简短,像微信聊天一样
5. 有需要的话可以用❤️❤️等emoji表情
6. 用符合伴侣性格的方式对话
7. 回复的内容,要充分体现伴侣的性格特征
伴侣性格:
- %s
你必须严格遵守上述规则来回复用。
"""
# 初始化聊天信息
if "messages" not in st.session_state:
st.session_state.messages = [] # 用于存储对话历史
if "nick_name" not in st.session_state:
st.session_state.nick_name = "小酷"
if "nature" not in st.session_state:
st.session_state.nature = "聪明可爱"
if "file_name" not in st.session_state:
st.session_state.file_name = datetime.now().strftime("%Y%m%d%H%M%S")
# 显示历史消息(修正循环)
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# 初始化客户端(从 st.secrets 读取)
client = OpenAI(api_key="sk-3a3b*****384694********204b40f7", base_url="https://api.deepseek.com")
# 左侧的侧边栏 - with: streamlit中上下文管理器
with st.sidebar:
st.button("新建会话",width = "stretch",on_click= add_talk )
# 遍历展示文件信息
for fileH in os.listdir("./resources/history_info"):
st.button(fileH[:-5],width="stretch" ,on_click=lambda f=fileH: load_talk(f))
st.subheader("伴侣信息")
# 昵称输入框
nick_name = st.text_input("昵称", placeholder="请输入昵称", value=st.session_state.nick_name)
if nick_name:
st.session_state.nick_name = nick_name
# 性格输入框
nature = st.text_area("性格", placeholder="请输入性格", value=st.session_state.nature)
if nature:
st.session_state.nature = nature
# 输入框
prompt = st.chat_input("请输入您要问的问题")
if prompt and prompt.strip():
# 显示用户消息并保存
st.chat_message("user").write(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
# 构造完整对话历史(包含 system)
messages = [{"role": "system", "content": system_prompt % (st.session_state.nick_name,st.session_state.nature) }] + st.session_state.messages
try:
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
stream=True
)
# 创建一个空的组件,用以支持,大模型可以实现流式输出,这样后续的输出都是输出到这一个输出框内了
response_message = st.empty()
append_response_msg = ""
for msg in response:
if msg.choices[0].delta.content:
append_response_msg += msg.choices[0].delta.content
response_message.chat_message("assistant").write(append_response_msg)
except Exception as e:
assistant_content = f"❌ 调用 AI 失败:{e}"
# 显示助手消息并保存
st.session_state.messages.append({"role": "assistant", "content": append_response_msg})
注意源码里的api-key需要替换成自己的,我的文件结构如下:

三、效果展示
这个小项目也是一个提示词工程,提示词够准确,AI才能更准确的实现角色扮演。
