LangChain 实战课
黄佳
新加坡科研局首席研究员
8120 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 28 讲
结束语 & 结课测试 (2讲)
LangChain 实战课
15
15
1.0x
00:00/00:00
登录|注册

10|记忆:通过Memory记住客户上次买花时的对话细节

你好,我是黄佳,欢迎来到 LangChain 实战课!
在默认情况下,无论是 LLM 还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过 API 开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。
你肯定会说,不可能啊,每次和 ChatGPT 聊天的时候,ChatGPT 明明白白地记得我之前交待过的事情。
的确如此,ChatGPT 之所以能够记得你之前说过的话,正是因为它使用了记忆(Memory)机制,记录了之前的对话上下文,并且把这个上下文作为提示的一部分,在最新的调用中传递给了模型。在聊天机器人的构建中,记忆机制非常重要。

使用 ConversationChain

不过,在开始介绍 LangChain 中记忆机制的具体实现之前,先重新看一下我们上一节课曾经见过的 ConversationChain。
这个 Chain 最主要的特点是,它提供了包含 AI 前缀和人类前缀的对话摘要格式,这个对话格式和记忆机制结合得非常紧密。
让我们看一个简单的示例,并打印出 ConversationChain 中的内置提示模板,你就会明白这个对话格式的意义了。
from langchain import OpenAI
from langchain.chains import ConversationChain
# 初始化大语言模型
llm = OpenAI(
temperature=0.5,
model_name="gpt-3.5-turbo-instruct"
)
# 初始化对话链
conv_chain = ConversationChain(llm=llm)
# 打印对话的模板
print(conv_chain.prompt.template)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

LangChain中的记忆机制对话系统的实现方法和操作步骤进行了详细介绍。文章首先介绍了ConversationChain的基本对话格式和记忆机制的重要性,然后详细讲解了ConversationBufferMemory和ConversationBufferWindowMemory的使用方法。接着,介绍了ConversationSummaryMemory,它通过对对话历史进行汇总来避免过度使用Token。最后,介绍了ConversationSummaryBufferMemory,它结合了前述记忆机制的特点,旨在在对话中总结早期的互动,同时尽量保留最近互动中的原始内容。这些记忆机制为构建聊天机器人或其他对话系统提供了重要的方法和工具,能够提供更加连贯和个性化的对话体验。 在第二回合,记忆机制完整地记录了第一回合的对话,但是在第三回合,它察觉出前两轮的对话已经超出了300个字节,就把早期的对话加以总结,以节省Token资源。ConversationSummaryBufferMemory的优势是通过总结可以回忆起较早的互动,而且有缓冲区确保我们不会错过最近的互动信息。总体来说,ConversationSummaryBufferMemory为我们提供了大量的灵活性。它是我们迄今为止的唯一记忆类型,可以回忆起较早的互动并完整地存储最近的互动。在节省Token数量方面,ConversationSummaryBufferMemory与其他方法相比,也具有竞争力。 四种记忆机制的比较如下:ConversationSummaryBufferMemory和ConversationSummaryMemory在对话轮次较少的时候可能会浪费一些Token,但是多轮对话过后,Token的节省就逐渐体现出来了。ConversationBufferWindowMemory对于Token的节省最为直接,但是它会完全遗忘掉K轮之前的对话内容,因此对于某些场景也不是最佳选择。 思考题:1. 在你的客服聊天机器人设计中,你会首先告知客户:“亲,我的记忆能力有限,只能记住和你的最近10次对话哦。如果我忘了之前的对话,请你体谅我。” 当有了这样的预设,你会为你的ChatBot选择那种记忆机制? 2. 尝试改变示例程序ConversationBufferWindowMemory中的k值,并增加对话轮次,看看记忆效果。 3. 尝试改变示例程序Convers

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《LangChain 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 在路上
    我们可以通过源码来分析ConversationSummaryBufferMemory是如何实现长短期记忆的。首先要关注ConversationSummaryBufferMemory.save_context()方法,它将每轮对话的inputs和outputs成对加入memory,然后调用self.prune()方法。prune()方法会计算memory的当前token数,如果超过self.max_token_limit,则对超出的messages总结,调用的方法是self.predict_new_summary(pruned_memory, self.moving_summary_buffer)。总结时使用的PromptTemplate来自prompt.py的_DEFAULT_SUMMARIZER_TEMPLATE,_DEFAULT_SUMMARIZER_TEMPLATE的部分内容如下: EXAMPLE ... Current summary: {summary} New lines of conversation: {new_lines} 也就是通过示例,让llm学习如何完成长期记忆的总结。 ConversationSummaryBufferMemory是在应用层平衡长短期记忆,我们也可以看看模型层是如何平衡长短期记忆的。RNN模型t时间步的隐藏层参数H_t计算公式为:H_t = phi(X_t*W_xh+H_(t-1)*W_hh+b_h),X_t*W_xh表示短期记忆,H_(t-1)*W_hh表示长期记忆,平衡长短期记忆,就是给短期记忆和长期记忆加一个权重,来控制对整体记忆(H_t)的影响。现代循环神经网络GRU和LSTM的模型有区别,但是原理上都是为短期记忆和长期记忆加权重。

    作者回复: 很赞!深入源码分析,知其然,知其所以然。

    2023-09-25归属地:广东
    2
    10
  • iLeGeND
    github代码是不是没更新呢

    作者回复: 更新了,同学快去看看。

    2023-09-25归属地:北京
    4
  • Webber
    老师,ConversationChain中可以加入memory机制,但是agents中怎么加入memory机制中呢。initialize_agent函数中的参数没有Chain类型,只是LLM类型。

    作者回复: 好问题。可以做到,大概这样,同学可以试试补全下面代码。 from langchain.memory import ConversationBufferMemory from langchain.agents import Tool from langchain.agents import AgentType from langchain.memory import ConversationBufferMemory from langchain.llms import OpenAI from langchain.utilities import SerpAPIWrapper from langchain.agents import initialize_agent from langchain.agents import AgentExecutor memory = ConversationBufferMemory() agent_executor = initialize_agent(tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=memory) agent_executor = AgentExecutor( agent=agent, tools=tools, memory=memory )

    2023-10-12归属地:韩国
    2
    1
  • humor
    老师,问个题外话 说到记忆,我们人类的大脑也不是无穷无尽的。所以说,有的时候事情太多,我们只能把有些遥远的记忆抹掉。毕竟,最新的经历最鲜活,也最重要。 你在文中说人类的记忆不是无穷无尽的,我们只能把遥远的记忆抹掉。但是我觉得人类的记忆可以认为是无穷无尽的,因为我们几乎不可能耗尽我们的记忆空间,大脑还有极强的可塑性,而且我们人类也没办法直接抹去遥远的记忆吧。人类会对于印象深刻的记忆或者经常重复的记忆保留很长时间,并不仅仅与时间有关,如果仅与时间有关的话,我们学习的意义就没了啊,因为我们就只记得刚学过的东西了🤔

    作者回复: 嗯嗯对的,同学对人类记忆的思考和补充非常深刻。其实我们人脑才是无穷无尽的宝藏。我们有不如机器的部分,也有远超机器的设定。

    2024-01-05归属地:浙江
  • 抽象派
    如果对话的内容跨度比较广,是不是总结出来的就不太准确了?

    作者回复: 是的,就不太准确了。以后的大模型会逐渐接收更长的Token窗口。

    2023-09-28归属地:广东
  • 阿斯蒂芬
    “汇总”的理念跟“摘要”的理念是一致的吗?所以是不是实际应用中,专门的“汇总”模型或许价格比Completions 和 chat 模型更便宜?

    作者回复: 差不多一个意思哈。至于做汇总的模型是否更便宜,我不大清楚。给你一个很好的工具:https://gptforwork.com/tools/openai-chatgpt-api-pricing-calculator 能看到所有模型的价格比较。gpt-3.5-turbo是最物美价廉的,比text-达文西便宜好多呢。

    2023-09-25归属地:广东
    3
  • 骨汤鸡蛋面
    老师,可以认为不同的chain都对应一个prompt,约定了很多 变量,memory 这些机制都预定了自己可以提供哪些变量嘛?

    作者回复: 思路对的哈。只是这边我们一般不用“变量”这个词。我觉得同学的意思是,各种Chain的核心就是约定(预定)了很多提升模板的构建方法。这是LangChain给我们带来的一个核心机制。

    2023-09-25归属地:上海
  • 大师兄
    请问ConversationSummaryBufferMemory在超过max_token_limit以后是将所有内容进行总结还是将超过max_token_limit的内容进行总结?
    2024-03-15归属地:北京
    1
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部