基于Streamlit的Deepseek的聊天构建

使用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才能更准确的实现角色扮演。

相关推荐
hoaxxcj10 小时前
DeepSeek Harness 本地部署与第三方插件排障实录:从 fetch failed 到 preset not found
人工智能·windows·开源·ai agent·deepseek
对角11 小时前
摸鱼神器:一边写代码,一边刷剧,从此没有一点摸鱼时间会被浪费!
ai编程·deepseek·vibecoding
m0_6348654012 小时前
2G2核服务器部署deep seekharness 困难?资源不够?DeepSeek Harness 部署复用笔记
运维·服务器·deepseek·harness
小年糕是糕手13 小时前
【AI】中国 AI:从跟随,到并肩
ai·chatgpt·agent·codex·deepseek
冬奇Lab1 天前
DeepSeek Harness 系列(07):能力 Seam——换一行配置,能力全换
人工智能·agent·deepseek
zLLM_Lab1 天前
DeepSeek V4.1 Flash 工程实践(二):从权重装配到八卡文本链路
llm·deepseek
️公子1 天前
DeepSeek V4.1 Flash 今日接管 Pro 流量:552B MoE + 非对称架构,Agent 推理成本怎么砍?
架构·开源·大模型·api·agent·deepseek
Regulus手记2 天前
DSH 为什么敢「万物皆插件」:会话日志是唯一真相
deepseek
weixin_416660072 天前
DeepSeek、豆包生成的表格怎么导出Excel,避免内容挤在一列?
word·豆包·deepseek
舒灿2 天前
全网都在测鹈鹕,我用 DeepSeek-V4.1-Flash 跑了50+小时、超5000MTokens消耗的真实开发任务
chatgpt·ai编程·deepseek