一、简介
我们之前完成了一个简易的聊天机器人,但是还留下了一些问题没有解决,比如如何开启新的会话。如何切换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 ElasticsearchChatMessageHistory
from 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_query
get_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',

最低0.47元/天 解锁文章
224

被折叠的 条评论
为什么被折叠?



