本文来源于数据从业者全栈知识库,更多体系化内容请访问知识库。
为什么向量数据库突然火了?
在 大语言模型 时代,向量数据库成为了关键基础设施:
| 应用场景 | 为什么需要向量数据库 |
|---|---|
| RAG系统 | 检索与问题语义相关的文档 → 详见RAG |
| 推荐系统 | 找到与用户兴趣相似的内容 |
| 图片搜索 | 用”意思”而非标签找图片 |
| 相似检测 | 查重、抄袭检测、重复内容识别 |
| Agent记忆 | 为AI Agent提供长期记忆 → 详见Agent |
一、什么是向量和向量搜索?
1.1 从文字到向量
问题:计算机不理解文字的”意思”,只能做字符串匹配。
解决方案:把文字转换成一串数字(向量),让计算机能计算”意思相近程度”。
实际的向量通常有几百到几千维,由 深度学习模型 自动学习。
1.2 向量搜索的原理
graph LR
A[查询文本] --> B[向量化]
B --> C[查询向量]
C --> D[计算相似度]
E[文档库] --> F[向量化]
F --> G[向量索引]
G --> D
D --> H[返回最相似的结果]
核心步骤:
- 把查询文本转成向量
- 在向量库中找到最”接近”的向量
- 返回对应的原始内容
1.3 相似度计算方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 余弦相似度 | 计算两个向量的夹角 | 最常用,对长度不敏感 |
| 欧氏距离 | 计算空间中的直线距离 | 对绝对值敏感的场景 |
| 内积 | 向量点乘 | 已归一化的向量 |
二、Embedding:把万物变成向量
2.1 什么是Embedding?
Embedding = 把高维、离散的数据(文字、图片、音频)转换成低维、连续的向量表示。
graph TD
subgraph "输入"
A[文本]
B[图片]
C[音频]
end
subgraph "Embedding模型"
D[文本Embedding模型]
E[图像Embedding模型]
F[音频Embedding模型]
end
subgraph "输出向量"
G[768维向量]
H[512维向量]
I[256维向量]
end
A --> D --> G
B --> E --> H
C --> F --> I
2.2 文本Embedding模型
| 模型 | 维度 | 特点 | 推荐场景 |
|---|---|---|---|
| OpenAI text-embedding-3 | 1536/3072 | 效果最好,需付费 | 商业应用 |
| BGE-large-zh | 1024 | 中文效果优秀,开源 | 中文场景首选 |
| M3E-base | 768 | 中文优化,轻量 | 资源有限场景 |
| Cohere multilingual | 1024 | 多语言支持好 | 跨语言场景 |
| sentence-transformers | 384-768 | 开源、选择多 | 研究和实验 |
2.3 Embedding的质量评估
| 评估维度 | 说明 | 测试方法 |
|---|---|---|
| 语义相似度 | 意思相近的文本,向量是否接近 | 相似句子对测试 |
| 区分度 | 不同主题的文本,向量是否分开 | 聚类可视化 |
| 领域适配 | 在特定领域的表现 | 领域数据集测试 |
| 多语言 | 跨语言语义对齐 | 翻译对测试 |
三、向量数据库核心概念
3.1 为什么需要专门的向量数据库?
传统数据库可以存向量,但:
| 对比项 | 传统数据库存向量 | 专业向量数据库 |
|---|---|---|
| 搜索速度 | 慢(需遍历计算) | 快(专用索引) |
| 海量数据 | 性能急剧下降 | 设计支持亿级 |
| 内存优化 | 无针对性优化 | 向量压缩、分片 |
| 相似度查询 | 需自己实现 | 原生支持 |
3.2 核心概念
| 概念 | 说明 | 类比传统数据库 |
|---|---|---|
| Collection | 向量的集合 | 表(Table) |
| Vector | 存储的向量数据 | 行(Row) |
| Dimension | 向量的维度 | 列的数量 |
| Index | 加速搜索的索引结构 | 索引(Index) |
| Metadata | 向量附带的属性信息 | 字段(Column) |
3.3 向量索引类型
不同的索引在速度、精度、内存之间做权衡:
| 索引类型 | 原理 | 特点 | 适用场景 |
|---|---|---|---|
| Flat | 暴力搜索,无索引 | 100%精确,最慢 | 小数据集、对精度要求极高 |
| IVF | 先聚类,再在簇内搜索 | 速度快,精度略降 | 通用场景 |
| HNSW | 构建多层图结构 | 速度快,内存大 | 高性能需求 |
| PQ | 向量压缩后搜索 | 节省内存,精度降 | 超大规模、内存受限 |
四、主流向量数据库对比
4.1 对比总览
| 数据库 | 类型 | 特点 | 适合场景 |
|---|---|---|---|
| Milvus | 开源/云 | 分布式、功能全面、性能强 | 大规模生产环境 |
| Pinecone | 云托管 | 全托管、易用、稳定 | 快速上手、中小规模 |
| Chroma | 开源 | 轻量、嵌入式、易集成 | 开发测试、小项目 |
| Weaviate | 开源/云 | 支持混合搜索、GraphQL | 需要关键词+语义 |
| Qdrant | 开源/云 | Rust实现、性能好 | 性能敏感场景 |
| Faiss | 库 | Facebook出品、纯算法库 | 嵌入现有系统 |
| pgvector | 扩展 | PostgreSQL扩展 | 已有PG生态 |
4.2 选择决策树
graph TD
A[选择向量数据库] --> B{是否需要云托管?}
B -->|是| C{预算充足?}
C -->|是| D[Pinecone]
C -->|否| E[Milvus Cloud / Weaviate Cloud]
B -->|否| F{数据规模}
F -->|小<100万| G[Chroma / Faiss]
F -->|中100万-1亿| H[Milvus / Qdrant]
F -->|大>1亿| I[Milvus集群]
G --> J{是否需要持久化?}
J -->|是| K[Chroma]
J -->|否| L[Faiss]
4.3 各数据库详解
Milvus
优点:
- 分布式架构,支持水平扩展
- 多种索引类型可选
- 生态完善,文档丰富
- 支持混合搜索(向量+标量过滤)
缺点:
- 部署相对复杂
- 资源消耗较大
Pinecone
优点:
- 全托管,无需运维
- 开箱即用,API简洁
- 性能稳定
缺点:
- 费用较高
- 无法私有部署
- 定制性有限
Chroma
优点:
- 极其轻量,pip安装即用
- 嵌入式,无需单独部署
- 与LangChain等框架集成好
缺点:
- 大规模性能有限
- 功能相对简单
pgvector
优点:
- 直接利用现有PG
- SQL语法熟悉
- 事务支持
缺点:
- 大规模性能不如专业向量库
- 索引类型有限
五、语义搜索实践
5.1 语义搜索 vs 关键词搜索
| 对比维度 | 关键词搜索 | 语义搜索 |
|---|---|---|
| 原理 | 字符串匹配 | 向量相似度 |
| ”退款流程”能找到”退货步骤” | 不能 | 能 |
| 精确匹配 | 强 | 可能漏掉 |
| 同义词处理 | 需人工维护 | 自动理解 |
| 跨语言 | 不支持 | 天然支持 |
5.2 混合搜索策略
graph TD
A[用户查询] --> B[语义搜索]
A --> C[关键词搜索]
B --> D[语义结果Top50]
C --> E[关键词结果Top50]
D --> F[结果融合]
E --> F
F --> G[重排序]
G --> H[最终结果Top10]
结果融合方法:
| 方法 | 说明 | 适用场景 |
|---|---|---|
| 加权求和 | 语义分数×0.7 + 关键词分数×0.3 | 简单有效 |
| RRF | 倒数排名融合 | 不需要调参 |
| 交叉重排 | 用LLM或专用模型重新排序 | 追求最优效果 |
5.3 提升搜索效果的技巧
技巧一:优化文本切片
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 切片太大 | 检索不精准 | 缩小切片,300-500字 |
| 切片太小 | 信息不完整 | 加大切片,保持语义完整 |
| 边界切断关键信息 | 答案不完整 | 使用滑动窗口,保留重叠 |
技巧二:查询扩展
用户的查询往往不够”好”,可以:
| 技术 | 说明 |
|---|---|
| 同义词扩展 | ”退款” → “退款”、“退货”、“取消订单” |
| HyDE | 先让LLM生成假设答案,用答案搜索 |
| 多查询 | 将原问题改写成多个角度的查询 |
技巧三:元数据过滤
在向量搜索前/后,用元数据缩小范围:
| 场景 | 过滤条件 |
|---|---|
| 产品知识库 | 按产品类别过滤 |
| 文档问答 | 按时间范围过滤 |
| 多租户系统 | 按租户ID过滤 |
六、向量数据库的运维要点
6.1 数据管理
| 操作 | 注意事项 |
|---|---|
| 插入 | 批量插入比单条效率高得多 |
| 更新 | 通常需要先删后插 |
| 删除 | 考虑软删除,避免索引频繁重建 |
| 增量更新 | 设计好增量同步机制 |
6.2 性能优化
graph TD
A[性能优化方向] --> B[索引优化]
A --> C[查询优化]
A --> D[资源配置]
B --> B1[选择合适的索引类型]
B --> B2[调整索引参数]
B --> B3[定期重建索引]
C --> C1[合理设置Top-K]
C --> C2[使用元数据过滤]
C --> C3[批量查询]
D --> D1[内存配置]
D --> D2[CPU/GPU资源]
D --> D3[分片策略]
6.3 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 搜索结果不准 | Embedding模型不合适 | 换用更好的模型 |
| 搜索太慢 | 索引配置不当 | 调整索引参数或类型 |
| 内存不足 | 数据量太大 | 使用PQ压缩或分片 |
| 结果不稳定 | 相似度阈值设置不当 | 调整阈值或增加结果数量 |
七、应用案例
7.1 RAG知识库问答
graph LR
A[用户问题] --> B[向量化]
B --> C[向量数据库检索]
C --> D[获取相关文档]
D --> E[构建Prompt]
E --> F[LLM生成答案]
向量数据库在RAG中的作用:
- 存储文档切片的向量
- 快速检索语义相关内容
- 支持元数据过滤(按来源、时间等)
7.2 智能推荐系统
| 推荐类型 | 向量来源 | 应用 |
|---|---|---|
| 相似商品 | 商品描述的向量 | ”猜你喜欢” |
| 相似内容 | 文章/视频的向量 | 内容推荐 |
| 相似用户 | 用户行为的向量 | 协同过滤 |
7.3 图片搜索
graph TD
A[图片库] --> B[图像Embedding模型]
B --> C[图片向量]
C --> D[向量数据库]
E[查询图片/文本] --> F[向量化]
F --> G[相似度搜索]
D --> G
G --> H[返回相似图片]
7.4 重复检测与去重
| 场景 | 应用 |
|---|---|
| 内容去重 | 新闻聚合、论坛帖子去重 |
| 抄袭检测 | 论文查重、代码相似度 |
| 数据清洗 | 识别重复记录 |
八、本章小结
选型速查表
| 场景 | 推荐选择 |
|---|---|
| 快速原型/小项目 | Chroma |
| 生产环境/中等规模 | Milvus Lite 或 Qdrant |
| 大规模/企业级 | Milvus集群 |
| 不想运维 | Pinecone |
| 已有PostgreSQL | pgvector |
| 需要最高性能 | Milvus + GPU |
本文节选自数据从业者全栈知识库。知识库包含 2300+ 篇体系化技术文档,覆盖数据分析、数据工程、数据治理、AI 等全栈领域。了解更多 ->