1. 为什么“长期运行”是Agent记忆机制的分水岭?
很多人第一次写Agent时,会把记忆当成一个可有可无的装饰项——对话历史存个JSON数组,上下文拼接进prompt,跑通Demo就收工。但真正把Agent部署到生产环境、让它连续运行数小时甚至数天后,你才会意识到:短期记忆和长期记忆不是同一类问题,它们在工程实现上存在本质断裂。
我去年带团队落地一个客服工单自动归因Agent,初期用LangChain的ConversationBufferMemory,本地测试一切正常。上线第三天凌晨,用户反馈“Agent突然开始重复回答、记错客户姓名、把昨天的订单号当成今天的”。排查日志发现,它在处理第173次请求时,内存中缓存的对话历史已膨胀到2.4MB,token计数超限触发了LLM的截断逻辑,而截断位置恰好在关键身份信息之后——于是Agent“失忆”了,把新用户当成了老用户。
这暴露了一个被严重低估的事实:短期交互依赖的是上下文窗口内的“工作记忆”,而长期运行依赖的是具备版本控制、冲突消解、语义压缩与生命周期管理的“持久化记忆系统”。前者是LLM原生能力的延伸,后者是独立于模型之外的工程子系统。
提示:不要混淆“记忆”和“上下文缓存”。前者是Agent的长期认知资产,后者只是临时计算载体。就像人不会靠反复读聊天记录来记住朋友生日,Agent也不该靠不断拼接历史来维持身份一致性。
从热搜词能看出行业共识正在迁移:“agent记忆”单独成词,且与“agent架构”“agent框架”并列,说明它已脱离辅助功能范畴,成为架构级设计要素。Hermes Agent官方文档里专门设了“Memory Lifecycle”章节,Dify在v0.12版本将Memory模块从插件升级为核心组件,CrewAI则要求每个Agent必须声明memory_backend——这些都不是巧合。
真正棘手的问题从来不是“怎么存”,而是“存什么、何时存、谁有权读、冲突时听谁的”。比如一个电商Agent同时服务客服、售后、物流三方角色,当客服记录“用户申请退货”,售后系统却标记“已换货”,物流端又显示“包裹已签收”,这三个事实都真实存在,但Agent的记忆系统必须能识别这是同一事件的不同视角,而非互相矛盾的错误数据。
所以本篇不讲“如何用Redis存对话”,而是聚焦一个更根本的问题:当你决定让Agent不再是一次性脚本,而是一个持续在线的服务实体时,记忆机制该如何从临时缓存进化为可信认知基座?这需要重新定义数据模型、访问协议、更新策略和失效边界——而这些,恰恰是当前90%的Agent教程刻意回避的“脏活”。
2. 记忆的四层结构:从临时缓存到可信基座
我见过太多团队在记忆设计上陷入“二元陷阱”:要么全量保存原始对话(导致存储爆炸),要么只存最后3轮(导致上下文断裂)。其实成熟的长期运行Agent,其记忆系统天然呈现四层嵌套结构,每一层解决不同维度的问题,且层间有明确的数据流转规则。
2.1 L1:工作记忆(Working Memory)——LLM上下文内的实时沙盒
这是最接近传统理解的“记忆”,本质是LLM推理时的输入上下文。关键在于:它必须是只读、瞬时、无状态的。
- 数据形态:纯文本片段,经模板化拼接(如
<user>...<assistant>...) - 生命周期:单次推理周期内有效,推理结束即销毁
- 核心约束:严格受LLM最大上下文长度限制(GPT-4-turbo为128K,但实际可用约110K需预留系统提示空间)
我们曾测试过将L1记忆扩展到极限:用RAG动态注入100条历史工单摘要,结果发现响应延迟从3.2秒飙升至17秒,且LLM开始频繁忽略最新指令。根本原因在于——LLM的注意力机制并非线性扫描,而是对token位置敏感的加权计算。当关键指令埋在10万token深处时,模型更倾向关注开头和结尾的强信号。
因此L1的设计哲学是:做减法,而非堆砌。我们最终采用“三段式压缩”:
- 意图锚点:提取当前请求的核心动词+宾语(如“查询订单Z123456的物流状态”)
- 身份快照:仅保留用户ID、角色标签、最近一次交互时间戳(非完整对话)
- 冲突标记:若检测到历史中存在矛盾事实(如“用户称未收到货”但物流显示已签收),插入显式标注
[CONFLICT: delivery_status vs user_claim]
这样L1体积稳定在800-1200 token,既保证关键信息可见,又避免噪声干扰。实测下来,相比原始对话拼接,任务完成率提升23%,幻觉率下降41%。
2.2 L2:会话记忆(Session Memory)——单次会话的有状态快照
当用户开启一个持续对话(如“帮我规划一周健身计划”),L1无法承载跨多轮的中间状态。此时需要L2提供轻量级状态管理,但它绝不能是简单的历史回放。
- 数据形态:结构化键值对 + 时间戳 + 权重标记(如
{"fitness_goal": "增肌", "current_phase": "热身", "last_update": "2024-06-15T14:22:01Z", "confidence": 0.92}) - 生命周期:会话超时(默认30分钟无交互)或显式结束(用户说“完成”)后自动归档
- 核心约束:必须支持原子性更新与版本回溯,禁止直接覆盖
我们用SQLite实现L2存储,每张表对应一类会话状态(fitness_plan, travel_itinerary等),关键设计是引入revision_id字段。当用户修改计划时,不是UPDATE现有行,而是INSERT新版本,并设置is_current=1,旧版本is_current=0。这样既能回滚到任意历史状态,又能通过SELECT * FROM fitness_plan WHERE is_current=1快速获取最新版。
注意:L2绝不存储原始对话!它只存经过Agent提炼的决策状态。比如用户说“把周一的训练换成游泳”,L2更新的是
{"monday_activity": "swimming", "reason": "user_preference_change"},而非整段对话。这避免了语义漂移——当LLM下次读取L2时,看到的是确定性事实,而非可能包含歧义的自然语言。
2.3 L3:实体记忆(Entity Memory)——跨会话的可信知识图谱
这才是真正意义上的“长期记忆”。它解决的是:如何让Agent在不同会话中保持对同一实体的一致认知?比如用户A在上周咨询过iPhone维修,在本周问“我的手机屏幕碎了怎么办”,Agent必须关联到“用户A的设备是iPhone 14 Pro”。
- 数据形态:属性图(Property Graph),节点为实体(User, Device, Order),边为关系(OWNS, REPORTED_ISSUE, HAS_WARRANTY)
- 生命周期:永久存储,但需定期校验(见2.4节)
- 核心约束:必须支持多源事实融合与置信度加权
我们采用Neo4j构建L3,但关键创新在于引入“证据链”(Evidence Chain)机制。每个属性都附带来源标识:
User.name = "张伟"来源:[verified_via_sms:0.95, claimed_in_chat:0.7]Device.model = "iPhone 14 Pro"来源:[order_system:0.99, user_photo_analysis:0.82]
当新证据出现(如用户上传新发票),系统不直接覆盖,而是计算加权平均置信度。若新证据置信度>0.9且与旧证据冲突,则触发人工审核流程;若置信度0.7-0.9,则标记为pending_verification,后续会话中降低该属性的权重。
这种设计让记忆具备“可审计性”。某次审计发现,37%的用户地址信息来自首次注册时的模糊填写,而物流系统提供的地址准确率99.2%,于是我们自动将地址字段的主数据源切换为物流系统,错误率从12%降至0.3%。
2.4 L4:元记忆(Meta-Memory)——记忆自身的治理中枢
前三层解决“存什么”,L4解决“怎么管”。它像记忆系统的操作系统,负责:
- 新鲜度管理:自动清理过期数据(如30天未更新的用户偏好)
- 冲突仲裁:当L3中出现矛盾事实(如两个订单系统对同一订单状态标记不同),启动协商协议
- 成本监控:跟踪各层存储/计算开销,当L3图谱节点数月增>15%时触发优化告警
我们用Python+APScheduler实现L4,核心是“记忆健康度仪表盘”:
| 指标 | 当前值 | 阈值 | 动作 |
|---|---|---|---|
| L3节点平均度数 | 4.2 | >5.0 | 启动关系精简算法 |
| 冲突未决率 | 2.1% | >3.0% | 推送至运营看板 |
| L2平均会话时长 | 18.3min | <15min | 调整超时策略 |
这个仪表盘每天生成报告,驱动架构迭代。例如当发现L2会话时长持续下降,我们意识到用户在多次中断后放弃复杂任务,于是新增“会话续订”机制:Agent主动询问“要继续上次的健身计划吗?”,点击即恢复L2状态,用户留存率提升34%。
四层结构不是理论空谈,而是我们踩坑后形成的防御性设计。当某次数据库故障导致L3不可用时,L2仍能支撑基础会话,L1保证单轮响应不中断——这种降级能力,正是长期运行的底气。
3. 记忆更新的三大反直觉原则:为什么“越勤快越危险”
多数开发者认为:记忆更新越及时、越全面,Agent就越聪明。但生产环境给出的残酷答案是:高频、全量、无条件的记忆更新,是导致Agent认知崩溃的首要原因。我们统计过127个Agent故障案例,其中63%源于记忆更新策略失当。
3.1 原则一:拒绝“实时同步”,拥抱“延迟确认”
新手常犯的错误是:用户每说一句话,就立刻存入记忆。这导致两个致命问题:
- 噪声污染:用户随口说的“算了别买了”“开玩笑的”被当作真实意图
- 时序错乱:当用户快速发送多条消息,网络延迟导致存储顺序与实际顺序不符
我们的解决方案是引入“意图确认窗口”(Intention Confirmation Window):
- 用户发送消息后,Agent不立即更新记忆,而是等待2秒(可配置)
- 若2秒内用户无新消息,则执行NLP意图分析(用轻量级BERT微调模型)
- 仅当检测到明确行动意图(如“下单”“预约”“修改”)时,才触发记忆更新
实测数据显示,此举使无效记忆写入减少78%,且因时序错乱导致的错误下降92%。更重要的是,它给了用户“反悔权”——当用户发完“我要退订”又马上发“等等先别退”,系统因未确认而自动忽略第一条。
3.2 原则二:禁止“覆盖写入”,强制“版本叠加”
很多团队用UPDATE memory SET value='new' WHERE key='user_preference',这在分布式环境下必然引发竞态。我们坚持“每次更新都是新版本”,并通过三重保障确保一致性:
- 乐观锁:更新前检查
version字段,不匹配则重试 - 幂等Key:为每次更新生成唯一ID(如
user_123_preference_v20240615_082201),避免重复写入 - 变更日志:所有更新操作写入WAL(Write-Ahead Log),宕机后可重放
最关键的创新是“语义版本控制”。不是简单递增数字,而是根据变更类型打标签:
v20240615_082201_core:影响核心决策(如用户预算从5000改为3000)v20240615_082312_context:仅影响上下文(如用户说“今天天气不错”)v20240615_082405_correction:修正错误(如之前记错用户邮箱)
Agent在读取记忆时,会按标签优先级加载——core版本必读,context版本按需加载,correction版本自动覆盖同类型旧版。这比单纯的时间戳排序更符合认知逻辑。
3.3 原则三:警惕“全量继承”,实施“场景隔离”
另一个常见误区是:让新会话自动继承所有历史记忆。这在跨领域场景下极其危险。比如用户在“理财顾问”会话中透露年收入50万,若在“游戏客服”会话中被继承,Agent可能不当推荐高风险理财产品。
我们设计“记忆域”(Memory Domain)机制:
- 每个Agent实例绑定一个Domain ID(如
finance_advisor,game_support) - L3实体记忆中,每个属性附加
domain_scope字段(global,finance,game) - 会话启动时,Agent只加载
domain_scope匹配或global的记忆
更进一步,我们实现“记忆透传白名单”。当用户明确说“把上次健身计划的强度用到这次”,Agent才临时打通fitness域到当前域,且透传后自动标记transient=true,下次会话即失效。这比粗暴的全域继承安全得多,也更尊重用户隐私预期。
提示:记忆更新不是技术问题,而是产品设计问题。每一次写入,都应该回答三个问题:这个事实是否已被用户确认?它是否会影响未来决策?它是否属于当前场景?答不出就暂停写入。
4. 实战避坑:那些让Agent“失忆”的隐蔽陷阱
即使遵循上述原则,长期运行Agent仍会遭遇各种“记忆失灵”现象。这些往往不在设计文档里,而是藏在基础设施、模型特性和业务逻辑的缝隙中。以下是我们在三年运维中总结的五大高危陷阱,附真实案例与修复方案。
4.1 陷阱一:Token截断的“静默失真”
现象:Agent在处理长对话时,突然开始编造不存在的订单号或日期。
根因:LLM的上下文截断不是简单删尾,而是按token概率分布进行“软截断”。当提示词模板中包含大量固定文本(如系统指令、格式说明),这些文本会挤占用户内容的token空间。更隐蔽的是,不同tokenizer对同一中文的切分结果不同——GPT-4的tiktoken将“苹果手机”切为['苹', '果', '手', '机']共4token,而Claude的tokenizer可能合并为['苹果手机']仅1token。当Agent在多模型间切换时,截断位置完全不可预测。
修复方案:我们开发了“动态截断探测器”(Dynamic Truncation Detector):
- 在每次推理前,用目标模型的tokenizer预计算完整上下文token数
- 若超限,按重要性权重分级裁剪:
- 一级:删除模板中的冗余空格与注释(不影响语义)
- 二级:压缩历史摘要(用LLM自动生成1句摘要替代10句对话)
- 三级:移除低置信度记忆项(L3中
confidence<0.7的属性)
关键技巧:永远在prompt末尾预留200token缓冲区。我们实测发现,当缓冲区<100token时,LLM开始随机丢弃中间信息;>200token则几乎不触发静默失真。
4.2 陷阱二:时钟漂移导致的记忆“时空错乱”
现象:Agent在凌晨3点记录的用户操作,显示时间为下午3点,导致后续基于时间的决策全部错误。
根因:容器化部署中,宿主机时钟与容器内时钟不同步。尤其在Kubernetes集群中,Node节点时钟漂移超过500ms就会引发问题。更麻烦的是,不同组件时区设置不一致:PostgreSQL默认UTC,而应用代码用Asia/Shanghai,前端JavaScript又用浏览器本地时区。
修复方案:建立统一时间治理规范:
- 所有服务强制使用UTC时间存储(L2/L3的
created_at字段) - 应用层不做时区转换,仅在展示层(前端)按用户偏好渲染
- 容器启动时执行
ntpd -q -p pool.ntp.org强制校时 - 关键操作增加“时钟健康检查”:每次写入前,对比系统时间与NTP服务器时间,偏差>100ms则拒绝写入并告警
我们曾因忽略此点,导致一个支付Agent将“23:59的交易”记为“00:59”,触发了错误的风控拦截。现在,所有Agent启动时都会运行clock_check.py,未通过则拒绝服务。
4.3 陷阱三:向量库的“语义坍塌”
现象:Agent对相似问题给出完全不同的回答,如“我的订单在哪”和“查一下订单状态”被检索到不同记忆片段。
根因:向量嵌入模型(如text-embedding-ada-002)对细微语义差异不敏感,且索引构建时未考虑领域特性。通用嵌入模型将“iPhone”和“苹果手机”映射到相近向量,但在电商场景中,前者指设备,后者常指水果——这种歧义导致检索失准。
修复方案:实施“领域感知嵌入”(Domain-Aware Embedding):
- 用领域语料(10万条客服对话)微调嵌入模型
- 在向量索引中添加“语义锚点”:对关键实体(如
ORDER_ID,DEVICE_MODEL)强制生成高区分度向量 - 检索时采用混合策略:70%权重给向量相似度,30%权重给关键词匹配(正则提取订单号、设备型号等)
效果:语义检索准确率从61%提升至89%,且“订单状态”类查询的响应一致性达99.2%。
4.4 陷阱四:分布式锁的“幽灵更新”
现象:同一用户在两台设备上同时操作,Agent记录了相互矛盾的状态(如A设备设为“免打扰”,B设备设为“紧急通知”)。
根因:看似简单的“先读后写”(Read-Then-Write)在分布式环境下必然竞态。即使用了Redis锁,若锁过期时间设置不当,仍会出现“锁失效但操作未完成”的情况。
修复方案:放弃传统锁,改用“状态向量时钟”(State Vector Clock):
- 每个记忆项维护
(node_id, counter)向量时钟 - 更新时比较向量时钟,若本地时钟落后,则拒绝更新并拉取最新状态
- 冲突时按预设策略合并(如
last_write_wins或custom_merge_function)
我们为用户偏好项定义合并函数:notification_mode冲突时,取置信度更高者;preferred_language冲突时,取最近更新者。这比简单覆盖更符合业务逻辑。
4.5 陷阱五:模型幻觉的“记忆污染”
现象:Agent在回答中引用了从未发生过的事件,如“您上周三提交的退货申请已处理”,而实际上用户从未申请退货。
根因:LLM在生成回复时,会无意识地“补全”记忆空白。当L3中缺少某类信息(如退货记录),模型基于训练数据生成合理虚构——这被误认为是记忆的一部分,进而写入L3,形成“幻觉循环”。
修复方案:实施“幻觉防火墙”(Hallucination Firewall):
- 所有LLM输出必须通过验证器:对涉及事实的陈述(时间、数字、ID),调用L3查询验证
- 若L3无对应记录,则强制返回“我暂未掌握该信息”,而非生成推测
- 验证失败时记录
hallucination_event,用于模型迭代
我们为此开发了专用验证DSL:
# 验证规则示例 if "退货" in response and re.search(r'退货申请.*\d{6,}', response): order_id = extract_order_id(response) if not l3.has_order_return(order_id): raise HallucinationError("Claimed return without record")这套机制使幻觉率从18%降至0.7%,且所有幻觉事件都被捕获用于模型优化。
这些陷阱没有银弹解法,但共同指向一个真理:长期运行Agent的记忆,本质是工程可靠性问题,而非AI能力问题。每一次“失忆”,都是系统某个环节的脆弱性在说话。
5. 架构选型实战:从LangChain到自研记忆引擎的演进路径
面对海量Agent框架(LangChain、LlamaIndex、Dify、CrewAI),很多团队纠结“选哪个”。我的经验是:不要选框架,而要选架构模式。因为所有主流框架的记忆模块,都只是帮你绕过前期验证,却无法规避长期运行的本质挑战。
5.1 LangChain记忆模块的适用边界
LangChain的ConversationBufferMemory、ConversationSummaryMemory等,本质是L1/L2层的快捷封装。它的优势在于:
- 快速验证想法(20行代码启动对话Agent)
- 教学友好(概念清晰,文档完善)
但生产级长期运行时,它暴露三大硬伤:
- 无L3实体记忆:所有记忆扁平化存储,无法建立用户-设备-订单关联
- 更新耦合LLM调用:每次
chat.invoke()都触发记忆写入,无法实施延迟确认 - 存储绑定单一后端:
PostgresChatMessageHistory强制要求PostgreSQL,无法混合使用SQLite(L2)+ Neo4j(L3)+ Redis(缓存)
我们曾用LangChain搭建初版,上线两周后因L3缺失导致用户投诉“记不住我的设备型号”。最终将LangChain仅作为L1/L2的胶水层,L3完全自研。
5.2 Dify的“记忆工作台”深度解析
Dify v0.12推出的记忆工作台,是目前最接近生产需求的方案。它明确区分:
- 会话记忆(Session Memory):类似我们的L2,支持JSON Schema定义
- 知识库记忆(Knowledge Memory):基于向量库的L3雏形
但关键缺陷在于:知识库记忆是只读的。它允许你上传文档构建RAG,却不支持Agent在运行中动态更新知识库——这意味着用户说“我的新手机号是138****”,这个事实无法沉淀为长期记忆。
我们的改造方案:在Dify基础上增加“记忆写入API”,当Agent检测到需持久化的事实时,调用POST /api/v1/memory/update,由后端将结构化数据写入Neo4j。这保留了Dify的易用性,又补全了L3闭环。
5.3 自研记忆引擎的核心模块
当业务复杂度超过框架能力时,我们启动了自研记忆引擎MemCore。它不是从零造轮子,而是整合成熟组件,专注解决长期运行特有的问题:
| 模块 | 技术选型 | 解决的关键问题 | 实现要点 |
|---|---|---|---|
| L1编排器 | Python + tiktoken | 动态上下文管理 | 实时计算token余量,智能裁剪非关键历史 |
| L2协调器 | SQLite + WAL | 会话状态原子性 | 所有更新走WAL,崩溃后自动恢复 |
| L3图谱 | Neo4j + Cypher | 实体关系推理 | 自定义MATCH规则,支持跨域关系查询 |
| L4治理中心 | FastAPI + APScheduler | 全局记忆健康度 | 每日执行CALL db.indexes()监控性能 |
最关键的是“记忆网关”(Memory Gateway)——统一入口,屏蔽底层复杂性:
# 统一API示例 class MemoryGateway: def get_user_profile(self, user_id: str) -> UserProfile: # 自动聚合L2/L3数据,处理冲突 pass def update_entity(self, entity: Entity, source: str, confidence: float): # 执行延迟确认、版本叠加、域隔离 pass def audit_memory(self, user_id: str, date_range: tuple) -> AuditReport: # 生成可审计的变更日志 pass这套架构让我们支撑了日均200万次记忆操作,P99延迟<80ms。而成本仅为商用向量数据库的1/5——因为L3图谱查询比向量检索快两个数量级。
5.4 Rust Agent生态的启示
近期基于Rust的Agent框架(如rust-lang/llm、tokio-llm)兴起,其内存安全与并发模型对长期运行极具价值。我们测试过llm-chain的内存管理:
- 所有记忆对象实现
Droptrait,确保资源及时释放 - 使用
Arc<Mutex<>>而非全局锁,避免IO阻塞 - 编译时内存布局优化,L1上下文加载速度比Python快3.2倍
虽然Rust生态工具链尚不成熟(缺乏成熟L3图谱集成),但它证明了一点:长期运行Agent的根基,终将回归系统级可靠性。当你的Agent要连续运行365天,语言特性比框架语法糖重要得多。
选择架构,就是选择你愿意为长期运行付出的工程代价。框架能加速启动,但只有深入理解四层结构与更新原则,才能构建真正可信的记忆基座。
6. 评估与演进:如何量化记忆机制的有效性
再精妙的设计,若无法衡量,就只是空中楼阁。我们建立了四级记忆健康度评估体系,覆盖从技术指标到业务价值的全链条。
6.1 L1层:上下文有效性指数(CEI)
衡量L1是否真正支撑了推理质量:
- 计算方式:
CEI = (正确利用历史信息的轮次数) / (总轮次数) - 采集方法:在测试集上运行,人工标注每轮是否需依赖历史(如“把刚才说的价格打9折”需依赖)
- 基准值:>95%为优秀,<80%需优化L1压缩策略
我们发现CEI与L1体积呈倒U型曲线:体积<500token时,信息不足;>1500token时,噪声干扰。最佳区间为800-1200token,CEI达96.3%。
6.2 L2层:会话连贯性得分(SCS)
衡量L2是否维持了会话状态一致性:
- 计算方式:
SCS = 1 - (状态丢失轮次 / 总会话轮次) - 状态丢失定义:Agent重复询问已知信息(如再次问用户姓名)、或做出与L2记录矛盾的决策
- 基准值:>98%为优秀
关键发现:SCS在会话时长>25分钟时显著下降。这促使我们引入“会话保鲜”机制——每20分钟,Agent主动总结当前状态(“我们正在规划您的健身计划,目标是增肌,已确定周一游泳”),既强化L2,又提升用户体验。
6.3 L3层:实体关联准确率(EAR)
衡量L3是否正确建立了跨会话关联:
- 计算方式:
EAR = (正确关联的实体对数) / (应关联的实体对总数) - 测试方法:构造跨会话测试集(如会话1记用户设备,会话2问该设备问题)
- 基准值:>92%为优秀
EAR暴露了数据源质量问题:当EAR<90%时,87%的错误源于外部系统(CRM、ERP)数据延迟。这推动我们与IT部门共建“记忆数据契约”,约定关键字段的SLA(如用户地址更新延迟<5分钟)。
6.4 L4层:记忆治理成熟度(MM)
衡量L4是否有效驱动系统进化:
- 评估维度:
- 冲突自动解决率(目标>95%)
- 记忆健康度仪表盘使用率(目标>90%工程师每周查看)
- 基于记忆数据的业务改进数(如“根据L3分析,发现30%用户因地址错误流失,推动地址校验流程优化”)
MM不是技术指标,而是组织能力的体现。当MM评分从2.1(初始)提升至4.7(当前),意味着记忆已从“技术组件”升维为“业务洞察引擎”。
最后分享一个真实演进案例:我们最初只监控CEI,发现L1优化后CEI达96%,但用户投诉“Agent记性不好”。深入分析SCS才发现,会话连贯性仅89%——问题出在L2超时策略。调整后SCS升至97%,投诉归零。这印证了:必须用多维指标穿透表象,单一指标会掩盖系统性缺陷。
记忆机制的终极评估标准,不是它有多“智能”,而是它让Agent在长期运行中,越来越像一个值得信赖的伙伴——记得住你的偏好,守得住你的秘密,理得清你的需求,且每一次“记得”,都经得起时间检验。