引言
在构建聊天机器人时,让机器人记住对话历史并使用它们来提供上下文响应极为重要。本文将探讨几种实现聊天机器人记忆功能的技术,包括简单的信息存储到复杂的对话总结。
主要内容
简单消息传递
最简单的记忆方法是将对话历史串联到模型的提示中。尽管简单,但这种方法需要手动管理对话的存储。
聊天记录管理
通过LangChain库,我们可以使用内置的消息历史类来存储和管理对话。它可以与多种提供商集成,支持持久存储和加载。
from langchain_community.chat_message_histories import ChatMessageHistory
chat_history = ChatMessageHistory()
chat_history.add_user_message("Translate this sentence from English to French: I love programming.")
chat_history.add_ai_message("J'adore la programmation.")
print(chat_history.messages)
# 输出 [HumanMessage(...), AIMessage(...)]
自动化历史管理
为了减少手动管理,可以使用RunnableWithMessageHistory类来自动处理消息的追加和管理。
from langchain_core.runnables.history import RunnableWithMessageHistory
chain_with_message_history = RunnableWithMessageHistory(
chain,
lambda session_id: chat_history,
input_messages_key="input",
history_messages_key="chat_history"
)
修剪和总结历史
修剪消息
通过修剪历史记录中的旧消息,可以保持上下文窗口的合理大小。
from operator import itemgetter
from langchain_core.messages import trim_messages
from langchain_core.runnables import RunnablePassthrough
trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)
chain_with_trimming = (
RunnablePassthrough.assign(chat_history=itemgetter("chat_history") | trimmer)
| prompt
| chat
)
总结历史
使用LLM生成对话的总结是一种有效的减少信息量的方法。
def summarize_messages(chain_input):
stored_messages = chat_history.messages
if not stored_messages:
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})
chat_history.clear()
chat_history.add_message(summary_message)
return True
常见问题和解决方案
- 消息丢失:可通过设置较长的历史或改用总结功能来保持关键信息。
- 上下文窗口限制:修剪旧消息或利用摘要功能来减少信息量。
总结和进一步学习资源
通过本文的技术,开发者可以提高聊天机器人的记忆功能,从而改善用户体验。要进一步深入了解,可以参考以下资源:
参考资料
- LangChain 官方文档
- OpenAI 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---