AI coding agent 找代码时,很多问题并不需要语义搜索。

如果你已经知道函数名、错误信息、API 名、配置键、日志片段,最有效的做法往往还是关键字检索。问题在于,普通 grep 很快,但输出是平铺的:一堆文件、一堆行号、一堆需要 agent 再读、再筛、再总结的上下文。对人来说还能扫过去;对 agent 来说,常常会变成几轮工具调用和一大段 token 消耗。

今天想记下的 shebe-oss/shebe,切的是这个很朴素的缝隙:给 coding agent 一个本地、快速、基于 BM25 的代码搜索层。它不是向量数据库,也不是代码理解平台,而是一个 Rust 写的 CLI 和 MCP server,让 agent 在本地仓库里拿到排序后的相关结果、引用候选、文件预览和分页读取能力。

按 GitHub repository page、README、Releases page、Tags page、commit history、LICENSE 和 GitHub 页面 metadata 在 2026-07-15 能核验的公开信息,shebe-oss/shebe 当前有 35 stars3 forks。仓库主语言是 Rust,许可证是 Apache-2.0。仓库创建于 2025-12-28 03:51:24 UTC,最近公开 push 是 2026-07-13 17:52:06 UTC。默认分支 main 当前最新提交是 7166911,提交时间 2026-07-13 17:52:04 UTC。GitHub Releases 页当前最新版本是 v0.5.8,Tags 页也显示最新 tag 为 v0.5.8,日期是 2026-02-03

项目概览

属性详情
仓库shebe-oss/shebe
定位面向 coding agent 的本地 BM25 代码搜索 CLI 和 MCP server
Stars35
Forks3
主语言Rust
许可证Apache-2.0
仓库创建时间2025-12-28 03:51:24 UTC
最近 push2026-07-13 17:52:06 UTC
最新 main 提交7166911,2026-07-13 17:52:04 UTC
Latest GitHub releasev0.5.8,2026-02-03
最新 tagv0.5.8
核心入口brew tap shebe-oss/tapbrew install shebeshebe index-repositoryshebe search-codeshebe-mcp
关键词BM25、local-first、MCP、code search、ranked results、Rust

为什么不是再做一个向量搜索

Shebe README 的问题设定很明确:开发者的大量代码搜索价值来自精确词。你要找的可能就是 AuthorizationPolicySubstitutionFormatter、某个 error message、某个 config key。这个时候,让 agent 先把问题改写成 embedding query,再从语义相似度里猜答案,不一定比关键词模型更直接。

BM25 的优点是朴素、可解释、便宜。它知道 query term 在文档里出现在哪里,也会考虑词频和文档长度。对代码仓库来说,这种排序比纯 grep 更适合给 agent 使用:不是把所有匹配行一次性倒出来,而是先给一组相关性更高的候选,让 agent 读更少的上下文。

Shebe 的定位也没有试图吃掉所有工具。README 里把它放在 grep/ripgrep 和 Serena 这类结构工具之间:grep 适合精确正则和小仓库,Serena 适合 AST/LSP 级别的符号重构,而 Shebe 适合大仓库、多语言、需要排序结果和布尔查询的内容搜索。这个边界感比“万能 AI 搜索”更可信。

对 agent 友好的接口,而不是只给人看的 CLI

Shebe 提供两类入口。人可以直接用 CLI:

shebe index-repository ~/envoy envoy-v1
shebe search-code envoy-v1 "accesslog format"

agent 则可以通过 MCP 使用它。README 里列出的能力包括 search_codefind_referencesfind_fileread_filepreview_chunklist_dirreindex_session 等,总数是 14 个 MCP tools。这里有一个很实际的设计点:结果不是只返回大段文件内容,而是控制在较小 token 范围内,并支持分页。

这对 coding agent 很重要。普通工具链里,agent 经常先用 grep 找到几十个文件,然后逐个 read file,最后再自己判断哪些真的相关。Shebe 把“排序候选”和“低 token 预览”提前放进工具层,等于减少 agent 在搜索结果上做机械筛选的时间。

README 给出的性能目标也很偏工程化:毫秒级查询、几千到上万文件每秒的索引速度、每次查询几百 token 级别的输出。这里我不会把 benchmark 当成所有项目上的保证,但这些指标说明作者关心的不是 demo,而是 agent 在真实代码库里跑工具时的成本。

本地优先,代价也很清楚

Shebe 的安装路径比较简单。macOS 和 Linux 可以用 Homebrew tap:

brew tap shebe-oss/tap
brew install shebe

Linux x86_64 也有手动下载的 release 包。索引时需要先把仓库 clone 到本地,再用 index-repository 建 session。README 明确写了两个限制:必须先有本地 clone,不支持直接给远程 URL;BM25 不是语义相似度,所以 login 不会自然匹配到 authenticate

我反而喜欢这种限制写得很直。它告诉你什么时候该用 Shebe,什么时候不该用。查已知符号、API、错误文本、配置项、跨语言关键字,它会很合适;如果你想问“哪里实现了用户身份校验这种概念”,那就应该补上语义搜索或结构工具。

本地优先也是它的价值之一。索引和查询都在本机完成,不需要把私有仓库送到云端。对很多团队来说,代码搜索不是能不能做的问题,而是数据能不能出边界的问题。Shebe 的取舍刚好让它适合先在私有仓库里小范围试验。

和 grep、Serena 的关系

Shebe 的 WHY_SHEBE 文档拿 Istio 和 Eigen 做了两个 refactoring 场景对比。它想证明的不是“grep 不好”,而是:当 agent 要把一批搜索结果变成修改计划时,原始 grep 输出需要很多人工式综合;LSP/AST 工具在某些语言或宏场景下又可能不完整;BM25 加引用类工具能在中间提供更容易消费的候选集。

这个判断值得保留一点警惕。benchmark 总是会选对自己有利的任务,代码库语言、query、符号形态都会影响结果。但它提出的问题是真实的:agent 的瓶颈往往不是工具运行慢,而是工具输出太散,导致后续读取和判断变贵。

所以我不会把 Shebe 看成 ripgrep 的替代品。对人类来说,rg 仍然是第一反应。Shebe 更像是给 agent 准备的 ranked search adapter:它把本来需要 agent 自己整理的 grep 结果,变成更结构化、更省 token 的工具响应。

适合什么场景

第一类场景,是大仓库里的已知词搜索。比如错误码、日志片段、API 名、feature flag、配置 key、类型名。你知道要找什么,但不想让 agent 读太多无关匹配。

第二类场景,是多语言仓库。Shebe 不依赖某一种 LSP,README 强调 polyglot search。对 Go 加 YAML、TypeScript 加配置文件、Rust 加文档这类仓库,内容检索有时比纯符号工具更稳。

第三类场景,是你已经在用 MCP agent。Shebe 的价值不只是 CLI,而是能成为 Claude Code、Codex、其他 MCP client 的一个检索后端,让 agent 在修改前先查清引用和上下文。

第四类场景,是私有代码库。没有 SaaS account、没有云端索引,对安全边界敏感的团队更容易接受。

需要注意的地方

第一,项目还很小。35 stars、3 forks,虽然最近 main 分支在 2026-07-13 还有文档更新,但外部使用反馈仍然有限。采用时最好固定版本,先在非关键仓库测。

第二,BM25 不是语义理解。你需要让 agent 使用更好的 query,必要时加同义词、API 名、错误文本或具体类型名。README 也建议在真正需要语义相似度时搭配向量工具。

第三,它要求本地 clone 和索引 session。这比直接丢 GitHub URL 给云服务多一步,但换来的是本地控制和更低数据外流风险。

第四,最新 GitHub release v0.5.8 是 2026-02-03,而 main 分支在 2026-07-13 还有更新。使用时要区分 release 包和 main 分支文档状态,别默认 README 里的所有新说明都已经进入稳定 release。

总结

Shebe 有意思的地方,是它选择了一个不花哨但很实用的位置:不是让 agent “理解一切”,而是先把已知关键词搜索这件事做得更适合 agent 消费。

如果你的 coding agent 经常在大仓库里为了一个符号、一个错误字符串、一个 API 名来回 grep,再读一堆文件筛上下文,shebe-oss/shebe 值得试一下。它小、边界清楚、完全本地,适合作为 MCP 工具箱里那个“先把相关代码排好序”的基础层。