零基础学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

安装wsl-Ubuntu到D盘

如果你一开始就希望将 WSL(如 Ubuntu)安装到 D 盘,而不是默认安装到 C 盘的 %LOCALAPPDATA% 路径,可以使用以下方法: ✅ 一、图形界面安装(如 Microsoft Store)不能指定安装路径 默认会安装到: C:\Users\<用户名>\AppData\Local\Packages\ 👉 所以,如果你希望初始就安装到 D 盘,必须使用 命令行的导入安装方式 ⬇️ 🧭 二、初始安装 WSL 子系统到 D 盘的方法 ✅ 步骤概览: 1. 下载 .appx 安装包(或 .tar 根文件系统) 2. 解压或导入到

By Ne0inhk
七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)

七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)

容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。Docker 通过强大而灵活的网络子系统来实现这一点。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络 思维导图 一、Bridge 模式 - 默认的网络 bridge 模式是 Docker默认使用的网络模式。当你运行一个容器而不指定--network 参数时,它就工作在这个模式下。 工作原理: Docker 在宿主机上默认创建一个名为 docker0 的虚拟网桥,用来让主机和容器在同一子网内通过 IP 直接通信。每个容器都会被分配一个独立的网络命名空间和一个连接到 docker0 的私有IP地址。 Bridge 模式特性 特性说明网络隔离默认提供良好的网络隔离,每个容器有自己的网络栈。容器间通信连接到同一网桥的容器,可以通过彼此的私有IP地址通信。外部访问必须使用-p 或 -P 进行端口映射,才能从外部访问容器服务。 代码示例: # 1. 启动三个 Nginx

By Ne0inhk
打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车

打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车

Ratel 斗地主服务器是一款基于 Netty 和 Protobuf 开发的轻量级服务端软件,核心功能是搭建斗地主游戏服务,适配 Windows、Linux、macOS 多系统,适合职场上班族、学生群体这类想利用碎片时间休闲的人群,它的核心优点是资源占用极低,CPU 仅占 3%,内存消耗也少,还支持 AI 对手和隐藏进程,日常使用不会给设备带来负担。 使用这款软件时也有一些小细节需要注意,比如在办公场景下启动服务要注意隐藏会话,避免被察觉;和 AI 对战时不同难度模式的出牌节奏有差异,新手可以先从简单模式上手,而且软件启动后需要保持终端窗口运行,不小心关闭就会中断游戏。 不过这款软件仅靠局域网使用时,会遇到不少实际问题:比如上班族想和异地的同事联机,却因为不在同一局域网无法连接;学生在宿舍搭建好服务器,放假回家后就没法和室友继续玩,只能局限在小范围的网络环境里,大大降低了使用的灵活性。 而将 Ratel 斗地主服务器和 cpolar 内网穿透结合后,这些问题就能迎刃而解。cpolar 无需公网 IP 就能把本地的游戏服务映射到公网,

By Ne0inhk
OpenClaw 汉化版完整部署手册:Docker + SSH 隧道 + 多端访问

OpenClaw 汉化版完整部署手册:Docker + SSH 隧道 + 多端访问

0 前言 本文将介绍如何在服务器上部署 OpenClaw(小龙虾) —— 一款基于 Claude Code(Clawdbot/Moltbot)的第三方开源汉化中文发行版。它提供了完整的中文界面适配,让国内用户能够更顺畅地使用 AI 编程助手的强大能力。 为什么要这样部署? 直接在本地运行 Claude Code 存在以下痛点: * 网络限制:国内直连官方服务不稳定,延迟高、访问受阻 * 语言障碍:原版界面为英文,上手门槛较高 * 设备依赖:本地运行受限于单一设备,无法多端共享 通过将 OpenClaw 部署在服务器上,配合 Docker 容器化管理,可以实现 7×24 小时稳定运行、局域网/公网多设备随时访问,一次部署,长期使用。 需要什么服务器? 配置项最低要求推荐配置操作系统Ubuntu 20.04 LTSUbuntu 22.

By Ne0inhk