模式矩阵 /模式白皮书/P3

P3 · Progressive Discovery · 渐进发现

字段
双轴坐标 感知 Perception × 循环 Loop(转)
成本档 ②(一轮 forage-focus-deepen 约 18K token)
课程对应 02-04
目录归属 全集 33 模式之一 · 感知模块 4 模式之一
一句话 Agent 面对陌生信息空间且不知道相关信息在哪时,先看一眼再决定钻多深,通过广扫→精读→深追三阶段循环把它探明白。

它解决什么问题

上下文分诊和语义压缩有个共同前提:你已经知道相关信息在哪。这个前提常常不成立——Agent 面对一个 15000 文件的遗留 codebase、一份没看过的合同、一个长长的事故日志,它不知道相关代码叫什么、不知道关键证据在哪一页。把整个 codebase 喂进去会爆窗口,做 RAG 又常常召不回(相关代码的变量名是 merge_user_state,注释里没有 "order" 字样,语义检索匹配不上)。

渐进发现把这件事工程化:用广扫拿一批候选,让看到的内容重塑下一步该看什么,迭代到信号足够强为止。它管的是当下 session 内对未知空间的主动探索,核心约束是成本——一轮探索约 18K token、约 45 秒,远比把整个 codebase 索引进 prompt 划算。

为什么坐标是「感知 × 循环」

核心机制

一次发现走 forage-focus-deepen 三阶段,广度递减、深度递增:

阶段 动作 工具与代价
Forage 广扫 扫陌生空间拿 30-50 个候选,只看文件名、路径、匹配行上下文 grep / glob / find,~3K token、~10 秒
Focus 精读 从候选里挑 5-10 个最可能的完整读,看依赖关系和调用链 read,~8K token、~20 秒
Deepen 深追 沿可疑链追下去(被引用的函数、测试、历史 commit),只追一两条最有信号的 read,~7K token、~15 秒

三个机制决定发现的成败。第一,给 Agent grep、read、glob 三件 atomic 工具,不要给 search_codebase() 这种高级封装——只有 atomic 工具支持"看到的内容重塑下一步"的反馈循环。第二,硬上限。循环数封顶(多为 3 轮,事故场景 2 轮),单循环 token 封顶(约 20K),3 轮还没找到说明关键词不对或需要人介入,继续循环只是烧 token。第三,关键词推导是杠杆。第一轮的关键词决定 forage 的命中质量,做得粗糙后面再多循环也救不回来,建议先用一个轻量模型把任务描述翻译成 5-8 个精确关键词再 grep。一轮信号不够时回到 forage 用更准的关键词重来,而不是硬猜。

适合的生产场景

容易出错的地方

关键指标

最小骨架

discover(task, keywords):
    循环 至多 max_cycles(默认 3):
        Forage:对每个 keyword 跑 grep → 汇总候选 → 按 task 相关性打分 → 留 top-30
        若 cycle_tokens 超 budget → 停
        Focus:挑 top-8 完整 read,记下依赖关系
        Deepen:从已读内容抽依赖(import / 函数引用),最多深追 5 个
        若信号足够 → 成功,跳出
        否则 → 用已发现内容 refine keywords,再来一轮
    每阶段落一条 DiscoveryEvent(phase / keyword / 候选数 / files_read / tokens / wall_time)

三件 atomic 工具(grep / read / scorer)用注入而非封装,让同一份代码能跑在本地文件系统、MCP server 或外部索引引擎上,只换注入实现。

企业落地一例

一个电商客户的 bug:订单确认邮件偶尔混入其他客户的订单条目。开发团队面对 15000 文件的遗留 monolith,试过把整库喂给 Agent(800K token 爆窗口)、试过 RAG(相关代码无 "order" 字样召不回),最后让 Agent 用 grep + read 自己探。Forage:grep "send.*confirm" 拿 30 个候选,按文件名挑出 mailers/order_confirmed.rb。Focus:完整读 5 个文件,看到调用链 MailerWorker → Cache.get_user → render。Deepen:追 Cache.get_user,发现 cache key 用了 order_id 却没用 customer_id,不同客户订单 id 撞桶就命中错误缓存——bug 找到了。一轮、约 18K token、约 75 秒。复盘结论是这个 bug 跟语义没关系、跟代码结构有关系,只有直接接触结构的 grep + read + follow imports 才能找到。

与其他模式的关系

一句话记住它

最强的 Agent 不是知道得最多的,是知道哪里去找的——渐进发现是信息觅食理论在 LLM 时代的回响,Agent 不试图理解整个 codebase,它找够用的就停。


本页属于 ADPS 33 模式白皮书。返回 模式矩阵与白皮书目录, 或查看配套 可运行代码目录