LangChain入门(五)AI记住聊天历史
之前的案例都是一次性的会话,我们有时候需要进行连续沟通,就需要LLM记住之前的聊天内容。
Chat_History 组件提供能力,允许机器人“记住”过去的互动,并在回应后续问题时考虑它们。
需要安装组件
pip install langchain_community
保留聊天记录
#保存聊天的历史记录
store = {} # key 为sessionId,保存所有用户的了解记录# 根据session_id 获取消息历史记录对象def get_session_history(session_id: str):if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]do_message = RunnableWithMessageHistory(chain,get_session_history,input_messages_key='my_msg' #每次聊天时候发送msg的key
)config ={'configurable':{'session_id':'l1211'}} #给当前会话定义一个sessionid# 第一轮
resp1 = do_message.invoke({'my_msg':[HumanMessage(content='您好啊!我是悠然')],'language':'中文'},config=config
)print(resp1.content)
提示词模板修改,在提示词模板中添加聊天历史记录
chat_prompt = ChatPromptTemplate.from_messages([("system", "你是一个乐于助人的助手,用{language}尽你所有回答所有问题"),MessagesPlaceholder(variable_name='my_msg')]
)
流式输出,输出是一个token一个token输出的
for resp in do_message.stream({'my_msg':[HumanMessage(content='请给我讲一个笑话')],'language':'English'},config=config2
):print(resp.content,end="-") #一次响应是一个token
完整代码如下:
from langchain.chat_models import init_chat_model
from langchain_core.output_parsers import StrOutputParser
from langchain.prompts.chat import ChatPromptTemplate,MessagesPlaceholder
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
import os# 这里只是示意,工程中建议使用getpass.getpass()来获取API密钥
api_key = os.environ.get("DEEPSEEK_API_KEY");
api_base = "https://api.deepseek.com/"
#聊天机器人案例
#1.定义模型
model = init_chat_model(model="deepseek-chat",api_key=api_key,api_base=api_base,temperature=0.8,max_tokens=1024,model_provider="deepseek",)
#2.定义提示词模板
chat_prompt = ChatPromptTemplate.from_messages([("system", "你是一个乐于助人的助手,用{language}尽你所有回答所有问题"),MessagesPlaceholder(variable_name='my_msg')]
)
# 3. 定义解析器
parser =StrOutputParser()
# 4. 定义chain
chain = chat_prompt | model #保存聊天的历史记录
store = {} # key 为sessionId,保存所有用户的了解记录# 根据session_id 并返回一个消息历史记录对象def get_session_history(session_id: str):if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]do_message = RunnableWithMessageHistory(chain,get_session_history,input_messages_key='my_msg' #每次聊天时候发送msg的key
)config ={'configurable':{'session_id':'l1211'}} #给当前会话定义一个sessionid# 第一轮
resp1 = do_message.invoke({'my_msg':[HumanMessage(content='您好啊!我是悠然')],'language':'中文'},config=config
)print(resp1.content)#第二轮
resp2 = do_message.invoke({'my_msg':[HumanMessage(content='请问我的名字是什么?')],'language':'中文'},config=config
)
print(resp2.content)config2 ={'configurable':{'session_id':'1213131'}} #给当前会话定义一个sessionid#第三轮 返回的数据是流式的
for resp in do_message.stream({'my_msg':[HumanMessage(content='请给我讲一个笑话')],'language':'English'},config=config2
):print(resp.content,end="-") #一次响应是一个token