开篇:做 RAG 应用,向量数据库动辄几十上百 GB,云服务费用一个月小几千。有个开源项目挺有意思,反着来——不存向量,只存关系图,6000 万文档只要 6GB。
先说痛点
去年给公司搭 RAG 系统,踩了不少坑:
-
云服务贵:Pinecone 免费额度用完,一个月账单 200 刀起 -
本地吃资源:试过 Milvus,100 万文档就要 30 多 GB,服务器内存直接吃满 -
数据出不去:金融客户要求数据不能上云,但本地机器配置有限
后来发现 LEANN 这个项目,思路挺特别。

怎么做到的?
常规方案 vs LEANN
常规做法:
文档 → 转成向量 → 全存硬盘 → 搜索时直接查
存储:201GB(6000 万文档)
LEANN 做法:
文档 → 建图索引 → 压缩关系 → 搜索时现算
存储:6GB(6000 万文档)
具体实现:
-
存图不存向量:用 CSR 格式存文档之间的关系,类似社交网络的好友关系图 -
砍掉冗余连接:保留重要节点,删掉多余的边(有点像 PageRank 的思路) -
两步搜索:
-
先在图里快速找候选文档 -
再临时算这些候选的向量做精排

为啥能省这么多空间?
其实很简单:用户搜索只看前几条结果。
-
比如搜索只要前 10 条 -
图结构先筛出 100 个候选 -
只算这 100 个的向量就行,不用全存
边缘设备特别适合这个方案——硬盘小但 CPU 够用。
实际用起来怎么样
场景 1:本地文档搜索
from leann import LEANN
# 建索引
index = LEANN(backend="hnsw", dim=768)
index.build(documents)
# 搜索
results = index.search("分布式事务怎么做", top_k=5)
实测:
-
10 万份技术文档 -
占用 1.2GB(之前用 Qdrant 要 40GB) -
查询 500ms 左右 -
前 3 条准确率 92%
场景 2:接入 Claude Code
配置成 MCP 服务器,给 Claude Code 加个语义搜索:
{
"mcpServers": {
"leann": {
"command": "python -m leann.mcp",
"env": {"INDEX_PATH": "./codebase"}
}
}
}
比 grep 关键词搜索聪明多了,能理解你想找什么。
场景 3:企业内网部署
某金融公司的案例:
-
需求:6000 万份合同要能全文检索 -
限制:数据不能出内网,服务器内存 32GB -
方案:LEANN + DiskANN -
结果:索引 6GB,1 秒内出结果,过了安全审计
几个设计亮点

后端可以换
# 数据少用 HNSW(省内存)
index = LEANN(backend="hnsw")
# 数据多用 DiskANN(省硬盘)
index = LEANN(backend="diskann")
代码没改,换个参数就行。
支持增量更新
# 先建基础索引
index.build(initial_docs)
# 后面慢慢加
for new_batch in stream:
index.add(new_batch)
日志分析、监控这种持续写入的场景很方便。
完全离线跑
不用:
-
API Key -
网络 -
外部数据库
对隐私要求高的团队来说,这点挺重要。
性能对比
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
取舍:慢一点点,准确率低一点点,但省了 97% 空间,不用运维。
适不适合你?
适合:
-
个人知识库(Obsidian、Notion 增强) -
公司内网文档搜索 -
边缘设备 AI -
数据不能上云的场景
不适合:
-
要求毫秒级响应(广告推荐) -
高并发(QPS 上千) -
必须 99% 准确率
上手试试
pip install leann
# 五行代码搞定
from leann import LEANN
index = LEANN()
index.build(your_documents)
index.save("my_index")
results = index.search("查询内容")
云栈社区( https://yunpan.plus )有人把它接到 Logseq、Zotero 里了,本地搜索体验不错。想深入了解向量数据库原理,可以看看数据库与中间件这块的资料。
几点思考
LEANN 这个项目给了我一些启发:
-
不是啥都要上云:本地能跑就本地跑 -
资源可以换:存储换计算,网络换延迟,看场景 -
没有银弹:合适比完美重要
现在大模型本地化、隐私计算越来越火,这类项目的思路值得关注。如果你在搭云原生架构或者研究 RAG 落地,可以参考一下


