当前位置: 首页 > wzjs >正文

企业网站推广的名词解释网站建设流程案例

企业网站推广的名词解释,网站建设流程案例,做seo网站推广价格,外贸软件价格一、简介 我们之前完成了一个简易的聊天机器人,但是还留下了一些问题没有解决,比如如何开启新的会话。如何切换session_id,如何把对话做成流式的输出。这些我们就会在今天来完成。 二、关于新的会话和session_id from dotenv import load_…

一、简介

我们之前完成了一个简易的聊天机器人,但是还留下了一些问题没有解决,比如如何开启新的会话。如何切换session_id,如何把对话做成流式的输出。这些我们就会在今天来完成。

二、关于新的会话和session_id

from dotenv import load_dotenv
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ElasticsearchChatMessageHistoryfrom streamlit import streamlit as st# load env file
load = load_dotenv("./.env")# 无密码的elasticsearch配置
es_url = "http://localhost:9200"
# 存储的索引,我们不用预先创建索引,因为说实话我也不知道字段,langchain会创建,并且自动映射字段
index_name = "chat_history"# init llm
llm = ChatOllama(base_url = "http://127.0.0.1:11434",model = "huihui_ai/deepseek-r1-abliterated:14b",temperature = 0.5,num_predict = 10000
)# 构建ElasticsearchChatMessageHistory
def get_session_history(session_id: str) :return  ElasticsearchChatMessageHistory(index=index_name,session_id=session_id,es_url=es_url,ensure_ascii=False)session_id = "levi"
st.title("你好,这里是橘子GPT,我是小橘")
st.write("请把您的问题输入,小橘会认真回答的哦。")
# 添加一个输入框,用户自己输入来替代默认的
session_id = st.text_input("请输入一个session_id,否则我们将使用默认值levi",session_id)
# 添加一个按钮,触发按钮开启新的会话,并且删除上下文记录
isClickButton:bool = st.button("点击按钮,开启新的对话")
# query input
user_prompt = st.chat_input("我是小橘,请输入你的问题吧")if isClickButton:# 清除es中存储的上下文记录,这个是物理删除delete_by_queryget_session_history(session_id).clear()# 清除当前会话的上下文st.session_state.chat_history = []# 如果没有就创建,不要每次都建立新的
if 'chat_history' not in st.session_state:st.session_state.chat_history = []
# 遍历里面的内容,取出来存进去的每一组role 和 content
for message in st.session_state.chat_history :# 通过取出来的信息,构建st.chat_message,不同的角色会有不同的ui样式,这里就是做这个的with st.chat_message(message['role']):# 把内容展示出来st.markdown(message['content'])template = ChatPromptTemplate.from_messages([('human',"{prompt}"),('placeholder',"{history}")
])
chain = template | llm | StrOutputParser()
chain_with_history = RunnableWithMessageHistory(chain,get_session_history,input_messages_key="prompt",history_messages_key="history",
)if user_prompt :response = chain_with_history.invoke({"prompt": user_prompt},config={"configurable": {"session_id": session_id}})# 保存历史,上面用来遍历显示,避免后面覆盖前面的显示st.session_state.chat_history.append({'role':'user','content':user_prompt})with st.chat_message('user'):st.markdown(user_prompt)# 保存历史,上面用来遍历显示,避免后面覆盖前面的显示st.session_state.chat_history.append({'role':'assistant','content':response})with st.chat_message('assistant'):st.markdown(response)

这样就实现了需求了,可以直接跑一下看看。

三、关于流式对话

流式对话其实说白了就是回复的时候一个字一个字的显示,表现为流的样子,而不是一次性返回一大堆。

from dotenv import load_dotenv
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ElasticsearchChatMessageHistoryfrom streamlit import streamlit as st# load env file
load = load_dotenv("./.env")# 无密码的elasticsearch配置
es_url = "http://localhost:9200"
# 存储的索引,我们不用预先创建索引,因为说实话我也不知道字段,langchain会创建,并且自动映射字段
index_name = "chat_history"
# streamlit code
session_id = "levi"# init llm
llm = ChatOllama(base_url = "http://127.0.0.1:11434",model = "huihui_ai/deepseek-r1-abliterated:14b",temperature = 0.5,num_predict = 10000
)
# 构建ElasticsearchChatMessageHistory
def get_session_history(session_id: str) :return ElasticsearchChatMessageHistory(index=index_name,session_id=session_id,es_url=es_url,ensure_ascii=False)st.title("你好,这里是橘子GPT,我是小橘")
st.write("请把您的问题输入,小橘会认真回答的哦。")
# 设置一个输入框,用户输入的内容来替代默认的session_id。
session_id = st.text_input("请输入一个session_id,否则我们将使用默认值levi",session_id)
# 添加一个按钮,点击按钮的时候清空历史会话
isClickButton:bool = st.button("点击按钮,开启新的对话")
if isClickButton:# 注意这一行会去调用es客户端delete_by_query物理删除es中的上下文数据,最好自己定制,不要直接用get_session_history(session_id).clear()# 清除当前窗口的上下文记录st.session_state.chat_history = []# query input
user_prompt = st.chat_input("我是小橘,请输入你的问题吧")# 构建langchain执行
def invoke_history_by_stream(chain,prompt,session_id):chain_with_history = RunnableWithMessageHistory(chain,get_session_history,input_messages_key = prompt,history_messages_key="history",)# 以stream流的方式执行responseStream = chain_with_history.stream({"prompt": prompt},config={"configurable": {"session_id": session_id}})# 遍历返回,逐个回复for response in responseStream:yield response# 如果没有就创建,不要每次都建立新的
if 'chat_history' not in st.session_state:st.session_state.chat_history = []
# 遍历里面的内容,取出来存进去的每一组role 和 content
for message in st.session_state.chat_history :# 通过取出来的信息,构建st.chat_message,不同的角色会有不同的ui样式,这里就是做这个的with st.chat_message(message['role']):# 把内容展示出来st.markdown(message['content'])template = ChatPromptTemplate.from_messages([('human',"{prompt}"),('placeholder',"{history}")
])
chain = template | llm | StrOutputParser()# 如果感知到输入
if user_prompt :# 保存历史,上面用来遍历显示,避免后面覆盖前面的显示st.session_state.chat_history.append({'role':'user','content':user_prompt})with st.chat_message('user'):st.markdown(user_prompt)with st.chat_message('assistant'):# 以流式的方式渲染答案streamResp = st.write_stream(invoke_history_by_stream(chain,user_prompt,session_id))# 保存历史,上面用来遍历显示,避免后面覆盖前面的显示st.session_state.chat_history.append({'role': 'assistant', 'content': streamResp})

这就是流的代码,可以执行一下。

四、优化一版

我们再来优化一下样式。这个可以有可以不做,最好交给前端来做,streamlit的ui太生硬了。加了几个模板占位的替换。

from dotenv import load_dotenv
from langchain_community.chat_message_histories import ElasticsearchChatMessageHistory
from langchain_ollama import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.prompts import MessagesPlaceholder, ChatPromptTemplatefrom streamlit import streamlit as stload = load_dotenv("./.env")
es_url = "http://localhost:9200"
index_name = "chat_history"
def get_session_history(session_id: str) :return ElasticsearchChatMessageHistory(index=index_name,session_id=session_id,es_url=es_url,ensure_ascii=False)
# init llm
llm = ChatOllama(base_url = "http://127.0.0.1:11434",model = "huihui_ai/deepseek-r1-abliterated:14b",temperature = 0.5,num_predict = 10000
)user_id = "levi"with st.sidebar:st.image("./orange.png", width=150)user_id = st.text_input("输入你的id", user_id)role = st.radio("你想获得什么级别的回答呢?", ["初学者", "专家", "大佬"], index=0)if st.button("清空历史上下文,开启新的对话"):st.session_state.chat_history = []get_session_history(user_id).clear()st.markdown("""<div style='display: flex; height: 70vh; justify-content: center; align-items: center;'><h2>请问你需要什么帮助呢?</h2></div>""",unsafe_allow_html=True
)if 'chat_history' not in st.session_state:st.session_state.chat_history = []for message in st.session_state.chat_history:with st.chat_message(message['role']):st.markdown(message['content'])template = ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="history"),('system', f"你作为一个 {role} 级别的人来回答这个问题"),('human', "{prompt}")
])chain = template | llm | StrOutputParser()def invoke_history(chain, session_id, prompt):history = RunnableWithMessageHistory(chain, get_session_history,input_messages_key="prompt",history_messages_key="history")for response in history.stream({"prompt": prompt},config={"configurable": {"session_id": session_id}}):yield responseprompt = st.chat_input("输入你的问题,小橘会为你回答。")if prompt:st.session_state.chat_history.append({'role': 'user', "content": prompt})with st.chat_message('user'):st.markdown(prompt)with st.chat_message('assistant'):streamResponse = st.write_stream(invoke_history(chain, user_id, prompt))st.session_state.chat_history.append({'role': 'assistant', "content": streamResponse})

在这里插入图片描述


文章转载自:

http://eggAWulW.yfffg.cn
http://KtYUU1DS.yfffg.cn
http://IuLCc8rg.yfffg.cn
http://CuFGDNjm.yfffg.cn
http://aK03sXXL.yfffg.cn
http://cW80Tc84.yfffg.cn
http://aJ7sLObp.yfffg.cn
http://0mT1l5j8.yfffg.cn
http://kVrorq9O.yfffg.cn
http://twXhlZle.yfffg.cn
http://16lUtJGJ.yfffg.cn
http://q8aBwegK.yfffg.cn
http://cOjbM3Ak.yfffg.cn
http://YHih10cW.yfffg.cn
http://WSzPjJMx.yfffg.cn
http://LnTCLLwm.yfffg.cn
http://OAJKew1P.yfffg.cn
http://tKUaE6rL.yfffg.cn
http://VCTj1g5Y.yfffg.cn
http://ZlCHJENR.yfffg.cn
http://RGpdkMiM.yfffg.cn
http://Gl7gYWTQ.yfffg.cn
http://7lIeGnRN.yfffg.cn
http://X4KrhkH5.yfffg.cn
http://0WCOJGnd.yfffg.cn
http://jQg6dXvW.yfffg.cn
http://eRXDKN0Q.yfffg.cn
http://hD8oIYHc.yfffg.cn
http://cEDLsxaW.yfffg.cn
http://v9J4umQG.yfffg.cn
http://www.dtcms.com/wzjs/682278.html

相关文章:

  • 河南第二建设集团网站视频自己做网站用哪个软件
  • 建立个网站国外服务器购买平台
  • 简约大气网站wordpress网页不存在
  • 炫酷网站首页wordpress 调用个人资料
  • 网站建设相关的比赛一套网页ui设计多少钱
  • 企业做网站预付账款会计分录如果做网站接口
  • 重庆知名网站制作公司上海最大的企业
  • 如何选择个人网站主题wordpress性能检测
  • amp网站建设广州网络平台
  • 国外做网站公司能赚钱吗tv网站建设
  • 滕州营销型网站游戏开发 网站开发
  • 台州网站建站公司廊坊网站建设官网
  • 上传网站空间上海手机网站制作
  • 企业建站系统是什么网站专题报道怎么做
  • 谷歌网站推广排名工具wordpress 后台登陆 修改
  • 网站建设中什么意思9 1短视频安装
  • 东莞市塘厦网站建设壹网
  • 求跳转代码来自百度等搜索引擎访问跳转到另一个网站直接输入域名如何在网站做旅游产品
  • 潍坊网站建设方案推广宁波seo优化外包公司
  • 郑州网站建设 股权投资学院网站建设投标
  • 网站推广方式关键词优化排名易下拉稳定
  • 昆明做网站设计谷秋精品课程网站建设软件
  • 网站续费开发门户网站
  • 泰安网站建设哪家快深圳公司开发网站
  • 做网站需要什么技能西安 医疗网站建设
  • 做平面什么网站好用龙岩招聘网最新招聘在龙岩的工作
  • 上海建站提供商怎么样建设网站网站
  • 盐城建站江西网站开发软件公司
  • vpn网站模板wordpress 分类信息主题
  • 本地镇江网站建设长沙设计网站多少钱