【免费下载链接】endee
Endee.io – A high-performance vector database, designed to handle up to 1B vectors on a single node, delivering significant performance gains through optimized indexing and execution. Also available in the cloud at https://endee.io and under the Endee Enterprise license. Free 30-day evaluation: https://docs.endee.io/v2/quick-start/enterprise
Endee是一款高性能开源向量数据库,专为 AI 搜索、RAG 与语义检索设计。它内置稀疏倒排索引,让你用一次请求同时提交稠密向量和稀疏向量,通过 RRF 融合输出混合搜索结果——这正是本文要讲透的 Endee Hybrid Search 实战流程。
什么是 Hybrid Search:为什么要混合稠密与稀疏?
单一检索方式各有盲区:
| 检索方式 | 擅长 | 短板 |
|---|---|---|
| 稠密向量(Dense) | 语义相似:"推荐一本像《三体》的书" | 对精确词、型号、代码符号不敏感 |
| 稀疏向量(Sparse) | 词级精确匹配:产品编号、报错信息、专业术语 | 不理解语义,同义改写会漏召回 |
混合搜索(Hybrid Search)把两者结合:稠密路召回"意思相近"的文档,稀疏路召回"用词命中"的文档,再融合排序。Endee 用 HNSW 索引跑稠密检索,用内置的分块倒排索引跑稀疏检索,最后用**加权 RRF(Reciprocal Rank Fusion)**合并两路结果。
Endee 稀疏倒排索引:3 个关键设计 🔍
稀疏引擎的源码文档在 docs/sparse.md,三个设计让它在亿级文档上依然快:
- 分块存储(Blocked Postings):文档按 65535 个一组分块,每个词项的倒排表按块拆开存放在 MDBX 键值库中。写入时只做"块内合并",而非整表重写,更新成本极低。
- 零拷贝流式扫描 + 剪枝:查询时游标逐块读取,绝不全量加载进内存;当某个词项的剩余上界不可能超过当前 Top-k 阈值时,直接跳过整段倒排表。
- 量化压缩 + SIMD:块内权重默认量化为
uint8_t,配合 AVX2/AVX512/NEON/SVE2 指令跳过已删除条目,进一步压缩内存与 CPU 开销。
核心实现在 src/sparse/inverted_index.cpp 与对外 API src/sparse/sparse_storage.hpp,两者在同一 MDBX 事务中原子更新,保证稠密/稀疏状态一致。
三步开启 Endee 混合搜索 🚀
第一步:创建支持稀疏的索引
创建索引时通过sparse_model参数开启稀疏能力,取值为None、default、endee_bm25:
curl -X POST http://localhost:8080/api/v1/index/create \ -H "Content-Type: application/json" \ -d '{ "index_name": "docs", "dim": 384, "space_type": "ip", "sparse_model": "endee_bm25" }'default:按向量点积打分endee_bm25:按 BM25 思想打分,适合文本场景None:纯稠密索引,不建倒排表
⚠️ 旧的
sparse_dim字段已废弃,服务端会直接返回 400 错误,请使用sparse_model。
第二步:写入稠密 + 稀疏混合数据
插入接口同时接受vector与sparse_indices/sparse_values(详见 src/core/ndd.hpp 中的HybridVectorObject):
curl -X POST http://localhost:8080/api/v1/index/docs/vector/insert \ -H "Content-Type: application/json" \ -d '{ "id": "doc-001", "meta": "{\"source\":\"faq\"}", "vector": [0.12, -0.45, 0.88], "sparse_indices": [42, 107, 882], "sparse_values": [1.0, 2.5, 0.6] }'sparse_indices是词项 ID 数组,sparse_values是对应权重(如 TF-IDF / BM25 权重),两数组长度必须一致。只给vector或只给稀疏字段也完全合法,稀疏部分是可选的。
第三步:一次请求执行混合搜索
同一个/search接口里同时传稠密和稀疏查询向量,就自动走混合融合流程:
curl -X POST http://localhost:8080/api/v1/index/docs/search \ -H "Content-Type: application/json" \ -d '{ "k": 10, "vector": [0.11, -0.44, 0.89], "sparse_indices": [42, 107], "sparse_values": [1.0, 2.2], "dense_rrf_weight": 0.5, "filter": "[{\"source\":{\"$eq\":\"faq\"}}]" }'融合参数怎么调:RRF 的两个旋钮 🎛️
当两路都有结果时,Endee 使用加权 RRF 合并(融合逻辑见 src/core/ndd.hpp):
文档得分 = Σ 每路权重 / (rrf_rank_constant + 该路排名)| 参数 | 默认值 | 作用 |
|---|---|---|
dense_rrf_weight | 0.5 | 稠密路权重(0~1),稀疏路权重自动取1 - dense_rrf_weight |
rrf_rank_constant | 60 | 平滑常数,越大则排名靠后的文档失分越慢 |
k | 必填 | 返回数量,范围 1~4096 |
ef | 可选 | 稠密侧 HNSW 搜索精度,调大提升召回 |
调参经验:
- 通用 RAG 场景:保持默认 0.5 / 0.5,均衡语义与词项命中
- 搜索"型号、SKU、报错串"为主:把
dense_rrf_weight调到 0.2~0.3,让稀疏路主导 - 纯语义问答(改写多的场景):调到 0.7~0.8
- 融合分对排名不敏感时,可把
rrf_rank_constant降到 20~30,拉开头部差距
另外,稠密、稀疏、filter 三者可以任意组合:只传vector即稠密搜索,只传sparse_indices即稀疏搜索,再加filter就是带元数据过滤的混合搜索,过滤语法见 docs/filter.md。
生产实践建议 ✅
- 稀疏向量离线生成:用 BM25 / SPLADE 等模型在入库时把文档转成
(term_id, weight)对,词表 ID 需与查询侧一致。 - 批量写入:插入接口支持 JSON 数组或
application/msgpack批量提交,比逐条写入快一个量级。 - 单节点容量:倒排库最大可开到 1TB,配合 docs/rebuild.md 的重建流程和 docs/backup-system.md 的备份能力,可支撑十亿级向量在单节点运行。
- 本地快速验证:
./install.sh --release --avx2 && ./run.sh即可在localhost:8080起服务,完整步骤见 docs/getting-started.md。
小结
Endee 的混合搜索把"稠密语义召回 + 稀疏倒排精确命中 + RRF 融合"封装进了同一个 HTTP 接口:建索引时指定sparse_model,写入时带上sparse_indices/sparse_values,查询时调好dense_rrf_weight,即可得到相关性显著提升的 Hybrid Search 结果。稀疏引擎的分块倒排、零拷贝剪枝与 SIMD 优化让这条路径在大规模数据下依然低延迟,是 RAG 与 AI 搜索场景的实用组合拳。
【免费下载链接】endee
Endee.io – A high-performance vector database, designed to handle up to 1B vectors on a single node, delivering significant performance gains through optimized indexing and execution. Also available in the cloud at https://endee.io and under the Endee Enterprise license. Free 30-day evaluation: https://docs.endee.io/v2/quick-start/enterprise
相关推荐
LlamaIndex BGEM3Index 实战指南:用 BGE-M3 构建稠密+稀疏+多向量混合检索索引
LlamaIndex BGEM3Index 实战指南:用 BGE M3 构建稠密+稀疏+多向量混合检索索引 本篇指南以 LlamaIndex 的 BGEM3In
人工智能RAG大模型GBrain 混合检索(Hybrid Retrieval)原理与源码实现:稠密向量 × 稀疏关键词的融合召回
GBrain 混合检索(Hybrid Retrieval)原理与源码实现:稠密向量 × 稀疏关键词的融合召回 混合检索(hybrid retrieval)是一种
人工智能RAGAgent 记忆MCP 服务知识管理如何用 PandasAI 让数据支持自然语言提问
如何用 PandasAI 让数据支持自然语言提问 运营同事想要一个"各地区平均营收"的数字,你要么现写一段 pandas 代码,要么等数据组排期。PandasA
人工智能大模型RAG数据分析数据可视化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考