智能体Agent记忆系统深度解析:短期上下文与长期外部存储对比指南

2026-05-26阅读 0热度 0
其他

上一期我们解决了AI网关的成本与安全问题。现在,让我们深入模型内部:它究竟是如何“理解”上下文的?当对话历史不断增长,关键事实需要跨会话留存,再加上外部知识库的检索结果,如果将所有信息都塞入提示词,上下文窗口和项目预算都将不堪重负。一个高效的记忆系统,必须清晰回答:哪些信息应保留在短期上下文?哪些应存入外部记忆?以及,读写操作应遵循怎样的路径?

两类「记忆」,别混成一个数组

从工程角度看,记忆必须拆分为两类独立管理,混合处理只会带来混乱:

  1. 短期上下文
    这是当前轮次直接发送给模型的消息序列,包含系统指令和最近的若干轮对话。它通常源自会话消息表,但在组装时必须经过上下文预算的严格审核——超出软限制则静默丢弃最旧的对话,超出硬限制则可能触发安全降级或直接终止。
  2. 长期/分层外部记忆
    这是一套结构化的记录系统,包含租户、层级(短/中/长)、键、载荷和时间戳。它通过独立的记忆服务进行读写,后端可灵活替换,如SQLite、进程内存储或Mem0等专业平台。核心原则:它绝非将完整聊天记录直接追加到提示词中。

在聊天应用中,典型的组合是:消息表记录“原始对话流水账”,而记忆服务则管理经过提炼、抽取的事实或会话摘要等可检索片段。在信息注入模型前,由协调层决定具体纳入哪个范围(会话级或用户级)的记忆。

Memory Service:薄门面,重隔离

对外接口应保持极简:记住(写)、回想(读)、清理(按租户清除)。每条记录都携带租户ID、层级、键和载荷等核心元数据。

这里有一条铁律:租户隔离不容妥协。若请求中的租户ID与目标租户不匹配,必须直接拒绝并记录审计日志——绝不能依赖后端存储“偶然”返回正确数据。这种设计确保了无论底层使用SQLite还是外部平台,越权访问的风险都已被提前锁定。

在具体实现上,Agentium项目采用三层枚举(SHORT / MID / LONG)来清晰定义时间尺度,避免了业务代码中散落晦涩的魔法字符串:

层级 典型内容 生命周期
SHORT 单轮对话摘要、工具调用结果快照 较短,可由后台任务整理
MID 会话级摘要、本次会话中提取的关键事实 跟随session_idrun_id
LONG 跨会话的用户偏好、稳定的个人事实 跟随user_id,作用域更广

写入路径通常在对话轮次结束后异步或“发射后不管”式执行:SHORT层内容优先落盘,随后可选择性通过LLM抽取,晋升至MID或LONG层。读取路径则发生在下一轮组装提示词或响应API查询时,需按层级和作用域进行过滤

后端可插拔:协议固定,实现可换

记忆服务之下,应定义清晰的后端协议,如追加查询清理租户。通过工厂模式根据配置实例化不同后端:

  • 内存存储:用于单元测试和演示;
  • SQLite:实现本地持久化,便于备份;
  • Mem0等外部服务:利用托管的检索与向量化能力,但需接受数据出境和额外的API依赖。

关键在于,上层协调逻辑仅依赖记忆服务接口,绝不直接耦合具体后端的实现——这划定了“可插拔”的边界。企业内网部署可换用SQLite,SaaS试点可接入Mem0,而对话轮次的核心逻辑无需任何改动。

泳道路由:同一会话,不同存储策略

当系统同时配置本地原生外部Mem0两条泳道时,绝不能全局写死使用单一泳道。更稳健的做法是:根据会话元数据进行动态解析。例如,工作区标记了memory_plugin: mem0则走外部泳道,默认则走本地原生。

这里有一条优先级更高的原则:隐私先于成本。若会话被标记为local_onlyon_prem等有数据驻留要求,必须禁止其使用Mem0泳道——即使用户偏好外部存储,也需强制降级至本地。若本地存储未配置,应返回空或明确失败,而非将受监管数据悄无声息送至公网记忆库。

这与之前网关篇提到的隐私分级一脉相承:数据驻留约束必须在记忆层再加一道防线。路由决策的结果最好记录为结构化日志(如选择哪条泳道、是否因隐私策略降级),便于后续合规审查与问题复盘。

上下文窗口预算:修剪比“硬塞”更体面

模型的上下文窗口是有限的。即便有网关进行全局限流,单轮提示词仍可能过长。典型的上下文预算管理分为三档:

  1. 软限制:超出后,丢弃最旧的非系统消息,保留最近的几轮对话;
  2. 硬限制:若仍超出,要么抛出错误,要么进入安全降级流程;
  3. 安全降级:用简短摘要或占位符消息替代大段历史,同时保留尾部最近的几轮对话——确保用户至少能继续对话。

系统消息通常不参与丢弃,以防角色设定或安全指令被意外裁切。估算token数量时,可采用字符数启发式方法(如JSON长度除以4),无需每次调用tokenizer API——预算层的核心是快速与可预测

这与记忆服务形成互补:修剪策略管理的是“原始对话流水账”;而MID层的运行摘要(running summary)管理的则是“被裁切后仍需保留的核心语义”。

读路径 vs 写路径

写入路径(对话轮次结束后)

  • SHORT层:写入本轮用户与助手的对话预览,键名包含会话ID和轮次对ID;
  • MID层:通过LLM抽取会话事实,或生成Hermes式的运行摘要;
  • LONG层:写入跨会话的用户事实,写入前需进行去重(规范化键名,避免同义重复)。

读取路径(下一轮开始前或API查询时)

  • 按照tenant_idlayer及可选的run_id_filter拉取记录;
  • 用户级的LONG层记录,需额外用user_idmemory_scope过滤;
  • 注入提示词时,必须控制条数与总token数,避免一次性召回200条全部塞入。

后台可运行记忆整合器,周期性执行任务:对SHORT层相同键的记录去重、将存活时间足够的记录晋升至MID层、为冲突的载荷打上_conflict_with标记——采用保守合并策略,绝不覆盖置信度更高的旧记录。

「污染」:评测、生产、租户之间

设计记忆系统,必须直面“污染”风险,否则实验结论将毫无可信度:

  • 评测集事实被写入生产环境的LONG层 → 导致模型“偷看”到标准答案;
  • A租户的回想操作混入B租户的键 → 意味着隔离彻底失效(因此服务层必须硬性拦截跨租户访问);
  • 开发环境的SQLite数据库被拷贝至生产环境 → 脏数据被永久固化;
  • 外部Mem0与本地原生存储双写不一致 → 导致同一会话出现两条“真相”。

工程上的最佳实践包括:使用环境前缀区分数据、提供便捷的清理API、默认收紧run_id/session的作用域、为评测使用专用租户。最关键的是,对于标记为外联的泳道和local_only的会话,必须在物理上确保其无法回退至外网

上下文检索扩展(知识库)

除了“对话记忆”,系统通常还有文档库或知识块的需求:这是按租户隔离的全文检索或向量检索,可附加上下文前缀以提高命中率。它可作为记忆服务的子模块,也可作为独立的知识库存储——关键在于,检索结果在进入提示词前,仍需经过网关的安全检查与token预算,绝不能将整个PDF库的内容直接灌给模型。

一张白板图:从 Turn 到记忆再回上下文

伪代码:memory 与 context budget

function MemoryRecall(ctx, layer, query_scope) -> List[Record]:
    assert ctx.tenant_id matches target tenant
    lane := MemoryLaneRouter.Resolve(ctx.session_id, privacy_tier)
    if lane is None:
        return []
    records := lane.recall(ctx, layer, limit=N, run_id_filter=scope)
    return filter_by_user_scope(records, query_scope)

function MemoryWrite(ctx, layer, key, payload, policy):
    assert policy.allows_write(layer, payload)
    lane := MemoryLaneRouter.Resolve(ctx.session_id, privacy_tier)
    if lane is None:
        return Denied
    lane.remember(ctx, layer, key, payload)

function ContextWindowTrim(messages, soft, hard, safe_degrade) -> messages:
    if estimate_tokens(messages) <= soft:
        return messages
    kept := [system] + drop_oldest_non_system_until_soft(messages, soft)
    if estimate_tokens(kept) <= hard:
        return kept
    if safe_degrade:
        return [system, budget_notice] + tail_recent(kept, k=4)
    raise ContextHardStop

几句容易踩坑的地方

有些陷阱,提前知晓即可规避:仅有消息表,缺乏记忆服务——导致跨会话的用户偏好全靠用户重复介绍。记忆服务不做租户校验——一次bug即可导致跨客户数据泄露。local_only会话仍能回退至Mem0——合规防线被直接击穿。召回操作不加限制——提示词长度隐形爆炸。SHORT层从不整合——数据库无限膨胀,检索性能持续下降。评测与生产共用数据库——导致指标虚高,失去参考价值。允许知识库检索结果绕过内容安全——脏数据片段直接进入模型。

收束一下,下一篇讲什么

本篇旨在厘清几个核心:短期上下文与外部记忆如何分工协作、记忆服务的读写接口与后端边界、泳道路由与隐私关卡、上下文预算的三档策略,以及工程中常说的“污染”具体指什么。

下一篇,我们将进入编排与工作流领域:从单轮对话扩展至任务图或DAG——协调层如何串联多个对话轮次,工作制品又如何贯穿审计链路。(连载 08)

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策