3. 核心概念

理解这三个概念,Chroma 就掌握了一半。

3.1 Collection(集合)

Collection 是 Chroma 中最核心的概念,类似 MySQL 中的"表"。
每个 Collection 存储一组相关的向量数据。

Chroma 实例
  ├── Collection: "产品文档"
  │     ├── 文档1的向量 + 原文 + 元数据
  │     ├── 文档2的向量 + 原文 + 元数据
  │     └── ...
  ├── Collection: "用户反馈"
  │     └── ...
  └── Collection: "代码库"
        └── ...

3.2 Document(文档)

Chroma 里的 "Document" 指的是一段文本块,而不是一个 PDF 或 Word 文件。在实际应用中,你通常会把一个长文档或一本书,切分成许多有意义的短文本块,每个文本块作为一个独立的 Document 存入 Chroma

每条存入 Chroma 的数据包含三个部分:

{
  // 1. ID:唯一标识,字符串,必须唯一
  id: "doc_001",

  // 2. 文本内容:原始文字,Chroma 会自动向量化(如果配置了 embedding 函数)
  // 真正想存储和搜索的原始文本内容
  document: "量子纠缠是两个粒子之间的神秘关联...",

  // 3. 元数据:任意键值对,用于过滤,不参与向量检索
  metadata: {
    source: "physics_textbook.pdf",
    page: 42,
    author: "张三",
    date: "2024-01-01",
  },

  // 4. 向量(可选):如果自己传向量就不需要 Chroma 帮你计算
  embedding: [0.12, -0.87, 0.43, ...]  // 通常由 Embedding 模型生成
}

最小可用示例 (只填必须的):

如果你想用最简单的方式添加数据(只提供 iddocuments,利用 Chroma 自动生成向量),代码如下:

await collection.add({
    ids: ["doc1", "doc2"],           // 必须,手动设置
    documents: ["文本A", "文本B"]     // 必须提供,否则没有内容可搜索(其实不提供也能插入)
    // embeddings 自动生成
    // metadata 可省略
});

理解元数据 (Metadata) :
metadata 是让 Chroma 从“向量搜索引擎”升级为“智能数据库”的关键。它让你能像用 SQL 一样,对搜索结果进行精确筛选。

  • 丰富的类型metadata 的值可以是字符串、数字、布尔值,甚至是这些类型的数组
  • 强大的过滤:你可以在查询时通过 where 参数,基于 metadata 进行过滤。
// 查询时,只返回 category 为 "core_concept" 的文档
const results = await collection.query({
    queryTexts: ["什么是向量数据库?"],
    nResults: 3,
    where: {
        "category": "core_concept" 
    }
});

3.3 距离函数

向量之间的"相似度"通过距离函数计算,Chroma 支持三种:

距离函数 说明 适用场景
cosine(余弦距离) 衡量方向相似性,忽略向量长度 文本检索首选,对文本长度不敏感
l2(欧氏距离) 衡量空间距离 图像特征向量
ip(内积) 点积,和余弦类似但考虑长度 已归一化的向量

文本 RAG 场景一律用 cosine,这是默认值。