探索为聊天机器人添加记忆的技术方法

115 阅读2分钟

引言

在聊天机器人中,利用之前对话轮次的内容作为上下文是其关键特性之一。这种状态管理可以有多种形式,如简单地将之前的信息放入模型提示,或是精简旧消息以减少干扰,甚至是为长对话生成总结。本篇文章将深入探讨几种实现聊天机器人记忆的技术方法。

主要内容

环境设置

首先,你需要安装几个必要的库,并将OpenAI API密钥设置为环境变量OPENAI_API_KEY

%pip install --upgrade --quiet langchain langchain-openai

在Python中加载环境变量:

import dotenv
dotenv.load_dotenv()

消息传递

最简单的记忆形式是将聊天历史直接传递给链。这可以通过以下代码实现:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

chat = ChatOpenAI(model="gpt-3.5-turbo-0125")

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant. Answer all questions to the best of your ability."),
    ("placeholder", "{messages}"),
])

chain = prompt | chat

ai_msg = chain.invoke({
    "messages": [
        ("human", "Translate this sentence from English to French: I love programming."),
        ("ai", "J'adore la programmation."),
        ("human", "What did you just say?"),
    ],
})

print(ai_msg.content)
# 使用API代理服务提高访问稳定性

自动历史管理

通过RunnableWithMessageHistory类可以自动管理新消息。以下是一个应用示例:

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

demo_chat_history = ChatMessageHistory()
chain_with_message_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: demo_chat_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

chain_with_message_history.invoke(
    {"input": "Translate this sentence from English to French: I love programming."},
    {"configurable": {"session_id": "unused"}},
)

修剪与总结

为了优化上下文窗口,可以修剪历史消息或生成摘要:

from langchain_core.messages import trim_messages
from langchain_core.runnables import RunnablePassthrough
from operator import itemgetter

trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)
chain_with_trimming = (
    RunnablePassthrough.assign(chat_history=itemgetter("chat_history") | trimmer)
    | prompt
    | chat
)

chain_with_trimmed_history = RunnableWithMessageHistory(
    chain_with_trimming,
    lambda session_id: demo_chat_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

chain_with_trimmed_history.invoke(
    {"input": "What's my name?"},
    {"configurable": {"session_id": "unused"}},
)

常见问题和解决方案

  • 上下文窗口:对于大规模对话,需精简信息。
  • 稳定访问API:在一些地区,网络限制可能影响API访问,建议使用API代理服务。

总结和进一步学习资源

通过不同的技术方式,聊天机器人可以具备更强的上下文记忆能力。想要深入探索这些技术,可以参考以下资源:

参考资料

  • LangChain 官方文档
  • OpenAI API 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---