在 Rust/WASM 中构建亚毫秒向量数据库
Source: Dev.to
概览
EdgeVec 是一个高性能向量数据库,完全在浏览器中通过 WebAssembly 运行。它实现了亚毫秒级的搜索时间,使得客户端的语义搜索、RAG(检索增强生成)和推荐在无需服务器的情况下成为可能。
性能
| 向量数量 | Float32 搜索 | 量化 (SQ8) 搜索 |
|---|---|---|
| 10 k | 203 µs | 88 µs |
| 50 k | 480 µs | 167 µs |
| 100 k | 572 µs | 329 µs |
这些延迟与服务器端方案相当,但完全在客户端运行。
实现细节
算法
EdgeVec 使用 层次化可导航小世界 (HNSW) 图,这正是 Weaviate、Qdrant 等生产级向量数据库所采用的算法。
量化
向量不再以 32 位浮点数存储(768 维 × 4 字节 ≈ 3 KB 每个向量),而是压缩为 8 位整数。这样可实现 3.6 倍的内存缩减,且对准确度的影响极小。
SIMD 优化
- 本地 (x86_64):AVX2 指令
- WebAssembly:在支持的情况下使用
simd128
Rust 的可移植 SIMD 用于向量化距离计算,提供了上表所示的亚毫秒查询时间。
构建体积
使用 wasm-pack 编译后,最终包的 gzip 大小仅为 148 KB,足以用于任何 Web 应用。
客户端向量搜索的适用场景
- 隐私 – 嵌入向量永不离开设备。
- 延迟 – 零网络往返。
- 离线 – 可在无网络环境下工作。
- 成本 – 消除服务器费用。
非常适合浏览器扩展、本地优先应用以及隐私保护的 RAG 流程。
使用示例
import init, { EdgeVec, EdgeVecConfig } from 'edgevec';
await init();
const config = new EdgeVecConfig(768);
const index = new EdgeVec(config);
// Insert a vector
index.insert(new Float32Array(768).fill(0.1));
// Perform a search
const results = index.search(query, 10);
// results: [{ id: 0, score: 0.0 }, ...]
资源
- GitHub:
- npm:
npm install edgevec
Alpha 版发布 – 欢迎反馈!