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

相关推荐
Zach_菠萝侠2 小时前
【deepseek harness研究】进化方向10:对外编程接口面 思考、设计与实现
人工智能·深度学习·deepseek
明月_清风3 小时前
看完 DSH 文档后,我总结了这 7 个关键点
前端·后端·deepseek
99316665 小时前
让 DeepSeek 当主持人,claude、千问、Kimi 围着圆桌开会 —— 我做了个 DSH 圆桌会议插件
deepseek
DS随心转APP6 小时前
AI导出鸭插件 如何解决这些痛点,以及它如何重构“批量导出”这件事,让 纳米AI导出Excel 和其他格式告别手动整理,让AI导出回归优雅。
人工智能·重构·word·excel·deepseek·ai导出鸭
江厌0111 小时前
DeepSeek V4本地部署实战:联想ThinkStation P7+商红科技全流程交付解析
大模型部署·deepseek·ai工作站·商红科技·联想thinkstation
AC赳赳老秦21 小时前
企业级合规审计体系:用 OpenClaw 落地采集全链路留痕,自动生成合规审计报告
java·python·django·beautifulsoup·php·deepseek·openclaw
曦云沐1 天前
DeepSeek Harness 3 步跑通 Agent 运行时框架(npx 一键启动 Web UI)| 2026 实测
agent·deepseek·harness
a187927218311 天前
从一条直线到大模型输出一个token(九):输出矩阵与多层堆叠
深度学习·ai·transformer·token·注意力机制·deepseek·多层堆叠
运维自动化&云计算1 天前
ubuntu22.04离线跑Unsloth UD‑Q4_K_XL
deepseek