10|记忆:通过Memory记住客户上次买花时的对话细节
使用 ConversationChain
- 深入了解
- 翻译
- 解释
- 总结
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归属地:广东210 - iLeGeNDgithub代码是不是没更新呢
作者回复: 更新了,同学快去看看。
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归属地:韩国21 - 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