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

本站文章一览:

在这里插入图片描述


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

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

0. LangChain中 Memory 实战

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

0.1 记忆封装罗列

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

简单罗列如下:

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

下面看下 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 中的记忆模块,ConversationBufferMemoryConversationBufferWindowMemoryConversationTokenBufferMemory 看起来都无法实现长期记忆的能力:无法持久化(看源码,底层都是一个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 的实现很类似。

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

如果你对AI大模型应用感兴趣,这套大模型学习资料一定对你有用。

1.大模型应用学习大纲

AI大模型应用所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

2.从入门到精通全套视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
在这里插入图片描述
在这里插入图片描述

3.技术文档和电子书

整理了行业内PDF书籍、行业报告、文档,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

请添加图片描述

朋友们如果有需要全套资料包,可以点下面卡片获取,无偿分享!

<think>好的,用户之前问过如何开发一个基于DeepSeek的校园助手应用,现在他们又询问如何使用LangChain框架开发。我需要先回顾之前的对话,确保这次回答能衔接上。用户可能已经对校园助手应用有基本了解,现在想深入技术实现,特别是LangChain应用。 首先,我应该介绍LangChain是什么,以及为什么在开发AI应用时使用它。用户可能不太清楚LangChain的作用,需要简明扼要的解释。比如,LangChain可以帮助集成各种AI模型,管理数据流,处理提示词等。 接下来,要结合之前的校园助手应用场景,说明LangChain如何具体应用如,之前提到的课程管理、校园服务、智能问答等功能,如何用LangChain来实现。可能需要分模块讲解,比如数据连接、处理流程、与DeepSeek的集成等。 用户可能需要具体的代码示,这样他们能更直观地理解。比如,用LangChain调用DeepSeek的API,处理用户查询,访问学校数据库等。需要确保代码示简单易懂,同时指出需要注意的地方,比如API密钥的安全性。 另外,用户可能关心开发步骤和架构设计。之前回答中提到了技术栈和系统架构,这里需要补充LangChain在其中的位置。比如,如何在后端使用LangChain来协调AI模型和其他服务,如何管理对话链和记忆模块。 还要考虑潜在的问题,比如数据隐私、处理复杂查询的效率、多步骤任务的处理等。需要给出解决方案,比如使用LangChain的Agent和Tools来分解任务,或者使用缓存机制优化性能。 最后,应该总结使用LangChain的优势,并邀请用户进一步提问,确保他们如果有更具体的问题可以得到帮助。同时,提醒用户注意合规性和安全性,与之前回答中的建议保持一致。</think>以下是使用LangChain框架开发的系统化指南,结合其核心模块和典型应用场景: --- ### 一、LangChain基础架构 #### 1. **核心组件** | 模块 | 功能描述 | |-----------------|--------------------------------------------------------------------------| | **Models** | 对接大语言模型(如DeepSeek/OpenAI) | | **Prompts** | 管理提示词模板(动态生成高质量query) | | **Chains** | 构建任务流水线(多步骤逻辑串联) | | **Memory** | 维护对话状态(短期记忆+长期记忆存储) | | **Indexes** | 连接外部数据(文档加载/向量数据库) | | **Agents** | 动态决策工具调用(如计算器/API调用) | #### 2. **典型工作流** ``` 用户输入 → [Prompt模板加工] → [LLM推理] → [工具调用] → [记忆更新] → 输出响应 ``` --- ### 二、校园助手开发实战 #### 1. **环境准备** ```python # 安装核心库 pip install langchain langchain-community langchain-core # 对接DeepSeek需要额外安装适配器(假设存在) pip install langchain-deepseek ``` #### 2. **基础问答实现** ```python from langchain_community.llms import DeepSeek from langchain_core.prompts import PromptTemplate # 初始化模型 llm = DeepSeek(api_key="YOUR_KEY", temperature=0.3) # 创建课程咨询模板 prompt = PromptTemplate.from_template( "你是一个校园助手,根据用户专业:{major}和年级:{grade}," "用中文回答关于{course}的问题。当前问题:{question}" ) # 构建链式调用 chain = prompt | llm # 执行查询 response = chain.invoke({ "major": "计算机科学", "grade": "大三", "course": "数据结构", "question": "本周实验课要准备哪些材料?" }) print(response) ``` #### 3. **工具扩展(图书馆查询)** ```python from langchain.agents import Tool, AgentExecutor from langchain.agents import create_react_agent # 自定义图书馆API工具 def search_library(query: str) -> str: # 模拟调用学校图书馆接口 return "《算法导论》可借阅,馆藏位置:A区3层CS书架" tools = [ Tool( name="LibrarySearch", func=search_library, description="用于查询图书馆藏书信息" ) ] # 创建Agent agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools) # 执行工具调用 result = agent_executor.invoke({ "input": "帮我找《算法导论》的借阅信息" }) ``` --- ### 三、关键功能实现模式 #### 1. **课程提醒系统** ```python from langchain.chains import LLMChain from langchain.memory import ConversationBufferMemory # 带记忆的对话链 memory = ConversationBufferMemory() chain = LLMChain( llm=llm, prompt=PromptTemplate.from_template( "作为课程助手,根据用户过往选课记录:{history}," "用亲切的中文风格回答:{input}" ), memory=memory ) # 模拟多轮对话 chain.invoke({"input": "我这学期选了哪些专业课?"}) chain.invoke({"input": "哪门课最近有作业要提交?"}) ``` #### 2. **文档问答系统** ```python from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain_deepseek import DeepSeekEmbeddings # 加载学生手册PDF loader = PyPDFLoader("student_handbook.pdf") pages = loader.load() # 文档处理 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000) docs = text_splitter.split_documents(pages) # 创建向量库 embeddings = DeepSeekEmbeddings() db = FAISS.from_documents(docs, embeddings) # 构建检索链 retriever = db.as_retriever() qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever ) # 查询宿舍管理条 qa_chain.invoke("宿舍晚上几点关门?") ``` --- ### 四、性能优化技巧 #### 1. **缓存策略** ```python from langchain.cache import SQLiteCache import langchain # 启用SQLite缓存 langchain.llm_cache = SQLiteCache(database_path=".langchain.db") ``` #### 2. **流式输出** ```python # 实现逐字输出效果 for chunk in chain.stream({"input": "解释牛顿第三定律"}): print(chunk.content, end="", flush=True) ``` #### 3. **验证与测试** ```python # 使用Pytest编写测试用 def test_course_query(): response = chain.invoke({ "major": "物理", "question": "下周的电磁学实验地点" }) assert "实验楼B栋" in response ``` --- ### 五、部署方案 #### 1. **API服务化** ```python from fastapi import FastAPI from langserve import add_routes app = FastAPI() add_routes(app, chain, path="/course-assistant") ``` #### 2. **监控指标** | 指标 | 监控方式 | |-----------------|--------------------------| | 响应延迟 | Prometheus + Grafana | | API调用错误率 | Sentry异常捕获 | | Token消耗 | 自定义中间件统计 | --- ### 六、典型问题解决方案 1. **长上下文处理** - 使用`LongContextReorder`优化文档检索顺序 - 采用Map-Reduce策略分割长文本 2. **多模态扩展** ```python from langchain_community.document_loaders import ImageCaptionLoader # 处理校园地图图片 loader = ImageCaptionLoader("campus_map.jpg") img_description = loader.load() ``` 3. **权限控制** ```python # 添加角色验证装饰器 def require_student(func): def wrapper(user_role, *args, **kwargs): if user_role != "student": raise PermissionError("仅限学生访问") return func(*args, **kwargs) return wrapper ``` 如果需要具体场景的完整代码实现(如课程表同步Agent),可以提供更详细的需求说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值