跳转至

12-多轮对话中让AI保持长期记忆的8种优化方式篇

来源 PDF:200页AI大模型面试高频必刷题(附详解)/12-多轮对话中让AI保持长期记忆的8种优化方式篇.pdf
主题:RAG / 文档问答
页数:4
字符数:3823
索引片段数:10

摘要

多轮对话中让AI保持长期记忆的8种优化方式篇 来自: AiGC面试宝典 宁静致远 2024年02月08日 10:05 一、前言 在基于大模型的 Agent 中,长期记忆的状态维护至关重要,在 OpenAI AI 应用研究主管 Lilian Weng 的 博客《基于大模型的 Agent 构成》[1]中,将记忆视为关键的组件之一,下面我将结合 LangChain 中的代 码,8 种不同的记忆维护方式在不同场景中的应用。 二、Agent 如何获取上下文对话信息? 2.1 获取全量历史对话 以一般客服场景为例 在电信公司的

代表性原文片段

片段 1

多轮对话中让AI保持长期记忆的8种优化方式篇 来自: AiGC面试宝典 宁静致远 2024年02月08日 10:05 一、前言 在基于大模型的 Agent 中,长期记忆的状态维护至关重要,在 OpenAI AI 应用研究主管 Lilian Weng 的 博客《基于大模型的 Agent 构成》[1]中,将记忆视为关键的组件之一,下面我将结合 LangChain 中的代 码,8 种不同的记忆维护方式在不同场景中的应用。 二、Agent 如何获取上下文对话信息? 2.1 获取全量历史对话 以一般客服场景为例 在电信公司的客服聊天机器人场景中,如果用户在对话中先是询问了账单问题,接着又谈到了网络连接问 题,ConversationBufferMemory 可以用来记住整个与用户的对话历史,可以帮助 AI 在回答网络问题时还 记得账单问题的相关细节,从而提供更连贯的服务。 2.2 滑动窗口获取最近部分对话内容 以商品咨询场景为例 在一个电商平台上,如果用户询问关于特定产品的问题(如手机的电池续航时间),然后又问到了配送方

片段 2

细节,从而提供更连贯的服务。 2.2 滑动窗口获取最近部分对话内容 以商品咨询场景为例 在一个电商平台上,如果用户询问关于特定产品的问题(如手机的电池续航时间),然后又问到了配送方 式,ConversationBufferWindowMemory 可以帮助 AI 只专注于最近的一两个问题(如配送方式),而不 是整个对话历史,以提供更快速和专注的答复。 • 多轮对话中让AI保持长期记忆的8种优化方式篇 • 一、前言 • 二、Agent 如何获取上下文对话信息? • 2.1 获取全量历史对话 • 2.2 滑动窗口获取最近部分对话内容 • 2.3 获取历史对话中实体信息 • 2.4 利用知识图谱获取历史对话中的实体及其联系 • 2.5 对历史对话进行阶段性总结摘要 • 2.6 需要获取最新对话,又要兼顾较早历史对话 • 2.7 回溯最近和最关键的对话信息 • 2.8 基于向量检索对话信息 • 致谢 from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory()

片段 3

from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory() memory.save_context({"input": "你好"}, {"output": "怎么了"}) variables = memory.load_memory_variables({}) 查看更多

2.3 获取历史对话中实体信息 以法律咨询场景为例 在法律咨询的场景中,客户可能会提到特定的案件名称、相关法律条款或个人信息(如“我在去年的交通 事故中受了伤,想了解关于赔偿的法律建议”)。ConversationEntityMemory 可以帮助 AI 记住这些关键 实体和实体关系细节,从而在整个对话过程中提供更准确、更个性化的法律建议。 2.4 利用知识图谱获取历史对话中的实体及其联系 以医疗咨询场景为例 在医疗咨询中,一个病人可能会描述多个症状和过去的医疗历史(如“我有糖尿病史,最近觉得经常口渴

片段 4

性化的法律建议。 2.4 利用知识图谱获取历史对话中的实体及其联系 以医疗咨询场景为例 在医疗咨询中,一个病人可能会描述多个症状和过去的医疗历史(如“我有糖尿病史,最近觉得经常口渴 和疲劳”)。ConversationKGMemory 可以构建一个包含病人症状、疾病历史和可能的健康关联的知识图 谱,从而帮助 AI 提供更全面和深入的医疗建议。 2.5 对历史对话进行阶段性总结摘要 from langchain.memory import ConversationBufferWindowMemory

只保留最后1次互动的记忆

memory = ConversationBufferWindowMemory(k=1) llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) memory = ConversationEntityMemory(llm=llm) _input = {"input": "公众号《LLM应用全栈开发》的作者是莫尔索"} memory.load_memory_variables(_input) memory.save_context( _input,

片段 5

"公众号《LLM应用全栈开发》的作者是莫尔索"} memory.load_memory_variables(_input) memory.save_context( _input, {"output": "是吗,这个公众号是干嘛的"} ) print(memory.load_memory_variables({"input": "莫尔索是谁?"}))

输出,可以看到提取了实体关系

{'history': 'Human: 公众号《LLM应用全栈开发》的作者是莫尔索 \n AI: 是吗,这个公众号 是干嘛的', 'entities': {'莫尔索': '《LLM应用全栈开发》的作者。'}} from langchain.memory import ConversationKGMemory from langchain.llms import OpenAI llm = OpenAI(temperature=0) memory = ConversationKGMemory(llm=llm) memory.save_context({"input": "小李是程序员"}, {"output": "知道了,小李是程序员"})

片段 6

sationKGMemory(llm=llm) memory.save_context({"input": "小李是程序员"}, {"output": "知道了,小李是程序员"}) memory.save_context({"input": "莫尔索是小李的笔名"}, {"output": "明白,莫尔索是小李 的笔名"}) variables = memory.load_memory_variables({"input": "告诉我关于小李的信息"}) print(variables)

输出

{'history': 'On 小李: 小李 is 程序员. 小李 的笔名 莫尔索.'}

以教育辅导场景为例 在一系列的教育辅导对话中,学生可能会提出不同的数学问题或理解难题(如“我不太理解二次方程的求 解方法”)。ConversationSummaryMemory 可以帮助 AI 总结之前的辅导内容和学生的疑问点,以便在随 后的辅导中提供更针对性的解释和练习. 2.6 需要获取最新对话,又要兼顾较早历史对话 以技术支持场景为例

片段 7

yMemory 可以帮助 AI 总结之前的辅导内容和学生的疑问点,以便在随 后的辅导中提供更针对性的解释和练习. 2.6 需要获取最新对话,又要兼顾较早历史对话 以技术支持场景为例 在处理一个长期的技术问题时(如软件故障排查),用户可能会在多次对话中提供不同的错误信息和反 馈。ConversationSummaryBufferMemory 可以帮助 AI 保留最近几次交互的详细信息,同时提供历史问 题处理的摘要,以便于更有效地识别和解决问题。 2.7 回溯最近和最关键的对话信息 以金融咨询场景为例 在金融咨询聊天机器人中,客户可能会提出多个问题,涉及投资、市场动态或个人财务规划(如“我想了 解股市最近的趋势以及如何分配我的投资组合”)。ConversationTokenBufferMemory 可以帮助 AI 聚焦于 最近和最关键的几个问题,同时避免由于记忆过多而导致的信息混淆。 2.8 基于向量检索对话信息 以了解最新新闻事件为例 用户可能会对特定新闻事件提出问题,如“最近的经济峰会有什么重要决策?” VectorStoreRetrieverMemory 能够快速从大量历史新闻数据中检索出与当前问题最相关的信息,即使这

片段 8

对特定新闻事件提出问题,如“最近的经济峰会有什么重要决策?” VectorStoreRetrieverMemory 能够快速从大量历史新闻数据中检索出与当前问题最相关的信息,即使这 些信息在整个对话历史中不是最新的,也能提供及时准确的背景信息和详细报道。 vectorstore = Chroma(embedding_function=OpenAIEmbeddings()) retriever = vectorstore.as_retriever(search_kwargs=dict(k=1)) memory = VectorStoreRetrieverMemory(retriever=retriever) memory.save_context({"input": "我喜欢吃火锅"}, {"output": "听起来很好吃"}) memory.save_context({"input": "我不喜欢看摔跤比赛"}, {"output": "我也是"}) PROMPT_TEMPLATE = """以下是人类和 AI 之间的友好对话。AI 话语多且提供了许多来自其上

片段 9

: "我不喜欢看摔跤比赛"}, {"output": "我也是"}) PROMPT_TEMPLATE = """以下是人类和 AI 之间的友好对话。AI 话语多且提供了许多来自其上 下文的具体细节。如果 AI 不知道问题的答案,它会诚实地说不知道。 以前对话的相关片段: {history} (如果不相关,你不需要使用这些信息) 当前对话: 人类:{input} AI: """

prompt = PromptTemplate(input_variables=["history", "input"], template=PROMPT_TEMPLATE) conversation_with_summary = ConversationChain( llm=llm, prompt=prompt, memory=memory, verbose=True ) print(conversation_with_summary.predict(input="你好,我是莫尔索,你叫什么"))

片段 10

ory=memory, verbose=True ) print(conversation_with_summary.predict(input="你好,我是莫尔索,你叫什么")) print(conversation_with_summary.predict(input="我喜欢的食物是什么?")) print(conversation_with_summary.predict(input="我提到了哪些运动?"))

使用建议

  • 这些内容来自授权公开 PDF 的文本抽取结果,网页端会基于同一份静态索引做关键词检索。
  • 面试复习时建议先用网页 PDF 原文检索定位题目,再回到主 notes 学系统化答案。
  • 如果片段出现排版噪声,以原 PDF 语义为准,并优先整理成自己的回答模板。