本文来源于数据从业者全栈知识库,更多体系化内容请访问知识库。
学习目标
- 理解 Embedding 的本质与 ANN 算法的工程原理
- 掌握主流向量数据库的技术差异与选型逻辑
- 深入理解 Naive RAG 的局限与 Advanced RAG 的改进方向
- 掌握企业知识库的工程实践:数据处理、质量管理、增量更新
- 明确数据工程师在 RAG 系统中的核心职责
核心洞察RAG 不是一个模型问题,而是一个数据工程问题。决定 RAG 系统质量的 80% 因素来自数据侧:文档切割策略、Embedding 质量、数据清洗程度、检索排序逻辑。大模型只是最后的”答题者”,前面所有的工程工作决定了它能看到什么题目材料。
一、Embedding 的本质:把语义变成数字
1.1 从词袋模型到语义向量
传统搜索用关键词匹配——“苹果手机”搜不到”iPhone”的结果,因为字面上不相似。Embedding 技术的突破在于:把语义相似的内容映射到向量空间中相近的位置。
graph LR
A["原始文本/图片/音频"] --> B["Embedding模型<br/>BERT/E5/BGE/CLIP"]
B --> C["高维向量<br/>如 1536维的浮点数组"]
C --> D["向量空间<br/>语义相近 = 距离相近"]
subgraph "向量空间示意"
E["苹果 iPhone"]
F["Apple手机"]
G["手机评测"]
H["水果苹果"]
E --- F
F --- G
H
end
相似度度量方式:
| 方法 | 公式理解 | 适用场景 |
|---|---|---|
| 余弦相似度 | 两个向量夹角的余弦值,范围 [-1, 1] | 文本语义相似性,最常用 |
| 内积(Dot Product) | 向量点积,与向量模长相关 | 归一化向量时等价余弦,OpenAI 推荐 |
| L2 欧氏距离 | 向量空间中的直线距离 | 图像检索,对量纲敏感 |
1.2 主流 Embedding 模型选型
| 模型 | 维度 | 特点 | 适用场景 |
|---|---|---|---|
| OpenAI text-embedding-3-large | 3072 | 效果最佳,付费 API | 预算充裕,对效果要求高 |
| BGE-M3 (BAAI) | 1024 | 开源最佳,支持中文,多语言 | 中文企业知识库首选 |
| E5-mistral-7b | 4096 | 指令微调,效果优秀 | 英文场景,GPU资源充足 |
| M3E-base | 768 | 中文专用,轻量级 | 中文场景,资源受限 |
| Nomic-embed-text | 768 | 完全开源,可商用 | 开源替代方案 |
选型原则中文场景优先选 BGE 系列(北京智源研究院出品),MTEB 中文排行榜持续领先。不要盲目追求高维度,768 维对大多数企业应用完全够用,更高维度带来的收益递减但存储和计算成本线性增加。
二、ANN 算法:向量检索的工程核心
2.1 为什么不能用暴力搜索
假设知识库有 100 万条文档,每条 Embedding 是 768 维的 float32:
- 存储:768 × 4 bytes × 1,000,000 ≈ 3GB(还算可以)
- 暴力检索:每次查询需要计算 100 万次余弦相似度,每次约需 3~10ms,完全不可用
近似最近邻(ANN, Approximate Nearest Neighbor) 算法通过牺牲极小精度换取巨大的速度提升。
2.2 三种主流 ANN 算法
HNSW(Hierarchical Navigable Small World)
HNSW 是目前工业界最广泛使用的算法,类似”高速公路 + 省道 + 小路”的多层导航结构:
- 最顶层:稀疏长程连接,快速定位大致区域
- 底层:密集短程连接,精确找到最近邻
- 查询复杂度:O(log N),几乎不随数据规模增长
- 缺点:构建索引时内存消耗大(约原始数据的 4~8 倍)
IVF-PQ(Inverted File Index + Product Quantization)
- IVF:先把向量空间聚类为 K 个簇,查询时只搜索最近的几个簇
- PQ:把高维向量压缩编码,大幅减少内存占用(通常 8~32 倍压缩)
- 适合:数据量超过千万,内存有限,可接受略低的召回率
FAISS(Facebook AI Similarity Search)
- Meta 开源的向量检索库,包含多种 ANN 算法实现
- 优势:GPU 加速支持,超大规模检索(亿级)
- 定位:算法库而非完整数据库,常作为 Milvus 等向量数据库的底层
2.3 精度与速度的权衡
graph LR
A["暴力搜索<br/>Brute Force"] --> B{"精度 100%<br/>速度极慢"}
C["IVF-Flat"] --> D{"精度 95%+<br/>速度快 10-100x"}
E["HNSW"] --> F{"精度 95%+<br/>速度快 100-1000x"}
G["IVF-PQ"] --> H{"精度 85-95%<br/>速度极快<br/>内存最省"}
subgraph "工程选择"
B
D
F
H
end
三、主流向量数据库对比
3.1 全景对比
| 维度 | Milvus | Pinecone | Weaviate | Chroma | pgvector |
|---|---|---|---|---|---|
| 类型 | 开源自托管 | 全托管云服务 | 开源自托管 | 开源嵌入式 | PostgreSQL扩展 |
| 规模上限 | 亿级+ | 亿级(付费) | 亿级 | 百万级 | 千万级 |
| 混合检索 | 支持(标量过滤) | 支持(Metadata过滤) | 强(BM25+向量融合) | 有限 | 支持(SQL过滤) |
| 部署复杂度 | 高(依赖etcd/minio/kafka) | 零运维 | 中等 | 极低(嵌入式) | 低(PostgreSQL插件) |
| 成本 | 开源免费,运维成本高 | 按用量付费,较贵 | 开源免费 | 开源免费 | 开源免费 |
| 最适场景 | 大规模生产,有运维能力 | 快速上线,预算充裕 | 知识图谱+向量混合 | 原型开发,本地应用 | 已有PG,数据量适中 |
中国企业的额外选项国内还有 Zilliz Cloud(Milvus 的商业化版本,Milvus 作者团队出品)、腾讯云 VectorDB、阿里云 DashVector 等选项,在合规性和访问速度上有优势。
3.2 向量数据库 vs 传统数据库的定位差异
这是一个常见的认知误区:向量数据库不是来”替代”传统数据库的,它们解决的是完全不同的问题。
| 对比维度 | 传统数据库(MySQL/ES) | 向量数据库(Milvus/Pinecone) |
|---|---|---|
| 查询方式 | 精确匹配、模糊匹配 | 语义相似性检索 |
| 擅长问题 | ”查询年龄=25的用户" | "找和这段描述意思相近的文档” |
| 索引结构 | B-Tree、倒排索引 | HNSW、IVF-PQ |
| 存储单元 | 结构化行列数据 | 高维浮点向量 |
| 事务支持 | 强ACID保证 | 通常不支持复杂事务 |
实际生产中,向量数据库往往与传统数据库配合使用:向量数据库做语义检索,传统数据库存储结构化元数据,通过 ID 关联。
四、RAG 架构深度解析
4.1 Naive RAG 的工作流程与局限
Naive RAG 是最基础的实现,理解其局限是进阶的前提:
sequenceDiagram
participant U as 用户
participant R as 检索层
participant V as 向量数据库
participant L as 大模型
U->>R: 原始问题
R->>R: 问题向量化 (Embedding)
R->>V: TopK 检索 (默认K=3~5)
V-->>R: 返回相似文档片段
R->>L: 拼接 Prompt = 问题 + 检索结果
L-->>U: 生成回答
Naive RAG 的三大痛点:
- 召回率问题:用户问”如何申请差旅报销?“但文档里写的是”出差费用报销流程”,语义相近但词汇不同,向量检索可能召回不准
- 上下文窗口限制:检索到的片段可能缺少关键的上下文,大模型看到的是碎片化信息
- 无法处理多跳推理:当问题需要综合多个文档的信息才能回答时,简单 TopK 检索效果很差
4.2 Advanced RAG 的改进策略
改进方向一:查询优化(Query Enhancement)
HyDE(Hypothetical Document Embeddings): 先让大模型根据问题”假设”生成一段理想答案,再用这段假设答案去检索,而不是直接用原始问题检索。因为答案的语义空间与文档更接近。
def hyde_retrieval(question: str, llm, vector_store, k: int = 5): # Step 1: 让LLM生成假设文档 hyde_prompt = f"""请根据以下问题,生成一段可能的答案文档(不需要完全准确,只需要语义相近):
问题:{question}
假设答案:"""
hypothetical_doc = llm.generate(hyde_prompt)
# Step 2: 用假设文档做检索(而不是用原始问题) results = vector_store.similarity_search(hypothetical_doc, k=k) return results 本文作者:Elazer (石头)
原文链接:https://ss-data.cc/posts/kb-vector-db-rag
版权声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。