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 如何索引代码

  1. 解析 — Tree-sitter 将你的代码解析为函数、方法、类。
  2. 结构化 — 每个代码单元被转换为结构化文本:签名、参数、调用、文档字符串、代码体。
  3. 嵌入 — 一个小型模型(lightonai/LateOn-Code-edge,1700 万参数)将该结构化文本转换为每个代码单元的多个向量(多向量嵌入)。在 CPU 上运行。
  4. 索引 — 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 是替代方案。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目