基本概念:
- 嵌入(Embeddings):文本、图像或其他数据的数值向量表示,能够捕捉语义信息。
- 向量搜索(Vector search):在数据库中找到与查询向量最相似的向量的过程。
- 应用场景:RAG系统、搜索引擎、内容推荐、异常检测。
ChromaDB
ChromaDB 是一个开源向量数据库,专为在 AI 应用程序中轻松使用而构建,特别适用于 RAG(检索增强生成)流程。
主要特点
- 高级、对开发者友好的 API。
- 在集合(collections)中存储向量和元数据。
- 支持在搜索过程中进行元数据过滤。
- 内置持久化功能(使用 DuckDB + Parquet 进行本地存储)。
- 易于与 LangChain 等 LLM 框架集成。
应用场景示例:
- 拥有 50,000 个带有元数据(标题、作者、日期)的文档,并希望根据用户查询检索相关内容块,同时提供过滤选项。
Faiss
FAISS(Facebook AI Similarity Search)是由 Meta 开发的一个底层库,用于在大规模向量数据集上进行快速相似性搜索。
主要特点
- 针对速度和可扩展性进行了优化。
支持多种索引策略:
- Flat Index(Flat Index,精确搜索,准确度最高)
- IVF(倒排文件索引)适用于大型数据集
- HNSW 适用于动态插入
- PQ/OPQ 用于压缩
- GPU 加速,可处理数百万至数十亿的向量。
- 最小化的元数据处理(需要单独的存储系统来管理元数据)。
应用场景示例
- 拥有 2 亿个图像嵌入向量,需要在 GPU 加速下实现亚秒级检索时间。
使用选择
ChromaDB 最适合:
- 小到中等规模的数据集(最多几百万个向量)。
- 需要元数据过滤的 RAG 系统。
- 快速原型开发和最小可行产品(MVP)。
- 希望即插即用持久化功能的开发者。
FAISS 最适合:
- 大规模数据集(从数千万到数十亿个向量)。
- 对延迟要求严格的应用程序。
- 可以从 GPU 加速中受益的工作负载。
- 需要针对性能/内存权衡进行自定义索引调优的场景。
| 数据集大小 | 推荐工具 | 说明 |
|---|---|---|
| < 1万条向量 | ChromaDB 或 FAISS (Flat) | 简单性是关键。 |
| 1万 – 20万条向量 | ChromaDB | 适合带元数据的 RAG 应用。 |
| 20万 – 1000万条向量 | FAISS (HNSW 或 IVF) | 追求更高速度和可扩展性。 |
| 1000万+条向量 | FAISS 配合 GPU / 分布式部署 | 侧重性能调优。 |
代码段
ChromaDB
from chromadb import Client
from chromadb.config import Settings
client = Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="./chroma_db"
))
collection = client.create_collection("my_docs")
collection.add(
documents=["Text 1", "Text 2"],
metadatas=[{"source": "a"}, {"source": "b"}],
ids=["id1", "id2"]
)
results = collection.query(
query_texts=["sample query"],
n_results=3,
where={"source": "a"}
)
print(results)Faiss
import faiss
import numpy as np
d = 768 # vector dimension
n = 10000
xb = np.random.random((n, d)).astype('float32')
xq = np.random.random((5, d)).astype('float32')
index = faiss.IndexFlatL2(d) # exact search
index.add(xb)
D, I = index.search(xq, k=5)
print(I, D)