第十七章:知识库与向量数据库
学习目标
- 理解知识库的类型和建设流程
- 掌握向量搜索的原理和优势
- 了解常见向量数据库的特点和适用场景
- 能够使用Chroma构建简单的向量数据库
前置要求
建议先学习第十四章:向量与Embedding,了解向量、Embedding和相似度计算的基本概念。
什么是知识库?
知识库是有组织地存储和管理知识的系统,为AI应用提供可靠的信息来源。在AI系统中,知识库是RAG、Agent等应用的基础设施。
为什么需要知识库?
LLM的知识来自训练数据,存在时效性差(无法获取最新信息)、领域知识不足(缺乏专业领域深度知识)、无法引用来源(回答无法追溯出处)等问题。知识库为AI提供了可靠、可更新、可追溯的外部知识来源。
知识库的类型
| 类型 | 存储方式 | 检索方式 | 适用场景 |
|---|---|---|---|
| 结构化知识库 | 关系数据库(SQL)、知识图谱 | 精确查询(SQL、SPARQL) | 需要精确查询的结构化数据 |
| 非结构化知识库 | 文档、网页、PDF | 全文搜索、向量搜索 | 文档问答、知识检索 |
| 向量知识库 | 向量数据库 | 向量相似度搜索 | RAG系统、语义搜索 |
| 混合知识库 | 多种存储方式组合 | 多路召回、融合排序 | 复杂企业级应用 |
知识库建设流程
数据收集
收集文档、网页、数据库等各类数据源
数据清洗
去除噪声、格式统一、质量检查
数据处理
文档切分、向量化、建立索引
存储入库
将处理后的数据存入向量数据库
检索应用
通过检索接口为AI应用提供知识服务
向量数据库详解
向量数据库是专门用于存储和检索高维向量的数据库。它通过向量相似度搜索(而非精确匹配)来找到语义相关的内容。
传统搜索 vs 向量搜索
| 维度 | 传统关键词搜索 | 向量语义搜索 |
|---|---|---|
| 匹配方式 | 精确关键词匹配 | 语义相似度匹配 |
| 理解能力 | 不理解语义,只看字面 | 理解语义,能匹配同义词 |
| 查询示例 | "机器学习"只能匹配含"机器学习"的文档 | "机器学习"也能匹配含"AI训练"、"模型训练"的文档 |
| 跨语言 | 不支持 | 多语言模型可支持 |
| 速度 | 极快(倒排索引) | 快(近似最近邻算法) |
向量搜索的优势
- 语义理解:能匹配含义相近的内容,而非仅字面匹配
- 容错性强:对拼写错误、表述方式变化不敏感
- 跨模态:可以实现图文互搜(图片向量与文本向量在同一空间)
- 个性化:可以结合用户偏好向量进行个性化推荐
常见向量数据库
- Chroma:轻量级、Python友好、适合开发和小规模应用
- Milvus:分布式、高性能、适合大规模生产环境
- Pinecone:全托管云服务、无需运维
- Weaviate:支持混合搜索(向量+关键词)
- Qdrant:Rust编写、高性能、支持复杂过滤
- FAISS:Meta开源的向量检索库(非完整数据库)
向量检索流程
向量化查询
将用户查询文本转换为Embedding向量
相似度计算
计算查询向量与数据库中所有向量的相似度
排序筛选
按相似度排序,返回Top-K个最相关的结果
返回结果
返回对应的原始文档内容和元数据
使用Chroma构建向量数据库
import chromadb
from chromadb.utils import embedding_functions
# 1. 创建Chroma客户端
client = chromadb.PersistentClient(path="./my_chroma_db")
# 2. 初始化Embedding函数
embedding_fn = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="BAAI/bge-small-zh-v1.5"
)
# 3. 创建集合(相当于一张表)
collection = client.get_or_create_collection(
name="ai_knowledge_base",
embedding_function=embedding_fn,
metadata={"description": "AI学习笔记知识库"}
)
# 4. 添加文档
documents = [
"机器学习是人工智能的一个分支,通过数据训练模型来学习规律。",
"深度学习使用多层神经网络来学习数据的复杂表示。",
"自然语言处理(NLP)让计算机能够理解和生成人类语言。",
"计算机视觉让机器能够理解和处理图像和视频数据。",
"强化学习通过奖励和惩罚机制来训练智能体做出最优决策。"
]
collection.add(
documents=documents,
ids=["doc1", "doc2", "doc3", "doc4", "doc5"],
metadatas=[
{"category": "ML", "chapter": 4},
{"category": "DL", "chapter": 5},
{"category": "NLP", "chapter": 11},
{"category": "CV", "chapter": 9},
{"category": "RL", "chapter": 4}
]
)
print(f"已添加 {collection.count()} 条文档")
# 5. 向量搜索
results = collection.query(
query_texts=["如何让计算机理解人类语言?"],
n_results=3
)
print("\n搜索结果:")
for i, (doc, distance, metadata) in enumerate(zip(
results["documents"][0],
results["distances"][0],
results["metadatas"][0]
)):
print(f"\n[{i+1}] 相似度距离: {distance:.4f}")
print(f" 分类: {metadata['category']}")
print(f" 内容: {doc}")
# 6. 带条件过滤的搜索
filtered_results = collection.query(
query_texts=["学习方法"],
n_results=2,
where={"category": "ML"}
)
本章小结
- 知识库是有组织地存储和管理知识的系统,分为结构化、非结构化、向量和混合四种类型,是AI应用的重要基础设施。
- 向量数据库通过语义相似度搜索实现智能检索,相比传统关键词搜索,能理解语义、匹配同义词、容错性更强。
- 向量检索流程包括:向量化查询→相似度计算→排序筛选→返回结果,核心是Embedding模型和近似最近邻算法。
- Chroma是轻量级向量数据库,Python API友好,适合快速构建原型和小规模应用;大规模生产环境推荐使用Milvus。
练习题
-
向量搜索相比传统关键词搜索的最大优势是什么?
A. 搜索速度更快
B. 能理解语义,匹配含义相近的内容
C. 占用存储空间更小
D. 不需要建立索引答案:B。向量搜索通过Embedding将文本转换为向量,通过向量相似度来匹配语义相关的内容,即使字面不完全相同也能找到相关结果。
-
以下哪个向量数据库最适合大规模生产环境?
A. Chroma
B. FAISS
C. Milvus
D. 以上都不适合答案:C。Milvus是分布式架构的向量数据库,支持十亿级向量的高性能检索,最适合大规模生产环境。
-
向量检索的四个步骤中,第二步是什么?
A. 向量化查询
B. 相似度计算
C. 排序筛选
D. 返回结果答案:B。向量检索的四个步骤依次是:向量化查询→相似度计算→排序筛选→返回结果。