10-如何使用LangChain构建记忆功能 | 豆包MarsCode AI刷题

188 阅读4分钟

在大语言模型(LLM)应用中,通常每次调用都是独立的,没有上下文记忆。我们看到的ChatGPT记住过去对话的效果,依赖于记忆机制(Memory),将对话历史传递给模型作为提示。在LangChain中,这种记忆机制可以帮助构建智能聊天机器人,使其具备持续对话的能力。

ConversationChain 与记忆机制

在LangChain中,ConversationChain 提供了一个友好对话的基础框架。提示模板包括对话历史 {history} 和新输入 {input}。通过这种设置,可以将每次对话存储为历史内容,然后在下次交互时传递给模型,实现记忆功能。这种方式让模型在与用户的多轮对话中,能够保持上下文的连贯性。

ConversationBufferMemory

ConversationBufferMemory 是最简单的记忆机制,它保存整个对话历史。在一个示例中,用户请求为姐姐购买生日花束,模型根据前几次的交互内容,清楚地回忆起用户的需求并给出合适的建议。然而,当对话变得非常长时,所有的历史记录作为提示会显著增加Token的数量,导致响应变慢,甚至可能超过模型的上下文窗口限制(通常是4096个Token)。这种方法适合短对话,但不适合特别长的对话场景。

ConversationBufferWindowMemory

为了解决Token数量过多的问题,ConversationBufferWindowMemory 提供了一种缓冲窗口机制,只保存最近的几次对话内容。这样既能有效节省Token数量,又能保留对当前对话有用的信息,适用于对远期信息需求不高的场景。在一个示例中,设置 k=1,意味着模型只记得最近一次的互动内容,而之前的内容则被“遗忘”。这种机制对于节省Token非常有效,但无法记住更早的对话。

ConversationSummaryMemory

ConversationSummaryMemory 通过对话汇总来减少Token的使用量。每次新的互动发生时,LLM会对之前的对话进行汇总,再将这个汇总传递给模型。这样可以大幅减少Token的使用,特别适用于长对话场景。在示例中,模型总结了对话历史,再将其用作提示,使其能够回忆起关键内容并保持对话的连贯性。这种方法的优势在于能够节省大量Token,但它对汇总内容的准确性依赖较大,如果汇总不准确,可能会影响后续对话的质量。

ConversationSummaryBufferMemory

ConversationSummaryBufferMemory 结合了对话总结和缓冲的优势,它既保存最近的互动内容,又对更早的对话进行汇总。当对话变得很长时,它会先记录原始对话内容,超过最大Token限制后将较早的历史内容进行总结,以节省Token。这种方式既保留了近期的具体互动内容,又减少了旧对话对Token的消耗,适用于需要保留近期信息且对话内容较长的场景。它有效地平衡了Token使用和上下文记忆的完整性。

四种记忆机制的比较

  1. ConversationBufferMemory:保存所有对话历史,适合短对话,但Token使用量高。
  2. ConversationBufferWindowMemory:只保存最近的 k 轮对话,节省Token,但无法记住早期内容。
  3. ConversationSummaryMemory:通过总结保留对话内容,适合长对话,但对总结的依赖较大。
  4. ConversationSummaryBufferMemory:结合总结和缓冲,既节省Token又保留近期内容,适合需要长时间记忆的对话场景。

在实际应用中,可以根据具体需求选择合适的记忆机制。例如,如果只需记住最近几次对话内容,BufferWindowMemory 是较好的选择。而如果需要在长时间对话中保留对话背景,SummaryBufferMemory 则更为合适。

思考题

  1. 假设你是一个客服聊天机器人,需要向客户告知“只能记住最近10次对话”,你会选择哪种记忆机制?
  2. 试试调整 ConversationBufferWindowMemoryk 值,并观察对话记忆的效果。
  3. 改变 ConversationSummaryBufferMemory 中的 max_token_limit 值,看看它如何影响对话记忆。

欢迎分享你的心得,也欢迎将这篇笔记分享给有需要的朋友!