semantic-code-search
用自然语言在本地代码库中搜索函数级代码片段,支持14种编程语言,无需联网即可完成语义搜索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用自然语言在本地代码库中搜索函数级代码片段,支持14种编程语言,无需联网即可完成语义搜索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你在维护一个数万行的遗留代码库,代码注释早已残缺不全。当你想找到"处理支付回调"的相关逻辑时,脑子里蹦出来的描述是"payment callback handler"——但代码里的变量名叫 handle_order_webhook,注释里写的是"订单通知处理函数",完全对不上。
传统搜索工具(grep、ack)本质上是字符串匹配器,它们找的是"包含这个词的代码",而不是"做了这件事的代码"。你不得不反复换关键词、反复试错,才能在浩如烟海的函数中找到那个正确的结果。
Semantic Code Search(项目名 sem)就是为了解决这个问题而生的:让你用自然语言搜索代码——就像问一个懂代码的同事"这个逻辑在哪里"一样自然。

图1:sem 命令输出示例,展示匹配结果、相似度分数和代码片段
这个工具的作者是 Kiril Videlov(GitHub ID sturdy-dev),同时也是 Codeball AI 的成员。他长期在大型代码库中挣扎,grep 搜不到想要的逻辑、AST 分析工具又太重,于是决定自己动手实现一个"用自然语言搜代码"的方案。
项目于 2022 年初发布,至今已获得 399 颗 GitHub stars,并被收录于 Papers With Code 等平台。作为一个纯本地运行、零数据外传的 CLI 工具,它在注重代码隐私的开发者社区中有着不错的口碑。
sem 的工作原理可以分为离线索引和在线查询两个阶段,整体构建在 Sentence Transformers 框架之上。
当你首次在项目目录下运行 sem 时,它会做三件事:
解析代码结构:使用 tree-sitter 对代码进行 AST(抽象语法树)解析,精准提取函数级别的代码块。支持 14 种主流编程语言,包括 Python、JavaScript、TypeScript、Go、Rust、Java、Ruby、PHP、C/C++、Kotlin 等。相比简单粗暴地按行切割,按函数边界提取能让每个索引单元都具有完整的语义单元。
生成代码嵌入:调用预训练的代码语义模型(默认使用 krlvi/sentence-msmarco-bert-base-dot-v5-nlpl-code_search_net,基于 MS MARCO 数据集微调的 BERT 架构),将每个函数体的代码文本编码为高维向量(约 768 维)。
持久化缓存:将所有函数嵌入向量和元数据(文件路径、行号、函数代码)一起压缩(gzip + pickle)存入项目根目录的 .embeddings 文件,供后续查询复用。这个过程只需要执行一次,且会跳过 .gitignore 指定的文件——不用担心把依赖目录也索引进去。
当你输入自然语言查询(如 sem 'Where are API requests authenticated?')时:
prompt_toolkit)展示结果,支持键盘导航,选中后直接跳转到对应编辑器(支持 VS Code 和 Vim)。这个过程完全在本地运行,没有任何数据上传到网络。
sem 还提供了一个容易被忽视但极具实用价值的命令:sem --cluster。
聚类功能基于 sklearn 的层次聚类(Agglomerative Clustering) 算法,对代码嵌入向量进行自动分组。它能帮你发现:
聚类结果输出到 stdout,开发者可以自由地结合其他工具进一步分析。
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 代码解析 | tree-sitter + tree-sitter-languages | 高性能增量 AST 解析,支持 14 种语言 |
| 语义嵌入 | sentence-transformers (krlvi/msmarco-bert) | 基于 BERT 的代码语义编码模型 |
| 深度学习框架 | PyTorch 1.12 | 模型推理后端 |
| 交互界面 | prompt_toolkit 3.0 | 类 Vim 键盘交互的 TUI 框架 |
| 语法高亮 | Pygments 2.12 | 多语言代码语法高亮 |
| CLI 框架 | argparse(内置) | 轻量无额外依赖 |
| 聚类算法 | sklearn AgglomerativeClustering | 层次聚类,支持自定义距离阈值 |
pip3 install semantic-code-search
安装时会自动下载预训练模型(约 500 MB),这是整个工具唯一一次联网下载操作。
# 进入你的 Git 项目目录
cd /my/project
# 首次运行,自动生成索引(约数秒到数分钟,取决于项目规模)
sem 'parsing command line args'
# 指定结果数量
sem -n 10 'database connection handling'
# 仅搜索特定语言
sem -x py 'authentication logic'
# 使用 Vim 打开结果
sem -e vim 'payment processing'
# 聚类分析
sem --cluster --cluster-max-distance 0.2
关键限制:sem 必须在 Git 仓库根目录运行(或通过 -p 指定路径),因为它依赖 git ls-files 来获取需要索引的文件列表。
sem -d 重新生成索引,增量更新尚未支持。Semantic Code Search 代表着代码搜索从"字符串匹配"时代向"语义理解"时代的过渡。随着代码大模型的成熟,这种基于预训练嵌入的方案正在被更强大的 LLM-based 代码理解工具所补充(如 Sourcegraph Cody、GitHub Copilot Chat),但 sem 的本地运行、零数据外传特性使其在重视代码隐私的企业环境中仍具不可替代的价值。
同时,它也是理解"代码嵌入"(Code Embedding)这一 AI 编程基础设施概念的优秀入门案例——没有复杂的微调、没有庞大的部署成本,一个 pip install 就能体验语义搜索的魔力。
一句话总结:
sem是一个用自然语言搜索代码的本地 CLI 工具,基于 sentence-transformers 生成代码嵌入向量,支持 14 种语言,零数据外传,安装即用。