嵌入向量与向量数据库:AI时代的语义搜索革命
一、嵌入向量(Embedding Vector)
定义
嵌入向量是将 高维数据(如文本、图像、音频)映射到 低维连续向量空间 的表示方式。每个向量捕捉数据的语义信息,使得相似的数据在向量空间中距离更近,不相似的数据距离更远。
例如:
将轿车、轮船、飞机、自行车等交通工具定义成嵌入向量存储。
如果定义了三个维度:能否在陆地上运行、能否飞、能跑的多快等等。
那么以上几个交通工具定义的向量可以是:
轿车(1,0,5)
轮船(0,0,3)
飞机(1,1,10)
自行车(1,0,1)
如果相距的距离越近,我们可以认为他们越相似,实际生产过程中。使用的向量维度一般在1024维左右。
生成方法
- 预训练模型:
-
- 文本:BERT、Word2Vec、Sentence-BERT 等模型将文本转换为向量。
- 图像:ResNet、CLIP 等模型提取图像特征。
- 音频:Wav2Vec2、OpenAI Whisper 等模型生成音频向量。
- 自定义模型:
-
- 通过微调预训练模型或训练自定义神经网络生成特定领域的嵌入向量(如医学文献嵌入)。
- 传统方法:
-
- 词袋模型(Bag-of-Words)、TF-IDF 等(适用于简单场景,效果有限)。
特点
- 低维稠密:例如,文本嵌入向量维度通常为 768~1024。
- 语义相似性:通过余弦相似度或欧几里得距离衡量相似性。
- 可扩展性:适用于大规模数据(如亿级文档库)。
应用场景
场景 | 示例 |
相似性搜索 | 在商品库中搜索与用户查询最相似的商品。 |
聚类分析 | 对用户行为日志进行聚类,发现兴趣群体。 |
推荐系统 | 根据用户历史行为向量推荐相似内容。 |
异常检测 | 通过向量距离检测异常数据点。 |
二、向量数据库(Vector Database)
定义
向量数据库是专门 存储和查询嵌入向量 的数据库,支持高效相似性搜索(如 k-近邻搜索)。相比传统数据库,它优化了高维向量的索引和检索效率。
核心功能
- 相似性搜索:
-
- 支持 近似最近邻搜索(Approximate Nearest Neighbor, ANN),例如 Faiss、Annoy 等算法。
- 查询时返回与目标向量最接近的 K 个结果(如搜索“猫”的图片时返回相似图片)。
- 高效索引:
-
- 使用 HNSW(Hierarchical Navigable Small World)或 IVF-PQ(Inverted File with Product Quantization)等算法加速搜索。
- 大规模存储:
-
- 支持 PB 级向量数据的存储和实时检索(如 Milvus、Pinecone、Weaviate)。
- 混合查询:
-
- 结合向量相似性和传统属性过滤(如“红色且价格低于 100 元的商品”)。
主流工具
数据库 | 特点 |
Pinecone | 云原生,支持实时向量搜索和自动扩展。 |
Faiss | Facebook 开源,适合本地部署,支持多种索引类型(HNSW、IVF-PQ)。 |
Milvus | 开源,支持向量与元数据关联,适用于推荐系统、图像检索。 |
Weaviate | 支持 GraphQL 接口,集成 AI 模型生成嵌入向量。 |
三、嵌入向量与向量数据库的关系
- 流程示例:
-
- 文本 → 嵌入模型(如 BERT)→ 向量数据库 → 相似性搜索。
- 图像 → 嵌入模型(如 ResNet)→ 向量数据库 → 相似图像检索。
- 典型应用场景
-
- 搜索引擎:Google 的语义搜索(用户输入“苹果”,返回水果和公司相关内容)。
- 推荐系统:Netflix 根据用户观看记录向量推荐相似电影。
- 知识图谱:将实体和关系嵌入向量,加速图谱查询。
四、技术挑战与解决方案
挑战 | 解决方案 |
高维计算复杂度 | 使用 ANN 算法(如 HNSW、IVF-PQ)降低搜索时间。 |
数据动态更新 | 支持 增量更新 和 实时写入(如 Milvus 的 |
多模态融合 | 存储和检索文本、图像、音频的混合向量(如 CLIP 模型生成图文对齐向量)。 |
隐私与安全 | 加密存储、访问控制(如 Pinecone 的 IAM 管理)。 |
五、示例代码(使用 Faiss + BERT)
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np# 1. 生成嵌入向量
model = SentenceTransformer('all-MiniLM-L6-v2')
vectors = model.encode(["苹果", "香蕉", "iPhone"]) # 3 个 384 维向量# 2. 构建 Faiss 索引
dimension = 384
index = faiss.IndexFlatL2(dimension) # 使用 L2 距离
index.add(vectors) # 添加向量到索引# 3. 相似性搜索
query_vector = model.encode("水果") # 用户查询
distances, indices = index.search(np.array([query_vector]), k=2) # 返回最相似的 2 个结果
print(indices) # 输出 [0, 1]("苹果" 和 "香蕉")
六、实际案例
案例 1:电商商品推荐
- 流程:
-
- 将商品描述生成嵌入向量。
- 使用向量数据库存储所有商品向量。
- 用户搜索“运动鞋”时,生成查询向量并检索相似商品。
案例 2:图像检索
- 流程:
-
- 使用 ResNet 提取图像特征。
- 将特征向量存入向量数据库。
- 用户上传一张图片,检索相似图像(如 Pinterest 的“视觉搜索”)。
七、总结
概念 | 核心价值 | 典型工具 |
嵌入向量 | 将数据转化为可计算的语义表示 | BERT、ResNet、CLIP |
向量数据库 | 高效存储和检索海量向量数据 | Faiss、Pinecone、Milvus |
嵌入向量与向量数据库的结合是 AI 应用的核心基础设施,尤其在大规模语义搜索、推荐系统和多模态任务中不可或缺。