跳转至

为什么 Claude Code 放弃 RAG,转向 Agentic Search

最近在技术社区中,一条观点引发了不少讨论:Claude Code 在代码理解场景中放弃了 RAG,转而采用 Agentic Search
这一决策来自 Claude Code 创始人 Boris Cherny 的实践经验。他甚至用一句非常工程化的话总结了这种方法:

所谓 Agentic Search,其实只是 glob 和 grep 的高级说法。

乍一看这似乎有些反直觉。毕竟 RAG 一直被认为是当前 AI 应用中最主流的知识检索方案。那么为什么在代码场景里,复杂的 RAG 反而不如传统的 Unix 搜索工具?要理解这一点,需要先看清两种技术路线的底层原理。


一、RAG 的基本原理

RAG 的核心思想是:通过检索外部知识来增强大模型的回答能力

在标准的 RAG 系统中,一般包含以下流程。

首先,系统会将知识库中的文档拆分成多个文本块。这一过程通常称为 chunking,每个文本块通常在几百到一千个 token 左右。

接着,每个文本块会被转换成向量表示:

\[ v_i = f(\text{text}_i) \]

这里 \(f(\cdot)\) 表示 embedding 模型,它会把文本映射到一个高维向量空间。

当用户提出问题时,系统同样会把问题转成向量:

\[ q = f(\text{query}) \]

然后通过相似度搜索找到最相关的文本块。常见的计算方式是余弦相似度:

\[ \text{sim}(q, v_i) = \frac{q \cdot v_i}{|q||v_i|} \]

最后,把检索到的文本块和用户问题一起输入大模型:

用户问题 + 检索到的上下文 → LLM

大模型再基于这些上下文生成答案。

这种架构在很多场景中非常有效,例如:

  • 企业知识库问答

  • 文档检索系统

  • 客服机器人

  • FAQ 系统

这些场景的共同特点是:信息以自然语言为主,语义相似度是有效的检索方式


二、为什么 RAG 在代码场景中效果不佳

当我们把 RAG 直接应用到代码仓库时,问题开始出现。原因并不是 RAG 技术本身不好,而是 代码的结构特性与自然语言完全不同

在工程实践中,主要存在四个核心问题。


1 代码定位依赖符号,而不是语义

RAG 的检索逻辑基于语义相似度,但代码的定位方式通常依赖符号信息,例如:

  • 函数名

  • 类名

  • 文件路径

  • import 关系

  • 调用关系

例如一段代码:

def compute_slope_stability():

如果用户提问:

稳定性计算在哪里实现

embedding 检索未必能找到这个函数。

但如果直接执行:

grep compute_slope_stability

几乎可以瞬间定位。

这说明在代码场景中,精确符号匹配往往比语义匹配更有效


2 代码理解依赖全局结构

自然语言文本通常是相对独立的段落,但代码并不是这样。

例如一个简单的调用链:

A.py 调用 B.py
B.py 调用 C.py

如果代码被 RAG 切分成多个 chunk:

chunk1: A.py
chunk2: B.py
chunk3: C.py

向量检索可能只返回其中一部分内容,而缺失关键调用关系。

但在实际工程中,理解代码往往需要完整的:

  • 调用链

  • 类型定义

  • 模块依赖

  • import 关系

RAG 的 chunk 机制会破坏这些结构。


3 文本切块破坏代码层级

代码仓库本身具有清晰的结构:

repository
 ├─ folder
 │   ├─ file
 │   │   ├─ class
 │   │   │   ├─ method

这种层级结构对于理解代码非常重要。

但在 RAG 系统中,所有内容都会被拆分成无结构的文本块:

chunk_102
chunk_103
chunk_104

文件路径、模块边界和上下文关系都会丢失。


4 代码库更新频繁

代码仓库的变化速度远高于普通文档。

典型的开发流程包括:

git commit
git branch
git merge

如果使用 RAG,每次更新代码库都需要:

  1. 重新切分文档

  2. 重新生成 embedding

  3. 更新向量数据库

在大型仓库中,这一成本非常高。


Claude Code 团队采用了一种更接近工程师工作方式的方法:Agentic Search

简单来说,就是让大模型像程序员一样使用工具来探索代码仓库。

核心工具包括:

  • glob:查找文件

  • grep / ripgrep:搜索文本

  • tree:查看目录结构

  • open:读取文件内容


Agentic Search 的基本流程

当模型需要理解代码仓库时,会进行一系列循环操作:

第一步,搜索文件结构。

glob("*.py")

第二步,搜索关键词。

grep compute_slope

或者

rg compute_slope

第三步,打开相关文件。

open slope_analysis.py

第四步,根据新信息继续搜索。

例如:

grep factor_of_safety

整个过程会不断循环:

搜索 → 阅读 → 推理 → 再搜索

这就是所谓的 Agentic(代理式)行为


四、为什么 Agentic Search 更适合代码

在代码仓库场景下,Agentic Search 具有明显优势。

能力 RAG Agentic Search
函数定位 较弱 非常强
调用链分析 困难 容易
结构信息 容易丢失 完整保留
实时更新 成本高 成本低
工程可控性 较差 较好

本质上,两者的差别可以总结为:

RAG 是语义检索

Agentic Search 是工程检索

代码仓库显然更适合后者。


五、一个实际例子

假设一个代码仓库包含 50 万行代码,用户提出问题:

边坡稳定性算法在哪里实现

如果使用 RAG,系统可能会检索到:

  • 一些文档说明

  • 不完整的代码片段

  • 与问题语义相近但不相关的函数

结果往往不稳定。

但如果使用 Agentic Search,模型可能会执行:

grep slope
grep stability
grep factor_of_safety

然后逐步打开相关文件:

open slope_analysis.py

继续查找调用关系:

grep compute_factor_of_safety

最终定位到真正实现算法的函数。

整个过程和工程师调试代码几乎完全一致。


六、总结

Claude Code 放弃 RAG 的原因并不是 RAG 技术不好,而是因为 代码仓库具有完全不同的信息结构

自然语言知识库适合语义检索,而代码仓库更适合符号搜索和结构分析。

因此在代码理解场景中:

  • RAG 更像是 语义搜索引擎

  • Agentic Search 更像是 AI 驱动的代码探索工具

Boris Cherny 的那句话其实揭示了一个工程事实:

很多看似复杂的 AI 系统,最终可能只是对经典工具的一种自动化封装。

而在代码世界里,几十年前诞生的 Unix 工具 —— globgrep —— 依然是最可靠的基础设施。