零基础学AI大模型之LLM存储优化:大量QA与长对话问题实战

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

前情摘要

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大模型存储记忆功能
54、零基础学AI大模型之LLM大模型存储记忆功能


本文章目录

零基础学AI大模型之LLM存储优化:大量QA与长对话问题实战

哈喽,各位小伙伴!我是工藤学编程🦉 最近有不少粉丝问我:“工藤,做智能助手时,用户聊得久了模型就‘失忆’,大量QA信息存不下怎么办?” 其实这也是我刚开始做AI大模型项目时踩过的坑——模型有Token限制,长对话会截断,全存历史又耗资源。今天就结合我的实战经验,聊聊怎么用LangChain的摘要存储解决这个问题,从面试考点到代码实战,一步步讲明白!

一、先搞懂面试常问:为什么会有“存储优化”需求?

在这里插入图片描述

我之前面试时,面试官就问过两个灵魂问题,正好戳中核心痛点,咱们先吃透这两个问题,后面实战就好理解了:

面试题1:传统对话系统每次交互独立,模型无法感知历史,怎么解?

在这里插入图片描述

答:用记忆模块(如LangChain的Memory)记录历史,但长对话会超Token,所以需要摘要存储——不存完整对话,只存关键信息摘要,既保连贯性又省Token。

面试题2:长对话超出模型Token能力,信息截断、性能下降,怎么解?

答:核心是“压缩历史”——用大模型生成对话摘要,后续交互只传摘要而非全量历史,搭配分布式存储(如MongoDB、Milvus),平衡连贯性、性能和资源消耗。

二、大模型存储的3大核心痛点

在这里插入图片描述

这些痛点真的很影响用户体验,咱们对号入座:

痛点类型具体表现后果
技术限制用户聊10轮就超4k Token限制早期QA信息丢失,回答驴唇不对马嘴
效率瓶颈全量存历史,检索一次要600ms+回复慢,用户吐槽“反应迟钝”
业务&合规风险存用户手机号、需求等敏感信息原文有数据泄露风险,质检溯源难

三、核心解决方案:摘要存储+LangChain实战

在这里插入图片描述

解决思路很简单:用ConversationSummaryMemory生成对话摘要,只存摘要不存全量历史。优势特别明显:

核心目标

通过摘要存储维护长期上下文,解决“Token不够用、资源消耗大、连贯性差”三大问题。

技术原理

就像我记笔记——不抄老师每句话,只记重点。模型也一样:用大模型(如通义千问)把对话生成摘要,后续交互只传摘要,相当于“带着笔记聊天”,而非“带着整本书聊天”。

优势

  1. 省Token:摘要比全量历史小80%,再也不担心超限制;
  2. 保连贯:摘要含关键信息,模型知道之前聊了啥;
  3. 易扩展:可存在MongoDB、Milvus,支持多用户、大数据量。

四、带摘要存储的对话系统

实战准备

先安装依赖:

pip install langchain langchain-openai langchain-core pymilvus # 按需装存储依赖

实战1:基础版——生成对话摘要

这是最基础的用法,我用来测试摘要效果,看看模型能不能抓关键信息:

from langchain.memory import ConversationSummaryMemory from langchain_openai import ChatOpenAI # 初始化大模型(工藤用的通义千问,大家替换自己的api_key) llm = ChatOpenAI( model_name="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", api_key="你的api_key",# 工藤提示:别硬编码,放环境变量里更安全 temperature=0.7# 摘要不用太死板,0.7刚好)# 初始化摘要记忆(核心组件) memory = ConversationSummaryMemory(llm=llm)# 模拟我和用户的对话(工藤项目里的真实对话片段) memory.save_context({"input":"工藤,AI大模型怎么入门?"},{"output":"先学基础概念,再调用API,然后学LangChain、RAG,最后实战做项目"}) memory.save_context({"input":"有没有适合零基础的课程?"},{"output":"可以看我的零基础学AI大模型系列,从API调用讲到Agent实战"})# 取摘要——看看效果 summary = memory.load_memory_variables({})print("工藤项目实战:对话摘要")print(summary["history"])# 输出摘要,只存关键信息# 工藤运行结果:# 用户询问AI大模型零基础入门方法,助手建议先学基础概念、调用API、学LangChain和RAG,再实战;用户又问适合零基础的课程,助手推荐自己的零基础学AI大模型系列。

实战2:进阶版——带摘要存储的对话链

这是我现在项目里用的核心代码,用LCEL链式结构,支持多轮对话,自动更摘要,特别稳定:

from langchain.memory import ConversationSummaryMemory from langchain_openai import ChatOpenAI from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate # 1. 初始化大模型(和我之前的Agent项目用的一样) llm = ChatOpenAI( model_name="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", api_key="你的api_key", temperature=0.7)# 2. 初始化摘要记忆(memory_key要和prompt里的变量名一致!) memory = ConversationSummaryMemory( llm=llm, memory_key="chat_history",# 工藤踩坑:这里和下面prompt的{chat_history}要同名 return_messages=True# 返回消息对象,更灵活)# 3. 定义prompt——必须包含摘要变量(chat_history) prompt = ChatPromptTemplate.from_messages([("system","你是工藤学编程的AI助手,基于对话摘要回答问题,语气亲切像聊天"),("human","对话摘要:{chat_history}\n用户现在问:{input}")])# 4. 构建LCEL链(工藤推荐用这个,比LLMChain灵活) chain =(# 注入输入和记忆摘要 RunnablePassthrough.assign( chat_history=lambda_: memory.load_memory_variables({})["chat_history"])| prompt # 格式化prompt| llm # 调用大模型| StrOutputParser()# 解析输出)# 5. 模拟用户多轮对话(工藤项目里的真实用户提问) user_inputs =["工藤,怎么用LangChain做记忆功能?","之前说的ConversationSummaryMemory,能存多少轮对话?","它和Milvus结合的话,怎么存摘要?"# 依赖上一轮的记忆]# 6. 运行对话(工藤重点注释:LCEL需要手动保存上下文!)for query in user_inputs:print(f"\n用户:{query}")# 调用链获取回复 response = chain.invoke({"input": query})print(f"工藤助手:{response}")# 手动保存上下文到记忆(LLMChain会自动存,LCEL要手动!) memory.save_context({"input": query},{"output": response})# 查看当前摘要(工藤调试时必看,确保摘要正确) current_summary = memory.load_memory_variables({})["chat_history"]print(f"当前对话摘要:{current_summary}")

工藤实战输出效果(真实运行结果)

用户:工藤,怎么用LangChain做记忆功能? 工藤助手:可以用LangChain的Memory模块,比如ConversationBufferMemory存完整历史,ConversationSummaryMemory存摘要,适合长对话... 当前对话摘要: 用户询问如何用LangChain做记忆功能,助手建议使用Memory模块,举例ConversationBufferMemory和ConversationSummaryMemory,后者适合长对话。 用户:之前说的ConversationSummaryMemory,能存多少轮对话? 工藤助手:它没有固定轮数限制,因为存的是摘要,不是全量对话,哪怕100轮,摘要也不会超太多Token... 当前对话摘要: 用户先问LangChain记忆功能做法,助手推荐Memory模块及两个子类;接着用户问ConversationSummaryMemory能存多少轮,助手称无固定限制,因存储的是摘要。 用户:它和Milvus结合的话,怎么存摘要? 工藤助手:可以把生成的摘要转成向量,用LangChain的VectorStoreRetrieverMemory,把摘要存在Milvus里,需要时检索相关摘要... 当前对话摘要: 用户问ConversationSummaryMemory与Milvus结合的存摘要方法,助手建议将摘要转向量,用VectorStoreRetrieverMemory存入Milvus,需用时检索。 

看!就算聊多轮,模型也不会“失忆”,摘要里全是关键信息,Token消耗特别少~

四、关键知识点:LCEL和LLMChain怎么选?

特性LCEL链LLMChain
记忆保存需手动调用memory.save_context()自动保存,不用手动写
链式灵活性高,可加路由、日志(我加了错误捕获)固定结构,灵活度低
调试&扩展可插中间件,适合复杂项目(如多工具调用)靠verbose=True调试,适合入门
工藤使用场景智能助手、Agent项目(复杂场景)简单对话demo(快速验证想法)

五、避坑指南

  1. 变量名要一致:memory_key(如"chat_history")必须和prompt里的变量名一样,不然会报“变量未定义”;
  2. 摘要模板可定制:想让摘要包含更多QA细节,可改prompt,比如加一句“摘要要包含用户问题和助手核心回答”;
  3. 敏感信息过滤:保存摘要前,用正则替换手机号、邮箱,避免合规风险;
  4. 存储扩展:量大时,把摘要存Milvus,用VectorStoreRetrieverMemory,检索更快(之前讲过Milvus实战,可回头看)。

总结

其实解决大量QA、长对话存储问题,核心就是“抓重点”——用ConversationSummaryMemory生成摘要,只存关键信息,再根据项目复杂度选LCEL或LLMChain。

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

Read more

❿⁄₁₂ ⟦ OSCP ⬖ 研记 ⟧ 密码攻击实践 ➱ 获取并破解Net-NTLMv2哈希(上)

❿⁄₁₂ ⟦ OSCP ⬖ 研记 ⟧ 密码攻击实践 ➱ 获取并破解Net-NTLMv2哈希(上)

郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。 🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论 | 保持连接💬 🌌 立即前往 👉晖度丨安全视界🚀 ▶ 信息收集  ▶ 漏洞检测 ▶ 初始立足点  ▶ 权限提升 ▶ 横向移动 ➢ 密码攻击 ➢  获取并破解Net-NTLMv2哈希(上)🔥🔥🔥 ▶ 报告/分析 ▶ 教训/修复 目录 1.密码破解 1.1 破解Windows哈希实践 1.1.1 Net-NTLMv2 协议概述 1.1.1.1 身份验证流程(以访问 SMB 共享为例) 1.1.

By Ne0inhk
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二叉树深度 * 2.1题目 * 2.2 算法原理 * 2.3代码 * 二、 求先序排列 * 3.1题目 * 3.2 算法原理 * 3.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长 一、二叉树深度 2.

By Ne0inhk
2026年 Java 面试八股文总结(完整版)

2026年 Java 面试八股文总结(完整版)

1、Java中有几种类型的流    难度系数:⭐ 2、请写出你最常见的5个RuntimeException    难度系数:⭐ 1. java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。 1. java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。 1. java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。 1. java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。 1. java.lang.IllegalArgumentException 方法传递参数错误。 1. java.lang.ClassCastException 数据类型转换异常。 3、谈谈你对反射的理解    难度系数:⭐ 1. 反射

By Ne0inhk
无中生有——无监督学习的原理、算法与结构发现

无中生有——无监督学习的原理、算法与结构发现

“世界上绝大多数数据都没有标签。 真正的智能,不是在已知答案中选择,而是在混沌中发现秩序。” ——无监督学习的哲学 一、为什么需要无监督学习? 在前七章中,我们系统学习了监督学习(Supervised Learning)的核心范式:给定输入 x\mathbf{x}x 和对应标签 yyy,学习映射 f:x↦yf: \mathbf{x} \mapsto yf:x↦y。无论是线性回归、决策树,还是神经网络,都依赖于标注数据这一稀缺资源。 然而,现实世界的数据绝大多数是未标注的: * 用户浏览日志(只有行为,没有“好/坏”标签); * 医学影像(只有图像,没有诊断结论); * 社交网络(只有连接关系,没有群体划分); * 传感器时序(只有数值流,没有异常标记)

By Ne0inhk