返回 AI大模型从0到1——理论与实操

C2-03 向量数据库


回顾RAG两阶段

向量数据库

如果文档有几百万条,每次都逐一计算余弦距离效率太低。向量数据库专门为此设计了高效的索引和检索算法(如 HNSW、IVF)。

主流向量数据库对比

数据库 特点 适合场景
Chroma 本地轻量,易上手 学习、开发原型
FAISS Meta 开源,速度快 高性能本地检索
Milvus 开源,生产级 大规模生产环境
Pinecone 云端托管 无需运维的云服务
PGVector PostgreSQL 插件 已有 PG 的项目

关键概念澄清

  1. 向量数据库本身不生成向量——向量是由 Embedding 模型产生的

  2. 向量数据库和关系型数据库是互补的,不是替代关系;向量数据库可以通过metadata进行数据过滤。

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 先执行:pip install chromadb
# Chroma 向量数据库基本使用
import chromadb
from chromadb.utils import embedding_functions

# 创建客户端(持久化到磁盘)
chroma_client = chromadb.PersistentClient(path="./chroma_db")

# 创建集合(类似关系数据库的「表」)
collection = chroma_client.get_or_create_collection(
    name="my_knowledge_base",
    metadata={"description": "测试知识库"}
)

# 添加文档
collection.add(
    # 不用默认embedding模型时取消注释并编写get_embeddings函数
    # embeddings = get_embeddings(documents, model="text-embedding-3-small"),
    documents=[
        "人工智能是计算机科学的一个分支",
        "机器学习是人工智能的子集",
        "深度学习使用神经网络进行学习"
    ],
    ids=["doc1", "doc2", "doc3"]
)

# 向量检索
results = collection.query(
    query_texts=["什么是人工智能?"],
    n_results=2
)
print(results["documents"])

输出:

C:\Users\nianh\.cache\chroma\onnx_models\all-MiniLM-L6-v2\onnx.tar.gz: 100%|█| 79.3

[['人工智能是计算机科学的一个分支', '机器学习是人工智能的子集']]

📌 Chroma向量数据库内置了embedding模型all-MiniLM-L6-v2(来自 Sentence Transformers),开箱即用,不过中文效果较差,生产环境要换好一点的embedding模型,见注释代码

🍞 数据库

所有的数据库的核心能力就是数据的增、删、改、查,向量数据库也不例外