云计算百科
云计算领域专业知识百科平台

零基础学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与长对话问题实战
    • 一、先搞懂面试常问:为什么会有“存储优化”需求?
      • 面试题1:传统对话系统每次交互独立,模型无法感知历史,怎么解?
      • 面试题2:长对话超出模型Token能力,信息截断、性能下降,怎么解?
    • 二、大模型存储的3大核心痛点
    • 三、核心解决方案:摘要存储+LangChain实战
      • 核心目标
      • 技术原理
      • 优势
    • 四、带摘要存储的对话系统
      • 实战准备
      • 实战1:基础版——生成对话摘要
      • 实战2:进阶版——带摘要存储的对话链
      • 工藤实战输出效果(真实运行结果)
    • 四、关键知识点:LCEL和LLMChain怎么选?
    • 五、避坑指南
    • 总结

零基础学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不够用、资源消耗大、连贯性差”三大问题。

技术原理

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

优势

  • 省Token:摘要比全量历史小80%,再也不担心超限制;
  • 保连贯:摘要含关键信息,模型知道之前聊了啥;
  • 易扩展:可存在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(快速验证想法)

    五、避坑指南

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

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

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 零基础学AI大模型之LLM存储优化:大量QA与长对话问题实战
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!