公司动态
基于Streamlit的Deepseek的聊天构建
使用python的streamlit做了一个简单的chat页面分享下学习产物需要自取一、简介streamlit 是python的一个三方包里面提供了使用python语法实现前端页面的功能可以让后端人员免于vue的搭建当然vue也不难但是相对于streamlit来说还是复杂不少先安装 streamlit和openai的三方包操作如下pipinstallstreamlit pipinstallopenai执行即可我这里下载过了就不重复下载了二、python源码上面包安装完成后展示出successful 就行就可以运行下面命令来启动streamlit了。streamlit run D:\python\workspace\main.py注意替换自己的文件路径下面是源码fromopenaiimportOpenAIimportstreamlitasstfromdatetimeimportdatetimeimportjsonimportosdefadd_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}withopen(f./resources/history_info/{st.session_state.file_name}.json,w,encodingUTF-8)asf:json.dump(history_info,f,ensure_asciiFalse)# 初始化初始化聊天信息st.session_state.messages[]# 用于存储对话历史st.session_state.nick_name小酷st.session_state.nature聪明可爱st.session_state.file_namedatetime.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}withopen(f./resources/history_info/{st.session_state.file_name}.json,w,encodingUTF-8)asf:json.dump(history_info,f,ensure_asciiFalse)defload_talk(file):withopen(f./resources/history_info/{file},r,encodingUTF-8)asf:history_infojson.load(f)print(f加载的历史信息{history_info})st.session_state.nick_namehistory_info[nick_name]st.session_state.naturehistory_info[nature]st.session_state.messageshistory_info[messages]st.session_state.file_namehistory_info[file_name]# 设置页面的配置项st.set_page_config(page_titleAI智能伴侣,page_icon,layoutwide,# 使用宽屏布局initial_sidebar_stateexpanded,# 侧边栏默认展开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 你必须严格遵守上述规则来回复用。 # 初始化聊天信息ifmessagesnotinst.session_state:st.session_state.messages[]# 用于存储对话历史ifnick_namenotinst.session_state:st.session_state.nick_name小酷ifnaturenotinst.session_state:st.session_state.nature聪明可爱iffile_namenotinst.session_state:st.session_state.file_namedatetime.now().strftime(%Y%m%d%H%M%S)# 显示历史消息修正循环formsginst.session_state.messages:st.chat_message(msg[role]).write(msg[content])# 初始化客户端从 st.secrets 读取clientOpenAI(api_keysk-3a3b*****384694********204b40f7,base_urlhttps://api.deepseek.com)# 左侧的侧边栏 - with: streamlit中上下文管理器withst.sidebar:st.button(新建会话,widthstretch,on_clickadd_talk)# 遍历展示文件信息forfileHinos.listdir(./resources/history_info):st.button(fileH[:-5],widthstretch,on_clicklambdaffileH:load_talk(f))st.subheader(伴侣信息)# 昵称输入框nick_namest.text_input(昵称,placeholder请输入昵称,valuest.session_state.nick_name)ifnick_name:st.session_state.nick_namenick_name# 性格输入框naturest.text_area(性格,placeholder请输入性格,valuest.session_state.nature)ifnature:st.session_state.naturenature# 输入框promptst.chat_input(请输入您要问的问题)ifpromptandprompt.strip():# 显示用户消息并保存st.chat_message(user).write(prompt)st.session_state.messages.append({role:user,content:prompt})# 构造完整对话历史包含 systemmessages[{role:system,content:system_prompt%(st.session_state.nick_name,st.session_state.nature)}]st.session_state.messagestry:responseclient.chat.completions.create(modeldeepseek-chat,messagesmessages,streamTrue)# 创建一个空的组件用以支持大模型可以实现流式输出,这样后续的输出都是输出到这一个输出框内了response_messagest.empty()append_response_msgformsginresponse:ifmsg.choices[0].delta.content:append_response_msgmsg.choices[0].delta.content response_message.chat_message(assistant).write(append_response_msg)exceptExceptionase:assistant_contentf❌ 调用 AI 失败{e}# 显示助手消息并保存st.session_state.messages.append({role:assistant,content:append_response_msg})注意源码里的api-key需要替换成自己的我的文件结构如下三、效果展示这个小项目也是一个提示词工程提示词够准确AI才能更准确的实现角色扮演。