Agentic Search Over Vector Embeddings
Nikola Balic (@nibzard)· best-practice
问题
面向代码搜索的向量嵌入需满足以下需求:
- 随代码变更持续执行重新索引
- 支持处理本地未提交的变更
- 企业部署场景下需额外覆盖安全攻击面
- 存在基础设施开销(涉及嵌入模型、向量数据库)
- 开发者在多分支环境工作时会出现索引过期问题
传统RAG方法会引入复杂度,而对于现代高性能LLM而言,这种复杂度可能并无必要。
方案
使用bash、grep、文件遍历及其他命令行工具,将向量搜索替换为智能体搜索。现代LLM已具备迭代使用搜索工具的能力,无需承担向量索引的维护成本,即可达到相近的搜索准确率。
核心思路:
- 基于工具的搜索:提供grep、ripgrep、find、ls等搜索工具
- 迭代优化:允许智能体多次执行搜索,逐步缩小结果范围
- 无需预索引:针对当前文件状态按需执行搜索,无需预先构建索引
- 可选MCP集成:若团队需要语义搜索,可通过MCP工具开放该能力
# 原实现方式:
vector_db.index(codebase) # 需要持续更新
results = vector_db.query(embedding(query))
# 新实现方式:
agent.call_tool("grep", pattern="function.*authenticate")
agent.call_tool("find", pattern="**/auth/*.ts")
agent.refine_search_based_on_results()
如何使用
何时使用代理式搜索(agentic search):
- 存在频繁变更的代码库
- 无专用向量基础设施的团队
- 对安全敏感的部署场景(外部依赖更少)
- 文件持续变更的本地开发环境
- 多分支工作流
实现方案:
- 提供全面的搜索工具(grep、ripgrep、find、fd、ast-grep)
- 允许Agent进行迭代式搜索
- 优先优化工具执行速度,而非追求初次搜索结果的完美性
- 通过system prompt让Agent学习搜索策略
Claude Code 示例: Claude Code最初采用向量嵌入(vector embeddings)技术,后切换为纯代理式搜索,原因如下:
- 部署更简洁:无需索引步骤,可直接投入使用
- 适配本地变更:始终搜索文件的当前状态
- 安全性增强:缩小企业场景下的攻击面
- 精度有保障:搭配Sonnet 4+模型可达到相近的搜索结果精度
权衡
优点:
- 无需维护索引基础设施
- 始终搜索当前状态(无过时结果)
- 支持本地未提交的变更
- 安全模型更简单
- 新仓库的搭建速度更快
- 无嵌入模型成本
缺点:
- 可能需要多次搜索迭代(消耗更多tokens)
- 在超大规模代码库(数百万个文件)中运行速度较慢
- 语义理解能力较弱(例如,对“authentication”与“login”的语义区分度不足)
- 需要性能强劲的模型(如Sonnet 4及以上版本)才能获得良好结果
- 复杂查询的延迟更高
参考文献
关键词:
Anthropic的Cat Wu分享Claude的技术选型与功能拓展:初期曾用向量嵌入但维护难度高,智能体搜索可实现同等精度且部署更简洁;同时说明可通过MCP工具为Claude Code接入语义搜索,内容出自AI & I播客。
直译:
- 凯特·吴(Anthropic公司):“我们最初确实使用了向量嵌入。这类技术的维护难度很高,因为你必须持续进行重新索引……Claude的智能体搜索能力非常出色。通过智能体搜索,你可以达到同等的准确率水平,而且部署流程要简洁得多。”
- 凯特·吴:“如果你希望为Claude Code引入语义搜索功能,可以借助MCP工具来实现。”
- 【《AI & I播客:像开发者一样使用Claude Code》】(https://every.to/podcast/transcript-how-to-use-claude-code-like-the-people-who-built-it)
来源摘要
正在获取来源并生成中文摘要…
来源: https://every.to/podcast/transcript-how-to-use-claude-code-like-the-people-who-built-it