lightonai/next-plaid
NextPlaid, ColGREP: Multi-vector search, from database to coding agents.
这个项目是什么
由 LightOn AI 构建的两个相关工具:
- NextPlaid — 一个搜索数据库,存储文本的多向量表示,并通过 REST API 提供搜索查询。它在你的机器上本地运行。
- ColGREP — 一个基于 NextPlaid 构建的代码搜索工具。你输入类似
"database connection pooling"的问题,它会找到你项目中的相关代码,结合传统正则表达式匹配与语义排序。一切都在你的机器上运行;你的代码永远不会离开它。
两者均为开源(Apache-2.0)。
ColGREP:语义代码搜索
ColGREP 是一个单一的 Rust 二进制文件——无需服务器、无需 API、无依赖。通过 Homebrew 或 shell 安装程序安装,然后:
colgrep init /path/to/project # 构建索引一次
colgrep "database connection pooling" # 搜索
索引在首次使用时自动构建,并在文件变化时增量更新。
两种搜索模式:
- 直接搜索 — 对代码库进行语义排序。你也可以将其与正则表达式结合:
colgrep -e "async.*await" "error handling"通过模式和含义缩小结果范围。 - 代理模式 —
colgrep --agent "where is the database connection pool configured"下载一个小型本地模型(一次性,2.5 GB),它像一个子代理一样工作:搜索、读取候选文件,并返回回答问题的确切行号。大型编码模型可以委托给它,节省自己的上下文窗口。
ColGREP 如何索引代码
- 解析 — Tree-sitter 将你的代码解析为函数、方法、类。
- 结构化 — 每个代码单元被转换为结构化文本:签名、参数、调用、文档字符串、代码体。
- 嵌入 — 一个小型模型(
lightonai/LateOn-Code-edge,1700 万参数)将该结构化文本转换为每个代码单元的多个向量(多向量嵌入)。在 CPU 上运行。 - 索引 — NextPlaid 将这些向量存储在量化、内存映射的二进制索引中。
这种结构化表示比原始代码单独提供更丰富的信号给模型。
模型切换
你可以更换嵌入模型(colgrep set-model、--model 标志、colgrep status 查看索引是用什么构建的)。每个(项目,模型)对都有自己的索引,因此切换永远不会损坏现有索引。私有 HuggingFace 模型可通过 HF_TOKEN 使用。
代理集成
为 Claude Code(--install-claude-code)、OpenCode、Codex 和 Hermes 安装钩子。Claude 有完整的钩子支持;其他三个目前是基本的。
基准测试
在 Semble 公共代码搜索基准(1,251 个查询 × 63 个仓库 × 19 种语言)上,ColGREP 使用 LateOn-Code 模型得分 NDCG@10 = 0.859,使用较小的 edge 模型得分为 0.846——略优于之前的模型(semble potion-code-16M 为 0.853)。
为什么使用多向量?
传统向量搜索将整个文档压缩为一个嵌入——一种有损摘要。这对代码来说效果不佳,因为单个函数有名称、参数、文档字符串、控制流和依赖关系。
多向量搜索为每个文档保留约 300 个维度为 128 的嵌入。在查询时,每个查询标记在所有文档标记中找到其最佳匹配(一种称为 MaxSim 的技术)。权衡——更多存储——正是 NextPlaid 通过量化和内存映射索引解决的问题。
NextPlaid:底层引擎
NextPlaid 是一个通用的、本地优先的多向量数据库,带有 REST API。特性:
- 内置编码 — 发送原始文本,获得结果;无需单独的推理服务器。它随附用于 ColBERT 模型的 ONNX Runtime。
- 内存映射索引 — 索引存在于磁盘上,按需分页加载,因此 RAM 占用保持较低。
- 乘积量化 — 2 位或 4 位压缩;一百万文档可放入内存。
- 增量更新 — 添加/删除文档无需重建。
- 元数据预过滤 — 内置 SQLite 存储上的 SQL
WHERE子句在评分之前运行,因此只有匹配的文档才会被评分。 - CPU 优化,可选 CUDA 支持。
与 FastPlaid 的关系: FastPlaid 是一个用于大型单次工作负载的 GPU 批量索引器。NextPlaid 将相同的算法包装在面向流式摄取和服务的生产 API 中。
快速开始:运行 Docker 容器(CPU 或 CUDA 镜像),然后使用 Python 客户端(pip install next-plaid-client)创建索引、添加文档、搜索、按元数据过滤和删除。Swagger UI 可在 http://localhost:8080/swagger-ui 使用。
API 基准测试
端到端测量,包括编码时间(模型在 API 内部运行)。设置:GTE-ModernColBERT-v1 在 NVIDIA H100 80GB 上,top_k=100。BEIR 数据集上的示例结果:
- quora(522,931 文档):NDCG@10 = 0.8519,索引速度 105 文档/秒,GPU 约 21 QPS,CPU 约 18 QPS。
- nfcorpus(3,633 文档):NDCG@10 = 0.3828,GPU 约 7 QPS。
- scifact(5,183 文档):NDCG@10 = 0.7593。
完整表格涵盖六个数据集,包含 MAP、NDCG@10/100、Recall@10/100、吞吐量和延迟百分位数。
模型
任何 HuggingFace ColBERT 风格模型都可以使用 pylate-onnx-export 导出为 ONNX 格式(默认 FP32 和 INT8 变体;INT8 约小 4 倍且更快,质量损失极小)。现成可用的模型:
| 模型 | 用途 |
|---|---|
lightonai/LateOn-Code-edge |
代码搜索,轻量级 |
lightonai/LateOn-Code |
代码搜索,准确 |
lightonai/mxbai-edge-colbert-v0-32m-onnx |
文本检索,轻量级 |
lightonai/answerai-colbert-small-v1-onnx |
文本检索,轻量级 |
lightonai/GTE-ModernColBERT-v1 |
文本检索,准确 |
结论
ColGREP 通过单个二进制文件将语义代码搜索带到你自己的机器上;NextPlaid 是其下的可重用多向量数据库。如果你需要批量 GPU 索引而不是流式服务,兄弟项目 FastPlaid 是替代方案。
相关
- 项目
- 项目
- 项目
- 项目
- 项目