第8章 检索与记忆——信息怎样取得和复用
第7章决定本次模型请求应当看什么,但组装器不能凭选择规则产生缺失的信息。知道需要原文,不表示原文已经取得;找到一段相关文字,也不表示它足以支持当前结论。信息取得、证据使用和跨任务复用各有边界,需要在同一条过程里建设,而不是用一个“记忆模块”代替全部责任。
本章继续第3章的两个固定工具和摘录任务。固定来源已经足够时,直接定向读取就是合适入口,不为演示检索另造向量数据库。后续任务确有更多来源或长期复用需要时,可以把存储与搜索交给外部工具;宿主仍须明确怎样形成查询、选择发送、接受依据,以及何时拒绝继续。
8.1检索、RAG 与候选的使用
检索是在明确的信息范围中,依据查询条件寻找相关对象或片段的过程。它不是生成一个听起来相关的答案。最小形态是查询、搜索范围和带定位信息的候选结果。检索可以按名称、关键词、字段或语义相似性完成;采用哪种方式,要看需要找的对象,不由“智能”一词决定。
检索增强生成(retrieval-augmented generation,RAG)是取得外部材料,让这些材料支持模型判断或生成的过程。它不是向量库的别名,也不是“工具返回答案,所以答案是真的”。最小形态是形成信息需求、检索或定向取得材料、核对来源与范围,再把必要证据送入生成请求。已有文件索引、数据库查询、外部服务和固定读取工具都可以承担其中部分工作。
向量检索把对象表示成便于比较相似性的数值,并按相关性寻找候选。这里的数值不是事实可靠性得分。关键字相同也不证明来源权威;候选排名靠前只说明它满足该检索方法的某种相关条件。harness 需要的是有根据的取用过程,不必为了使用 RAG 自建这些表示和索引。
第3章的任务已经知道两个来源标识,因此不需要先搜索全库。read_source 取得绑定快照,模型根据实际原文提出摘录,工具再逐字验收。这具有外部材料支持生成的最小关系,但验收仅到来源与字节,不能扩展为材料事实已核验。将这条关系称为 RAG,也不会增加原系统没有承担的内容义务。
检索结果还不一定是正文。标题、命中片段和对象标识帮助决定下一步读什么,有时本身已经足够回答对象定位问题;若要引用原句或依据限定条件作结论,通常需要定向读取相关位置。应先界定当前判断需要哪种材料,再决定候选能否直接使用,不能把搜索摘要统一当作来源原文。
因此,RAG 的有效性至少分成两部分:有没有找到任务所需材料,以及取得的材料是否被恰当使用。找错来源、漏掉反例、用旧版本或误读条件,会发生在不同边界。把它们都归结为“检索不准”,就无法判断应改查询、补读取,还是改变后续判断方法。
8.2从信息缺口到有范围的查询
检索之前先说明缺什么。信息缺口是当前判断缺少的具体依据,不是笼统地要求“多了解背景”。最小记录可以是需要回答的问题、对象、时点和可接受来源范围。摘录任务的缺口是两个指定快照中的原文,而不是阅览室或花园的全部知识;这已经决定最窄的读取入口。
查询要保留用户要求中的对象名称、时间和版本条件。若任务要求启动时的材料,不能把查询改成“最新版本”;若需要精确原句,不能只查一个较宽的主题后就交付语义相近的文字。模型可以提出查询建议,但宿主核对它没有改变有效目标,也没有扩大来源访问范围。
搜索范围(range)说明查询在哪些来源、对象或时间段中执行。它不是显示界面当前打开的目录,也不是工具持有的全部访问权限。最小形态是实际传给搜索能力的范围条件,以及结果中可核对的来源归属。外部工具只能按账户范围搜索时,宿主应知道这一限制,不能把账户可读的所有结果视为任务都允许使用。
搜索命中(search hit)是检索过程返回的候选定位项,不是已确认结论。它至少应能说明来源、位置、版本或可取得的版本信息,以及返回片段的范围。若结果只有一句概括而无法定位,应标为有限线索;不能为方便引用补造一个来源路径或页码。
查询和结果规模都需要预算。可以先查固定来源,再在允许范围内扩大;每次扩大有明确理由和候选上限。候选目录同样占输入,搜索工具返回一百条也不表示宿主必须全部发送。反复换词直到得到符合预期的结果,还可能漏掉冲突依据;应记录查询覆盖和停止条件,而不是把次数增加当成充分性证明。
查不到只能说明在这次查询、范围和方法下没有取得命中。索引可能未覆盖对象,版本可能尚未更新,权限过滤也可能使对象不可见。除非工具具有明确的完整性与否定查询契约,不能据此断言对象不存在。报告应保留“未取得依据”及其搜索范围,必要时请求补充,而不是把检索失败转写成事实否定。
8.3定向读取与取得时点
得到候选之后,要取得足以判断的内容。定向读取(target read)是依据候选定位读取特定对象或有边界的片段。它不是继续搜索一个相似答案。最小形态是目标来源、读取位置、返回范围和版本信息。片段可用行区间、章节或字段表示,具体以工具契约为准,不能混用而丢失定位含义。
读取范围应涵盖改变判断的上下文。搜索片段中的一句肯定陈述,前后可能有限定对象、否定条件或有效日期。读得过窄会误解,直接读取全文又可能超出发送与输入预算。应由当前问题决定扩展边界,保留“已读哪些部分”和“哪些部分仍未核对”,而不是把局部阅读写成通读全文。
版本核对回答读到的是否仍是候选指向的对象。来源版本可以是服务版本号、不可变快照或内容 hash;它不是最近读取时间。若搜索返回旧索引片段,定向读取已是新内容,应显式记录差异,再决定采用哪个版本。不能把新正文与旧片段拼成一份仿佛同时存在的证据。
第3章的 read_source 读取启动快照,因而在同一运行内具有清楚的版本对象。下一次运行即使来源名相同,也不能凭名字断言观察完全相同。hash 绑定字节,不证明作者身份和陈述真实性。对于外部服务,如果只能取得当前版本且没有历史快照,应承认无法复原某次旧观察。
冲突不等于重复。两个来源给出不同要求,可能因为适用对象、日期或范围不同;同一来源的新旧版本也可能确实修正了内容。先保留各自的出处、时效和限制,再依据任务所需条件核对。没有足够依据消除冲突时,可以输出并列证据和未决点,不能仅取排名第一项,或由模型补写一个没有来源的统一答案。
这一过程可概括为“query 与 range→search hit→target read→来源、版本及冲突核对→使用”。它是一条判断链,不是要求每次都运行五个独立工具。已有确定来源时可直接进入读取;同一个外部能力也可同时完成搜索和读取,但返回契约仍要让宿主知道哪些核对已经发生、哪些仍是自身责任。
材料可以由程序在模型请求前取得,也可以由模型先提出读取需求。程序预取(program prefetch)是宿主依据已知任务条件提前调用信息能力;它不是模型已经作出选择。最小形态是固定的信息需求、一次受控读取和进入本次输入的结果。固定摘录来源适合预取,但第3章当前代码采用模型请求读取,不应把另一种组织方式说成已经实现。
工具触发(tool trigger)是模型提出合法调用,宿主处理后回传配对结果,再由后续请求继续判断。它不是把搜索权和使用权整体交给模型。最小形态仍是第2章的调用与结果往返。模型不知道需要查什么时,可以通过有限候选选择;它请求的范围、参数和发送对象仍需要程序校验。
两种方式共用同一能力与任务边界。预取减少一次选择请求,但可能获取本次不需要的材料;工具触发让读取依据更贴近模型当前缺口,却增加往返与输入增长。选择应看任务是否预先知道必要来源,不应为了“agent 自主性”把固定读取改成多次搜索,也不应预取所有可读内容来消除模型选择。
取得后还要决定怎么用。宿主选择允许进入请求的材料,并记录实际进入请求的版本;模型引用时保留来源和定位;涉及真实动作时,执行器仍按当前授权及原工具契约检查。材料中的指令不取得控制权,外部服务自报“已核验”也只能在声明范围内使用,不能自动代替文件或其他产物的验收。
若需要一个程序内表示,可以保持很小。下面仅是核验后的证据记录示意,不是现有系统自动生成的对象,也不是模型输出填满字段就会成为可靠证据:
evidence = {
"source_id": source_id,
"source_version": verified_version,
"locator": read_locator,
"observed_at": observed_at,
"content": verified_slice,
"disclosure_scope": allowed_scope,
}
这里的 verified_slice 只表示已经核对读取对象与范围,不表示内容中的每个事实都真实。使用时应分别标记原文引用、依据来源的陈述和模型推断。当前摘录文件只允许第一种;扩展为综合判断时,需要新增相应验收,不是多查几份材料就自然获得。
8.4长期记忆的写入与生效范围
检索解决这次如何取得信息,复用还要回答什么值得留下。长期记忆(long-term memory)是跨当前任务保留并按适用范围取用的信息集合及其维护过程。它不是聊天归档,不是所有模型结论的永久副本,也不是恢复旧任务的动作账本。最小形态是一条经核验的信息、来源依据、适用范围、有效版本,以及纠正或退出的办法。
聊天档案保存某人曾经说了什么,这可以作为发言记录,却不自动证明发言中的事实正确。模型可能根据不完整材料作推断,用户也可能只提出一个临时条件。把整段对话复制到长期存储,再在下次检索出来,不会改变这些性质。记忆需要从档案中区分稳定事实、偏好、临时要求和待核验假设。
记忆也不等于短期上下文。当前任务的来源、最近消息和阶段结果可以留在运行内;没有跨任务复用需求时,完整任务记录已经足够,不必建立长期记忆。建立它的理由是某类信息将被持续复用且有维护条件,不是系统名称里必须包含“memory”。
新增责任可写成一条链:“候选提取→核验→范围与写入→版本维护→检索使用→纠正、过期或撤回”。候选提取是识别可能值得复用的信息,不是直接持久化事实。最小候选应说明主张是什么、来自哪里、为什么可能跨任务有效,以及尚缺哪种核验。
在本书摘录任务里,两段原文可作为本次证据保留,却没有必要升格为关于阅览室和花园的长期事实。材料本就是自编练习文字。若为重复练习保存来源引用,应保存的是“这个练习版本提供了哪些字节”的对象事实,而不是把练习内容当成真实世界知识。
模型猜测可以作为明确标注的待核验候选保存到专门范围,但不得悄悄进入默认事实集合。下次检索到它时,仍要知道它未经核验。否则,模型第一次猜测被第二次检索包装成来源,形成没有新增证据的自我确认。来源可追溯不等于可靠性自动提高。
核验必须对应信息种类。用户明确表达的偏好,可以证明该用户在当时提出了这一偏好;由文档取得的事实,要核对文档出处、版本与适用条件;工具返回的动作事实,则按动作记录与对象核对处理。不能用统一的“模型置信度高”作为全部记忆写入条件。
候选与证据之间应有可检查关系。记忆条目写“用户偏好简体中文”,依据应是明确要求,而不是从一次中文提问推断永久偏好。来源仅支持本次任务的限制时,应保留任务范围,不把它扩大成全局规则。确实需要模型归纳的内容,可以留下归纳与原文引用,并说明核验只到哪些性质。
适用范围(scope)说明条目对哪个主体、任务类别、来源集合和用途有效。它不是存储所在目录。最小形态可以是用户、工作区和任务类型等固定字段的组合,具体只保留实际需要的边界。对当前个人摘录系统,不必因此引入组织权限平台;但若通过外部工具保存,存储与检索范围仍要明确。
范围还包括发送对象。外部记忆服务允许宿主读取一条信息,不证明可以把它发送给任意模型或交付给其他用户。写入本身也是一个持久效果,应确认保存许可和目标范围。工具可以承担这层权限控制,宿主仍需说明提交时如何绑定范围,不能仅依赖模型在文本里写“仅自己使用”。
写入要有版本。首次条目与后续修订应能区别,修订说明依据什么纠正,不直接把旧值覆盖得无迹可查。记忆版本是条目演进的身份,不等于来源版本;来源没变,核验结论也可能修正,条目需要自己的变化记录。若只有一项临时记忆,也可以用简单版本与原记录,不必建设通用知识管理平台。
模型提出候选以后,宿主或承担该责任的外部工具核验、写入并返回确定结果。响应丢失不能自动再写一遍并假定第一次未生效;具体核对与重试仍遵守第11章。记忆写入不是例外的“无副作用操作”。第3章现有工具没有这项能力,本章方法不表示它已经自动写入长期事实。
8.5取用时的复查与撤回
写入正确还不够,未来请求的条件会变化。记忆检索同样从当前信息需求开始,并带上当前范围。命中条目后检查它是否仍有效、依据是否足够、是否已被修订,以及可否进入这次请求。不能只凭相似性排名把旧条目重新装进上下文,尤其不能忽略条目的主体与时间条件。
可以复用稳定条目,也可以把它作为新的查证入口。来源容易变化时,旧条目应提示核对当前版本,而不是替代当前读取。任务要复现历史时,则保留历史条目的日期和来源快照,不能以当前版本悄悄改写旧观察。长期记忆的用途应明确是历史证据还是当前依据。
纠正是用新依据修订原条目的内容或适用范围;过期是条目不再满足有效时间条件;撤回是条目不再获准保存或使用。它们不是同一个删除按钮。最小纠正保留新旧版本关系,过期有可检查条件,撤回阻止后续默认取用,并按实际保存契约处理原记录。
旧错误条目若仍在搜索索引或缓存中可被命中,返回链必须过滤或明确标记,不能把“已在主表修正”当作全部生效。外部服务可以负责版本和过滤,但宿主要知道读到的是有效条目还是历史记录。无法核对时,不应把旧值当成当前确定事实;可以报告记忆维护状态未知。
用户的当前纠正优先进入有效任务条件。它还可能要求修订长期条目,但两者并不自动等价:一次任务的例外,不必改变全局偏好;明确撤回长期记忆,则不能只在当前输入中遮蔽一轮。宿主应根据用户实际要求决定作用范围,避免把临时变化永久化,或把永久纠正当成临时提醒。
条目撤回也不自动撤销过去的外部发送和已完成动作。系统应说明实际能停止哪些未来取用、删除哪些副本、保留哪些必要记录,而不是承诺已经发给模型的内容从所有系统消失。维护过程的价值在于范围明确、当前使用可控和变化可核对,不在于一个没有条件的“彻底遗忘”说法。
8.6外挂存取与建设起点
检索与记忆可以通过外部 tools 完成。外部能力可以承担整个存储、检索、版本维护和权限控制,不要求宿主再复制一套数据库。接入契约应说明写到哪里、读到哪些范围、返回版本如何识别、纠正怎样生效,以及失败或未知时如何报告。协议统一不等于这些责任已经存在。
宿主保留的责任至少是:按当前目标决定查询与写入候选,选择允许发送的返回内容,按证据性质使用,并在动作前检查当前权限和状态。如果外部服务也承担核验或选择,需要明确它的契约及宿主接受条件。不能只写“记忆都在工具里”,却没有任何一方负责判断模型猜测是否成为永久事实。
近期消息和任务材料也可以通过工具外挂。会话服务负责保存、按范围读取和组织交互记录;它不是必须内建的短期记忆,也不是所有 harness 必备组件。最小形式可以只返回指定会话的有限片段。它有利于输入组织,但返回摘要不能自动替代接口要求的历史字段,更不能重建未完成调用的真实配对。
证据档案负责保存观察原文、来源版本和定位,供同版引用与核对;它不是长期事实集合。最小形式可以是本次运行的不可变结果记录。长期事实集合负责经过核验的信息及范围和修订;它也不是任务进展。三者可以在同一外部服务里存储,但读取接口和使用含义要能够区别。
动作状态则由可信执行记录与当前核对提供。摘要写着“文件已创建”,不证明文件存在、内容合格或效果已可靠记录。第3章的账本和产物验收不能被会话服务替换;只知道过去发过 create_card,不能在新任务中把它当成当前完成证据。
记忆不能恢复旧授权。曾经允许外发两份材料,不表示下一任务仍可外发;曾经使用某个工具,也不表示现在可以接手其未完成动作。即使工具返回完整旧记录,调度资格仍须按当前目标、授权、映射和旧执行状态核对。检索负责找到信息,可靠接手由第11章处理,不能靠“记起来了”直接继续执行。
最小建设先复用已有能力。固定来源任务用 read_source 取得原文,用请求快照记录实际发送,用 create_card 验收摘录;没有搜索缺口,就不增加搜索调用。要支持较大来源时,可扩展固定读取契约以表达范围与版本,但输出截取必须显式,不能把当前全文接口静默改成前半份材料。
确有来源发现需求时,再接入一个可以返回有限候选及定向读取信息的外部能力。宿主只需要规范查询、范围、定位、版本与错误状态,不需要自行管理向量索引。外部服务没有同版读取能力,就按这个限制设计证据保存;没有完整否定查询能力,就保留“未命中”而不推出不存在。
确有长期复用需求时,再增加候选核验和版本化写入。不要先定期总结全部聊天,再寻找它的用途。条目少时,简单的程序侧记录和范围读取已经能表达责任;条目多时,服务可承担更多存取工作,但候选、事实和动作的区别不能随规模消失。组件是否值得保留,取决于实际复用和维护成本。
验证围绕错误使用路径展开:把未命中解释成缺少依据,发现搜索与读取版本不同时保留差异,拒绝超范围发送,阻止未核验候选进入事实集合,确认纠正与撤回后不再默认取用旧条目。还要检查旧记忆无法触发新的创建,外部摘要无法把未知动作改成成功。这里列的是建设检查,不冒充现有代码已完成全部测试。
效果比较沿同一任务记录取得了哪些必要证据、哪些判断仍无依据、实际模型用量、工具往返、重取与人工核对。使用第2章的统一价格基线比较实际用量,外部收费单列。命中更多条目、存储更多聊天或生成更长答案,都不能单独证明检索与记忆提高了任务效果。
配套实践与限制
随书 book/v2/practices.py 的 Material、MaterialRef 与 read_slice 只处理已经交给程序的内存原文及同版范围引用。它们没有形成查询、搜索候选、来源发现或核验长期事实,不能把这个 helper 当作完成了 RAG 或记忆平台。原 read_source 及 book/v2/capability_lab.py 的固定 MCP 读取,可以检验已知来源进入生成请求的关系;其范围仍限于两份练习快照,不是通用检索服务。
本章的长期记忆仍是概念、接口与取用方法,没有新增候选写入、索引维护、纠正或撤回模块。没有跨任务复用需求时,可以保持现有系统;确需外挂服务时,再按本章边界取得明确契约。配套函数的本地测试不替代这些服务的实施与验证。
8.7本章判据
- ☐是否将 RAG 定义为检索材料支持判断或生成的过程,而不是向量库或自动真实性保证?
- ☐查询是否对应具体信息缺口,范围是否明确,未命中是否没有被写成对象不存在?
- ☐搜索命中是否可定位,使用原文前是否按需要定向读取并核对范围、版本和冲突?
- ☐预取与工具触发是否共用授权、发送和证据规则,返回内容是否没有取得指令权?
- ☐长期记忆是否经历候选提取、核验、范围与版本写入,而不是直接永久保存模型推测?
- ☐取用是否复查当前适用性,纠正、过期和撤回是否影响实际后续检索与发送?
- ☐外部工具和宿主的责任是否明确,会话记录、证据档案、长期事实与动作状态是否分开?
- ☐记忆是否不能恢复旧授权或接手动作,摘要是否不能把未知结果改成已完成?
- ☐没有跨任务复用时是否允许不建长期记忆,效果比较是否包含证据质量、实际用量与维护成本?
本章没有回答什么
本章没有建设检索平台、向量索引算法、存储运维或完整知识管理系统,也不保证某种相关性方法能找到全部必要证据。外部服务的存在只解决契约内的存取责任,有限核验不证明来源中的所有陈述真实。
本章没有把检索结果移出长上下文的全部规则,也没有用聊天归档实现可靠恢复。第9章处理证据的折叠、展开与历史压缩;第11章处理未知动作和继续资格。这里的方法不表示第3章已经新增搜索、长期记忆写入或自动接手能力。