Agent后端-记忆RAG和上下文管理怎么做才像样

Agent后端:记忆、RAG 和上下文管理,怎么做才像样

文章目录

先说结论

很多 Agent 看起来"聪明",其实只是短期上下文还够用。一旦对话变长、任务变复杂、信息一多,模型就开始忘事、跑偏、答非所问。要让 Agent 真正能长期工作,记忆、RAG 和上下文管理几乎是绕不开的三件事。

简单说,记忆负责"记住什么",RAG 负责"去哪里找",上下文管理负责"这次该喂给模型多少"。这三件事没做好,Agent 再强也会越聊越乱。

为什么不能把所有内容都塞进上下文

上下文窗口不是无限的。哪怕模型能放很多内容,也不代表应该全塞进去。因为上下文越长,成本越高,噪声越多,模型越容易抓错重点。

所以更现实的做法是分层:

  • 短期上下文:当前对话和正在执行的任务
  • 长期记忆:用户偏好、历史结论、关键事实
  • 外部知识:文档、数据库、搜索结果

这样一来,模型每次拿到的都是"刚好够用"的信息,而不是一大锅乱炖。

RAG 在 Agent 里怎么用

RAG 不是简单地"把文档搜一下",而是一个完整链路:切片、索引、召回、重排、拼接、再交给模型。
Agent RAG Pipeline This diagram shows how agent memory and retrieval work together through indexing, retrieval, ranking, and context assembly. #mermaid-svg-HHT3RD6EUMzABMqv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HHT3RD6EUMzABMqv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HHT3RD6EUMzABMqv .error-icon{fill:#552222;}#mermaid-svg-HHT3RD6EUMzABMqv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HHT3RD6EUMzABMqv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HHT3RD6EUMzABMqv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HHT3RD6EUMzABMqv .marker.cross{stroke:#333333;}#mermaid-svg-HHT3RD6EUMzABMqv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HHT3RD6EUMzABMqv p{margin:0;}#mermaid-svg-HHT3RD6EUMzABMqv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HHT3RD6EUMzABMqv .cluster-label text{fill:#333;}#mermaid-svg-HHT3RD6EUMzABMqv .cluster-label span{color:#333;}#mermaid-svg-HHT3RD6EUMzABMqv .cluster-label span p{background-color:transparent;}#mermaid-svg-HHT3RD6EUMzABMqv .label text,#mermaid-svg-HHT3RD6EUMzABMqv span{fill:#333;color:#333;}#mermaid-svg-HHT3RD6EUMzABMqv .node rect,#mermaid-svg-HHT3RD6EUMzABMqv .node circle,#mermaid-svg-HHT3RD6EUMzABMqv .node ellipse,#mermaid-svg-HHT3RD6EUMzABMqv .node polygon,#mermaid-svg-HHT3RD6EUMzABMqv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HHT3RD6EUMzABMqv .rough-node .label text,#mermaid-svg-HHT3RD6EUMzABMqv .node .label text,#mermaid-svg-HHT3RD6EUMzABMqv .image-shape .label,#mermaid-svg-HHT3RD6EUMzABMqv .icon-shape .label{text-anchor:middle;}#mermaid-svg-HHT3RD6EUMzABMqv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HHT3RD6EUMzABMqv .rough-node .label,#mermaid-svg-HHT3RD6EUMzABMqv .node .label,#mermaid-svg-HHT3RD6EUMzABMqv .image-shape .label,#mermaid-svg-HHT3RD6EUMzABMqv .icon-shape .label{text-align:center;}#mermaid-svg-HHT3RD6EUMzABMqv .node.clickable{cursor:pointer;}#mermaid-svg-HHT3RD6EUMzABMqv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HHT3RD6EUMzABMqv .arrowheadPath{fill:#333333;}#mermaid-svg-HHT3RD6EUMzABMqv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HHT3RD6EUMzABMqv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HHT3RD6EUMzABMqv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HHT3RD6EUMzABMqv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HHT3RD6EUMzABMqv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HHT3RD6EUMzABMqv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HHT3RD6EUMzABMqv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HHT3RD6EUMzABMqv .cluster text{fill:#333;}#mermaid-svg-HHT3RD6EUMzABMqv .cluster span{color:#333;}#mermaid-svg-HHT3RD6EUMzABMqv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HHT3RD6EUMzABMqv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HHT3RD6EUMzABMqv rect.text{fill:none;stroke-width:0;}#mermaid-svg-HHT3RD6EUMzABMqv .icon-shape,#mermaid-svg-HHT3RD6EUMzABMqv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HHT3RD6EUMzABMqv .icon-shape p,#mermaid-svg-HHT3RD6EUMzABMqv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HHT3RD6EUMzABMqv .icon-shape .label rect,#mermaid-svg-HHT3RD6EUMzABMqv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HHT3RD6EUMzABMqv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HHT3RD6EUMzABMqv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HHT3RD6EUMzABMqv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-HHT3RD6EUMzABMqv .normal>*{fill:#f8fafc!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-HHT3RD6EUMzABMqv .normal span{fill:#f8fafc!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-HHT3RD6EUMzABMqv .normal tspan{fill:#0f172a!important;}#mermaid-svg-HHT3RD6EUMzABMqv .accent>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532d!important;}#mermaid-svg-HHT3RD6EUMzABMqv .accent span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532d!important;}#mermaid-svg-HHT3RD6EUMzABMqv .accent tspan{fill:#14532d!important;} 业务文档
切片
向量索引
用户问题
召回
重排
上下文拼接
模型回答

真正有用的 RAG,不是"召回很多",而是"召回对的"。很多系统看上去有检索,实际返回一堆相似但没用的内容,最后把模型带偏。RAG 的价值,本质上是提升可控性。

记忆到底该记什么

记忆不是所有聊天记录都保存,而是只保存高价值信息。比如:

  • 用户长期偏好
  • 任务中间结论
  • 已确认的事实
  • 下次还能复用的工作结果

如果你把所有内容都写进记忆,最后记忆就会变成垃圾场。更好的做法是给记忆分类型、分层级、分过期时间。哪些是永久的,哪些是临时的,哪些是可覆盖的,要提前定义好。

上下文管理是稳定性的关键

上下文管理做不好,Agent 就会出现典型问题:前后矛盾、记错用户要求、忘了之前做过什么、把旧结论当新结论。

所以在工程上,最好做这些事:

  1. 对输入做摘要,保留关键约束
  2. 对工具输出做结构化,去掉噪声
  3. 对历史记录做裁剪,只保留相关片段
  4. 对重要事实做显式标记,避免被模型忽略

你会发现,真正成熟的 Agent,不是上下文越多越厉害,而是上下文越精炼越可靠。

一个更实用的判断标准

如果你在设计 Agent,可以用一个很朴素的问题判断方案好不好:

这条信息,是不是下次还会用到?

如果答案是"会",那它才值得进入长期记忆;如果只是当前这轮临时有用,那就放在短期上下文里;如果它是外部知识,就交给 RAG 去查,而不是硬塞在提示词里。

这个判断很简单,但非常实用。

结尾

记忆、RAG 和上下文管理,本质上是在帮 Agent 控制"知道多少、记住多少、每次看多少"。这三件事一旦设计得顺,Agent 就会从"偶尔灵光一现"变成"长期可用的工具"。