**如何为聊天机器人添加记忆:探索状态管理技术**

114 阅读2分钟

引言

在聊天机器人领域,记忆功能是其重要特点之一。它使得机器人能够利用先前对话的内容作为上下文进行交流。有多种方法可以实现状态管理,包括简单地将以前的信息放入模型提示中,以及生成长对话的摘要等复杂技巧。本篇文章将详细介绍这些技术及其实现方法。

主要内容

设置

首先,确保安装必要的软件包,并将OpenAI API密钥设置为环境变量OPENAI_API_KEY

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

# 设置环境变量OPENAI_API_KEY或通过.env文件加载:
import dotenv
dotenv.load_dotenv()

使用聊天模型

我们将使用LangChain中的ChatOpenAI模型进行示例:

from langchain_openai import ChatOpenAI

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

消息传递

最简单的记忆形式是将历史消息传递给模型。下面是一个简单的例子:

from langchain_core.prompts import ChatPromptTemplate

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)

这个方法可以直接将历史对话作为上下文传递给模型。

聊天记录管理

使用LangChain的ChatMessageHistory类可以更加方便地管理消息历史:

from langchain_community.chat_message_histories import ChatMessageHistory

history = ChatMessageHistory()

history.add_user_message("Translate this sentence from English to French: I love programming.")
history.add_ai_message("J'adore la programmation.")

自动历史管理

借助RunnableWithMessageHistory类,消息记录可以自动管理:

from langchain_core.runnables.history import RunnableWithMessageHistory

history_for_chain = ChatMessageHistory()

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

代码示例

通过代码示例,我们可以看到如何使用RunnableWithMessageHistory进行上下文管理,确保每次调用都能利用整个对话历史:

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

常见问题和解决方案

挑战:上下文窗口限制

大语言模型有上下文窗口限制,可能需要进行消息修剪。使用trim_messages可以减少传递给模型的历史信息数量。

from langchain_core.messages import trim_messages

trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)

挑战:长对话总结

对于长对话,可以使用LLM生成对话摘要,并在每次调用前添加到对话历史中。

def summarize_messages(chain_input):
    # 生成摘要并清除历史
    ...

总结和进一步学习资源

使用LangChain和其他工具,我们可以构建具有记忆功能的强大聊天机器人。为了继续学习,推荐以下资源:

参考资料

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

---END---