记忆与检索:让旧信息在需要时重新进入上下文
所属:第二部分 · 让它做对事的四块地基(第 5–8 章) 前置:第 6 章(工具粒度、工具合同与结果状态)、第 5 章(工作集、外置与检索)、第 1 章(模型快照不会在对话中自动更新) 本章新概念:记忆策略、任务记忆、跨任务记忆、资料库、检索器、RAG、向量检索、迭代搜索(Agentic Search)
一、文件已经存了,新任务为什么还从零开始¶
前两章已经让运行系统把原文保存在窗口外,并让读取工具按来源编号读回。一次运行结束后,材料还在;但下一次运行时,主循环仍从一个新的用户问题开始,既没有读取旧材料,也不知道哪份材料与当前任务有关。
这说明,留下信息不代表未来任务能直接重新使用这些信息。
让信息留下只需要存储。要让未来任务重新使用它,至少还要回答:什么值得写入、按什么范围隔离、这次取回哪些、旧记录什么时候过期、冲突时保留哪一版,以及谁有权删除。
因此,本章把记忆系统看成两部分:一部分是为未来复用而保存的状态,另一部分是管理这些状态的记忆策略。记忆策略决定什么可以写入、谁能取回、何时更新、何时过期以及怎样删除。磁盘、数据库或向量库只是存放信息的介质;没有这些策略,存得再多也只是仓库。
二、先分清四种责任,再看资料怎样进入回答¶
「记忆」「检索」「Retrieval-Augmented Generation(检索增强生成,RAG)」「向量库」和「迭代搜索」经常被放在一起说,但它们不是五种并列方案。要把关系理顺,先回答一个更基础的问题:检索过程中的每一项决定由谁负责?
上下文装配决定模型这一轮能看到什么。相对稳定的指令和工具定义只是其中一部分;当前任务、从对话与任务状态中选出的内容、刚返回的工具结果,以及从窗口外取回的材料,也可能进入本轮上下文。下面的四种责任,专门解释最后一部分怎样被选进来。
下面把所有可能被检索的窗口外内容统称为窗口外可检索信息。它可以来自当前任务记忆、跨任务记忆或资料库;这个统称描述它在信息流中的输入位置,不等于后文专门保存来源材料的「资料库」。
在允许模型参与检索选择的 Agent 循环里,这些责任跨越设计时和运行时,不是四个依次执行的同层步骤:
- 开发者定义可用范围和规则。 开发者选择可搜索的数据源、检索方法、模型能使用的工具和参数,以及权限范围;采用固定检索时,还要预写查询、转移和停止规则。模型需要知道的部分进入系统或开发者指令与工具合同;必须强制执行的部分写进程序、权限配置和检索器配置。
- 模型在迭代搜索中提出具体请求。 模型根据当前任务与已有材料,提出查询词、过滤条件、读取对象,以及继续搜索或停止的请求。它只能在开发者开放的范围内选择,不会自动扫描磁盘或数据库,也不拥有最终执行权限。
- 运行系统协调实际执行。 运行系统校验模型请求,或者应用开发者预写的固定规则;随后调用检索器、接收候选结果、限制返回范围,再把当前步骤需要的材料装入本轮工作集。
- 检索器执行过滤、匹配和排序。 检索器接收运行系统给出的查询和过滤条件,执行关键词、向量、数据库查询或混合检索,再返回候选材料。
开发者规定“可以怎样找”,模型决定“这次具体找什么”,检索器负责“真正怎样匹配”,运行系统决定“哪些结果能进入上下文”。
这句话描述的是模型参与检索选择的情况。其中「模型决定」指模型在开放范围内提出具体请求,不代表请求一定获准执行;「运行系统决定」指它按照开发者设定的规则把守上下文入口。固定检索则由开发者预写查询、转移和停止规则,运行系统在每次任务中应用这些规则。开发者也不需要把向量算法的内部细节全部讲给模型;模型只需要看懂自己能够选择的动作和参数,真正的匹配算法仍由检索器执行。
责任分清以后,再看材料怎样变化:
- 当前任务暴露了需要补充的信息;
- 模型提出查询与过滤请求,或者运行系统应用开发者预写的固定规则形成查询;
- 检索器从窗口外可检索信息中选出候选材料;
- 运行系统把当前需要的候选材料装入本轮工作集;
- 模型根据工作集生成回答。
从检索到生成的第 3 至第 5 步合起来,构成一次 RAG:检索器先选出候选材料,运行系统再把候选材料交给模型生成。检索只完成了其中的选择动作;只有候选材料进入工作集并参与生成,才形成完整的 RAG。
把其余概念接回这两条关系,位置就清楚了:
- 存储和记忆策略位于信息流上游,决定窗口外有哪些信息可以留下、复用、更新或删除;
- 关键词检索、数据库查询和向量检索属于检索器的匹配方法;
- 向量库是实现向量检索的一种索引与存储方案,不是 RAG,也不是检索的同义词;
- 固定检索和迭代搜索改变的是具体查询与停止规则在设计时写定,还是由模型在运行时提出,不会改变检索器负责匹配、运行系统负责协调与装配的基本分工。
后面的概念都会沿着这条主线展开:先分清谁作哪一项决定,再看信息以什么角色留在窗口外、怎样被匹配成候选,以及怎样进入本轮生成。
三、工作集与记忆按使用范围区分,资料库按内容职责区分¶
产品常用「短期记忆」和「长期记忆」,但两者没有适用于所有系统的小时数阈值。先按使用范围区分三类状态:
| 名称 | 作用范围 | 典型内容 | 与模型当前调用的关系 |
|---|---|---|---|
| 本轮工作集 | 当前一次模型调用 | 当前目标、必要材料、工具结果 | 模型此刻可以直接看到 |
| 任务记忆 | 当前任务 | 已完成步骤、临时假设、待办、已读来源 | 可供后续轮次取回,不一定一直留在窗口里 |
| 跨任务记忆 | 之后的其他任务 | 用户偏好、已核验的项目事实、可复用结论及来源 | 新任务开始时按范围和需要取回 |
资料库不在这条从本轮到未来任务的范围刻度上。 它回答的是另一个问题:哪些来源材料要作为可查询集合留下。手册、网页快照、工单、代码和研究资料都可以进入资料库,供一个或多个任务查询;只有被检索并装入工作集的部分,当前模型才看得到。
这些角色不由存储介质决定。任务记忆可以写进磁盘,跨任务记忆也不等于向量数据库;资料库中的某段原文被选中后,会暂时进入本轮工作集,但它仍然是资料库中的来源材料。跨任务记忆也可以保存可复用结论及其来源指针,成为未来检索的入口。
资料库与任务记忆、跨任务记忆的写入依据也不同。一份公开法规因为它本身有查询价值而进入资料库;「这个用户不希望收到周末提醒」则是为了改善未来交互而进入跨任务记忆。它们都需要权限、来源和生命周期管理,但不能混成同一类记录。
四、全量装入和固定检索不是一回事¶
把内容放进模型生成前的工作集,可以有两种不同机制。
全量装入:运行系统不做选择
例如,每次回答都把同一份十页手册完整放进工作集。这里发生了上下文装配,但运行系统没有从候选集合中挑选材料。
固定检索:运行系统按预写规则选择
例如,开发者预先规定查询怎样形成以及怎样过滤,运行系统按这些规则把用户问题交给检索器;检索器选出几段候选材料后,运行系统再把它们装入工作集。固定检索可以包含多次查询、重排和回退;「固定」不是只能查一次,而是查询怎样形成、何时继续、怎样转移和何时停止都已由开发者写进规则。
两种机制建立以后,才能比较代价。内容很少、几乎每次都要用时,全量装入很直接;资料增长后,无关内容也会占据窗口并增加处理成本。固定检索只装入候选材料,但会增加检索延迟,也可能漏掉真正相关的内容。
因此,看到「生成前已经放入材料」还不能判断架构。先问:运行系统是否从一个更大的集合中选择了本轮候选材料?没有选择,是全量装入;先选择、再装入并用于生成,才走完一次 RAG 主链。
五、RAG 把候选材料交给生成,不把它变成事实¶
第二节已经建立了从检索到生成的 RAG 主链。这个名称描述的是「从窗口外选出候选材料,再把它装入工作集参与生成」的组合关系,不单指检索器、向量库或其中任何一个节点。
这个名称来自 Lewis 等人的原始论文,原论文让生成模型访问稠密向量索引。本课关注「取回外部材料,再让生成以这些材料为条件」这条机制关系,因此关键词、数据库查询、向量检索和混合检索都可以提供其中的检索步骤。
只完成检索,得到的仍只是候选材料;把材料存进向量库,也只是为以后检索做准备。反过来,候选材料一旦被装入工作集并参与生成,无论它来自关键词、数据库还是向量检索,都可以形成 RAG。由此可以直接判断:RAG 包含检索,检索却不等于完整的 RAG。
这条链的每一步都可能失败:资料库可能缺少关键来源,检索器可能漏掉相关片段,候选材料可能只与主题相似却不支持主张,模型也可能忽略或误读正确材料。因此,检索结果只是候选材料,不是事实证明。
RAG 改变的是模型本轮可访问的信息,不是模型权重,也不保证答案正确。若答案需要出处,工作集应保留与主张对应的原文片段、来源和定位;还要核对具体片段是否真的支持该主张。
六、向量检索是检索方法,向量库是可能的实现¶
回到 RAG 主链,向量检索和向量库只解释「窗口外可检索信息怎样产生候选材料」这一段。向量检索先把文本和查询转换成一组表示语义关系的数字,再寻找距离较近的片段。向量库或带向量索引的检索服务,则负责保存这些表示并支持相似度查询。
向量检索的优势是:即使查询和原文几乎没有共同词,也可能找到意思接近的内容。OpenAI 的 Retrieval 文档展示了这种语义检索,也说明可以在检索前按日期等属性过滤。
关键词检索和向量检索是两种匹配候选的方法:
| 方式 | 更擅长找什么 | 不能据此判断什么 |
|---|---|---|
| 关键词检索 | 编号、专有名词、精确短语 | 字面不同的内容是否语义相关 |
| 向量检索 | 语义接近但措辞不同的内容 | 候选材料是否支持主张、是否真实 |
范围过滤回答的是另一层问题:哪些材料有资格参加匹配。 系统可以先限定用户、项目、时间或文档类型,再在这个范围内做关键词或向量匹配,最后重排候选。过滤、匹配和重排可以组合,不能当成三个互斥的检索方案。
但相似度不是支持关系,更不是真值判断。一篇评论预测规则会通过,和最终规则已经生效,主题可能非常相似;只有回到来源、时间和具体原文,才能判断材料究竟支持哪一个主张。
所以三者的关系是:RAG 包含检索步骤;检索可以使用向量检索;向量检索可以由向量库或其他带向量索引的服务实现。 向量库既不是 RAG 的定义,也不是跨任务记忆的同义词。
七、固定检索与迭代搜索可以组合¶
回到第二节的责任分工,固定检索与迭代搜索只改变一个位置:具体查询、转移和停止规则是在设计时写定,还是由模型在运行时根据结果提出。 固定检索由开发者预写规则、运行系统应用;迭代搜索则让模型在边界内提出后续动作。检索器仍负责匹配,运行系统仍负责检查、调用和上下文装配。
一次 RAG 回答「候选材料怎样进入生成」;固定检索与迭代搜索回答「查询怎样形成、何时继续、何时停止,由谁控制」。固定检索可以只运行一次,也可以按预写规则执行多步;两者都可以运行 RAG 主链,也可以出现在同一个任务里。
| 运行方式 | 谁控制查询、继续与停止 | 适合什么情况 | 主要风险 |
|---|---|---|---|
| 固定检索 | 开发者预写规则,运行系统应用;可一次,也可多步 | 资料和问题稳定,查询与停止规则容易预定 | 预写规则没有覆盖的新情况会被漏掉 |
| 迭代搜索 | 模型根据当前结果提出后续查询、来源或停止 | 开放问题、多跳调查、结果会改变下一问 | 漂移、绕圈、过早停止,成本较难预估 |
| 混合方式 | 运行系统先取稳定材料,模型只补缺口 | 既有高频背景,又可能出现新问题 | 两部分交接不清时,可能重复查找或漏掉缺口 |
混合方式在每周调研里很自然:运行系统先固定取回上次已核验的结论、来源和记录时间;模型判断这些材料是否覆盖本周问题,只有存在缺口时才继续搜索。Anthropic 的上下文工程文章也把预先取回与运行时自主探索写成可组合策略,但这不意味着所有系统都需要两者。
资料和问题稳定、检索规则容易预定时,先用固定检索;中间结果会合理改变下一次查询、来源或停止点时,再把这一部分选择交给模型。两类需求同时存在,就让模型只搜索固定检索没有覆盖的缺口。
八、迭代搜索控制下一次检索,不替代 RAG¶
一次 RAG 结束后,任务不一定已经完成。材料可能过期、互相冲突,或者只回答了问题的一部分。此时系统要决定:是否再次回到主链中的「检索」节点,以及下一次查什么。
固定检索即使有多步,查询、转移和停止规则仍由开发者预先写好,再由运行系统应用。**迭代搜索(Agentic Search)**则把一部分选择放进 Agent 循环:模型看到本轮候选材料或回答缺口后,提出新的查询、换来源或停止请求;运行系统检查请求并调用检索器。新的结果又会被装入工作集,供模型继续生成或判断。
例如,模型为「本周稳定币监管动态」拿到三条候选材料:一篇是咨询稿,一篇是行业回应,另一篇评论声称规则即将生效,却没有原始文件。模型据此改搜规则编号,只读取监管机构原文,比较发布日期;如果仍找不到生效文件,就停止并报告证据缺口。
迭代搜索改变的是主链外面的控制方式,不是主链内部的 RAG 关系。这里新增的能力不是「可以检索」,而是本轮结果会改变下一轮的查询、来源和停止点。这种适应性适合开放问题和多跳调查,也会增加查询漂移、重复搜索、低质量来源循环、过早停止以及调用成本失控等失败路径。
所以,迭代搜索不保证更准。它只提供根据反馈调整路径的能力;是否值得使用,要看中间结果会不会合理改变下一步。
九、写入与更新:让记忆以后还能被安全使用¶
取回错误通常影响当前任务;自动写入错误却可能影响之后许多任务。运行系统不能把模型刚生成的总结直接当成已核验事实保存。为了让本课的记录可以回查和更新,用下面六项检查每一条准备复用的信息:
| 要保存的信息 | 它回答的问题 |
|---|---|
| 作用范围 | 这条记录属于哪个用户、项目、租户或任务域 |
| 可复用内容 | 未来准备取回什么主张、偏好、状态或摘要 |
| 来源与定位 | 内容来自哪里,怎样回到具体原文或用户输入 |
| 记录时间、来源时间与生效时间 | 什么时候写入,来源何时发布,所述事实从什么时候开始成立 |
| 核验状态 | 是模型生成、待核对、已核对、已否定还是待复查 |
| 更新与过期关系 | 哪条新记录替代哪条旧记录,何时必须重新核对或停止使用 |
模型可以提出「这条信息值得保存」,运行系统负责检查作用范围、必填信息和写入权限,再把它保存为待核对记录。模型根据材料写过一段总结,只能证明这段总结被生成过;只有独立核对具体来源后,核验流程或有权限的人才能把状态提升为「已核对」。
更新也不等于静默覆盖。新来源与旧记录冲突时,运行系统应保留冲突、时间和替代关系,直到核对完成。对于「本周发生了什么」这类时效任务,旧记忆可以提供稳定背景和已知来源,却不能替代本周检索;最新来源的发布日期也不能证明中间没有漏掉其他材料。
记忆内容仍可能包含网页里的提示注入、模型误读和过期信息。被模型总结过一次,不会把不可信内容变成可信指令。因此,写入、提升核验状态、替代旧记录和删除应分别设定权限,不能因为都叫「记忆操作」就默认共享同一权限。
十、一个普通动作案例:先取回旧结论,不够再搜索¶
假设 Agent 每周要整理稳定币监管动态,并为每条结论保留出处。第二周开始任务时,信息这样流动:
- 运行系统按当前项目、主题和有效期,从跨任务记忆中取回上周已保存的结论状态和来源指针,再按指针从资料库取回需要核对的原文或片段。
- 运行系统把这些候选材料连同本周任务装入工作集。到这一步为止,走的是固定检索。
- 模型检查候选材料,发现最新来源仍停在上周,而且其中一项只有行业评论,没有监管机构原文。
- 模型提出搜索本周材料、按规则编号读取监管机构原文等请求;运行系统检查并执行。这部分才是迭代搜索。
- 模型比较新旧来源,写出有支持的结论,并把没有找到生效文件的事项保留为证据缺口。
- 运行系统把本轮可能复用的结论写成跨任务记忆中的待核对记录,同时保存作用范围、来源、时间和核验状态。模型不能把自己的输出直接标成「已核对」。
这个案例说明:固定检索和迭代搜索可以串联;跨任务记忆只有被检索并装入工作集后,模型才看得到;本周答案只有回到具体来源核对后,才可能成为以后可靠复用的记忆。
第二周可能比第一周少搜索,但这不是必然结果。旧记录可能已经过期,当前问题也可能要求重新核对。复用的目标是减少不必要的重复工作,同时保持答案质量和时效性,不是让搜索次数单向下降。
十一、怎样检查复用没有放大旧错误¶
可以比较第一次没有可复用记录和第二次已有相关记录时的任务表现,但先检查复用是否可靠,再看节省了多少工作:
- 运行系统是否只取回属于当前用户、项目和主题的记录;
- 记录是否保留来源、时间、核验状态和过期条件;
- 候选材料是否真的支持最终主张,而不只是主题相似;
- 有权威答案或后来确认的事实时,最终主张能否与之对上;没有这样的外部标准时,只能声称主张可追踪且有材料支持,不能声称已经证明为真;
- 旧记录与新来源冲突时,系统是否保留冲突并重新核对;
- 迭代搜索是否围绕明确缺口继续,能否在证据不足或成本超出约束时停止。
这些检查通过后,再比较调用次数、处理量和等待时间是否下降。只减少搜索,却让系统误用旧结论、串用其他项目的记忆或漏掉当前证据,不算改进。
检索日志只能说明来源路径可以追踪;它不能解释模型内部为什么选了某句话,也不能证明那句话正确。可追踪、材料支持主张和主张符合现实,是三个需要分别检查的问题。
十二、三条结论¶
一,存储只让信息留下,记忆策略才决定信息以后怎样复用。 文件、数据库和向量库只是介质;作用范围、来源、时间、核验状态以及更新和过期规则,才决定记录能否安全进入未来任务。
二,检索责任跨越设计时与运行时。 开发者规定可以怎样找;模型在迭代搜索中提出这次具体找什么;运行系统校验请求、调用检索器并装配结果;检索器执行过滤、匹配和排序。固定检索由开发者预写具体规则,再由运行系统应用。
三,RAG 描述材料怎样进入生成,固定检索与迭代搜索描述谁控制检索过程。 窗口外信息经过匹配、候选、装入工作集和模型生成,形成 RAG;向量检索只负责其中的匹配,不负责证明候选材料真实或支持结论。
十三、这一章引出的问题¶
现在,旧结论可以跨运行留下并被重新取回,但搜索函数、参数定义和结果适配仍直接写在运行系统里。换一个能力提供方,运行系统仍可能要重写连接代码。
下一章把连接边界分成两种:复用一个外部能力,和把一项完整任务委托给另一个 Agent。它们解决的不是同一个问题。
十四、自检题¶
- RAG 是主链中的某一个节点,还是一组节点之间的完整关系?
- 一个本地文件跨进程保留下来,为什么还不能自动叫跨任务记忆?
- 向量检索返回最高相似度片段,能否据此认定它支持答案?
- 在模型参与检索选择时,开发者、模型、检索器和运行系统分别负责什么?换成固定检索,哪一项责任会变化?
- 本轮工作集和任务记忆有什么差别?
- 什么任务适合先固定检索、缺口出现后再迭代搜索?
- 为什么模型根据来源生成的总结不能直接标成「已核对」?
- 第二次运行没有重新搜索,能否直接声称旧记录仍代表本周最新情况?
- 跨任务记忆中的来源指针,与资料库中的原文分别起什么作用?
十五、参考答案¶
先自己答完再往下看。
- 是一组节点之间的完整关系。 检索器从窗口外可检索信息中选出候选材料,运行系统把材料装入工作集,模型再据此生成;从检索到生成的这组关系共同构成一次 RAG。检索只是其中一步,RAG 也不是额外增加的一个步骤。
- 因为存储不等于可复用策略。 还需要写入依据、检索入口、作用范围、来源、核验状态、更新、过期和删除规则;否则它只是一个未来不会自动被使用的文件。
- 不能。 相似度只说明语义接近。材料可能只是讨论同一主题,也可能与答案相反;仍要核对来源身份、时间和具体原文是否支持主张。
- 开发者规定可用的数据源、动作、参数和权限;模型在迭代搜索中提出这次查询什么、读什么以及何时停止;运行系统检查请求、调用检索器并把需要的结果装入上下文;检索器执行过滤、匹配和排序。 换成固定检索后,查询、继续与停止规则由开发者预写、运行系统应用;固定检索可以只查一次,也可以执行预先设计的多步查询、重排和回退。
- 工作集是运行系统为当前步骤主动选入的任务内容,任务记忆是当前任务范围内可供后续轮次取回的状态。 工作集只是模型本轮有效上下文中的任务部分;任务记忆可以暂时留在窗口外,工作集也可以包含从跨任务记忆和资料库取回的内容。
- 既有稳定高频资料、又可能遇到开放缺口的任务。 例如客服先取产品手册,仍无法覆盖异常个案时再搜索工单;调研先取上次结论和已知来源,再补查新动态。
- 因为生成动作只证明模型写出了这段总结。 它没有证明来源身份可靠、摘要忠实或具体片段支持主张;核验状态应由独立检查或有权限的人提升。
- 不能。 旧记录只能说明当时保存了什么、其中最新来源何时发布;它不能证明资料完整覆盖到某日。涉及当前状态时,必须检查有效期、检索范围和新证据,必要时重新搜索。
- 来源指针保留在跨任务记忆里,帮助未来任务知道该回查哪份依据;原文保存在资料库里,供运行系统按指针取回并重新核对。 指针不是证据正文,资料库中的原文也不会在未被检索和装入工作集时自动对模型可见。
上一章:第 6 章 工具设计:让模型选择哪些动作,怎样说明这些动作 下一章:第 8 章 MCP 与 A2A:调用外部能力,还是委托远端任务