【AI大模型应用开发】以LangChain为例:从短期记忆实战,到如何让AI应用保持长期记忆的探索

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 【AI大模型应用开发】以LangChain为例:从短期记忆实战,到如何让AI应用保持长期记忆的探索
  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:


AI应用中,无论是多轮对话场景、RAG场景还是AI Agent场景中,记忆能力都是不可或缺的一部分。然而,记忆能力是目前大模型的短板,所以,现在很多框架,诸如 LangChain、MetaGPT 等,都封装了自己的记忆模块,以方便开发者实现自己大模型应用的记忆功能。

之前我们简单概览了一下 LangChain 的 Memory 模块(【AI大模型应用开发】【LangChain系列】3. 一文了解LangChain的记忆模块(理论实战+细节)),那只是在多轮对话场景中,简单的取最近几次的对话历史作为记忆。这是最简单的使用记忆的方法,也是短期记忆的一种。

本文我们来系统看下实现大模型应用记忆的方法,包括短期记忆和长期记忆。还是以LangChain为例来进行实战。

0. LangChain中 Memory 实战

我这里将记忆简单理解为对话历史,查询历史等历史记录。

0.1 记忆封装罗列

在 LangChain 中提供了多种获取记忆的封装,例如ConversationBufferMemoryConversationBufferWindowMemoryConversationTokenBufferMemory等。

简单罗列如下:

  • ConversationBufferMemory可以理解为通用的将全部的历史记录取出来。
  • ConversationBufferWindowMemory可以理解为滑动窗口,每次只取最近的K条记录。
  • ConversationTokenBufferMemory可以理解为控制每次取的历史记录的Token数。
  • ConversationSummaryMemory: 对上下文做摘要
  • ConversationSummaryBufferMemory: 保存 Token 数限制内的上下文,对更早的做摘要
  • VectorStoreRetrieverMemory: 将 Memory 存储在向量数据库中,根据用户输入检索回最相关的部分
  • ConversationEntityMemory:保存一些实体信息,例如从输入中找出一个人名,保存这个人的信息。
  • ConversationKGMemory:将历史记录按知识图谱的形式保存和查询

这里面的大部分记忆封装,之前咱们已经学习过了,这里不再重复。详细的使用教程可以参考我之前的文章:【AI大模型应用开发】【LangChain系列】3. 一文了解LangChain的记忆模块(理论实战+细节)

下面看下 VectorStoreRetrieverMemory 的使用和实现效果。

0.2 实践:VectorStoreRetrieverMemory的使用

0.2.1 完整代码

from langchain.memory import VectorStoreRetrieverMemory
from langchain_openai import ChatOpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
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 话语多且提供了许多来自其上下文的具体细节。如果 AI 不知道问题的答案,它会诚实地说不知道。
以前对话的相关片段:
{history}
(如果不相关,你不需要使用这些信息)
当前对话:
人类:{input}
AI:
"""
prompt = PromptTemplate(input_variables=["history", "input"], template=PROMPT_TEMPLATE)
chat_model = ChatOpenAI()
conversation_with_summary = ConversationChain(
    llm=chat_model,
    prompt=prompt,
    memory=memory,
    verbose=True
)
print(conversation_with_summary.predict(input="你好,我叫同学小张,你叫什么"))
print(conversation_with_summary.predict(input="我喜欢干什么?"))

0.2.2 代码解释

(1)代码中我们使用了 VectorStoreRetrieverMemory 作为记忆存储和获取的模块。它既然是向量存储和查询,所以接收参数:retriever=retriever,必须要穿给它一个向量数据库才能工作。

(2)然后使用了 ConversationChain 作为对话的Chain。它接收一个 memory = memory 参数设置,指定使用的记忆类型。默认是最普通的 ConversationBufferMemory 类型。

(3)什么时候会去检索记忆呢?在Chain运行 invoke 的一开始,就加载了。源码如下:

可以看到,最后就是用用户的输入,去向量数据库中检索相关的片段作为需要的记忆。

0.2.3 运行效果展示

第一个问题,检索到的内容不相关,但是也得检索出一条。

第二个问题,检索到的内容相关,用检索到的内容回答问题。

1. 如何让AI应用具备长期记忆?

我这里将“长期记忆”理解为持久化记忆或者长上下文记忆。也就是两种形式的记忆我都认为是“长期记忆”:

  • 第一种:持久化记忆,对话历史等历史记录持久化保存,不会随着进程的退出而消失。例如保存成功文件或存储进数据库等。
  • 第二种:长上下文记忆,当历史记录特别多时,如何从历史记录中找出有用的记忆,而不是只关注最近的几条历史记录。

1.1 LangChain 中的记忆模块是否具有长期记忆的能力?

上面罗列的和实战的 LangChain 中的记忆模块,ConversationBufferMemory

ConversationBufferWindowMemoryConversationTokenBufferMemory 看起来都无法实现长期记忆的能力:无法持久化(看源码,底层都是一个List类型,保存到内存,随着进程消亡而消亡),也没法查询长的上下文。

ConversationSummaryMemoryConversationSummaryBufferMemory 在一定程度上能提供更多的记忆信息(因为其对之前的历史记录做了总结压缩),所以在某些上下文不是特别长的场景中,还是可以用一用来实现简单的长期记忆能力的。

ConversationEntityMemoryConversationKGMemory一个只保存实体信息,一个将历史记录组织成知识图谱,会对长上下文场景中的长时记忆功能非常有用。它可以从全局的角度将用户提问中的实体或相关知识作补充,而不是关注最近的几次对话。

VectorStoreRetrieverMemory应该是最好和最能实现长期记忆能力的类型了。一方面,它是向量数据库存储,可以方便的持久化数据,另一方面,它的向量检索能力,本来就是针对用户提问检索出最相关的文档片段,不受长上下文的窗口限制。但是其检索的相关片段之间是否存在信息缺失等,会影响长时记忆的准确性,从而影响最终的结果。

所以,ConversationEntityMemoryConversationKGMemory + VectorStoreRetrieverMemory 是否可以一试?三者结合,保持相关片段的相关性,同时利用实体关系和知识图谱进行补充,是否可以更好地实现长时记忆的能力?感兴趣的可以一起讨论~

1.2 关于让AI应用具备长期记忆的一些研究

1.2.1 记忆思考:回忆和后思考使LLM具有长期记忆

论文原文:Think-in-Memory: Recalling and Post-thinking Enable LLMs with Long-Term Memory

这篇文章提出了一种名为TiM(Think-in-Memory)的记忆机制,旨在使LLM在对话过程中保持记忆,存储历史思考。TiM包括两个关键阶段:在生成回复之前,LLM从记忆中回想相关思考;在生成回复之后,LLM进行后思考并将历史和新思考结合起来更新记忆。

下图描述了TiM方法的使用方式:

(1)在回答第二个问题时,需要考虑问题1的内容,从问题1中推理出答案,而后在回答问题2。

(2)在回答第三个问题时,需要同时考虑问题1和问题2,从问题1和问题2中推理出答案,而后再回答问题3。

这就导致了问题的存在:问题1被推理了两遍,两遍的结果还可能不一样,导致最终的错误。

而TiM的思路,是将每一个问题的思考也存起来,这样,在回答问题3时,可以使用问题2之前的思考,避免重新思考问题1,从而避免多次思考结果不一致导致的错误。

具体步骤如下:

总的原理是,将相关的记忆放到一起,例如上图中,关于book的谈话放到index 0中,关于moive的谈话放到index 1中。

如何将相关内容放到一起的?论文中实现了一种基于局部敏感哈希(LSH)的存储系统,用于高效地存储和检索大规模的向量数据。LSH的作用是将每个向量映射到一个哈希索引,相似的向量有更高的概率被映射到相同的哈希索引。

而相同的哈希索引可以将用户问题固定到某一块记忆中,然后只在这一块记忆中进行向量检索,大大提高了检索效率。

这篇文章还是值得精读一下的,数据的组织方式和索引方式都比较高级,很有启发。

1.2.2 递归总结在大型语言模型中实现长期对话记忆

论文原文:Recursively Summarizing Enables Long-Term Dialogue Memory in Large Language Models

这篇文章提出了一种递归总结的方法,用于增强大模型的长期记忆能力,以解决在长对话中无法回忆过去信息和生成不一致响应的问题。该方法首先刺激LLM记忆小的对话上下文,然后递归地使用先前的记忆和后续的上下文生成新的记忆。

其流程如下:

简单概括,就是:上一轮的内容总结 + 本轮的问题回答 = 本轮的内容总结。本轮的内容总结 + 下轮的问题回答 = 下轮的内容总结。… 不断迭代。与 LangChain中ConversationSummaryMemory 的实现很类似。

这种方法每一轮都要总结一次,也就是调用一次大模型,使用成本很高啊… 实际生产中应该落地比较难。

1.2.3 更多研究

更多关于AI应用 Memory 的研究可以参考下面这个文章:

LLM-based Agent Memory相关论文集锦

加个TODO,还没看完,大家可以一起看。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
当前AI大模型在软件开发中的创新应用与挑战
2024年,AI大模型在软件开发领域的应用正重塑传统流程,从自动化编码、智能协作到代码审查和测试,显著提升了开发效率和代码质量。然而,技术挑战、伦理安全及模型可解释性等问题仍需解决。未来,AI将继续推动软件开发向更高效、智能化方向发展。
|
6天前
|
机器学习/深度学习 人工智能 算法
AI在医疗领域的应用与挑战
本文探讨了人工智能(AI)在医疗领域的应用,包括其在疾病诊断、治疗方案制定、患者管理等方面的优势和潜力。同时,也分析了AI在医疗领域面临的挑战,如数据隐私、伦理问题以及技术局限性等。通过对这些内容的深入分析,旨在为读者提供一个全面了解AI在医疗领域现状和未来发展的视角。
35 10
|
5天前
|
存储 人工智能 固态存储
如何应对生成式AI和大模型应用带来的存储挑战
如何应对生成式AI和大模型应用带来的存储挑战
|
1月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
127 2
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
239 2
|
15天前
|
人工智能 JSON API
阿里云文档智能 & RAG解决方案:提升AI大模型业务理解与应用
阿里云推出的文档智能 & RAG解决方案,旨在通过先进的文档解析技术和检索增强生成(RAG)方法,显著提升人工智能大模型在业务场景中的应用效果。该方案通过文档智能(Document Mind)技术将非结构化文档内容转换为结构化数据,提取文档的层级树、样式和版面信息,并输出为Markdown和Json格式,为RAG提供语义分块策略。这一过程不仅解决了文档内容解析错误和切块丢失语义信息的问题,还优化了输出LLM友好的Markdown信息。方案的优势在于其多格式支持能力,能够处理包括Office文档、PDF、Html、图片在内的主流文件类型,返回文档的样式、版面信息和层级树结构。
75 2
|
25天前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
56 2
|
26天前
|
弹性计算 自然语言处理 安全
国内基础大模型的独立性及应用大模型的依赖性
本文探讨了国内基础大模型(如阿里巴巴的通义千问)的独立性及其应用大模型的依赖性。详细分析了这些模型的研发过程、应用场景及技术挑战,包括数据收集、模型架构设计和算力支持等方面。同时,讨论了微调模型、插件式设计和独立部署等不同实现方式对应用大模型的影响。
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
当前AI大模型在软件开发中的创新应用与挑战
【10月更文挑战第31天】2024年,AI大模型在软件开发领域的应用取得了显著进展,从自动化代码生成、智能代码审查到智能化测试,极大地提升了开发效率和代码质量。然而,技术挑战、伦理与安全问题以及模型可解释性仍是亟待解决的关键问题。开发者需不断学习和适应,以充分利用AI的优势。
|
12天前
|
人工智能 自然语言处理 算法
政务培训|LLM大模型在政府/公共卫生系统的应用
本课程是TsingtaoAI公司面向某卫生统计部门的政府职员设计的大模型技术应用课程,旨在系统讲解大语言模型(LLM)的前沿应用及其在政府业务中的实践落地。课程涵盖从LLM基础知识到智能化办公、数据处理、报告生成、智能问答系统构建等多个模块,全面解析大模型在卫生统计数据分析、报告撰写和决策支持等环节中的赋能价值。
35 2