从现代Coding Agent视角回看代码搜索与嵌入
· 24 min read
应该如何说起代码搜索呢,先说代码搜索的几个小的子流派吧,这方面可能略微和其他领域不同
代码的检索我认为是可以分解成以下几种的:
- 搜索引擎式
- grep传统搜
- 向量embedding搜
- 码仓index
每一种都是什么意思呢,举个例子
搜索引擎式是复用传统的搜索引擎,如elasticsearch, meilisearch等;也有一些变体,比如github的代码搜索,主要是弥补传统搜索引擎在代码搜索的不足
grep如其名字,基于linux grep或者riggrep,在agent内使用最广
向量embedding搜则有多个子任务,如NL2Code, Code2Code, Code2NL等,每个还有一些细微差别,这个很有意思,待会讲;
码仓index呢,则大致有两种:一种基于传统的AST分析,希望构建整个码仓的符号树或者CKG来辅助搜,另一种则寄希望于新型的生成式大模型,希望让LLM读了仓库之后能生成”索引“,典型的做法比如deepwiki。
搜索引擎式
传统的搜索引擎其实在代码搜上有很多问题,参见
最严重的问题甚至不是想象的NL2Code的问题,而是传统搜索引擎的部分优化不够、部分优化又不足,总之不与代码适配
- 索引的开销, 恐怖的内存消耗
当我们第一次部署 Elasticsearch 时,需要几个月的时间才能索引 GitHub 上的所有代码(当时大约有 800 万个存储库)。今天,这个数字已经超过 2 亿,而且代码不是静态的:它不断变化,这对搜索引擎来说是相当具有挑战性的。
- 可不可以不要索引?对大规模库高并发是不可能的:
首先,让我们探讨一下解决问题的蛮力方法。我们经常收到这样的问题:“你为什么不直接使用 grep