侧边栏壁纸
  • 累计撰写 56 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

ChromaDB 为何使用 SQLite 持久化

温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

ChromaDB 为何使用 SQLite 持久化

ChromaDB 选择 SQLite 作为底层持久化引擎,是一个经过深思熟虑的架构决策。核心原因是 “小即是美”——在保持零依赖部署的同时获得足够的持久化能力。

核心原因

1. 零运维依赖(Embeddable Database)

传统向量数据库架构:
  应用 → 网络 → 独立数据库服务进程 → 磁盘

ChromaDB + SQLite 架构:
  应用 → ChromaDB 库(内嵌 SQLite)→ 磁盘
  • SQLite 是嵌入式数据库,编译进 ChromaDB 的二进制/包中,不需要用户安装任何数据库服务
  • 对比 Qdrant/Weaviate/Pinecone 等需要独立部署服务,ChromaDB 做到了 pip install chromadb 即可使用
  • 这与 LlamaIndex 默认内存向量库的设计哲学一致:让开发者快速上手

2. 单文件存储,便于分发

# ChromaDB 的持久化目录结构
chroma_data/
└── chroma.sqlite3    # 一个文件包含所有数据:元数据、文档、向量
  • 所有数据存入一个 .sqlite3 文件,备份、迁移、分享都极其方便
  • 对于 RAG 项目,可以直接将知识库打包分发

3. SQLite 在 ChromaDB 中的角色

ChromaDB 的存储架构分为两层:

存储层 引擎 存储内容
元数据层 SQLite collection 信息、文档 ID、metadata(JSON)、embedding 元信息
向量层 自定义(基于 NumPy/HNSW) 实际的 embedding 浮点向量

SQLite 不存储向量本身,只存储:

┌──────────────────────────────────┐
│          chroma.sqlite3          │
├──────────────────────────────────┤
│  • collections 表                │
│    - id, name, metadata(json)    │
│                                  │
│  • embeddings 表(元数据部分)     │
│    - id, segment_id              │
│    - embedding_id (指向向量文件)   │
│    - document (文本内容)          │
│    - metadata (JSON 字段)        │
│                                  │
│  • segments 表                   │
│    - 向量分片的元信息             │
└──────────────────────────────────┘

向量数据本身存在独立的二进制文件中(通常是 Parquet 或自定义格式),SQLite 只负责索引和组织这些数据。

4. 为什么不用其他方案

方案 为什么不选
MySQL/PostgreSQL 需要独立部署,违背"零配置"原则
纯文件系统 缺乏事务支持、并发控制、索引能力
LevelDB/RocksDB 嵌入式 KV 存储,不支持复杂查询(metadata 过滤)
DuckDB 分析型场景优秀,但 OLTP 不如 SQLite
JSON 文件 数据量大时读写性能差,不支持并发

5. SQLite 的具体优势

# ChromaDB 利用 SQLite 的能力示例
client = chromadb.PersistentClient(path="./chroma_db")

collection = client.get_or_create_collection("my_collection")

# 1. 元数据过滤 — SQLite 的 WHERE 查询能力
results = collection.query(
    query_embeddings=[query_vec],
    n_results=5,
    where={"source": "供热手册", "year": {"$gte": 2023}}  # → 转为 SQL 查询
)

# 2. 事务安全 — SQLite 的 ACID 特性
# 批量插入时,要么全部成功,要么全部回滚

# 3. 并发读取 — SQLite 的 WAL 模式
# 支持多读单写,满足 RAG 场景的并发需求

ChromaDB 的数据流

写入流程:
  doc → embedding → 向量写入 Parquet → 元数据写入 SQLite → 构建 HNSW 索引

查询流程:
  query → embedding → HNSW 近似搜索 → SQLite 查元数据 → 返回结果

总结

ChromaDB 用 SQLite 的本质是一个经典的关注点分离设计:

SQLite 管"簿记"(谁是谁、属于哪个集合、有什么标签),HNSW + Parquet 管"找人"(向量相似度搜索)。

这也是 ChromaDB 能成为轻量级向量数据库标杆的原因——用最少的依赖,提供最完整的向量检索体验。对于本项目的供热知识库场景,这种设计意味着你可以用一个 pip install 和一个目录就完成从开发到生产的全部部署。

0

评论区