grep是一个诞生50多年的负责检索的命令行工具,RAG是新诞生的大模型应用技术。到底哪个才是AI编程助手的最佳搭档?
用 AI编程助手的人越来越多,但是大家知道目前的AI编程助手,是如何根据用户自然语言指令去寻找对应代码的吗?例如, 你问一句“这个项目的用户登录逻辑在哪?”,它就开始满项目翻找,最后给你几段相关的代码。这个过程的背后,绝大多数靠的是 RAG——检索增强生成。
然而,Anthropic 推出的 Claude Code 直采取了一个不同的方法。它的核心检索工具不是向量数据库,而是两个“老古董”——grep 和 glob。它的负责人 Boris Cherny 直言:
“Plain glob and grep, driven by the model, beat everything.”(由模型驱动的纯 glob 和 grep,胜过一切。)
这到底是在开倒车,还是另有玄机?今天我们一起聊聊这个话题。
01
—
grep、glob是什么?
grep是一个命令行工具,诞生于 1973 年。它的作用很简单:在文件内容里找匹配的文字。
glob 不是工具,而是一种匹配文件/文件夹名字的语法,主要用在命令行里找文件。
—
RAG 在编程场景里的三个问题
现在的 AI 编程助手,大多数都使用的是 RAG 路线——建索引、向量化、语义检索。这套技术优点很多,但是放到编程这个场景种,还是又不少问题的。
第一:无法精确匹配
你想找getUserById 这个函数。RAG 的向量检索会把 getUserByName、getUserByEmail、fetchUserInfo全给你捞过来,而且会把上下文也带过来——因为它们在高维空间里“长得像”。
但写代码不是写散文。代码要求精确:函数名差一个字,逻辑就完全不同。你让大模型从一堆“像但不对”的结果里大海捞针,这件事情对大模型来说还是很有挑战性的。
而grep呢?你搜 getUserById,它就老老实实找这个字符串,一个不多,一个不少。
第二:索引永远跟不上代码变化
一个活跃的代码库,一天可能有几十次提交——函数改名、文件移动、模块删除……。
RAG 的索引怎么办?要么全量重建(计算成本爆炸),要么容忍过期数据(搜出来的东西已经没了),要么搞增量同步(边界情况多到能把自己搞奔溃)。
Claude Code 直接绕开这个死结:不用索引。每次检索都直接读当前磁盘上的代码库,永远是最新的。
第三道坎:切片切不准
RAG 需要先把代码切成小段,再向量化。但代码有严格的语法结构——函数、类、循环体、判断分支。
如果按固定行数切片(比如每 100 行一段),很可能在 if 语句中间、或者函数调用的那一行正中间一刀切下去。大模型拿到的代码是残缺的,自然更容易胡编乱造(也就是幻觉)。
而 grep和glob是按行或按文件返回完整内容,没有“切一半”的问题。
03
—
Claude Code 到底是怎么做的?
它的方案可以概括为:让大模型自己指挥grep 和 glob,像人一样找代码。
具体流程是这样的:
用户先发问:“认证逻辑在哪?”
模型决定先用
glob找相关文件名,比如**/auth*.py、**/login*.js。找到候选文件后,模型再用
grep在这些文件里搜具体的关键词,比如authenticate、login。模型读一读搜出来的代码片段,如果发现新的线索(比如调用了
verify_token函数),就继续用grep追下去。直到模型觉得信息足够回答用户问题了,才停止。
这不是一次性把几百个结果塞给模型,而是一个逐步深入、不断聚焦的搜索循环。就像你翻开一本陌生的代码库时,会先看目录,再找几个关键文件,然后搜索某个函数,沿着调用链往下翻——Claude Code 模仿的就是这个行为。
04
—
grep的问题,太费钱
当然也有人吐槽:grep返回的结果经常包含大量无关的行,一股脑塞给大模型,很容易把上下文窗口撑爆,Token 成本飙升。
为了解决这个问题,开源社区已经有人做了“补丁”——比如 Claude Context 这个项目,通过 MCP 模式给 Claude Code 增加了语义检索能力,声称可以减少约 40% 的 Token 消耗。
还有很多人拿 Claude Code 和 Cursor 对比。Cursor 从一开始就坚定走 RAG 索引路线,语义检索做得很漂亮,两边的拥趸谁也说服不了谁。
工具是死的,方案是活的。知道自己要解决什么问题,才知道手里该握grep还是向量数据库,或者别的什么工具。
夜雨聆风