多仓库时代的代码搜索:AI 编程的隐形基础设施
分析大规模多仓库环境下,强大的代码搜索能力对 AI 编程助手的重要性。突出搜索作为 AI 工作流基础的价值。
分析大规模多仓库环境下,强大的代码搜索能力对 AI 编程助手的重要性。突出搜索作为 AI 工作流基础的价值。
你的 AI 编程助手能写代码,但它能告诉你某个端点在 500 个微服务中被调用的位置吗?这 500 个微服务分散在数十个代码仓库中。
当工程组织从几十个代码仓库扩展到数千个时,一个关键的问题就浮现了:AI 工具针对你正在编写的代码进行了优化,但企业需要的是对所有已存在的代码的可观测性。这就是大代码问题(big code problem),也解释了为什么像 Uber、Stripe、Dropbox 以及美国前 6 大银行中的 4 家都采用了 Sourcegraph。
转向 AI 智能体编码工作流的转变反而使大规模代码搜索变得更有价值,而不是更少。Claude Code、Cursor 和 Codex 擅长在当前项目中生成新代码,但它们各自孤立运作,无法回答规模化中最关键的问题:这个 API 在哪里被调用?谁依赖这个已废弃的函数?这个改动在整个组织中的影响范围有多大?
每个主流 AI 编程工具都面临同一个架构约束:以工作区为中心的上下文。Cursor 使用云端托管的嵌入索引你的本地工作区。Claude Code 在当前目录中使用 grep 和 glob 进行按需搜索。OpenAI Codex 在单个工作目录上运行。即使 Windsurf 的企业级远程索引也需要逐个存储库的手动配置。
这些工具都无法自动发现和搜索企业组织中的所有代码仓库。
这在实践中意味着什么呢?想象你是一家拥有 400 个代码仓库、分布在三个代码平台上的公司的工程师。你写了一个支付处理端点,需要在修改其行为前找到所有的调用位置。使用 Cursor 或 Claude Code 的话,你需要在本地克隆全部 400 个仓库、在工作区中打开它们,并希望上下文窗口能捕获相关的调用者。这种变通方案根本扩展不了,而且容易出错。
Augment Code 工程团队的研究精准地捕捉了这个问题:"深埋在三级目录中的自定义装饰器、兄弟微服务中的细微覆盖、散布在各个模块中的关键业务逻辑,这一切对模型都是不可见的。" 结果就是 AI 建议"在隔离环境中看似正确,但集成到现有系统时就失败了。"
一些编程智能体开始解决这个差距。比如 Amp 的 Librarian 子智能体可以搜索超出本地工作区的 GitHub 仓库——这对快速的跨仓库研究效果不错。但这些功能还很早期,仅限于单个代码平台(Librarian 只支持 GitHub),而且是为开发者探索而不是企业级枚举设计的。当你需要跨越 GitHub、GitLab、Bitbucket 和 Perforce 的数千个仓库进行搜索时,要求毫秒级延迟、审计日志和合规控制——你需要的是专用基础设施,而不是一个智能体的子功能。
大规模代码搜索是我们的首要目标,Sourcegraph 平台从基础设施、驱动搜索的应用,到查询语言,都是从头设计来实现这一目标的。该平台连接到你的代码平台(GitHub、GitLab、Bitbucket、Gerrit、Perforce、Azure DevOps),并使用 Zoekt(一个基于三元组的搜索引擎)将每个代码仓库索引到统一的搜索语料库中,可在数十亿行代码中提供毫秒级查询。
这一架构设计决策支持对企业至关重要的查询:
repo:myorg/.* endpoint("/api/v2/payments") type:symbol
这单个查询在你的组织中的每个代码仓库中搜索支付端点符号,返回每个定义和引用。无需克隆。无上下文窗口限制。结果是确定性的、可审计的。
查询语言提供了基于 LLM 的语义搜索无法提供的精度。Sourcegraph 的搜索语法支持:
存储库过滤: repo:github.com/myorg/.* 匹配组织中的所有代码仓库
路径过滤: file:\.go$ file:internal/ 查找 internal 目录中的 Go 文件
符号搜索: type:symbol CreateUser 查找函数和类定义
差异搜索: type:diff after:"2 weeks ago" author:security-team 跟踪最近的安全变化
提交信息搜索: type:commit SLO 查找提交信息中提及 SLO 的提交——这对于理解改动的原因而不仅仅是改动内容至关重要
布尔逻辑: (repo:service-a OR repo:service-b) AND deprecated lang:python
这种精度对于安全性、合规性和大规模重构至关重要,在这些用例中你需要每个实例,而不仅仅是代表性样本。
Sourcegraph 的 Deep Search 认识到开发者既需要自然语言探索,也需要精确的枚举。Deep Search 是一个由最先进的模型驱动的 AI 智能体搜索系统,能够理解以下问题:
"认证流是如何通过我们的后端服务的?"
"在我们的代码仓库中找到速率限制实现的例子"
"sourcegraph 仓库中哪些 GraphQL API 看起来没被使用?"
"我们缓存层的历史是什么?它是如何随时间演变的?"
Deep Search 使用 Sourcegraph 的代码搜索和导航作为工具,通过多次搜索查询迭代精化其理解。关键区别在于:Deep Search 显示它执行的是哪些搜索作为来源,使工程师能够从语义探索转向确定性枚举。你从"X 如何工作?"开始,以找到每个实例的精确查询结束。
这个工作流——用语义搜索进行探索,用查询语言进行枚举——在任何 AI 编程助手中都不可得。Claude Code 和 Cursor 能够回答它们能看到的代码的问题,但它们无法在整个组织的代码库中提供详尽、可重现的搜索。
大型工程组织一致面临以下场景,其中以工作区为限的工具失败:
变更前的影响分析。 平台团队需要修改核心认证库。在进行修改前,他们需要识别导入此库的每个服务,理解每个服务如何使用它,并估计迁移工作量。使用 Sourcegraph:repo:myorg/.* file:go.mod content:"auth-lib" 查找具有该依赖的每个 Go 服务。跨存储库代码导航随后显示每个服务如何调用该库的方法。
API 废弃和迁移跟踪。 工程领导层要求用 GraphQL API 代替旧的 REST 端点。Sourcegraph 的 Code Insights 可以随时间跟踪迁移进度:有多少个仓库仍然引用已废弃的端点、这个数字周环比趋势如何,以及哪些团队拥有剩余的调用者。
安全漏洞响应。 一个关键 CVE 影响了日志库。安全团队需要在所有存储库中找到漏洞模式的每个实例,不是代表性样本,而是在披露窗口关闭前的每个单一实例。确定性搜索 lang:java logger.format(userInput) 返回可审计、完整的结果。
新员工入职加速。 新工程师可以在无需询问同事该克隆哪些仓库的情况下搜索整个代码库。正如一位 CERN 工程师所说:"Sourcegraph 帮我在大概 5 秒钟内回答了一个问题......通常我可能会骚扰很多人。"
这些场景有一个共同点:它们需要单个仓库工具无法提供的组织级可观测性。
AI 智能体的未来并不会消除大规模代码搜索的必要性,反而会放大它。进行自主代码改动的 AI 智能体需要可靠、确定性的工具来理解现有代码库。Sourcegraph 的 MCP(Model Context Protocol)服务器将代码搜索和导航能力直接暴露给 AI 智能体。
这意味着Claude、Codex和其他编码智能体可以以编程方式查询Sourcegraph业界领先的搜索索引,获得组织范围内的代码上下文。这个组合非常强大:AI的创意用于生成代码,Sourcegraph的精准搜索用于理解新代码将集成的代码库。
搜索发现问题;批量变更在组织范围内解决问题。Sourcegraph的Batch Changes产品会在与搜索查询匹配的每个仓库中创建拉取请求,然后在统一的仪表板中跟踪从CI检查、代码审查到合并的所有变更。
Workiva报告大规模代码变更的时间减少了80%。Indeed将Batch Changes称为"减少跨团队推送更新隐性负担的关键能力"。
任何AI编码助手都不存在这种查找并修复的能力。你可以要求Claude Code修改当前目录中的文件,但无法跨200个仓库协调变更并跟踪审查状态。
Sourcegraph提供AI编码助手无法匹配的部署灵活性:
对于受监管行业、金融服务、医疗保健和政府部门的工程领导者,这些能力是不可协商的。无需将代码发送到第三方云服务即可搜索代码的能力,消除了整个类别的合规问题。
如果你在前一家公司使用过Sourcegraph,你就会知道它带来的生产力差异。在新组织中建立采用案例需要将能力与业务成果关联起来:
开发者生产力:Forrester研究表明,知识工作者花费高达30%的时间搜索信息。大规模代码搜索将代码发现从打扰同事转变为自助查询。
安全响应时间:当漏洞被披露时,在几分钟内找到所有实例和花费数天之间的差异直接影响暴露窗口和修复成本。
技术债务可见性:Code Insights仪表板以领导力可以跟踪和优先排序的术语量化技术债务、弃用的API使用、过时的依赖项和迁移进度。
AI智能体有效性:当你的组织采用AI编码工具时,Sourcegraph提供这些工具缺乏的组织范围内的上下文,使AI生成的代码更可能与现有系统成功集成。
你的工程师绝对可以今天搜索代码。问题是他们是否在整个代码库中高效地搜索,还是只在他们碰巧本地克隆的仓库中低效地搜索。
GitHub Code Search被积极维护,支持使用org:和enterprise:限定符的跨仓库查询。查询语法处理正则表达式、符号搜索和布尔操作。对于完全致力于GitHub的组织,它提供有意义的代码搜索能力。
然而,GitHub Code Search只搜索GitHub托管的仓库。使用GitLab、Bitbucket、Perforce或多个代码平台的企业无法实现统一搜索。查询语言缺乏Sourcegraph的diff和提交搜索能力——你无法通过提交消息搜索或跟踪代码如何随时间变化。
Augment Code的Context Engine提供了令人印象深刻的代码库语义理解,支持索引超过100百万行代码,并支持多仓库感知。该平台擅长回答"支付令牌在哪里被验证?"等问题,结果跨越多个服务。
局限:Augment Code是一个AI助手,而不是代码搜索引擎。它提供语义、AI解释的响应,而不是确定性的查询结果。你无法编写正则表达式来查找每个脆弱模式的实例,你只能提问并收到AI策划的答案。对于合规性和安全枚举,这个区别很重要。
传统开源工具在较小规模发挥重要作用:
Hound(由Etsy创建)提供简单部署和快速的基于三字组的正则表达式搜索,跨多个仓库。然而,其单服务器架构限制了规模,并且不提供语义搜索或代码智能。
OpenGrok(Oracle)支持多个版本控制系统并提供基于网络的交叉引用。权衡:复杂的设置需要Java、Tomcat和ctags,具有显著的内存需求(8-16GB+ JVM堆)和大规模部署的具有挑战性的运维开销。
Livegrep(来自Stripe)为千兆字节规模的代码库提供闪电般快速的正则表达式搜索,但明确针对个位数千兆字节规模,而不是跨数千个仓库的企业级部署。
没有一个提供语义/AI驱动的搜索、企业安全功能(SSO、RBAC、审计日志)或通过自动化变更对搜索结果进行操作的能力。
每个开发者都使用grep或ripgrep进行本地搜索,ripgrep搜索Linux内核源代码的速度比GNU grep快32倍。但命令行工具需要本地文件访问,不提供持久索引或网络界面,并且无法搜索未克隆的仓库。
大规模时该局限变得尖锐:你无法grep一个没有本地的仓库,企业不会期望开发者克隆500+个仓库来回答关于代码使用的基本问题。
大规模代码搜索解决一个增长速度快于人员增长的问题:随着仓库数量增加,碎片化代码发现的成本呈指数增长。AI编码助手加速代码生成,但无法提供组织范围的可见性,它们是互补能力,而不是替代品。
Sourcegraph的确定性查询语言、语义Deep Search、跨仓库代码导航和Batch Changes的组合创建了其他地方无法获得的工作流:用自然语言探索、用精确查询枚举、用自动化变更采取行动、用统一仪表板跟踪。MCP集成确保这些能力增强而不是与AI智能体工作流竞争。
对于评估代码搜索的工程领导者,决策框架很直接:如果你的组织拥有超过任何开发者能合理克隆的仓库数量,如果你使用多个代码托管平台,如果安全响应需要详尽枚举,或如果你正在构建需要可靠代码上下文的AI智能体工作流,大规模代码搜索已经变得更加必要。
解除组织的阻碍。更快地发布。
使用Sourcegraph,企业的代码理解平台。