当前位置: 首页 > news >正文

Agent 的记忆,记岔了比没记更坑

上一篇讲上下文,那是一次会话里的短期记忆,会话一结束就没了。可老用户回来排第三趟行程,Agent 不该还在问「你喜欢住民宿还是酒店」,这事他半年前就告诉过你。跨会话记住一个用户是谁,靠的是另一套东西,记忆系统。在 Claude Code 里它叫 CLAUDE.md,你的项目约定、代码风格写一次,之后每次它都记得。野行 Y 里对应的东西,是用户画像。

但记忆这东西,做起来特别容易在两个地方栽跟头,而且栽了比不做还糟。这篇就讲这两个坑,以及怎么绕开。

先说清楚记忆记什么。野行 Y 的用户画像记两类。一类是显式偏好,用户在账户里设过的:住宿档次、出行节奏、预算、体力、忌讳、兴趣,这些是他主动告诉系统的,最可靠。另一类是行为记忆,他做过、参与过的行程,这个不用问,从数据库里捞最近六条标题。于是一个老用户开新对话,Agent 一上来的 system 里就带着「固定偏好:住民宿、深度慢玩、预算适中;做过:川西小环线、洱海环湖」,它一张嘴就「记得」这个人,能说「你之前走过川西,这次给你换个方向」。

这里有个容易混的地方要厘清:记忆和上下文是两回事。上下文在模型的窗口里,活一次会话;记忆在数据库里,跨会话、长期存着。关键是,数据库里躺着的记忆,模型自己是看不见的,它不会凭空「感应」到。得在合适的时机,把它提炼成一小段,注入到这次会话的上下文窗口里,模型才读得到。记忆负责长期存,上下文负责当次用,两者是接力关系。

现在说第一个坑,也是最凶的一个:记岔了。

记忆最危险的地方,是记错了还理直气壮。模型对注入进来的东西是全盘相信的,你往它记忆里塞一句错的,它会拿这句错的去误导用户整趟行程,语气还特别笃定。所以这个项目有一条铁律,从第一天就立着:记忆里的每一条,都必须真实、可追溯,绝不能是模型自己编出来的。

看前面那段「做过的行程」,它是从行程表里真实查出来的标题,模型没插手,只是把真实数据摆出来。偏好也一样,来自用户在账户里真实设置,模型不参与猜测。这跟整个 Agent 的第一原则一致,系统提示词开头就写着「禁止凭空编城市、距离、价格」,这条对工具成立,对记忆同样成立。

为什么这么较真?因为一个会编记忆的 Agent,比一个没记忆的 Agent 更糟。没记忆,最多每次重新问一遍,烦一点;编记忆,是拿着假的「我记得你说过」去误导决策,用户还不容易察觉。所以记忆系统的可信度,要排在它的丰富度前面。

代码里有个小而关键的细节:新用户,没有任何数据的时候,画像函数返回一个空字符串,什么都不注入。宁可不注入,也不硬凑一段「这个用户可能……」的猜测。没有记忆,好过错的记忆。

第二个坑更微妙:就算记忆是真的,把它当成命令来执行,也会出问题。

一个用户去过川西,不代表他这次也想去高原;他偏好住民宿,也不代表这次带着老人还非民宿不可。记忆是背景,是帮你更懂他的一层底色,别把它当成这次任务的硬指标。所以注入用户画像的时候,我在提示语里专门给它松了绑,明写一句「这些是背景,帮你更懂他,别生搬,按当前这次的需求灵活参考」。

这一句松绑很要紧。它告诉模型:当前这次对话里用户新说的话,永远优先于历史记忆。记忆解决的是「默认值」问题,让你不用每次从零问起,但它不该盖过用户此刻的明确表达。把这个优先级搞反,Agent 会显得又固执又不听话,明明记性好,体验反而更差。

说到底,做专用 Agent 的记忆系统,我把它收成三条:只记这个领域里真正跨会话有价值的东西,别什么都往里塞;每一条都必须真实可追溯,从数据库来、从用户设置来,绝不让模型编,宁可空着;注入的时候讲清楚它是背景参考,当次意图永远优先。守住这三条,记忆会让 Agent 越用越懂你;破了任何一条,它会越记越坑。

到这儿,主循环里的独角戏就讲完了:一个模型、一套工具、一段上下文、一份记忆。但有些活,交给同一个模型在主循环里顺手做并不好。要么慢,该并行的串成了一条;要么不客观,让排方案的人自己检查自己的方案。下一篇讲子 Agent,什么时候该把活派出去、并行地做,或者换一个新的脑子来核对。

http://www.jsqmd.com/news/1288050/

相关文章:

  • 宣城2026.7月新推荐:专业正规防水补漏公司全场景免砸砖 - 超人防水
  • 预算10-14万在酒泉做整装,闭口合同真能锁死价格不增项?
  • Diablo Edit2:终极暗黑破坏神2角色编辑器免费体验指南
  • 【App Store审核通过率92.7%的AI图标生成方案】:融合Figma+Stable Diffusion+人工微调的黄金三角模型
  • Zig 增量编译:毫秒级重建复杂应用,开发效率大提升!
  • VMware Unlocker 4.2.9终极指南:在普通PC上轻松运行macOS虚拟机的完整教程
  • Seata AT 模式不用写回滚代码:一次“脏写“让我们重读了 undo_log 的插入时机
  • Python类变量与实例变量详解:命名空间、查找链与实战避坑指南
  • Honey Select 2终极增强指南:10分钟打造完美游戏体验的完整解决方案
  • UML建模与面向对象分析
  • 如何在5分钟内为Microsoft Word安装免费的APA第七版引用样式
  • 基于MATLAB和PYTHON的跨平台光学建模与设计
  • 5分钟掌握HunterPie:《怪物猎人:世界》游戏数据监控插件终极指南
  • 北京geo优化公司哪家服务好?广拓时代解析数据复盘能力
  • 扣子定时任务设置全攻略:从零到上线的7个关键步骤,90%开发者都踩过的3个坑
  • GoBruteforcer僵尸网络攻击分析与Linux服务器防护
  • 子域名挖掘全攻略:从被动收集到主动枚举的完整安全评估流程
  • 一键提取微信数据库密钥:Sharp-dumpkey完整使用指南
  • 用Python打造个人数据礼物生成器:从聊天记录到情感可视化报告
  • 如何对 eBPF 代码进行性能分析?实例展示完整流程
  • 自动驾驶安全评估:Waymo事故率低68%背后的技术真相
  • GetQzonehistory:让时光倒流的终极记忆守护者
  • 别再盲目采购AI教育系统!资深CTO揭秘:真正产生教学闭环的6个技术-场景匹配关键点
  • Bluno Beetle微型蓝牙控制器:从Arduino无线通信到物联网原型开发实战
  • MagicCFG Reloaded:革命性iOS设备SysCFG编辑工具的技术突破
  • Robots.txt 配置错误修复 蜘蛛不来抓页面?用这2招轻松解决
  • Elasticsearch运行时字段与ES|QL查询优化实践
  • Arduino传感器扩展板设计:解决多传感器接口、供电与信号调理难题
  • PUBG罗技鼠标宏自动识别压枪:智能游戏辅助的完整指南
  • 柯里 - 霍华德对应关系揭示:类型检查器为何可能出错及证明辅助工具局限