ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大模型记忆系统:从上下文窗口到长期记忆的完整工程实践

大模型记忆系统:从上下文窗口到长期记忆的完整工程实践 最近和几个做 Agent 应用的朋友聊天大家不约而同地提到一个现象单轮对话的 Demo 很好写但一旦进入多轮任务、跨会话长期使用大模型的表现就明显“断片”。上午聊过的需求下午再问它它已经忘得一干二净。这个问题的背后不是模型本身的推理能力不够而是大模型缺少一套可管理的记忆体系。这也是为什么“给大模型做记忆”这件事能从技术圈一路火到一级市场。近期前华为云 AI 专家郝建业创业做“大模型记忆”方向半年内连续完成三轮融资受到了行业高度关注。它背后的技术本质、工程难点和商业化逻辑值得每一位正在做 Agent、RAG 或 AI 应用开发的从业者认真看一遍。这篇文章不打算只讲新闻我会从更落地的角度拆解四个问题大模型记忆到底是什么它和上下文窗口、RAG 有什么区别。一套可用的记忆系统在架构上由哪些核心模块组成。如何用 Python 和向量数据库从零搭建一个可运行的大模型记忆系统示例。在企业级场景落地时有哪些成本和安全的坑必须提前规避。如果你正在做大模型应用开发或者正准备给项目接入长期记忆能力这篇文章值得收藏。1. 大模型记忆解决的不只是“上下文不够长”很多人第一次接触“大模型记忆”这个概念时会误以为它只是在扩大上下文窗口。模型从 4K 扩到 128K再扩到 1M似乎把对话历史全部塞进去就能解决记忆问题。但从工程视角看这个思路有几个明显瓶颈。第一上下文越长推理成本越高。LLM 的注意力机制决定了计算量和内存占用会随序列长度增长长上下文的每一次请求都可能让单次调用成本线性甚至超线性上升。对于面向 C 端的高频应用这个账基本算不过来。第二全量历史并不等于有效记忆。把一个用户过去三个月的对话全部拼进提示词模型要从中定位关键信息注意力会被大量无关内容稀释。让模型从上万条历史记录里准确回忆起项目背景、用户偏好、上次决策结果效果并不稳定。第三很多任务需要跨会话记忆。一个智能客服系统用户昨天反馈过工单编号今天再次咨询时系统应该主动关联上下文。一个编程助手用户上一次指定了代码风格偏好下一次对话应该继续遵守。这类记忆存放在模型外部不会随着会话结束而消失。所以大模型记忆真正要解决的不是“提高上下文上限”而是“如何在可控成本下让模型在正确的时间、用正确的粒度获取正确的历史信息”。从架构上看它应该是模型外部的一套独立基础设施而不是模型内部的一个参数。郝建业团队在这个方向创业本质上是看准了一个判断当模型能力趋同之后应用层的差异化会越来越依赖记忆、工具、工作流这些外围能力。模型本身只是“大脑”记忆系统才是让大脑持续积累经验、越用越懂用户的关键组件。2. 大模型记忆的核心概念从短期记忆到长期记忆在系统设计大模型记忆之前先把基本概念理清。2.1 短期记忆上下文窗口内的信息短期记忆就是当前对话中模型能直接看到的所有输入内容包括用户消息、系统提示词、工具返回结果。它的特点是生命周期短对话结束即消失。容量有限受上下文窗口限制。速度快不需要额外检索模型直接读入。短期记忆适合存“正在处理的任务状态”。比如用户正在分步骤填写表单每一步的临时输入就应该保存在对话上下文中不需要写入长期存储。2.2 长期记忆模型外部的持久化信息长期记忆是独立于会话存储的信息通常放在数据库或向量数据库中通过检索在需要时注入上下文。它的特点是跨会话持久化可以保留数天、数月。容量理论上无上限。需要“先检索、再注入”因此会引入额外的检索链路。长期记忆适合存“用户的固定特征”“项目的历史决策”“已完成的业务事实”等内容。2.3 工作记忆正在执行的复杂任务状态有些系统还会单独划分“工作记忆”或“任务记忆”专门存放当前多步骤任务的中期状态。比如一个数据分析 Agent 正在执行三步操作第一步产出的中间表格第二步要用到但第三步又不需要了。这时如果把中间结果塞回长期记忆会造成污染如果不保存第二步就没法执行。工作记忆的作用就是在任务生命周期内维护这类临时状态。一个成熟的记忆系统通常会把这三层记忆分开管理记忆类型存储位置生命周期典型案例短期记忆对话上下文会话结束即失效当前问题、临时输入工作记忆内存或临时表任务完成即清理多步骤任务的中间结果长期记忆数据库/向量库跨会话持久化用户偏好、历史决策、业务事实有了这个分层再去看市面上各种“记忆增强”方案就能判断它的定位是偏哪一层。很多看似复杂的框架本质上就是把短期记忆之外的信息用某种方式持久化并在需要时取回。3. 记忆系统的四个核心模块提取、存储、检索、注入如果把记忆系统当成一个独立服务来设计它至少包含四个模块。3.1 记忆提取记忆提取解决的是“什么信息值得记”的问题。不能把用户说的每一句话都存下来那会制造大量噪声。工程上通常有两种策略规则提取识别固定字段比如用户 ID、项目名、日期、偏好设置。适合结构化程度高的场景。模型提取用 LLM 对当前对话做摘要抽取关键事实然后转成结构化记录或向量。适合开放域对话。更复杂的系统会把两者结合。先用规则做槽位抽取再用 LLM 做语义摘要最后过滤掉低价值信息。3.2 记忆存储存储层解决“记忆放在哪”的问题。结构化事实用户偏好、订单状态适合放关系数据库。语义化的长文本产品偏好描述、项目背景适合放向量数据库。混合型记忆通常要求两类数据库同时存在。存储时还要考虑记忆的元数据比如创建时间、更新时间、来源会话 ID、用户 ID、记忆类型、访问权限。没有元数据的记忆后续无法做生命周期管理和权限控制。3.3 记忆检索检索解决“什么时候取哪些记忆”的问题。最朴素的方式是向量相似度检索把当前用户问题转成向量去向量库里找最相近的历史记忆。但实际工程中单纯靠向量相似度远远不够还需要叠加时间衰减太久远的记忆降权。业务过滤只检索当前用户、当前项目的记忆。权限过滤当前 Agent 只能看到有权限的记忆。多样性控制防止检索结果全是同一条记忆的不同表述。3.4 记忆注入注入解决“检索到的记忆如何影响模型输出”的问题。最常见的做法是把记忆拼到 System Prompt 中作为背景信息。注入时需要考虑记忆总量不能超过上下文预算。多条记忆之间要按重要程度排序。注入的记忆必须标明来源和时点避免模型把过期信息当成新事实。这一步做得不好会出现一种很尴尬的情况模型明明检索到了记忆却在回答时使用了错误的记忆或者把旧信息当成当前事实。稍微严谨一点的系统会在注入模板里明确标注“以下是用户过往偏好可能不是最新内容如与本次对话冲突以本次对话为准”。4. 从零实现一个极简的大模型记忆系统理论讲完进入实操。下面用一个最小可运行的示例演示完整链路对话结束 → 提取记忆 → 写入向量库 → 用户再次提问 → 检索记忆 → 注入提示词 → 模型回答。这个示例使用 Python向量库用 Chroma轻量级、可本地运行LLM 部分用 OpenAI 兼容的接口环境变量来控制以便你替换成任何可用的大模型服务。4.1 环境准备先安装依赖pip install chromadb openai python-dotenv版本建议以你本地环境为准。Chroma 是嵌入式向量数据库本地运行不需要额外启动服务适合做原型验证。4.2 编写记忆服务类创建memory_service.py封装记忆的写入和检索逻辑。# 文件路径memory_service.py import uuid from datetime import datetime import chromadb from chromadb.config import Settings class MemoryService: def __init__(self, collection_nameuser_memory): # 使用本地持久化目录重启不丢数据 self.client chromadb.PersistentClient( path./chroma_data, settingsSettings(anonymized_telemetryFalse), ) self.collection self.client.get_or_create_collection( namecollection_name, metadata{hnsw:space: cosine}, ) def add_memory(self, user_id: str, memory_text: str, metadata: dict None): 写入一条记忆。 memory_text 是经过提取或摘要后的记忆文本。 memory_id str(uuid.uuid4()) base_metadata { user_id: user_id, memory_type: long_term, created_at: datetime.utcnow().isoformat(), } if metadata: base_metadata.update(metadata) self.collection.add( ids[memory_id], documents[memory_text], metadatas[base_metadata], ) return memory_id def search_memory(self, user_id: str, query: str, top_k: int 5): 检索某个用户相关的记忆。 注意过滤 user_id避免串号。 results self.collection.query( query_texts[query], n_resultstop_k, where{user_id: user_id}, ) documents results.get(documents, [[]])[0] metadatas results.get(metadatas, [[]])[0] return list(zip(documents, metadatas))这里做了两层关键设计使用PersistentClient而不是内存模式保证服务重启后记忆不丢。检索时强制加where{user_id: user_id}过滤避免多用户数据互相污染。4.3 用 LLM 做记忆提取原始对话不能直接存需要先让模型提取关键信息。创建memory_extractor.py# 文件路径memory_extractor.py from openai import OpenAI client OpenAI() # 通过环境变量 OPENAI_API_KEY 配置密钥 def extract_memories(conversation_text: str) - list[str]: 将一段对话文本交给 LLM提取出值得长期记住的事实。 返回一个字符串列表每一项是一条独立记忆。 prompt f 你是一个记忆抽取引擎。请从下面的对话中提取出值得长期记住的 用户偏好、项目背景、关键决策、重要事实。 要求 1. 只输出 JSON 数组不要输出其他内容。 2. 每条记忆必须是对事实的陈述不能是疑问句。 3. 如果没有任何值得记住的信息输出空数组 []。 4. 不要重复避免把同一事实拆成多条。 对话内容 {conversation_text} resp client.chat.completions.create( modelgpt-4o-mini, # 可以替换为你的模型 messages[ {role: system, content: 你是一个信息抽取助手。}, {role: user, content: prompt}, ], temperature0, ) content resp.choices[0].message.content.strip() # 简单起见这里不处理异常字符生产环境建议用 json.loads 并做容错 import json try: return json.loads(content) except json.JSONDecodeError: return []这里比较关键的一点是温度设置为 0。记忆提取任务应该追求稳定不需要模型发挥创造力。temperature0可以在大多数情况下减少输出格式变异。生产环境还要加 JSON 解析失败重试、格式修复等兜底逻辑。4.4 串联记忆写入流程创建save_conversation_memory.py演示“对话结束后写入记忆”的完整流程# 文件路径save_conversation_memory.py from memory_extractor import extract_memories from memory_service import MemoryService USER_ID user_123 conversation 用户我平时用 Java 写微服务喜欢用 Maven不太喜欢 Gradle。 助手好的后续项目配置我会优先按 Maven 习惯来。 用户对了我们项目的部署环境是 K8s优先走容器化。 # 1. 提取记忆 memories extract_memories(conversation) print(提取到的记忆, memories) # 2. 写入记忆库 svc MemoryService() for mem in memories: mem_id svc.add_memory(USER_ID, mem) print(写入记忆 ID, mem_id)运行python save_conversation_memory.py预期会输出一段类似的内容提取到的记忆 [用户偏好使用 Java 和 Maven 构建微服务, 项目部署环境为 Kubernetes 容器化] 写入记忆 ID 2f3c9b1a-xxxx-xxxx-xxxx-xxxxxxxxxxxx这里要强调记忆写入应该放在对话结束后异步执行不能阻塞在线响应链路。如果提取失败也不应该影响用户正在进行的对话。4.5 检索记忆并注入提示词创建query_with_memory.py演示用户新提问时如何把记忆检索出来并注入到提示词中# 文件路径query_with_memory.py from openai import OpenAI from memory_service import MemoryService USER_ID user_123 # 检索记忆 svc MemoryService() results svc.search_memory(USER_ID, 帮我配置一个新的微服务项目, top_k5) print(检索到的记忆, results) # 拼装带记忆的提示词 memory_block \n.join([f- {doc} for doc, _ in results]) system_prompt f你是一个智能助手。以下是与用户相关的长期记忆可能不是最新内容。 如果与本次对话冲突以本次对话为准。 如果记忆与当前问题无关请忽略。 用户长期记忆 {memory_block if memory_block else 暂无} client OpenAI() resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: system_prompt}, {role: user, content: 我用 Java 写微服务帮我初始化一个项目结构。}, ], ) print(助手回答, resp.choices[0].message.content)运行python query_with_memory.py如果记忆检索链路正常模型应该能主动带上“用户偏好 Maven”这一信息而不是把项目初始化为 Gradle。这个示例虽然只有几十行代码却完整覆盖了记忆系统的四个核心模块提取extract_memories完成。存储MemoryService.add_memory完成。检索MemoryService.search_memory完成。注入system_prompt拼接完成。实际项目里只需要把这个流程扩展成异步任务并加上更多元数据过滤和权限控制。5. 从“记录”到“有用”记忆的总结、遗忘与优先级一个简单的记忆写入和检索能解决 Demo 问题但距离生产可用还差得很远。最容易踩的坑是记忆存得太多、太乱反而让模型更糊涂。5.1 记忆压缩与摘要随着时间推移同一个人可能产生几十条记忆。如果全部注入提示词会挤占上下文空间。常规做法是定期把旧记忆交给 LLM 做进一步摘要合并重复项。把同一主题的记忆归组只保留组级摘要。设定记忆条数上限超出后丢弃最不重要的部分。5.2 记忆遗忘机制遗忘不是缺陷而是一种工程上的自我保护。有些记忆会过时比如用户曾经说“我不用 Python”半年后可能已经转变。遗忘策略常见有三种时间衰减超过一定期限未访问的记忆自动降权或删除。显式删除用户主动说“忘掉我上次说的偏好”系统要能执行。冲突覆盖用户新的表述和旧记忆冲突时默认新记忆覆盖旧记忆。冲突覆盖这件事尤其重要。很多系统只做“追加记忆”不做“更新记忆”导致用户已经改变了偏好模型还在沿用三个月前的老信息体验非常糟糕。5.3 记忆分级与优先级不是所有记忆对回答的贡献一样大。工程上可以给记忆加上重要度标签优先级记忆类型注入策略P0身份信息、账号信息每次请求固定注入P1用户偏好、关键决策按相关性检索注入P2历史对话摘要按需检索防止过时这样设计的好处是最关键的记忆不会因为向量相似度排名靠后而丢失。6. 企业级大模型记忆系统的最佳实践与踩坑清单进入企业项目记忆系统不再只是代码问题还涉及成本、安全、权限和运维。以下几条经验来自真实的 Agent 应用落地过程希望能帮你少走弯路。6.1 成本控制记忆链路要避免“每步都调模型”最典型的成本陷阱是对话中的每一轮都调用 LLM 做记忆提取。用户聊 10 句模型被调用 10 次额外提取成本直接翻倍。更合理的做法是只在用户消息结束、助手准备回复前的关键节点做提取。提取任务异步执行失败不影响主流程。对高频简单对话只做规则抽取不调 LLM。6.2 数据安全与权限隔离记忆系统天然会积累大量用户隐私。必须遵守几个底线记忆数据按用户级、会话级隔离绝不允许跨租户检索。数据库连接使用最小权限账号应用层不能使用管理员权限。对包含敏感信息的记忆存储前做脱敏或加密处理。用户有权查看、导出、删除自己的记忆数据这是合规底线。检索记忆时的where{user_id: user_id}过滤只是应用层的第一道防线。生产环境还应该在数据库层面做行级权限或在向量库侧做租户隔离而不是只依赖业务代码自觉。6.3 可观测性与回滚记忆系统的问题是“慢性病”很难在单次对话中发现需要靠指标监控记忆写入量、检索耗时、检索命中率。因记忆注入导致的回答偏好变化建议做 A/B 对比。用户对“记忆相关回答”的负面反馈率。一旦发现记忆策略导致模型回答质量下降要能快速回滚。建议记忆服务本身配置开关可以瞬间停用记忆注入让系统退回“无记忆模式”而不是临时改代码。6.4 生产环境还要注意什么不要用同步 HTTP 调用串起整条记忆写入链路建议引入消息队列。向量数据库和关系数据库都要做备份记忆数据是核心资产。定期清理低价值记忆索引避免向量库无限膨胀。对检索结果增加超时控制和降级策略检索失败时直接走无记忆模式而不是报错。7. 大模型记忆赛道的观察与开发者的机会回到文章开头提到的融资事件。郝建业从学术研究者和华为云技术专家转型创办公司专注“大模型记忆”半年内连续完成三轮融资。这个速度说明资本市场对“模型外围能力层”的重视程度正在上升。从趋势看大模型应用正在从“单轮问答”走向“多步任务、长期服务”。只要 Agent 需要承担更复杂的工作记忆就会从可选项变成必选项。无论是智能客服、个人助理、编程助手还是企业知识库机器人用户都会要求“系统懂我”而不是“每次重新认识我”。对开发者来说这个方向有几个可以切入的机会基础组件层做通用的记忆存储、检索、生命周期管理组件封装成 SDK 或服务。垂直场景层针对法律、医疗、教育、客服等特定行业做带有行业知识的记忆模板。工具链层做记忆可视化、调试工具帮助其他开发者理解模型到底记住了什么、为什么这样回答。最后给一个实际建议不管你现在用什么框架继续做 Agent都应该尽早把记忆模块从业务代码里抽离出来。先让它成为一个独立的服务定义好接口再慢慢迭代内部策略。模型会换提示词会改但“用户与业务数据的记忆沉淀”是长期价值。8. 总结大模型记忆不是把上下文窗口无限拉大也不是简单接一个向量数据库而是一套覆盖“提取、存储、检索、注入、遗忘、更新”的完整工程体系。它解决的是 Agent 能否长期服务、越用越懂用户的核心问题。从融资热度来看这个赛道的价值已经被资本市场认可。从技术落地来看一张清晰的记忆分层架构、一套可靠的数据隔离机制、一组合理的成本控制手段才是项目能否从 Demo 走向生产的关键。如果你正在做 Agent 应用建议下一步先把你现在项目的对话数据收集起来尝试用今天示例中的记忆服务类跑通“写入—检索—注入”的最小闭环。等这个链路稳定了再逐步加入摘要、分类、更新和权限控制。记忆这件事越早做越好因为它是一个需要长期积累数据才能发挥价值的系统。
返回列表