locate/read 两阶段正交
方法论道层 · context-infra 处理逻辑
locate/read 两阶段正交
viewtype=流程图 · 答:locate 与 read 为什么要正交分离 · 不答:具体 agent prompt
信息收集的定位与阅读分离
真源路径:contexts/methodology/locate_read_two_phase_info_collection_20260530_manual.md · 图型:流程图 · 域:context-infra 处理逻辑
真源正文
报告元数据(frontmatter)
name: locate_read_two_phase_info_collection_20260530_manual
description: 定位/读取两阶段收集
domain: infra
consumption:
surface: memory_index
trigger: "记忆索引召回"
consumer: orchestrator
status: library
promoted_to: rules/skills/drafts/workflow_recall_first_locate.md信息收集 face 的 locate / read 两阶段正交机制:诊断与设计
2026-05-30。Opus 亲写最终综合,证据来自一次自演示 workflow(locate 内联 → budget 受限的 7 路深读 + 2 路冗余增派 → opus 交叉验证 + solid-decision 判级 + 3 路对抗 skeptic)。run wf_39e88e76-518,14 agent,约 100 万 token。
方法本身就是被设计对象的活体演示:先定位、后阅读、动态增派、独立判级。
1. 直接结论(含对原假设的两处修正)
真正的问题不是"方向超过 5 个就失准",而是信息收集 face 把"定位"和"阅读判断"压进了同一个 agent pass。两处需要修正原来的判断:
第一,"方向数有时超过健康上限(>5)"这个说法,对真正的信息收集 face 是站不住的。专用信息收集 loop(large_context_compression_method_loop_20260523)实测每批 first-layer 的方向数最高就是 5、零次超限,subagent_direction_cap_first_layer: 5 这条 cap 被遵守了。之前看到的 21 / 23 个方向,来自 AAU 测试候选池的 triage(action=structured_pool_triage,loop 自己标了 status=CLASSIFICATION_ONLY_NOT_EXECUTION_COVERAGE),那是测试执行的候选分类,不是信息收集 sub-agent 的方向。把它当成"信息收集方向超限"是构造性误配。
第二,机制不是从零设计的新东西。locate / read 的正交分离在系统里已经存在两个可运行实例(都在 AAU 的 runner.py),并且在矩阵设计里已经被命名(information_collection_matrix_v0_1.md 的 L2 Bridge/Locator、P1 Universe Map)。所以缺口不是"没有这个概念",而是这个概念从没被操作化成一个独立的、带召回 oracle 的 agent pass,并且被默认合并进了阅读步骤。
因此正确的问法从"怎么设计一个 locate 阶段"变成:怎么把已经存在但寄生在阅读里的 locate,提成一个独立的、以召回为唯一硬指标的前置阶段,并给它一个能证明"没漏位置"的 oracle。这是用户说的"large context 处理矩阵里缺的那一格",也是 guidance_skill_matrix §7 #1 记录的"环节 3/4 承重墙缺口"的第一块具体砖。
2. 诊断:conflation 是什么、在哪、有什么代价
2.1 conflation 的确证(证据等级 bounded)
两个独立 reader 读了两个不同的 loop,结论一致:first-layer scanning agent 在同一个 prompt 里既枚举并定位原始单位,又深读它们、还判断有用性、再产出方法蕴含。
最干净的样例是 large_context_compression_method_loop_20260523/first_layer/C001_target_session_raw_audit.md:单个 agent 在同一轮里先列 Covered Units(定位 4 条 rollout 路径 + 量文件大小),再在同一份输出里写 Coverage / Usefulness / Candidate Method Implications。它服从的 rubric(prompts/first_layer_common.md:33-43)把五个方向并列成一组:Coverage / Usefulness / Method defect / Boundary / Candidate rule。这里有一个被对抗验证纠正的细节:rubric 里的 "Coverage" 定义是"实际读了哪些原始单位",它是读后的覆盖核查(coverage receipt),不是读前的高召回定位。也就是说,first-layer rubric 有一格"读后核查",却没有一格"读前的候选位置召回",定位是隐式发生、和阅读纠缠在一起的。
设计层确实分出了这一格,但从未落地为独立 pass:information_collection_matrix_v0_1.md:82-85 把 P1 Universe Map(过滤前先枚举源族)和 P2 Scent Scan(按信息气味排序)列为两个读前操作;method_v0_2.md:42-44 第一次把"枚举源单位"排成骨架里的独立一步(step 3,在 first-layer 提取 step 5 之前)。但这两处都只是清单项或 schema 字段,没有自己的 budget、退出条件或召回 oracle,执行时仍由做阅读的同一个 agent 顺手完成。source_frontier/ 经确定性 ls 核验是一个 symlink 目录(指向若干源根的静态 scope alias),功能是冻结源边界,不产候选位置图、不做召回核验,把它等同于 locate 阶段是范畴误配。
2.2 为什么 architecturally 必须拆(证据等级 bounded,确定性)
token_budget.json:22-78 显示语料 26 个单位约 768 万 token,单个 raw rollout 就 26.4 万到 44 万 token。单个 agent 连一份 rollout 都装不下。这把 locate / read 拆分从"更好"推到"架构必需":locate 在元数据 / manifest 层可以一个 context 扫完,read 在 26 万 token 的 chunk 上必须有自己的有界 context。
2.3 代价:有指向、但未经对照证实(证据等级 observational / partial)
有两处指向 conflation 真的造成了下游危害,但都不是受控实验,只能算 observational:
dd2525_aau_loop_process_compliance_audit_20260530_manual.md:66-70:取证 agent 读了六个目录顶层文档就下"未实现"结论,没递归进嵌套子目录,把一套 25 模块 / 7556 行的完整 UCR 误判成不存在(FAM-K 错路径隐身 + FAM-F 单视角 closure)。根因正是 scanning agent 同时承担定位和深读,context 不足时只扫顶层就关闭。这说明低报和高报一样危险,且由同一个混合阶段产生。large_context_compression_method_loop_20260523/first_layer/C010_git_prompt_extraction_baseline.md:43-53:明确写 enumerate_before_filter 是强制的,而 49-prompt 的高精确 baseline 曾经漏掉整段 session。这是"定位召回率直接界定下游阅读质量"的实证:定位漏了,后面读得再准也补不回来。
诚实边界:没有任何"拆分 vs 合并、同源比 recall/质量差异"的对照实验。所以"conflation 导致漏读"目前是有指向的假设,不是被测出来的因果。
3. 为什么 locate 与 read 必须正交:理论与失败模式
3.1 能力边界数字(来自既有调研,原始论文未在本轮复核,等级 observational)
我们之前的能力边界调研给出的量化天花板,正好把 locate 和 read 分到 LLM 的强项和弱项两侧:
- 能力分界线是"是否需要跨 forward pass 维持被覆写的 state"(
llm_capability_boundary_20260417_deep_research.md:17-63)。locate 判断"这个路径是否可能含相关内容"是单点分类、无状态(L0×S0),是 LLM 最可靠的区域;deep-read-to-locate 要求跨多文档多跳整合并维持已读摘要(L2×S1+),直接越过硬边界。 - 元认知准确率约 20%(
capability_map.md:62-63,149-152)。让 scanning agent 边读原文边自判"这条是否相关"是个元认知任务,天花板就在 20% 附近。locate 改为高召回轻量扫描(只判"可能在哪"、不要求精确相关性判断),把精确相关性留给 read,正好避开这个弱项。 - 有效 context 仅标称的 10-20%(BABILong,
llm_context_multi_topic_capacity_survey_20260416.md:123)。把原文全塞进去做定位,80-90% 的阅读是无效消耗。locate 用文件名 / 标题 / 摘要等轻量元数据代替原文,单候选 token 占用压缩 10 到 100 倍,同一预算能扫更多候选。 - 复杂度比长度更关键(Hong et al. IJCNLP 2025,
llm_constraint_capacity_and_task_decomposition_survey_20260414.md:42,110):working memory 的主要 stressor 是同时追踪的独立 items 数量,不是 token 长度。所以塞满元数据的轻量 locate,比塞满部分原文的 deep-read-to-locate 处理力更强,即使 token 数相同。 - read 阶段方向 ≤5 有架构依据:约束联合满足按 P(n)=p^n 崩溃(CSL≈3.3),主题在 2-4 个时维持 70-90% 而后乘法式衰减,self-attention 熵随追踪目标数对数增长(arXiv:2409.10715)。5 个方向落在可靠区边缘,超过就进入乘法崩溃,CoT 线性修不回来。
3.2 风险方向正交(来自近期综述,等级 bounded-to-observational)
subagent_failure_modes_and_entropy_control_survey_20260529.md 把失败分成两类不同底层:variety 型(context 有损传递、注意力稀释、误差复合)可由架构解决;激励-语义型(假共识、自报不可信、规格模糊)需要 independent critic 和确定性检查。locate 的主要失败是 variety 型(漏位置),read 的主要失败是激励-语义型(深读不准、自报 completed 不可信)。两个阶段的风险方向正交,正好用对应机制分别防御,这本身就是拆分的理由。
3.3 bad behavior catalog 的对应(等级 observational)
catalog 里多条目都能归到 locate / read 混淆:IB-02 上下文衰减(混合 pass 下任务锚点随证据堆积而丢失)、IB-03 sub-agent 背景缺失(没拿到 locate 输出就在阅读里重做定位、浪费预算)、IB-06 / IB-08 范围扩张与覆盖最大化(没有"你只负责找位置"的边界,阅读就向相邻领域膨胀)、IB-29 单视角 closure(单 agent 单视角定位没有覆盖界)。注意 IB-29 最强样例 bad_behavior_loop_scan_20260502 已从 working tree 删除,该条只能到 observational。
4. 机制设计
4.1 两个阶段的契约
Locate(定位,前置):目标是高召回、低精确。输入是用户需求 + 源边界(哪些目录 / 仓 / session 在范围内)。输出是一张候选位置图,只含"信息可能在哪"的指针(文件路径、章节、session id、行区间),不含深读内容、不做精确相关性裁决。单个 locate agent 是 L0×S0 的单点分类任务,读轻量元数据(文件名、标题、目录树、grep 命中行、摘要),判"这里可能有"。方向上限可以放到 1,因为它只做一件事。
Read(阅读,后置):消费 locate 的候选位置图作为 scope 边界,在已定位的位置上 budget 分片深读、提取真正相关内容、做精确筛选。这就是现成的 workflow_long_context_scale_up:先预算后派发、第一层覆盖原文、第二层 ≤3 关注点、方向 ≤5、覆盖证明、residual ledger、null baseline。read 不再自己做 ad-hoc 的源发现,它信任 locate 的图。
4.2 正交边界(这是设计的核心,不能含糊)
locate 优化召回,read 优化精确与覆盖。locate 的产物是"位置",read 的产物是"内容判断"。locate 失败 = 漏位置(variety 型,靠多 scanner 投票 + 确定性枚举防御);read 失败 = 深读不准 / 自报不可信(激励-语义型,靠 independent critic + 确定性核验防御)。两者之间有一道硬交接:locate 输出一张可被确定性命令(find / grep / SHA 清单)核验的候选清单,read 只在这张清单内工作。任何让 read agent 回头自己去全仓搜索的做法,都是把 conflation 偷偷放回来。
4.3 召回 oracle(locate 阶段的承重墙,当前真正缺的一格)
locate 阶段不要求精确,但必须能证明"没漏"。这正是当前体系缺的:phase_aware .../PHASES.md 的 CLP001(信息搜索阶段)退出条件只查"存了用户 prompt、SOURCE_MANIFEST.tsv 列了三个 loop、T001 任务卡存在、round_001 review 存在",没有任何一条测召回,而且 SOURCE_MANIFEST.tsv 是人工声明的清单,不是系统扫描的产物。
召回 oracle 的可操作形式:locate 的 SOURCE_MANIFEST 必须是机械枚举的产物(bash / SQL 全量 SHA 清单),不是人工声明;附一份 dropped-unit / NO_KEYWORD 反向抽样 receipt(被丢弃的候选里抽样核一遍,确认丢得对);关键定位用多个轻量 independent scanner 投票(不同检索角度,差异本身是漏位置的信号);候选清单为空时,不能直接声称"无相关信息",要用确定性命令独立核验(这条直接来自 loop_update_connected_synthesis_20260529_manual.md:163-166 的 Done 谓词镜像条款)。
4.4 budget 与冗余 budget
locate 用最廉价的估算和模型:CC 的 roughTokenCountEstimation(content.length/4,JSON/JSONL 用 /2,纯本地零 API,见 tokenEstimation.ts:203-224)足够给候选清单定预算;判断"可能在哪"用 Haiku 档即可。read 用 CC 的分层预留思路:autoCompact.ts:62-91 的三层 buffer(20k 预警 / 13k 主动 compact / 3k 硬阻断)和 getEffectiveContextWindowSize(有效窗口 = 原始窗口 − min(最大输出, 20k))给出"单 agent 安全输入上界"的现成公式;apiMicrocompact.ts:16-17 的 18 万触发 / 留 4 万的策略给出超阈值分片的参考点。(这些常量是 reader 从仓内相对路径转述的,CC 源码根在本机未经我亲自核验,落地前需 find 到绝对路径复核行号。)
冗余 budget 的形态在这次 workflow 里已经跑出来了,且证明了价值:每个 reader 返回 coverage_complete 标志和 uncovered_units 清单;主控检测到未覆盖就动态增派补读 agent(上限设 4 波)。这次自动增派了 2 个补读 agent,而它们找到的恰恰是第一波漏掉的关键证据(RPR-026 的 locate/read 正交实例、runner.py 的 w1/w2 两层架构、C010 的召回界定下游)。也就是说,准备好但不一定全用的冗余调度名额,是用来兜住"第一波覆盖不全"的,并且这次直接改变了结论。
4.5 已有可借鉴的实现(证明"非新",等级 bounded)
系统里已经有两个 locate/read 正交的可运行实例,应该作为模板而不是另起炉灶:
runner.py:12234-12431(RPR-026):locate 阶段location_scan产出 candidate index(高召回低精确),read 阶段direct_verify有界消费这个 index,另有forbidden_as_truth_sources把陈旧综合排除在阅读之外。子 agent prompt 明确写"把先前的 location_scan 只当候选索引用,不要重做定位,除非引用路径不可用"。runner.py:749-770,2778-2890(AAU-AUX-002):w1_scans(8 个并行轻量 scanner)/ w2_synthesis(5 个深度综合报告 + w2d 怀疑者挑战)的两层结构,与 locate(w1)/read(w2) 同构。
跨域同构(对应用户的思维方式):这正是检索系统的 retrieve-then-rerank。locate = 召回优先的粗检索,read = 精排。这个同构论证的是"两阶段分离有价值"(已被上述实例落实),不是"当前体系缺这个阶段",不能拿同构当"需要新建"的证据。
5. 最小可行落地(反过度工程)
对抗验证给出的关键约束:不要新建一整套独立 locate 运行时、不要拆 CONTROL.md 的 cap、不要改 scale_up 的方向纪律,这些都已存在。真正缺的只有"读前召回门"。最小改动 < 10 行,命中真正想解决的"召回界定下游":
phase_aware .../PHASES.md的 CLP001 退出条件加一条召回项:SOURCE_MANIFEST.tsv 必须是机械枚举(bash/SQL全量 SHA 清单)的产物,而非人工声明,并附 dropped-unit / NO_KEYWORD 反向抽样 receipt。workflow_long_context_scale_up.md:98的"降噪 frontier"从">50 agent 才触发的条件 fallback"改成"默认先做一次机械枚举建 Universe";并在 :246 快速自检加一条"是否对全集做了机械枚举再过滤"。- 把这条 locate/read 交接钉到三个运行时原语上:CLP001(intake 召回门)、
CONTROL.md(locate 与 read 各自的 direction cap 已有,补一个"locate 必须先于 read 完成并落 manifest"的次序约束)、scale_up(消费 locate 图而非自己搜)。
这一步必须钉到运行时,不能只写成文档。loop_update_connected_synthesis_20260529_manual.md:140-154 已经踩过一次"把已落地运行时重新抽象成理论文档却没接回去"的孪生孤岛失败,locate/read 拆分若只写成 skill 文档而不接回 CLP001 / CONTROL / scale_up,会重蹈覆辙。
填的位置:task_to_completion_matrix_and_whattohow_20260528_manual.md:98-106 的 large context 7 环节矩阵里,在环节 3"分解 Unit"之前插入"高召回轻量扫描(locate)"这一格,产出候选位置清单作为环节 3 分片的锚点。这就是用户说的"矩阵里缺的那一格"。
6. 证据等级与禁止声明(solid-decision 判级)
诚实地分层,不要把强弱不同的结论放在同一个信心层:
- conflation 存在:bounded(两独立 reader + C001 确定性原文读取)。其中"cap=5 被遵守、0 次超限"这条降到 observational,因为它是 reader 推导值,不是 loop 里被记录的指标(loop_state 没有 per-iteration 的 subagent / 方向计数字段)。
- "方向超 5 是信息收集 face 缺陷":不成立(构造性误配,确定性核验过 21/23 是测试候选池 triage)。
- conflation 造成漏读 / 质量退化:observational / partial(有 dd2525、C010 两处指向,无对照实验)。
- 拆分机制本身:weak(设计未运行、无 fixture、无 A/B、无 oracle 实跑)。RPR-026 / w1-w2 / C010 证明"非新、已局部落地",不证明"成熟通用"或"有效"。
- 能力边界数字、CC budget 常量:observational(前者是历史 survey 二次转述、原始论文未复核;后者 CC 源码根未在本机核验)。
- 真正缺的召回门(CLP001 无召回退出条件):bounded(PHASES.md 退出条件确定性读过)。
禁止声明:不能说这个机制"已验证有效"或"会稳定提升召回 / 质量"(从未运行);不能把机制章节和诊断章节放在同一信心层呈现(机制 weak、诊断 bounded);不能断言"方向数超健康上限"是信息收集 face 的真实缺陷;不能把"健康上限=5"当跨 loop 通用阈值(CONTROL.md:32 显示它只是该 loop 自设);不能声称已对"整个 loop / 整个语料"测量(两路 coverage 均不完整)。
把机制从 weak 升上去的唯一路径:在一个真实大 context 源上实跑 locate/read 拆分,操作化"方向"和"健康上限"的定义,实跑并打分召回 oracle(机械枚举 + 多 scanner 投票 + residual ledger),与合并 face 做 A/B 比 recall / 质量 delta。
7. 下一步(待用户选择)
三条路,互不排斥:先做最小落地(改 CLP001 + scale_up 两处,< 10 行,把 locate 钉到运行时);或先做对照实验(同源 拆分 vs 合并,把诊断和机制从 observational/weak 升到 bounded);或把这套提成一个独立的道 skill(填 guidance_skill_matrix §7 的环节 3/4 承重墙缺口),但 skill 化是比当前更大的动作,应在最小落地或对照实验给出运行证据之后再做。
相关目录与上下游
- 上游证据 loop:
adhoc_jobs/large_context_compression_method_loop_20260523/、adhoc_jobs/atomic_agent_unit_20260509/second_generation_implementation_20260511/integration_2_20260511/、adhoc_jobs/phase_aware_controller_loop_optimization_test_20260524/ - 阅读阶段 skill(read):
rules/skills/drafts/workflow_long_context_scale_up.md - 判级 skill:
rules/skills/drafts/workflow_solid_decision_review.md - 矩阵框架:
contexts/survey_sessions/task_to_completion_matrix_and_whattohow_20260528_manual.md、rules/skills/drafts/workflow_guidance_skill_matrix.md - bad behavior catalog:
adhoc_jobs/llm_harness_kb_20260418/research/bad_behavior/current_integrated_catalog_20260503/ - harness 参考:
adhoc_jobs/claude_code_source/src/services/compact/、src/utils/analyzeContext.ts、src/utils/tokenBudget.ts - 能力边界调研:
contexts/methodology/llm_context_multi_topic_capacity_survey_20260416.md、llm_constraint_capacity_and_task_decomposition_survey_20260414.md、llm_capability_boundary_20260417_deep_research.md
provenance:contexts/methodology/locate_read_two_phase_info_collection_20260530_manual.md data/methodology_dao.mjs