被工程实践反复确认的一个反直觉观察 过去半年,把 Coding Agent 推到生产环境的企业团队,几乎都观察到一个反直觉的工程现象:Coding Agent 在被给予树状工具(LSP 索引、tree-sitter AST、符号表)时,仍然倾向于用朴素工具(grep、glob、读文件)。多个独立项目在生产实测里都看到了这个现象,而且都得出了同一结论——这不是个例,是 Coding Agent 在当

被工程实践反复确认的一个反直觉观察

过去半年,把 Coding Agent 推到生产环境的企业团队,几乎都观察到一个反直觉的工程现象:Coding Agent 在被给予树状工具(LSP 索引、tree-sitter AST、符号表)时,仍然倾向于用朴素工具(grep、glob、读文件)。多个独立项目在生产实测里都看到了这个现象,而且都得出了同一结论——这不是个例,是 Coding Agent 在当前一代模型能力下的稳定行为模式。

这个观察和过去二十多年软件工程界对 IDE 工具的优化方向是反向的。在 Eclipse、IntelliJ、VSCode 主导的开发工具时代,行业一直把"tree-based 智能感知"作为终极目标——符号跳转、引用查找、重命名重构、类型推导、语义高亮,这些能力的核心都是基于 AST/LSP 的树状语义;基于字符串匹配的 grep/glob 在 IDE 场景里被逐步淘汰,只剩下边角场景还在用。但在 Coding Agent 场景里,这条二十多年的方向被反向——Agent 倾向于重新用回 grep/glob/读文件,而非树状工具。

朴素工具胜出的工程证据

2026 年 2 月初公开的一个项目,把这个问题用对照实验做了具体验证。项目一边维护了一个基于 tree-sitter 的代码索引服务,提供 init / structure / search / impl / callers / grep 这六类工具,意图是让 Agent 不再用 glob + grep + read 的工作流;另一边让 Agent 走 Claude Code 默认的 glob + grep + read 工作流。同样的任务("探索代码库,识别可以清理结构的机会")两边跑一次,结论非常具体。

在索引版工作流下,Agent 用了大约 3 分钟,识别出重复命名的代码、孤儿代码、跨模块命名约定不一致、词汇重叠这类语义级问题。这些问题的共同特点是"需要理解代码的结构关系才能发现"——只看字符串匹配是看不出来的,只有符号表能跳过去、关联上同名字段在不同文件的不同含义。

在朴素工作流下,Agent 用了大约 8 分钟,识别出文件根目录的杂物、过时引用、时间戳冲突这类字符串级问题。这些问题的共同特点是"扫一下文件系统就能看出来"——不需要理解代码结构,只需要 glob + read + grep 就能扫到。

这两类问题在工程上的价值密度不同——前者真正影响代码可维护性,后者只是文件整理。但关键发现是,即便朴素工作流在语义级问题上表现明显更弱,Agent 仍然倾向于走朴素工作流。原因在项目作者的实测里被明确记录:"Claude 仍然对在探索任务中使用 CodeRLM 表现出显著抗拒,通常要明确告诉它用 CodeRLM 它才会用。" 也就是说,索引工具是有效的,但 Agent 默认不愿意用——这是 Agent 的偏好问题,不是工具的有效性问题。

为什么 Coding Agent 偏好朴素工具

这个偏好在多个独立项目里被反复确认,根因可以拆成三层。第一层是训练数据分布——主流 Coding Agent 的基础模型在训练时见过的代码任务样本里,绝大多数是"按 prompt 写新代码"或"按 bug 描述修代码",这两种任务的最佳实践都不是基于 AST 的工具调用;基于 AST 的语义级分析在训练样本里出现频率极低,模型没有形成对应的行为模式。换句话说,模型"会"用朴素工具是因为训练数据教过它,"不会"用 AST 工具是因为训练数据几乎没教过。

第二层是认知一致性——朴素工具的输入是文本,输出也是文本;grep 返回的是文件路径 + 行内容,read 返回的是文件全文,Agent 看到的内容和它"想要理解代码"这件事在表征层面是直接对应的;但 tree-sitter 索引返回的是符号节点 ID + 父子关系 + 引用链,这些结构化输出需要 Agent 先在脑子里"翻译"成代码,再进行推理。多一次"翻译"意味着多一次认知开销,Agent 在时间压力和上下文压力下倾向于走最短路径。

第三层是工具链成熟度——朴素工具的实现是"文件名 + 行号 + 字符串",任何一个代码编辑环境都能立即支持,几乎没有安装门槛;但 tree-sitter 索引服务需要额外的 server 进程、需要初始化开销、需要针对不同语言的解析器配置、需要和 Agent 的 hook 系统对接。这条额外的工程负担,在 Agent 还在探索阶段时是真实障碍。多个项目作者都提到,他们的索引服务需要"明确告诉 Agent 使用"才能被有效利用,部分原因就是 Agent 默认会避开这条额外负担。

朴素工具的天花板

但朴素工具不是没有代价。同样的独立项目里,树状工具的优势也是被明确记录的——它们能识别出朴素工具识别不出的语义级问题,识别速度更快,定位更精准。具体表现为:tree-sitter 索引能在 3 分钟内识别出"重复命名的代码、跨模块命名约定不一致",而朴素工作流 8 分钟只识别出"文件杂物、过时引用"。前者是结构性 bug,后者是清洁度问题,在工程优先级上前者高于后者。

另一条独立的工程实测也指向类似的结论——对 Claude Code 默认工具集的逐项替换尝试里,作者明确指出 Edit 工具的 fuzzy matching 是次优解,推荐用 tree-sitter AST 直接拿到函数或类的命名节点,而不是让模型复现一整段文本去定位某个函数。"为什么让模型复现字符串去定位函数,当 tree-sitter 能给你带命名符号的 AST 的时候"是这条批评的原话。但同样的作者也承认,在替换 Edit 工具为 AST 工具的实际落地中,Agent 仍然在很多场景下选择用旧 Edit 工具——和 CodeRLM 的观察一致。

工程上的取舍:三层并存

把朴素工具胜出的工程证据和朴素工具的天花板合并,可以在企业 Coding Agent 工具装配上画出一条工程新基线。这条基线由三层并存构成,而不是非此即彼。

第一层,朴素工具必须保留且默认暴露。Grep、glob、读文件、写文件、Edit——这一组朴素工具是 Coding Agent 的"肌肉记忆",任何时候都必须对 Agent 可见,默认情况下 Agent 应该能用。即便有了 tree-sitter 索引,朴素工具仍然要暴露,因为它在"扫描文件系统、找过期引用、清理垃圾"这类任务上无可替代,且认知开销最低。

第二层,树状工具必须按需暴露且自带触发信号。Tree-sitter 索引、LSP 符号查询、AST 编辑器——这一组树状工具是 Coding Agent 的"专业装备",在"重复命名检测、跨模块引用分析、语义级重构"这类任务上明显优于朴素工具。但它不应该默认暴露给所有任务,因为它的认知开销更高、配置更复杂;它应该按需暴露——当 Agent 检测到任务涉及"重复命名检测、跨模块引用分析、语义级重构"这类语义级问题时,系统主动提示它使用树状工具;或者 Agent 主动请求时,系统响应启用。

第三层,任务调度器必须按任务画像决定工具集。简单的"扫一下文件、改几行"任务只暴露朴素工具;中等难度的"理解代码结构、找出 bug"任务同时暴露朴素工具和树状工具,且默认推荐后者;复杂的"跨模块重构、生成代码骨架"任务必须显式要求使用树状工具,且由人类工程师确认任务画像。这套按任务画像的工具集调度,在工程上是"不强迫 Agent 永远用最强工具,也不放任 Agent 永远只用最弱工具"的中间路径。

从 Coding Agent 工具装配推到企业 Agent 工具链设计

把视野拉宽到企业 Agent 工具链,朴素工具 vs 树状工具的取舍具有普遍意义。任何 Agent 系统,在"工具装配"环节,都需要面对同一组问题——Agent 偏好用什么工具、Agent 偏好什么类型的工具、工具的复杂度如何分布、工具的暴露时机如何决定。这组问题的回答,在 Coding Agent 场景里收敛到"三层并存 + 任务画像调度",在更广义的 Agent 工具链场景里也是适用的工程基线。

具体而言,任何 Agent 系统都应当把工具集按"复杂度梯度"分层。最简单的工具是"按字符串匹配、按文件名匹配、按文件内容全文读"——暴露给所有任务、所有 Agent、所有场景。中间的复杂工具是"按结构匹配、按语义分析、按规则推理"——按需暴露、需要 Agent 主动请求或任务画像匹配。最复杂的工具是"按多步推理、按外部知识、按跨系统协调"——只暴露给特定任务、需要人工审核。

这套"三层梯度"在工程上的好处是双重的。第一,简单任务不浪费 token——Agent 调用一个 grep 比调用一个完整 LSP 节省大量上下文,响应时间也更快。第二,复杂任务不被简单工具卡死——遇到"重复命名检测"这种语义级问题,Agent 不会因为只有 grep 可用而退而求其次用字符串匹配假装在做语义分析。

企业 Agent 治理负责人现在必须回答的三个问题

面对上述基线,企业 Agent 治理负责人现在至少要直接回答三个问题。第一个问题:你企业内部 Agent 系统当前默认暴露的工具集是什么?是只暴露朴素工具、是只暴露树状工具、是按场景混合?如果是混合,混合的触发信号是 Agent 主动请求、还是任务画像自动判断、还是人类工程师手动指定?

第二个问题:你的 Agent 系统是否在工具调用层有"任务画像"概念?任务画像是指系统对当前任务的难度、类型、上下文敏感度的判断结果;有任务画像,工具集调度才有依据;没有任务画像,工具集就是一刀切——要么 Agent 永远走朴素路径,要么 Agent 永远走树状路径,两者都不优。

第三个问题:你的 Agent 系统是否建立了"工具被使用"的观测?具体而言,工具被调用的频率、工具被调用的任务类型分布、Agent 在哪些任务上选择了朴素工具而不是树状工具、这些选择的 token 成本是多少、这些选择的任务完成质量是多少——这些数据是判断"三层并存"是否真的在企业里被有效使用的唯一可靠依据。

结语

Coding Agent 的工具偏好在过去一年被显著推前,从"只能用朴素工具"演化到"朴素工具和树状工具并存"。每推前一步,工具装配的工程基线就必须同步推前一步。把"用最强工具 = 最优解"作为主要思路的部署,在 Coding Agent 实际偏好朴素工具的工程现实面前被反复证明不够。把"三层并存 + 任务画像调度"作为基线,重新设计 Coding Agent 的工具装配方案,是当下能落地的工程基线。

任何企业 Coding Agent 项目,只要涉及 Agent 调用代码探索工具,工程基线就必须做到这三条——朴素工具默认暴露、树状工具按需暴露、任务画像决定工具集——否则,今天不是某次 Agent 走错工具路径的主角,也会是下一次 Agent 走错工具路径的主角。