LLM 存储优化:大量 QA 与长对话问题实战
针对 AI 大模型长对话 Token 限制及历史记忆丢失问题,采用 LangChain 的 ConversationSummaryMemory 进行摘要存储优化。通过生成对话摘要而非保存全量历史,有效降低 Token 消耗并维持上下文连贯性。文章涵盖面试题解析、核心痛点分析、基于 LCEL 链的实战代码实现,以及变量命名、敏感信息过滤等避坑指南,提供从基础摘要生成到多轮对话链构建的完整方案。

针对 AI 大模型长对话 Token 限制及历史记忆丢失问题,采用 LangChain 的 ConversationSummaryMemory 进行摘要存储优化。通过生成对话摘要而非保存全量历史,有效降低 Token 消耗并维持上下文连贯性。文章涵盖面试题解析、核心痛点分析、基于 LCEL 链的实战代码实现,以及变量命名、敏感信息过滤等避坑指南,提供从基础摘要生成到多轮对话链构建的完整方案。

智能助手开发中,用户聊得久了模型容易'失忆',且大量 QA 信息难以存储。由于模型存在 Token 限制,长对话会导致截断,全存历史又耗资源。本文结合实战经验,讲解如何用 LangChain 的摘要存储解决这个问题。

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

答:用记忆模块(如 LangChain 的 Memory)记录历史,但长对话会超 Token,所以需要摘要存储——不存完整对话,只存关键信息摘要,既保连贯性又省 Token。
答:核心是'压缩历史'——用大模型生成对话摘要,后续交互只传摘要而非全量历史,搭配分布式存储(如 MongoDB、Milvus),平衡连贯性、性能和资源消耗。

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

解决思路很简单:用 ConversationSummaryMemory 生成对话摘要,只存摘要不存全量历史。优势特别明显:
通过摘要存储维护长期上下文,解决'Token 不够用、资源消耗大、连贯性差'三大问题。
就像记笔记——不抄老师每句话,只记重点。模型也一样:用大模型(如通义千问)把对话生成摘要,后续交互只传摘要,相当于'带着笔记聊天',而非'带着整本书聊天'。
先安装依赖:
pip install langchain langchain-openai langchain-core pymilvus # 按需装存储依赖
这是最基础的用法,用来测试摘要效果,看看模型能不能抓关键信息:
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
)
# 初始化摘要记忆(核心组件)
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"])
这是现在项目里用的核心代码,用 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. 初始化大模型
llm = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="你的 api_key",
temperature=0.7
)
# 2. 初始化摘要记忆
memory = ConversationSummaryMemory(
llm=llm,
memory_key="chat_history",
return_messages=True
)
# 3. 定义 prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是 AI 助手,基于对话摘要回答问题,语气亲切像聊天"),
("human", "对话摘要:{chat_history}\n用户现在问:{input}")
])
# 4. 构建 LCEL 链
chain = (
RunnablePassthrough.assign(
chat_history=lambda _: memory.load_memory_variables({})["chat_history"]
)
| prompt
| llm
| StrOutputParser()
)
# 5. 模拟用户多轮对话
user_inputs = [
"怎么用 LangChain 做记忆功能?",
"ConversationSummaryMemory,能存多少轮对话?",
"它和 Milvus 结合的话,怎么存摘要?"
]
# 6. 运行对话
for query in user_inputs:
print(f"\n用户:{query}")
response = chain.invoke({"input": query})
print(f"助手:{response}")
memory.save_context({"input": query}, {"output": response})
current_summary = memory.load_memory_variables({})["chat_history"]
print(f"当前对话摘要:{current_summary}")
看!就算聊多轮,模型也不会'失忆',摘要里全是关键信息,Token 消耗特别少~
| 特性 | LCEL 链 | LLMChain |
|---|---|---|
| 记忆保存 | 需手动调用 memory.save_context() | 自动保存,不用手动写 |
| 链式灵活性 | 高,可加路由、日志 | 固定结构,灵活度低 |
| 调试&扩展 | 可插中间件,适合复杂项目 | 靠 verbose=True 调试,适合入门 |
| 使用场景 | 智能助手、Agent 项目 | 简单对话 demo |
其实解决大量 QA、长对话存储问题,核心就是'抓重点'——用 ConversationSummaryMemory 生成摘要,只存关键信息,再根据项目复杂度选 LCEL 或 LLMChain。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online