graph TB
A[向量数据库] --> B[向量存储]
A --> C[向量索引]
A --> D[相似度搜索]
A --> E[元数据管理]
B --> B1[高维向量 如768维、1536维]
C --> C2[快速检索 索引算法]
D --> D3[余弦相似度 欧氏距离 点积]
E --> E4[关联信息 过滤查询]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
style E fill:#ffccff
1. 向量(Vector)
定义:由多个数值组成的一维数组,表示对象在向量空间中的位置
维度:向量的长度,通常为 128、256、512、768、1536 等
示例:[0.1, 0.2, -0.3, 0.4, ...](768 维)
2. 嵌入(Embedding)
定义:将文本、图像等数据转换为向量的过程
特点:语义相似的向量在空间中距离较近
应用:文本嵌入、图像嵌入、多模态嵌入
3. 相似度搜索(Similarity Search)
flowchart TD
A[查询向量] --> B[向量数据库]
B --> C[计算相似度]
C --> D[排序结果]
D --> E[返回Top-K]
F[相似度度量] --> G[余弦相似度]
F --> H[欧氏距离]
F --> I[点积]
F --> J[内积]
style A fill:#ffcccc
style E fill:#ccffcc
向量数据库的特点
1. 高维向量支持
支持数百到数千维的向量
高效处理大规模向量数据
内存和磁盘优化
2. 快速相似度搜索
graph TB
A[传统数据库] --> B[精确匹配]
B --> C[线性搜索 O(n)]
D[向量数据库] --> E[相似度搜索]
E --> F[索引加速 O(log n)]
style A fill:#ffcccc
style C fill:#ffcccc
style D fill:#ccffcc
style F fill:#ccffcc
使用索引算法加速搜索
支持近似最近邻(ANN)搜索
查询延迟通常在毫秒级
3. 元数据过滤
graph TB
A[向量查询] --> B[相似度搜索]
A --> C[元数据过滤]
B --> D[结果集]
C --> D
D --> E[最终结果]
style A fill:#ffcccc
style E fill:#ccffcc
支持结构化元数据
可以结合向量搜索和元数据过滤
灵活的组合查询
4. 可扩展性
支持水平扩展
分布式架构
高可用性
向量数据库的应用场景
1. RAG(检索增强生成)
graph TB
A[用户问题] --> B[文本嵌入]
B --> C[向量数据库]
C --> D[相似度搜索]
D --> E[检索相关文档]
E --> F[LLM生成回答]
style A fill:#ffcccc
style F fill:#ccffcc
应用:
知识库问答
文档检索
智能客服
2. 推荐系统
graph TB
A[用户行为] --> B[用户向量]
B --> C[向量数据库]
C --> D[相似度搜索]
D --> E[推荐相似用户/物品]
style A fill:#ffcccc
style E fill:#ccffcc
应用:
商品推荐
内容推荐
用户相似度匹配
3. 图像搜索
sequenceDiagram
participant User as 用户
participant System as 系统
participant Embedding as 嵌入模型
participant VectorDB as 向量数据库
User->>System: 上传图片
System->>Embedding: 图像向量化
Embedding-->>System: 图像向量
System->>VectorDB: 相似度搜索
VectorDB-->>System: 相似图片
System-->>User: 返回结果
应用:
以图搜图
相似图片推荐
图像分类
4. 语义搜索
graph TB
A[搜索查询] --> B[查询向量化]
B --> C[向量数据库]
C --> D[语义相似度搜索]
D --> E[相关文档]
style A fill:#ffcccc
style E fill:#ccffcc
应用:
语义文档搜索
代码搜索
知识图谱查询
向量数据库 vs 传统数据库
特性
传统数据库
向量数据库
数据类型
结构化数据
高维向量
查询方式
SQL 精确匹配
相似度搜索
索引方式
B-tree, Hash
向量索引(HNSW, IVF)
适用场景
事务处理
相似度检索
查询性能
精确匹配快
相似度搜索快
向量数据库搭建
主流向量数据库
1. 产品对比
graph TB
A[向量数据库] --> B[开源产品]
A --> C[商业产品]
A --> D[云服务]
B --> B1[Chroma 简单易用]
B --> B2[Milvus 功能强大]
B --> B3[Qdrant 性能优秀]
B --> B4[Weaviate 多模态]
B --> B5[FAISS Facebook]
C --> C1[Pinecone 托管服务]
C --> C2[Zilliz Cloud Milvus云版]
D --> D1[Azure AI Search]
D --> D2[Google Vertex AI]
D --> D3[AWS Bedrock]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
style D fill:#ffffcc
graph TB
A[向量索引] --> B[精确索引]
A --> C[近似索引]
B --> B1[暴力搜索 Linear Scan]
C --> C1[基于树]
C --> C2[基于哈希]
C --> C3[基于图]
C --> C4[基于量化]
C1 --> C11[KD-Tree Ball Tree]
C2 --> C22[LSH Locality Sensitive Hashing]
C3 --> C33[HNSW Hierarchical NSW]
C4 --> C44[IVF Product Quantization]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
2. 常用索引算法
HNSW (Hierarchical Navigable Small World)
graph TB
A[HNSW索引] --> B[多层图结构]
B --> C[上层: 快速导航]
B --> D[下层: 精确搜索]
C --> E[少量节点 长距离连接]
D --> F[大量节点 短距离连接]
G[搜索流程] --> H[从顶层开始]
H --> I[逐层向下]
I --> J[底层精确搜索]
style A fill:#ffcccc
style J fill:#ccffcc
特点:
基于图的索引
支持快速近似搜索
适合高维向量
查询复杂度:O(log n)
适用场景:
大规模向量搜索
高维向量
实时查询
IVF (Inverted File Index)
graph TB
A[IVF索引] --> B[向量聚类]
B --> C[创建倒排列表]
C --> D[查询时]
D --> E[找到最近聚类]
E --> F[在聚类内搜索]
style A fill:#ffcccc
style F fill:#ccffcc
特点:
基于聚类的索引
需要训练阶段
查询速度快
内存占用相对较小
适用场景:
大规模数据集
批量查询
内存受限场景
LSH (Locality Sensitive Hashing)
graph TB
A[LSH索引] --> B[哈希函数]
B --> C[相似向量 相同哈希值]
C --> D[哈希表存储]
D --> E[快速查找]
style A fill:#ffcccc
style E fill:#ccffcc
特点:
基于哈希的索引
概率性保证
适合高维稀疏向量
查询速度快
适用场景:
高维稀疏向量
快速近似搜索
内存受限
索引选择指南
flowchart TD
A[选择索引] --> B{数据规模}
B -->|小规模 < 1M| C[HNSW 或暴力搜索]
B -->|中等规模 1M-10M| D{查询延迟要求}
B -->|大规模 > 10M| E[IVF + PQ]
D -->|低延迟| F[HNSW]
D -->|可接受延迟| G[IVF]
A --> H{向量维度}
H -->|低维 < 100| I[KD-Tree]
H -->|高维 > 100| J[HNSW/IVF]
style A fill:#ffcccc
style C fill:#ccffcc
style F fill:#ccffcc
style J fill:#ccffcc
print("查询结果:") for hits in results: for hit in hits: print(f"ID: {hit.id}, 距离: {hit.distance}") print(f"文本: {hit.entity.get('text')}") print(f"来源: {hit.entity.get('source')}")
graph TB
A[向量维度选择] --> B{应用场景}
B -->|文本嵌入| C[768维 BERT/BGE]
B -->|图像嵌入| D[512-2048维]
B -->|多模态| E[1024-4096维]
F[考虑因素] --> G[精度要求]
F --> H[存储成本]
F --> I[查询速度]
style A fill:#ffcccc
style C fill:#ccffcc
建议:
文本嵌入:通常 768 或 1536 维
图像嵌入:512-2048 维
平衡精度和性能
2. 索引参数调优
graph TB
A[索引调优] --> B[HNSW参数]
A --> C[IVF参数]
B --> B1[M: 连接数 影响精度和速度]
B --> B2[ef_construction: 构建时搜索范围]
B --> B3[ef_search: 查询时搜索范围]
C --> C1[nlist: 聚类数量]
C --> C2[nprobe: 搜索聚类数]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccccff
HNSW 参数:
M: 每个节点的连接数(通常 16-64)
ef_construction: 构建时的搜索范围(通常 200-400)
ef_search: 查询时的搜索范围(通常 50-200)
IVF 参数:
nlist: 聚类数量(通常 1024-16384)
nprobe: 搜索时检查的聚类数(通常 10-256)
3. 数据预处理
flowchart TD
A[原始数据] --> B[数据清洗]
B --> C[文本分块]
C --> D[向量化]
D --> E[向量归一化]
E --> F[存储到向量数据库]
style A fill:#ffcccc
style F fill:#ccffcc
建议:
清洗无关内容
合理分块(通常 500-1000 字符)
向量归一化(对于余弦相似度)
添加有意义的元数据
4. 查询优化
graph TB
A[查询优化] --> B[限制结果数量]
A --> C[使用过滤]
A --> D[批量查询]
A --> E[缓存结果]
B --> B1[只返回需要的Top-K]
C --> C2[元数据过滤减少搜索空间]
D --> D3[一次查询多个向量]
E --> E4[缓存常用查询]
style A fill:#ffcccc
style B fill:#ccffcc
style C fill:#ccffcc
style D fill:#ccffcc
style E fill:#ccffcc