开源jegrep:抛弃grep或RAG,用Jev实现语义搜索反而更省钱


Jev 在语义搜索方面似乎相当出色,比 gemini-lite agentic-retrieval 的性能更胜一筹,而且成本还低 10 倍。在将其集成到 omp 之前,我还需要进行一些基准测试,但它或许会成为 grep/glob/scout 的绝佳替代方案。

Can Bölük写了一个叫jegrep的命令行程序,让你用大白话搜整个代码库,而且它根本不建任何索引!

你花三小时搭的向量搜索管线,可能从一开始就是多余的!

语义搜索代码长期绑定向量数据库和embedding管线,但Can Bölük开发的jegrep每次直接遍历活文件树,用Jev大语言模型实时判断每段代码的语义匹配度,单次搜索成本不到三分钱,彻底绕开了预建索引这道工序。


搜代码这件事被带偏了十年

程序员找代码的默认姿势一直没变过:打开编辑器,按下Ctrl+F,输入一个函数名或者变量名,然后在一堆高亮结果里人肉翻找,这种操作本质上和1974年Ken Thompson写出来的grep命令没有任何区别,都是拿一串字符去撞另一串字符。

后来大家觉得grep太笨了,搜"用户登录"搜不到"authenticate_user",搜"数据库连接"搜不到"pool.acquire",于是语义搜索这个概念冒了出来,核心思路是让机器先"读懂"代码的意思,再按意思去匹配,而不是按字面去撞。

读懂代码的标准做法是把每一段代码送进一个embedding模型,模型吐出一串几百维的浮点数向量,你把这些向量存进Pinecone、Weaviate或者Chroma这类向量数据库,搜索的时候再把你的问题也转成向量,算余弦相似度,排名靠前的就是答案,整套流程跑下来,你得先花几个小时甚至几天把整个代码库嚼碎、向量化、入库,然后还得定期刷新,否则新提交的代码永远搜不到!

Sourcegraph的Cody要建索引,GitHub Copilot Chat要建索引,Bloop要建索引,Greptile也要建索引,整个行业默认了一个前提:语义搜索必须先建索引,就像你要查字典得先有一本字典一样,这个前提听起来天经地义,但Can Bölük在2026年9月19日发布的jegrep直接把这个前提掀翻了。


扔掉索引之后搜索精度反升

jegrep的做法简单到让人怀疑:你敲一行命令,它当场扫描你硬盘上的活文件树,把文件名和代码片段一批一批塞给Jev大语言模型,让模型直接判断"这段代码跟你问的问题有没有关系",模型返回一个0到1之间的概率分数,jegrep按分数排序,把文件路径和行号范围吐给你,整个过程没有任何预处理,没有任何后台守护进程,没有任何向量数据库在跑。

这就怪了,不建索引凭什么搜得准?

答案藏在Jev模型的计费方式里,Jev的输入token价格是每百万token收0.042美元,输出token免费,一个中等规模的代码库大概几千个文件,jegrep每次搜索只读取每个文件的前32KB内容,折算下来一次完整搜索消耗的token量大约对应0.01到0.03美元,也就是人民币几分钱,这个成本低到让"预建索引"变成了一种过度工程——你花三小时搭的embedding管线、向量数据库、定时刷新任务,换来的搜索精度提升可能还不如直接拿几分钱让大语言模型现场看一遍原文!

更关键的是,预建索引天然存在一个信息损耗环节:embedding模型把一段代码压缩成几百个浮点数的时候,代码里的具体变量名、注释里的业务逻辑、函数调用链的上下文全被压扁了,而jegrep把原始代码直接喂给Jev,模型看到的是完整的函数签名、完整的注释、完整的控制流,判断依据比向量丰富得多,所以返回的结果不但有文件路径,还有精确到行号的范围,甚至能把相邻的匹配段落自动合并!


三分钱一次的语义搜索账单

算清楚这笔账需要拆开jegrep的三层请求结构:第一层叫sketch,jegrep只取每个文件的前384字节(大约几行代码加文件名),打包成一批送给Jev,让模型快速判断哪些文件值得深看,这一层消耗极少,因为384字节的文本转成token也就几十个;第二层叫content check,sketch层筛出来的候选文件会被读取前32KB的完整内容,再次送给Jev做精细判断,这一层是token消耗的大头;第三层叫heatmap,对高分文件提取最多16个行号范围,精确定位匹配段落。

Jev的0.042美元每百万输入token这个定价是整个经济模型成立的前提,对比一下:OpenAI的GPT-4o输入价格是2.5美元每百万token,是Jev的将近60倍,如果用GPT-4o跑同样的搜索流程,一次搜索的成本会飙到0.6到1.8美元,这个价格足以让大多数开发者放弃实时搜索的念头,转回去老老实实建索引。

Can Bölük选择Jev而不是GPT-4o或者Claude,核心原因就是Jev的输入价格低到让"暴力遍历"变得经济可行,jegrep默认同时配置OpenRouter和TypeSafe两个API通道,OpenRouter的key存在就优先走OpenRouter,否则走TypeSafe,遇到401认证失败、429限流、5xx服务器错误的时候自动切换到另一个通道,这种双通道failover机制保证了搜索不会因为某个API提供商抽风而中断。


十二种策略轮流上场

jegrep内置了十二种搜索策略,每种策略对应不同的代码库规模和搜索场景,默认策略叫cascade,也就是级联策略,它的思路是先花极少的token做一轮全局sketch扫描,圈出大约128个候选文件,然后从中挑出20个最热的文件做32KB全文检查,最后对高分文件提取最多24个段落范围,整个流程像一个漏斗,越往下越精细,越往下token消耗越大。

如果你的代码库特别大,cascade策略的sketch层可能一次塞不下所有文件,这时候你可以切换到beam策略,beam策略先按文件夹做一轮粗筛,只保留得分最高的K个文件夹,然后钻进这些文件夹做逐文件检查,最后再跑一轮扁平的救援扫描,确保没有漏掉藏在冷门目录里的关键代码。

另外十种策略各有侧重:sniff策略只读每个文件的前1KB头部,适合超大仓库的快速摸底;budget策略用排名预算代替固定阈值,搜到足够多的命中就自动停手;deep策略递归扫描热点文件夹,先读8KB再升级到32KB;window策略把文件切成滑动窗口逐段打分;paged系列策略结合grep关键词做预排序;inline系列策略把热门文件内容直接内联到下一轮请求里节省往返延迟;hybrid-window策略先用beam发现热点再用window精修,十二种策略共享同一套底层组件:懒加载的文件树、并发请求池、问题构造器和Jev客户端,你甚至可以在src/strategies目录下自己写一个新策略注册进去!


三行命令跑通语义搜索

装jegrep只需要一行命令:cargo install jegrep,前提是你机器上装了Rust和Cargo,如果你不想装Rust,也可以去GitHub Releases页面下载预编译的二进制包,Linux、macOS、Windows三个平台都有,Linux版本要求glibc 2.39或更新。

装完之后你需要配一个API key,打开终端输入export OPENROUTER_API_KEY=你的key,或者export TYPESAFE_API_KEY=你的key,两个key都配了也行,jegrep会自动选一个能用的,配好key之后cd进你的代码仓库目录,敲jegrep "where do we handle authentication?",等几秒钟,屏幕上就会列出所有跟认证逻辑相关的文件路径和行号范围。

如果你想把搜索结果喂给其他脚本或者编程agent,加上--json参数就行,jegrep会输出完整的JSON结构,包含每个匹配项的概率分数、行号范围、token消耗量,按得分从高到低排列,你可以直接管道给jq做二次过滤,也可以接进你自己的自动化流程里,整个过程不需要启动任何后台服务,不需要等任何索引构建完成,你clone一个新仓库的下一秒就能开始搜!


一个还没吵完的赌局

jegrep的README里有一行容易被忽略的说明:Linux二进制要求glibc 2.39或更新,这意味着Ubuntu 22.04和Debian 11这些还在广泛使用的发行版跑不了预编译包,你得自己从源码编译,而源码编译又要求Rust工具链版本对齐rust-toolchain.toml里的配置,Can Bölük在仓库里锁定了nightly通道,这意味着每次Rust nightly更新都可能引入编译断裂,一个以"零配置、零索引"为卖点的语义搜索工具,自己的安装门槛却卡在了glibc版本和nightly编译器上,这个矛盾目前还没有人给出优雅的解法。