渐进感悟|代码库并非文档库

时间:2026-07-04 08:28:48 来源:互联网

这篇内容聚焦于Agent在陌生场景下的信息探索方法——从代码库到日志文件,探讨如何在不依赖语义检索的前提下,通过结构关系定位关键信息。

上一讲讨论了语义压缩策略,核心目标是在有限工作记忆里高效存放信息。本讲则处理一个更为棘手的情形:当面对从未接触的代码库、陌生的合同文本或海量事故日志时,Agent无法预知相关信息所在位置,必须依靠自身探索来发现关键线索。

这一讲的主题被称为"渐进发现",然而其提出的第一个判断就促使我重新审视RAG的适用边界。

一、代码库不是文档库

一个电商系统偶尔出现订单确认邮件发送错误,混入了其他客户的订单条目。团队先后尝试了三种处理思路。

img_6a4853bfbb30330.webp

第一种方案:将整个代码库15000个文件全部喂给Agent,结果token数量爆炸式增长。即便切成100段并行处理,每一段都回报"未发现bug"。第二种方案:采用RAG语义检索,召回的内容都跟"订单""邮件"语义相近,但问题代码中的变量名为merge_user_state,注释里不包含order或email,语义检索完全未能命中。第三种方案:使用grep结合read命令,搜索send.*confirm得到30个候选文件,从中挑选出5个最可能的,读取后发现调用链MailerWorker → Cache.get_user → render,进一步读取Cache.get_user后发现缓存key使用了order_id但未使用customer_id——bug最终定位。整个探索过程经过四轮,大约消耗18K token。

这个bug与语义无关,而是与代码结构紧密相关。代码中的关键信息往往隐藏在变量名、调用链、缓存key、配置文件以及测试路径这类结构关系中,而不是存在于语义相似度之中。

二、Forage / Focus / Deepen:三阶段循环

渐进发现方法的工程骨架是一个三阶段循环,其理论根源来自Pirolli和Card于1999年提出的信息觅食理论。

img_6a4853bfd103f31.webp

动物寻找食物时,不会将整片森林翻个遍,而是先进行广域扫描,找到食物斑块后再深入挖掘,当斑块食物耗尽时再换下一个区域。这一模型先被迁移到人类信息检索领域,如今再次迁移至Agent系统。

广扫阶段使用低成本工具,如grep、glob或find,获取候选内容;聚焦阶段从候选列表中挑选5到10个文件完整阅读,建立局部理解;深挖阶段则沿着可疑的调用链继续追踪,找到最强信号链。

每个阶段背后都有明确的判断指标:广扫阶段关注information_gain,即每次搜索能获取多少信号;聚焦阶段衡量patch_quality,确定哪个区域最值得深入;深挖阶段评估marginal_value,判断再多花1000 token是否还能获得新线索。这三个指标使Agent的探索决策从"凭感觉"转变为"有计算依据"。

这一机制与操作系统的调度器工作集理论几乎同构:先探索出工作集的范围,再针对工作集进行精读。

三、Agentic Search 反转了 RAG 常识

Claude Code的创始人Boris Cherny曾公开表示:agentic search generally works better。

这一观点反转了整个行业关于Agent上下文的常识——过去人们普遍认为"长上下文不够就用RAG"是天经地义,OpenAI、Pinecone、LangChain等整个生态都在沿着这条路径推进。然而最常用的Coding Agent却跳出来指出这条路不对。

img_6a4853bfe37e432.webp

但grep加read并非全部答案。Augment Code将Context Engine打造成工业级代码索引系统:支持400K文件、45秒增量更新、跨代码仓库依赖追踪。

这两条路线并非对立关系。Boris所说的"generally works better"中的"generally"一词意味着并非绝对。关键判断依据是按规模切分:5K文件以内使用agentic search即可;50K到400K文件需要代码库索引支撑;400K文件再加上跨仓库场景,持久化索引成为必选。Cursor所走的混合路线才是工业级的解决方案:小规模代码库采用现场探索,大规模代码库依赖索引托底。

四、Sub-Agent 隔离深挖

最后一条让我深有感触的工程纪律:深挖过程不应污染主Agent的上下文。

长时间运行的Agent主上下文相当于主进程。探索过程中产生的中间垃圾会不断堆积,最终导致真正有用的信息被淹没。更成熟的做法是将深挖工作隔离给Sub-Agent或独立的search worker,主Agent只接收压缩后的发现和证据链。

img_6a4853bff297933.webp

这与服务端架构中"主进程不做重活,重活交给worker、sidecar或沙箱"的工程纪律完全同构。我目前观察到的DeepAgents中的subagents.py、DeerFlow中的schema化Action,本质上都是在实现探索过程的命名空间隔离。

还有一个让我深感共鸣的判断:satisficing 而非 optimizing。探索并非寻找理论上的最优解,而是在有限的时间和有限的token预算内找到一个足够好的解。Herbert Simon提出的这条古老原则——边际收益是否还能覆盖边际成本——在Agent时代重新回归。


复制代码