向量数据库实现
此页面内容来自 DeepWiki 重组后的对应页面(来源:4-2.zh.md)
向量存储后端
相关源文件
本章引用的主要源码文件:
docs/MilvusConfigurationGuide.mdexamples/graph_visual_with_opensearch.pyexamples/lightrag_openai_opensearch_graph_demo.pyexamples/milvus_kwargs_configuration_demo.pyexamples/opensearch_storage_demo.pylightrag/kg/faiss_impl.pylightrag/kg/json_doc_status_impl.pylightrag/kg/json_kv_impl.pylightrag/kg/milvus_impl.pylightrag/kg/mongo_impl.pylightrag/kg/nano_vector_db_impl.pylightrag/kg/neo4j_impl.pylightrag/kg/networkx_impl.pylightrag/kg/opensearch_impl.pylightrag/kg/postgres_impl.pylightrag/kg/qdrant_impl.pylightrag/kg/redis_impl.pytests/test_dimension_mismatch.pytests/test_llm_cache_tools_opensearch.pytests/test_milvus_index_config.pytests/test_milvus_index_creation.pytests/test_milvus_kwargs_bridge.pytests/test_mongo_storage.pytests/test_no_model_suffix_safety.pytests/test_opensearch_storage.pytests/test_postgres_migration.pytests/test_qdrant_migration.pytests/test_unified_lock_safety.pytests/test_workspace_migration_isolation.py
LightRAG 采用可插拔的向量存储架构,将检索增强生成(RAG)引擎与具体数据库实现解耦。这使得用户可以在轻量级本地文件存储和企业级分布式向量数据库之间进行选择。所有后端都实现了 BaseVectorStorage 接口,为向量插入、相似性搜索和删除提供了统一的契约。
架构总览
LightRAG 中的向量存储主要用于三个命名空间:chunks(文本片段)、entities(知识图谱节点)和 relationships(知识图谱边)。每个后端通过工作空间前缀或集合后缀管理数据隔离,确保多个 LightRAG 实例可以共享同一个数据库集群而不会发生冲突。
向量存储接口
所有后端都必须实现 BaseVectorStorage 中定义的以下核心方法:
upsert(data: dict[str, dict[str, Any]]):嵌入文本内容并随元数据一起存储。query(query: str, top_k: int, query_embedding: list[float]):执行相似性搜索。delete(ids: list[str]):通过唯一标识符删除向量。
数据流图
下图展示了从自然语言输入到不同后端实现中向量嵌入存储的流程。
向量入库与检索流程
来源:lightrag/base.py:32-32, lightrag/kg/nano_vector_db_impl.py:26-26, lightrag/kg/milvus_impl.py:220-220, lightrag/kg/qdrant_impl.py:119-119, lightrag/kg/postgres_impl.py:143-143
支持的后端
1. NanoVectorDB(默认)
NanoVectorDBStorage 是默认的基于文件的后端,专为本地开发和中小型数据集设计。它在内部使用 nano-vectordb。
- 存储格式:数据以 JSON 文件形式持久化(例如
vdb_chunks.json),存储在working_dir中。lightrag/kg/nano_vector_db_impl.py:55-57 - 优化:在将向量编码为 Base64 进行存储之前,会使用
zlib压缩和Float16量化。lightrag/kg/nano_vector_db_impl.py:131-135 - 并发:通过共享内存实现
_storage_lock和storage_updated标志,以处理跨进程更新。lightrag/kg/nano_vector_db_impl.py:68-75
2. Milvus
Milvus 后端提供高性能、可扩展的向量搜索,并具有广泛的索引配置选项。
- 索引配置:支持
AUTOINDEX、HNSW、IVF_FLAT、DISKANN和SCANN。lightrag/kg/milvus_impl.py:24-35 - 量化:支持
HNSW_SQ,量化类型包括SQ8、BF16和FP16(需要 Milvus 2.6.8+)。lightrag/kg/milvus_impl.py:41-48 - 集合后缀:自动在集合名称后附加模型特定后缀(例如
_d768),以防止切换嵌入模型时出现维度不匹配。lightrag/kg/milvus_impl.py:270-275
3. Qdrant
Qdrant 实现专注于稳健的数据迁移和工作空间隔离。
- 工作空间隔离:使用
workspace_id载荷字段和models.KeywordIndexParams(is_tenant=True),确保在单个集合内实现高性能过滤。lightrag/kg/qdrant_impl.py:175-183 - 旧版迁移:具有复杂的
setup_collection方法,可以检测旧版 LightRAG 集合并自动将数据迁移到新模式。lightrag/kg/qdrant_impl.py:133-160
4. PostgreSQL(pgvector)
使用 pgvector 扩展在关系数据库中存储向量。
- 索引类型:支持
HNSW和IVFFlat。特别支持HNSW_HALFVEC以减少存储占用。lightrag/kg/postgres_impl.py:65-71 - 标识符安全性:包含
_safe_index_name工具函数,通过哈希长表名/索引名来处理 PostgreSQL 的 63 字节标识符限制。lightrag/kg/postgres_impl.py:74-104
5. OpenSearch
专为 OpenSearch 3.x+ 设计,使用 k-NN 插件。
- 分页:针对 3.3.0 及以上版本的集群,使用
_shard_doc实现高效的 PIT(时间点)分页。lightrag/kg/opensearch_impl.py:72-84 - 分片:可通过
OPENSEARCH_NUMBER_OF_SHARDS和OPENSEARCH_NUMBER_OF_REPLICAS进行配置。lightrag/kg/opensearch_impl.py:52-57
实现细节
向量插入逻辑
upsert 接口负责批处理文本内容,调用嵌入函数,然后将存储委托给特定后端。
upsert 的内部逻辑(以 NanoVectorDB 为例):
- 元数据准备:过滤输入数据,仅包含允许的
meta_fields。lightrag/kg/nano_vector_db_impl.py:108-115 - 批量嵌入:将内容拆分为由
embedding_batch_num定义的批次。lightrag/kg/nano_vector_db_impl.py:117-126 - 向量压缩:(后端特定)对生成的
numpy数组进行量化和压缩。lightrag/kg/nano_vector_db_impl.py:131-136 - 持久化:更新内部客户端,并将存储标记为已更新,以供其他进程使用。
lightrag/kg/nano_vector_db_impl.py:137-139
集合后缀生成
为防止在更改嵌入模型(通常会改变向量维度)时出错,Milvus 和 Qdrant 等企业级后端会生成动态集合名称。
| 后端 | 逻辑 | 示例 |
|---|---|---|
| Milvus | {workspace}_{namespace}_{model_suffix} | base_chunks_d1536 |
| PostgreSQL | {namespace}_{model_suffix}(表名) | chunks_d768 |
来源:lightrag/kg/milvus_impl.py:272-276, lightrag/kg/postgres_impl.py:260-265
存储生命周期与并发
LightRAG 使用协作锁定机制来管理跨多个进程的向量存储。
进程同步图
来源:lightrag/kg/shared_storage.py:11-14, lightrag/kg/nano_vector_db_impl.py:77-94, lightrag/kg/faiss_impl.py:83-97
关键函数与类
| 实体 | 文件路径 | 描述 |
|---|---|---|
BaseVectorStorage | lightrag/base.py | 所有向量后端的抽象基类。 |
MilvusIndexConfig | lightrag/kg/milvus_impl.py | HNSW/IVF 索引参数的数据类。 |
_safe_index_name | lightrag/kg/postgres_impl.py | 确保 PostgreSQL 标识符保持在 63 字节以内。 |
ClientManager | lightrag/kg/mongo_impl.py | 用于管理异步数据库客户端的单例。 |
get_data_init_lock | lightrag/kg/shared_storage.py | 全局锁,防止数据库初始化期间的竞态条件。 |
来源:lightrag/base.py:32, lightrag/kg/milvus_impl.py:75, lightrag/kg/postgres_impl.py:74, lightrag/kg/mongo_impl.py:44, lightrag/kg/shared_storage.py:40