引言
在AI驱动的对话系统中,记忆功能是增强用户体验的重要特性。聊天机器人通过利用对话的上下文来提升智能化处理能力。本文旨在为开发者提供实用的知识和技术,以改进聊天机器人的记忆功能。
主要内容
简单消息传递
最简单的记忆机制是将之前的聊天记录直接传递给模型。虽然这种方法实现简单,但当消息数量增加时,可能导致信息过载的问题。
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
("placeholder", "{messages}")
])
chat = ChatOpenAI(model="gpt-3.5-turbo-0125") # 使用API代理服务提高访问稳定性
chain = prompt | chat
messages = [("human", "Translate 'I love programming' to French."),
("ai", "J'adore la programmation."),
("human", "What did you just say?")]
ai_response = chain.invoke({"messages": messages})
print(ai_response.content) # 输出: I said "J'adore la programmation," which means "I love programming" in French.
使用消息存储类
使用LangChain的ChatMessageHistory可以方便地存储和加载聊天记录。它支持与多个提供商的集成。
from langchain_community.chat_message_histories import ChatMessageHistory
demo_history = ChatMessageHistory()
demo_history.add_user_message("Translate 'I love programming' to French.")
demo_history.add_ai_message("J'adore la programmation.")
# 使用API代理服务提高访问稳定性
response = chain.invoke({"messages": demo_history.messages})
自动历史管理
使用LangChain的RunnableWithMessageHistory自动管理消息历史,可以让开发更简洁高效。
from langchain_core.runnables.history import RunnableWithMessageHistory
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: demo_history,
input_messages_key="input",
history_messages_key="chat_history"
)
chain_with_history.invoke({"input": "What did I just ask you?"}, {"configurable": {"session_id": "unused"}})
修剪消息
为了处理长对话,可以通过修剪旧消息来减少模型的注意力负担。
from operator import itemgetter
from langchain_core.messages import trim_messages
trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)
chain_with_trimmer = (
RunnablePassthrough.assign(chat_history=itemgetter("chat_history") | trimmer)
| prompt
| chat
)
chain_with_trimmer.invoke({"input": "Where does P. Sherman live?"}, {"configurable": {"session_id": "unused"}})
概述记忆
通过对话概述来保持信息的简洁是另一种有效策略。
def summarize_messages(chain_input):
stored_messages = demo_history.messages
if len(stored_messages) == 0:
return False
summarization_prompt = ChatPromptTemplate.from_messages([
("placeholder", "{chat_history}"),
("user", "Distill the above chat messages into a single summary message.")
])
summarization_chain = summarization_prompt | chat
summary_message = summarization_chain.invoke({"chat_history": stored_messages})
demo_history.clear()
demo_history.add_message(summary_message)
return True
chain_with_summarization = (
RunnablePassthrough.assign(messages_summarized=summarize_messages)
| chain_with_history
)
chain_with_summarization.invoke({"input": "What did I say my name was?"}, {"configurable": {"session_id": "unused"}})
常见问题和解决方案
-
上下文窗口限制:LLMs和聊天模型具有上下文窗口限制。通过修剪消息或生成对话概要可以有效应对。
-
多用户会话管理:可通过
RunnableWithMessageHistory中的session_id来处理多用户会话。
总结和进一步学习资源
通过本文,我们探讨了如何为聊天机器人添加记忆功能的多种方法。为了更进一步学习推荐访问LangChain的文档,以及OpenAI的API指南。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!