为你的聊天机器人添加记忆功能:提升上下文理解与对话流畅性

172 阅读3分钟
## 引言

聊天机器人已经成为许多行业的热门工具,其能够模拟人类对话的能力是由复杂的AI模型支撑的。一个关键的功能是利用先前对话作为上下文来理解和回应当前的输入。这种状态管理有多种形式,从简单的对话历史填充到复杂的会话总结。本篇文章将深入探讨如何为聊天机器人添加记忆功能,以提升其对话能力。

## 主要内容

### 简单的消息填充

最简单的方式是直接将之前的聊天记录传递给模型。虽然简单,但这样的方法可能导致信息过载。通过按需修剪过时的消息,可以减少模型的处理负担。

### 消息历史管理

直接使用数组存储和传递消息是可行的,但我们可以使用LangChain的内置功能来管理消息历史。例如,`ChatMessageHistory`类允许我们把消息存储在持久化存储中。

```python
from langchain_community.chat_message_histories import ChatMessageHistory

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

自动历史管理

手动传递消息给链条虽然可以,但需要更多的管理。LangChain提供了RunnableWithMessageHistory类来自动处理。这使得消息历史管理与多用户会话变得更加简便。

修剪历史消息

LLM模型有固定的上下文窗口,过多的消息可能导致性能下降。通过修剪工具,我们可以在达到上下文限制之前移除旧消息。

from langchain_core.messages import trim_messages
trimmer = trim_messages(strategy="last", max_tokens=2, token_counter=len)

概述记忆

通过将历史对话总结为简要信息,可以在保持信息完整的同时减少上下文体积。

def summarize_messages(chain_input):
    stored_messages = demo_chat_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_chat_history.clear()
    demo_chat_history.add_message(summary_message)

    return True

代码示例

下面是一个完整的实现示例,展示了如何使用RunnableWithMessageHistory来处理消息历史:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables.history import RunnableWithMessageHistory

chat = ChatOpenAI(model="gpt-3.5-turbo-0125")  # 使用API代理服务提高访问稳定性

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful assistant."),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
    ]
)

chain = prompt | chat

常见问题和解决方案

  • API调用不稳定:由于网络限制,开发者可能需要使用API代理服务来保证API的稳定性。
  • 上下文窗口限制:使用消息修剪策略来避免超过上下文窗口限制。

总结和进一步学习资源

为聊天机器人添加记忆功能可以显著提升用户体验。通过合理管理对话历史,优化上下文信息,我们的聊天机器人将能更加智能、准确地响应用户请求。有兴趣的读者可以参考LangChain的文档来进一步学习。

参考资料

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

---END---