当AI学会自己查资料:Claude Code团队为何抛弃RAG,让模型化身数字侦探

## 🌊 代码海洋中的迷航:一个关于"记忆"与"智慧"的启示 想象一下,你是一位刚入职的资深工程师,被扔进了拥...

🌊 代码海洋中的迷航:一个关于”记忆”与”智慧”的启示

想象一下,你是一位刚入职的资深工程师,被扔进了拥有百万行代码的庞大项目。你的老板交给你一个任务:修复一个隐藏在深层模块中的bug。你手头有一本厚厚的”代码百科全书”——它包含了所有函数的说明、变量的定义、模块间的关系,甚至每个文件的历史变更记录。听起来很完美,对吧?


友情链接: 借一步  背多分   ACEJoy


 

但当你真正开始工作时,却发现这本百科全书有个致命缺陷:它是三个月前印刷的。在这三个月里,有二十多位同事提交了上千次代码变更。你按照百科全书找到的那个函数,现在已经被重构得面目全非。更糟的是,由于这本书太厚重,你只能同时翻开其中的五页。当你在五页之外需要某个关键信息时,必须小心翼翼地折角标记当前位置,然后翻到新的页面——但当你回来时,之前记住的上下文早已模糊。

这,就是传统RAG(检索增强生成)在大型代码库中的真实写照。

Anthropic的Claude Code团队曾满怀希望地搭建过这样一个”代码百科全书”系统。他们使用了当时最先进的Voyage向量数据库,把整个代码库变成了高维空间中的数学向量,期待着只要用户提问,系统就能像魔法般找到最相关的代码片段。起初,这个魔法确实奏效了——在小型项目中,它就像一位记忆力超群的助手,总能准确无误地找到你需要的那几行代码。

然而,当项目的规模从几万行膨胀到数百万行,当提交频率从每天几次飙升到每小时数十次,这位”记忆大师”开始频繁失忆。它推荐的函数已经过时,它引用的接口早已废弃,它构建的上下文如同沙滩上的城堡,在代码浪潮的冲击下迅速崩塌。团队尝试了各种优化:调整向量维度、改进检索算法、增加缓存层……但问题似乎根植于架构本身。

就在此时,Boris Cherny,这位Claude Code的核心开发者,提出了一个看似反直觉的疯狂想法:如果,我们不再试图让AI记住一切,而是教会它如何自己查找?

这个念头如同一道闪电,劈开了传统RAG的迷雾。于是,Agentic Search诞生了——不是让AI带着一本可能过时的百科全书回答问题,而是派一位数字侦探,拿着工具箱,亲自去代码现场调查取证。

📚 传统RAG:图书馆卡片目录的黄昏

要理解这场革命的意义,我们首先需要深入传统RAG的心脏,看看它到底是如何工作的。

RAG,全称Retrieval-Augmented Generation,听起来像是给生成模型装上了一副超级眼镜。它的工作流程优雅而直接:当用户提出问题时,系统首先在一个预先构建好的知识库中”检索”相关信息,然后将这些检索结果作为”上下文”喂给大语言模型,最后让模型基于这些新鲜信息生成回答。

这个过程就像你去图书馆查资料:图书管理员(检索系统)根据你的问题,从卡片目录(向量数据库)中找到相关书籍,把它们堆在你面前(上下文窗口),然后你(语言模型)快速阅读这些书,总结出答案。在理想情况下,这个模式完美无缺——模型获得了最新的外部知识,又不会超出其上下文窗口的限制。

🔍 向量数据库:魔法背后的数学

传统RAG的核心武器是向量数据库,或者更准确地说是嵌入技术(Embedding)。它的工作原理堪称现代AI的魔法:将任何文本——无论是一行代码、一个函数,还是整份文档——都转换成一串数字,通常是768维、1024维甚至更高维度的向量。这些向量不是随机的,它们捕捉了文本的”语义”——意义上相近的文本,在向量空间中的距离也相近。

举个例子,函数名 calculate_user_balancecompute_account_total 虽然用词不同,但语义相近,它们的向量在高维空间中会非常接近。当你查询”如何计算用户余额”时,系统会将你的问题也转换成向量,然后在向量数据库中寻找”距离”最近的邻居——就像在一个超大规模的宇宙星图中,找到与你所在恒星最近的星系。

Claude Code团队最初使用的Voyage,正是这样一位”向量图书管理员”。它兢兢业业地将整个代码库——每个源文件、每个函数、每行注释——都转换成了高维向量,构建了一个庞大的语义索引。当开发者询问”用户认证模块在哪里”时,它能瞬间找到所有与认证相关的代码片段,准确得令人惊讶。

⚠️ 但魔法开始失效

然而,正如Boris Cherny在Latent Space播客中坦诚分享的那样,这个系统的蜜月期非常短暂。随着项目规模的扩大,问题如同雨后春笋般涌现:

更新滞后:过期的地图比没有地图更危险

代码库是活的——它每天都在呼吸、成长、变化。新的提交如潮水般涌来,旧的模块被重构、被删除、被取代。但向量数据库是静态的。每次代码变更后,都需要重新运行嵌入过程,更新向量索引。在大型项目中,这个过程可能需要数小时甚至数天。

想象一下,你手持一张三个月前的城市地图,在日新月异的深圳寻找某栋新建成的大楼。地图告诉你”这里应该有个路口”,但你面前却是一堵崭新的围墙。过时的信息不仅无用,还会误导你的判断。在代码世界里,这种误导意味着模型可能基于已经废弃的API生成代码,或者引用已被删除的函数——生成的答案看似合理,实则完全错误。

安全风险:数据的幽灵

向量数据库必须存储在某个地方。无论是使用第三方云服务(如Pinecone、Weaviate),还是自建内部系统,你都面临一个根本性问题:你的核心代码,那些可能包含商业机密、敏感算法、未公开API的源代码,现在变成了数学向量,躺在别人的服务器上,或者某个可能被入侵的内部数据库中。

对于Anthropic这样的公司而言,这是一个不可接受的风险。他们的内部代码库包含了Claude模型本身的训练逻辑、未公开的算法优化、以及大量的专有技术。将这些信息以任何形式托管在外部,都如同把金库的钥匙复制一份交给保安公司——即使他们承诺不偷看,风险依然存在。

工程复杂性:维护的噩梦

维护一个向量数据库系统需要一整套基础设施:嵌入服务、索引构建管道、定期更新调度、性能监控、故障恢复……每增加一个组件,系统的复杂性就指数级增长。团队发现,他们花费在维护检索系统上的时间,几乎赶上了开发核心功能的时间。

更要命的是,当检索结果不理想时,调试过程如同在黑箱中摸索。为什么这个查询返回了不相关的结果?是嵌入模型的问题?还是向量维度设置不当?亦或是相似度计算算法的缺陷?这种不透明性让优化变得异常困难。

就在团队被这些问题折磨得焦头烂额时,一个简单却革命性的想法浮出水面:如果我们不再试图记住整个世界,而是学会如何高效地查询这个世界呢?

🕵️ Agentic Search:派一位侦探去现场

Agentic Search的核心理念,用Boris Cherny的话说,就是”让智能体自己主动去查找信息,进行多轮搜索,就像开发者使用grepglob之类的工具进行代码搜索一样。”

这听起来似乎平淡无奇——不就是让AI调用搜索工具吗?但其中的范式转变是颠覆性的。传统RAG是被动接收信息,就像学生坐在考场里,只能看监考老师发下来的几页参考资料;而Agentic Search是主动探索,就像侦探来到犯罪现场,可以自由走动、掀开地毯、检查抽屉、反复验证线索。

🔧 工具箱哲学:给AI配备真正的武器

在Claude Code的实现中,Agentic Search不是简单地调用一个”搜索”函数,而是为AI配备了一整套开发者日常使用的工具链:

grep:在文件中搜索特定字符串或正则表达式
glob:基于模式匹配查找文件(如src/*/.ts
find definition:查找函数或变量的定义位置
find references:查找某函数或变量被引用的地方
git log:查看文件或代码行的变更历史
cat:读取文件内容
ls:列出目录结构

这些工具对开发者来说如同呼吸般自然。当一位工程师需要理解一个陌生函数时,他会先grep找到它的定义,然后用find references查看调用方式,再用git log追溯它的演变历史。这个过程不是一次性的,而是迭代的、探索性的——发现一个线索后,会引出新的问题,进而触发新的搜索。

Agentic Search正是模拟了这一过程。当模型需要回答”如何实现用户认证”时,它不会被动等待系统喂给它几个相关文件,而是主动执行:

1. 首先用glob找到所有与auth相关的文件
2. 用cat读取关键文件的内容
3. 发现引用了validate_token函数,于是用find definition定位它
4. 用find references理解这个函数的使用模式
5. 用git log查看最近的变更,确保信息是最新的

这个过程可能涉及数十次工具调用,跨越多个文件,持续数轮交互。但最终,模型构建的理解是基于实时、准确、完整的信息,而非过期的向量快照。

🧠 主动检索:从”记忆”到”智慧”的跃迁

这种转变的深层意义在于,它将AI从”记忆机器”升级为”思考者”。

传统RAG试图解决的是记忆容量问题——模型记不住整个代码库,所以我们帮它记住,并在需要时提醒它�

留下评论

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 沪ICP备2024052574号-1