零基础学AI大模型之LLM存储记忆功能之BaseChatMemory

零基础学AI大模型之LLM存储记忆功能之BaseChatMemory
大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型零基础学AI大模型之LLM大模型存储记忆功能

前情摘要

1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的“幻觉”
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战
21、零基础学AI大模型之RAG系统链路构建:文档切割转换全解析
22、零基础学AI大模型之LangChain 文本分割器实战:CharacterTextSplitter 与 RecursiveCharacterTextSplitter 全解析
23、零基础学AI大模型之Embedding与LLM大模型对比全解析
24、零基础学AI大模型之LangChain Embedding框架全解析
25、零基础学AI大模型之嵌入模型性能优化
26、零基础学AI大模型之向量数据库介绍与技术选型思考
27、零基础学AI大模型之Milvus向量数据库全解析
28、零基础学AI大模型之Milvus核心:分区-分片-段结构全解+最佳实践
29、零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用
30、零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例
31、零基础学AI大模型之Milvus索引实战
32、零基础学AI大模型之Milvus DML实战
33、零基础学AI大模型之Milvus向量Search查询综合案例实战
33、零基础学AI大模型之新版LangChain向量数据库VectorStore设计全解析
34、零基础学AI大模型之相似度Search与MMR最大边界相关搜索实战
35、零基础学AI大模型之LangChain整合Milvus:新增与删除数据实战
36、零基础学AI大模型之LangChain+Milvus实战:相似性搜索与MMR多样化检索全解析
37、零基础学AI大模型之LangChain Retriever
38、零基础学AI大模型之MultiQueryRetriever多查询检索全解析
39、零基础学AI大模型之LangChain核心:Runnable接口底层实现
40、零基础学AI大模型之RunnablePassthrough
41、零基础学AI大模型之RunnableParallel
42、零基础学AI大模型之RunnableLambda
43、零基础学AI大模型之RunnableBranch
44、零基础学AI大模型之Agent智能体
45、零基础学AI大模型之LangChain Tool工具
46、零基础学AI大模型之LLM绑定Tool工具实战
47、零基础学AI大模型之LangChain Tool异常处理
48、零基础学AI大模型之CoT思维链和ReAct推理行动
49、零基础学AI大模型之Zero-Shot和Few-Shot
50、零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
51、零基础学AI大模型之个人助理智能体之tool_calling_agent实战
52、零基础学AI大模型之旅游规划智能体之react_agent实战
53、零基础学AI大模型之LLM大模型存储记忆功能


本文章目录

零基础学AI大模型之LLM存储记忆功能之BaseChatMemory

哈喽,各位小伙伴!👋 上一篇我们聊了LLM存储记忆的核心概念和应用场景,知道了短期记忆和长期记忆的区别。今天咱们就往深了钻——聚焦LangChain中聊天记忆的“老祖宗”BaseChatMemory,搞懂它是怎么定义记忆接口、管理对话历史的,还有它的几个常用子类怎么实战使用。就算部分API有过期情况,咱们也能掌握核心思想,轻松上手!

一、什么是BaseChatMemory?

在这里插入图片描述

BaseChatMemory是LangChain中所有聊天型记忆模块的基类,简单说就是“所有聊天记忆的模板”——它定义了记忆存储和检索的通用规则,不管是我们后面要学的ConversationBufferMemory,还是自定义记忆,都得遵守它的规范。

# 核心导入方式from langchain.memory.chat_memory import BaseChatMemory 

它的核心价值在于“标准化”:不管你是想存原始对话,还是存对话摘要,甚至想加密存储、过滤敏感信息,都能通过继承它来实现,不用从零造轮子。

二、BaseChatMemory的核心作用

作为基类,BaseChatMemory主要干三件大事,撑起所有聊天记忆的基础功能:

1. 标准化接口:统一“存”和“取”的方法

不管什么聊天记忆,都得实现两个核心方法,这是BaseChatMemory定好的规矩:

  • save_context():存上下文——把用户输入和模型输出保存到记忆里;
  • load_memory_variables():取记忆——把保存的对话历史加载出来,供大模型使用。

有了统一接口,我们切换不同记忆模块时,代码不用大改,兼容性拉满!

2. 状态管理:维护对话历史

BaseChatMemory会通过内部属性,帮我们管好对话消息的增删改查,不用自己手动维护列表。不管是加一条用户消息,还是清空所有记忆,都有现成的方法可用。

3. 高扩展性:支持自定义逻辑

这是最实用的点!我们可以继承BaseChatMemory,重写它的方法,实现自己的需求:比如保存时过滤“密码”等敏感词,加载时只取最近3天的对话,甚至把记忆加密存储。

三、BaseChatMemory的关键属性和核心方法

要用好BaseChatMemory,先搞懂它的“核心装备”——属性和方法,用起来就像玩游戏用技能一样简单!

1. 关键属性:chat_memory

这是存储对话消息的“容器”,类型是ChatMessageHistory,里面有个messages列表,所有对话消息都存在这里。

每条消息都是BaseMessage的子类,常见的有两种:

  • HumanMessage:用户发送的消息;
  • AIMessage:模型回复的消息。

简单说,chat_memory就像一个“聊天笔记本”,每一页就是一条HumanMessageAIMessage

2. 核心方法:3个常用技能

(1)save_context():保存对话上下文

作用:把用户输入和模型输出成对保存到chat_memory里。
用法有两种,效果完全一样:

# 方法1:直接调用save_context(推荐,简洁) memory.save_context({"input":"你好"},# 用户输入{"output":"你好!有什么可以帮您?"}# 模型输出)# 方法2:手动添加消息到chat_memory memory.chat_memory.add_user_message("你好")# 添加用户消息 memory.chat_memory.add_ai_message("你好!有什么可以帮您?")# 添加AI消息
(2)load_memory_variables():加载记忆

作用:把保存的对话历史取出来,默认返回一个字典,key是“history”,value是对话字符串。
示例:

# 加载记忆 variables = memory.load_memory_variables({})# 打印对话历史print(variables["history"])# 输出结果:# Human: 你好# AI: 你好!有什么可以帮您?
(3)clear():清空记忆

作用:一键清空chat_memory里的所有对话消息,相当于“格式化笔记本”。
示例:

# 清空所有记忆 memory.clear()# 再加载就是空的了print(memory.load_memory_variables({}))# 输出:{"history": ""}

四、BaseChatMemory的常用子类:不用自己写,直接用!

BaseChatMemory是基类,不能直接用,LangChain已经帮我们实现了几个常用子类,覆盖大部分场景,直接拿来用就行~

子类名称核心特点适用场景
ConversationBufferMemory存储完整原始对话历史短对话、需要保留全部对话细节
ConversationBufferWindowMemory只保留最近k轮对话(滑动窗口)长对话、避免token占用过多
ConversationSummaryMemory存储对话摘要(用大模型总结历史)超长对话、需要压缩对话内容

五、子类实战:3个案例

案例1:ConversationBufferMemory——存储完整对话

适合短对话,需要保留每一句聊天内容的场景。

# 1. 导入需要的包from langchain.memory import ConversationBufferMemory # 2. 初始化记忆(return_messages=True:返回消息对象列表,False返回字符串) memory = ConversationBufferMemory( memory_key="chat_history",# 加载记忆时的key(默认就是"history") return_messages=True# 这里设为True,方便看消息类型)# 3. 保存对话上下文 memory.save_context({"input":"你的名字是什么?"},{"output":"我叫工藤助手"}) memory.save_context({"input":"我叫张三"},{"output":"你好张三!很高兴认识你"})# 4. 加载并查看记忆 chat_history = memory.load_memory_variables({})["chat_history"]print("对话记忆:")for msg in chat_history:print(f"类型:{type(msg).__name__},内容:{msg.content}")# 输出结果:# 对话记忆:# 类型:HumanMessage,内容:你的名字是什么?# 类型:AIMessage,内容:我叫工藤助手# 类型:HumanMessage,内容:我叫张三# 类型:AIMessage,内容:你好张三!很高兴认识你# 5. 清空记忆 memory.clear()print("\n清空后记忆:", memory.load_memory_variables({}))# 输出:清空后记忆: {'chat_history': []}

案例2:ConversationBufferWindowMemory——只记最近k轮对话

适合长对话,比如聊了100轮,只想让模型记住最后3轮,避免token不够用。

# 1. 导入需要的包from langchain.memory import ConversationBufferWindowMemory # 2. 初始化记忆:k=2表示只保留最近2轮对话(一轮用户+一轮AI为一轮) memory = ConversationBufferWindowMemory( k=2,# 窗口大小:最近2轮 memory_key="chat_history", return_messages=False# 返回字符串格式,更直观)# 3. 保存3轮对话(会自动只留最后2轮)# 第1轮 memory.save_context({"input":"今天天气怎么样?"},{"output":"今天晴天,适合出游"})# 第2轮 memory.save_context({"input":"适合去公园吗?"},{"output":"适合,公园花开了"})# 第3轮 memory.save_context({"input":"公园要门票吗?"},{"output":"不需要,免费开放"})# 4. 加载记忆:只保留最后2轮(第2、3轮) chat_history = memory.load_memory_variables({})["chat_history"]print("窗口内对话记忆:")print(chat_history)# 输出结果:# 窗口内对话记忆:# Human: 适合去公园吗?# AI: 适合,公园花开了# Human: 公园要门票吗?# AI: 不需要,免费开放

案例3:ConversationSummaryMemory——用摘要压缩对话

在这里插入图片描述

适合超长对话,比如聊了100轮,用大模型把历史对话总结成一段话,既省token又能保留关键信息。

# 1. 导入需要的包from langchain.memory import ConversationSummaryMemory from langchain.chat_models import ChatOpenAI # 需要大模型来生成摘要# 2. 初始化大模型(也可以用开源模型,如通义千问、智谱清言) llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")# 3. 初始化记忆:传入大模型用于生成摘要 memory = ConversationSummaryMemory( llm=llm, memory_key="chat_history", return_messages=False)# 4. 保存多轮对话 memory.save_context({"input":"我叫张三,想学习微积分"},{"output":"好的,我会帮你规划学习路径"}) memory.save_context({"input":"微积分先学什么?"},{"output":"先学极限,这是微积分的基础"}) memory.save_context({"input":"极限怎么学容易?"},{"output":"多练例题,理解无穷小和无穷大的概念"})# 5. 加载记忆:返回的是对话摘要,不是原始对话 summary = memory.load_memory_variables({})["chat_history"]print("对话摘要:")print(summary)# 输出结果(大模型生成,简洁保留关键信息):# 用户张三表示想学习微积分,助手表示会帮他规划学习路径。用户询问微积分先学什么,助手建议先学极限,因为极限是微积分的基础。用户又问极限怎么学容易,助手建议多练例题,理解无穷小和无穷大的概念。

六、怎么选BaseChatMemory子类?一张表搞定!

不知道用哪个子类?看场景选就行,一目了然:

场景需求推荐子类关键参数
短对话、需要完整保留所有对话细节ConversationBufferMemoryreturn_messages
长对话、只想记最近几轮ConversationBufferWindowMemoryk(窗口大小)
超长对话、想压缩对话省tokenConversationSummaryMemoryllm(摘要用的大模型)
要自定义逻辑(过滤敏感词、加密)继承BaseChatMemory重写方法-

总结

在这里插入图片描述

BaseChatMemory作为LangChain聊天记忆的基类,核心是定了“存(save_context)、取(load_memory_variables)、清(clear)”的标准接口,让各种记忆模块有章可循。它的子类不用我们自己写,直接根据场景选:短对话用ConversationBufferMemory,长对话用窗口记忆,超长对话用摘要记忆。

有疑问欢迎在评论区交流,咱们下期再见!👋

Read more

[特殊字符] CoPaw(阿里龙虾AI)Windows 安装及应用指南

1. 什么是 CoPaw? CoPaw 是阿里云通义实验室推出的个人 AI 智能体,可以在电脑上帮你处理各种任务(如信息整理、定时提醒、文件处理等),并支持接入钉钉、飞书、QQ 等聊天软件,实现 24 小时在线办公助手。 2. 系统要求 * 操作系统:Windows 10 或 Windows 11(64位) * Python:3.9 或更高版本(推荐 3.10) * 内存:建议 4GB 以上(运行时占用约 200~500MB) * 磁盘空间:至少 500MB 可用空间 * 网络:需要能够访问外网(用于调用大模型 API) 3.

Anthropic这个新功能:Claude Code Agent Teams,一个人指挥一支AI军团写代码,彻底改变了游戏规则

Anthropic这个新功能:Claude Code Agent Teams,一个人指挥一支AI军团写代码,彻底改变了游戏规则

一个人指挥一支AI军团写代码,Anthropic这个新功能彻底改变了游戏规则 从"一对一结对编程"到"一人管一个AI开发团队",Claude Code Agent Teams让你体验什么叫降维打击。 过去两年,AI编程助手一直在进化——从代码补全,到对话式编程,再到自主执行任务的Agent。但不管怎么进化,本质上都是一个AI、一个人、一段对话。 就像你有一个特别聪明的实习生坐在旁边,你说一句,它干一件。快吗?快。但遇到大项目,它还是得一件一件排队干。 直到Anthropic放出了这个大招—— Agent Teams(智能体团队)。 16个Claude实例同时开工,从零手搓了一个能编译Linux内核的C编译器。10万行代码,耗时不到两周,花费约2万美元。 这不是demo,这是Anthropic官方的极限测试。 今天这篇文章,我把全网的教程、实战案例、踩坑经验全部整理了一遍,帮你搞清楚三个问题: * 这到底是什么? * 怎么用? * 值不值得用? 01

AI入门系列:AI新手必看:人工智能发展历程与现状分析

AI入门系列:AI新手必看:人工智能发展历程与现状分析

写在前面:为什么AI发展历史很重要? 记得刚开始学习AI的时候,我总觉得历史这种东西很枯燥,不如直接学习最新的技术来得实在。但后来我发现,了解AI的发展历程,就像了解一个人的成长经历一样,能帮助我们更好地理解现在的AI是如何走到今天的,也能帮助我们预测未来可能的发展方向。 有一次,我和一位从事AI研究多年的教授聊天,他告诉我:"现在的学生总想直接学习深度学习,但如果不了解符号主义AI的兴衰,就无法理解为什么深度学习会成功,也无法预见它可能面临的挑战。"这句话让我深受启发。 所以,在这篇文章中,我想和大家一起回顾一下AI的发展历程,不是为了考试背诵那些枯燥的年代和事件,而是为了让我们能够站在历史的高度,更好地理解现在的AI技术,以及它在我们生活中的应用。 人工智能的诞生:一个充满想象力的开始 说起AI的诞生,我们不得不提到1956年的达特茅斯会议。这次会议被公认为人工智能学科的诞生标志。 想象一下那个场景:一群来自不同领域的顶尖科学家,包括约翰·麦卡锡、马文·明斯基、克劳德·香农等,聚集在一起,讨论着一个看似疯狂的问题:"机器能思考吗?"他们相信,只要给机器输入足够多的规则

人工智能:自然语言处理在社交媒体分析领域的应用与实战

人工智能:自然语言处理在社交媒体分析领域的应用与实战

人工智能:自然语言处理在社交媒体分析领域的应用与实战 学习目标 💡 理解自然语言处理(NLP)在社交媒体分析领域的应用场景和重要性 💡 掌握社交媒体分析领域NLP应用的核心技术(如文本挖掘、情感分析、主题建模) 💡 学会使用前沿模型(如BERT、GPT-3、Transformer)进行社交媒体文本分析 💡 理解社交媒体领域的特殊挑战(如数据噪声、实时性要求高、用户意图多样性) 💡 通过实战项目,开发一个社交媒体情感分析应用 重点内容 * 社交媒体分析领域NLP应用的主要场景 * 核心技术(文本挖掘、情感分析、主题建模) * 前沿模型(BERT、GPT-3、Transformer)在社交媒体分析领域的使用 * 社交媒体领域的特殊挑战 * 实战项目:社交媒体情感分析应用开发 一、社交媒体分析领域NLP应用的主要场景 1.1 文本挖掘 1.1.1 文本挖掘的基本概念 文本挖掘是对社交媒体文本进行挖掘和分析的过程。在社交媒体分析领域,文本挖掘的主要应用场景包括: * 用户行为分析:分析用户的行为(如“