Swimming as fast as we can...
Swimming as fast as we can...
No summary in your language yet — showing the existing version.
该视频拆解了面试中关于“Claude Code为何放弃RAG而改用grep做代码检索”的问题,从背景、技术缺陷、架构哲学和辩证思考四层展开。首先,Claude Code早期尝试过本地向量数据库加embedding检索的RAG方案,但效果不佳,转而采用agentic search,即让模型通过grep、find等Linux命令实时搜索代码,工程师Boris称其效果远超其他方法。
核心原因有三:一是embedding对代码标识符的语义理解失效,例如getUserById和deleteUserById在向量空间距离很近,但功能完全相反,精确匹配天然更可靠;二是RAG链路各环节(切分、embedding、检索、重排序、生成)存在乘法效应,即便每步90%准确率,整体也不足60%,且调试困难,而grep失败仅因关键词未匹配,确定性高;三是索引时效性问题,代码仓库变化快,索引易过时,grep实时搜索则始终获取最新状态。
在架构哲学上,Claude Code遵循无状态设计,无需构建索引,实现零配置、零运维,并贯彻“Everything is the Model”理念,让模型能力提升直接驱动系统优化,同时grep本地执行也杜绝了embedding存储带来的信息泄露风险。
辩证看待,该方案也有代价:每次搜索需多轮工具调用,Token消耗巨大;对概念级跨文件搜索(如查找所有权限校验逻辑)覆盖不足。因此,业界趋向混合方案,将精确grep用于标识符查找,语义检索用于概念探索。面试回答需层层递进,既讲清RAG在代码场景的缺陷,也承认Claude Code方案的局限,展现深度与边界感。
This transcript is not in English — you can generate an English translation: read the whole piece, or check it line by line against the original.
面试题:为什么 Claude Code 放弃了 RAG? Claude Code不用RAG,全靠grep做代码检索,这在技术圈争议很大。我一个学员上个月面大厂AI岗就碰上了,面试官问:“Claude Code为什么放弃RAG?你觉得合不合理?”这题考的就是你对RAG链路的理解深度,加上你自己的工程判断。接下来我来拆解下这道面试题。 1. 先把背景交代清楚 回答的时候,第一步先把事情的来龙去脉讲清楚,让面试官知道你是真的跟踪过这个话题。Anthropic的工程师Boris在2025年5月 The Latent Space 播客里明确说过,Claude Code早期确实试过RAG,用的就是标准方案:本地向量数据库加embedding检索。但他们很快发现效果不行,最终切换到了他们叫agentic search的方式,说白了就是让模型自己要用grep、glob、find这些Linux命令去实时搜索代码。 Boris原话是:It outperformed everything by a lot。而且被追问是什么benchmark的时候,他说Mostly vibes,主要靠体感。 这个回答本身就很有意思,我们一会儿再说。面试的时候你先把这个事实陈述清楚,让面试官知道你是用心细研的,不是在瞎编。 二、核心原因:代码场景下RAG的根本性缺陷 好,接下来我们讲为什么放弃。很多人会笼统地说“RAG效果不好”,那面试里你得说清楚到底哪里不好。 第一个问题也是最致命的,就是embedding对代码标识符的语义理解几乎是失效的。你想,getUserById和deleteUserById这两个函数名,在向量空间里的距离非常近,因为它们共享了大量的token,但它们的功能完全相反:一个是查询,一个是删除。代码不是自然语言,它是结构化的精确标识符。函数名、类名、变量名本身就是最好的检索关键词。在这种场景下,精确匹配天然比语义匹配更可靠。GRAPSO Process Payment 就只精确命中,不存在一票否决的问题。 第二个问题是RAG管线的准确率有一个乘法效应。你想想整个链路:文档切分、embedding生成、向量检索、重排序、最终生成,每个环节哪怕做到90%的准确率,五个环节乘下来就只剩不到60%。而且这些环节出错的时候,调试是噩梦级别的,你根本不知道是chunk切得不好,还是embedding质量有问题,还是re-rank模型偏了。但GRAPSO失败的原因只有一个:关键词没匹配上。这种确定性在工程上的价值是巨大的。 第三个问题是索引的时效性。代码仓库变化极快,你上午建的索引下午可能就过时了。有人新提交了代码,重构了文件结构,索引就跟实际代码产生了漂移。你要么频繁重建,因此付出巨大的计算开销,要么忍受过时索引带来的错误次数。GRAPSO每次都是实时搜索,拿到的永远是当前最新的代码状态,根本不存在同步问题。 四、更深一层:架构哲学上的考量 讲完技术细节之后,你可以再拔高一层,聊聊架构哲学,这会让面试官觉得你有depth。Claude Code的设计遵循的其实是一个非常经典的原则:无状态设计。这条线从Unix管道到Rest API到Serverless,在计算机科学里反复验证过。不建索引意味着零配置,用户clone完代码就能直接用,不需要等几分钟构建embedding。不维护状态意味着零运维负担,没有索引卡住了缓存损坏了这种问题。而且Anthropic内部有一个原则叫Everything is the Model,尽量让模型本身去驱动决策,而不是在模型外面搭一套复杂的工程管线。模型每变强一分,整个系统就自动变好一分。这其实就是Rich Sutton说的Bitter Lesson在工程上的体现。 还有一个容易被忽略的点是安全性。RAG方案需要把代码做embedding,存到某个地方,不管是本地还是云端,这个向量表示本身就是一种信息泄露的风险。学术上已经有研究证明可以从embedding反推原始内容。而grep完全在本地执行,从架构上就杜绝了这个问题。 4. 辩证思考:这不是简单 最后面试的时候,一定要展现辩证思维,不要把话说死。Claude Code的方案也有明显的代价,最大的就是Token消耗。每次搜索都是实时执行,模型要列目录、读文件、做多轮探索,Token用量远高于一次性的向量检索。Mufus团队就公开批评过这一点,说这是在烧Token。而且对于超大型代码库,纯grep的方式在概念级搜索上确实有短板。比如你想找所有跟权限校验相关的逻辑,grep不一定能覆盖所有变体写法。所以业界目前的共识其实是在走向混合方案:精确搜索处理标识符级别的查找,语义检索处理概念级别的探索,两者互补。Claude Code选择了极简的那一段,Cursor选择了向量索引的那一段,未来大概率会在终端侧各个自主联网。 最后简单总结一下,你把这些讲清楚,这道题基本就拿满分了。核心就是三层:技术实施层,讲清楚embedding对代码的实现和管线复杂度;架构选择层,讲清楚无状态设计和everything is the model的理念;最后辩证层,承认Token成本和向量搜索的局限,有理有据,有深度有边界。面试官想不给高分都难。 以上就是对这道面试问题的分析和拆解。这里是丁师兄大模型,持续分享大模型面试干货。需要大模型一对一面试辅导的同学,请见评论区置顶介绍。大家面试加油。