2、向量检索基础:向量、嵌入(Embedding)、向量空间、距离度量(欧氏距离、余弦相似度、内积)的概念与数学直觉
在进入 Milvus 的架构与调优之前,我们必须先建立对向量检索底层逻辑的直觉。向量检索的本质是“将非结构化数据转化为高维空间中的坐标,然后通过数学运算衡量坐标之间的远近”。这一章将围绕四个核心概念展开:向量(Vector)、嵌入(Embedding)、向量空间(Vector Space)以及三种最常用的距离度量(欧氏距离、余弦相似度、内积)。理解这些概念不仅有助于你正确选择 Milvus 中的索引类型和相似度参数,更决定了你在处理文本、图像、音频等数据时能否设计出合理的检索方案。
2.1 向量与嵌入:从非结构化数据到数学坐标
核心原理
向量(Vector)在数学上是一组有序的数值,在几何上可以理解为高维空间中的一个点或一条从原点出发的有向线段。在 Milvus 中,一条向量通常以浮点数组的形式存在,例如 [0.12, -0.45, 0.78, ...]。向量的维度(Dimension)决定了空间的复杂度,常见的有 128 维、256 维、768 维甚至更高。维度越高,表达能力越强,但计算和存储成本也随之上升。
嵌入(Embedding)是向量在机器学习语境下的具体称呼。它指的是通过神经网络模型(如 BERT、ResNet、Word2Vec)将原始数据映射到连续向量空间的过程。嵌入的核心价值在于:语义相近的数据在向量空间中的距离更近。例如,“猫”和“狗”的嵌入向量距离较近,而“猫”和“汽车”的距离较远。这种性质使得向量检索能够实现“语义搜索”,而不仅仅是关键词匹配。
判断方法或操作流程
在实际项目中,选择嵌入模型时需要考虑以下因素:
- 数据模态:文本使用 Sentence-BERT、 Embedding;图像使用 CLIP、ResNet 特征层;多模态使用 CLIP 或 ImageBind。
- 向量维度:维度越高,精度越高但检索越慢。Milvus 中建议将维度控制在 1024 以内以保证性能。
- 归一化:如果后续使用余弦相似度或内积,通常需要对向量进行 L2 归一化,使模长为 1。
案例拆解:文本搜索场景
假设我们要构建一个法律文档检索系统。原始数据是 10 万份 PDF 合同。我们使用 Sentence-BERT 将每份合同的关键段落转换为 384 维向量。具体流程如下:
- 对 PDF 进行 OCR 和段落切分,每段不超过 512 个 。
- 调用嵌入模型,将每个段落转换为 384 维向量。
- 将向量和原始文本 ID 一起插入 Milvus,同时将文本内容存储在 MySQL 中。
- 查询时,将用户的问题同样转换为 384 维向量,在 Milvus 中执行 Top-10 搜索。
结果:系统能够找到“违约金计算方式”相关的段落,即使查询词是“赔偿金比例”,也能通过语义关联召回正确文档。
常见误区或总结复盘
- 误区一:认为向量维度越高越好。实际上,高维度会导致“维度灾难”,使得距离区分度下降,且索引构建时间显著增加。
- 误区二:忽略嵌入模型的更新。如果模型版本升级,新旧向量不能混用,需要重新生成全部向量。
- 误区三:不进行归一化。当使用余弦相似度时,未归一化的向量会导致计算结果错误。
2.2 向量空间与距离度量:数学直觉与选择策略
核心原理
向量空间是一个高维坐标系,每个向量对应空间中的一个点。向量检索的核心任务就是在这个空间中快速找到与查询点最近的 K 个点。距离度量定义了“远近”的数学标准。Milvus 支持三种主流度量方式:
| 度量方式 | 公式 | 数学直觉 | 适用场景 |
|---|---|---|---|
| 欧氏距离(L2) | √(Σ(xi - yi)²) | 两点之间的直线距离,值越小越相似 | 图像特征、数值型数据 |
| 余弦相似度 | Σ(xi·yi) / (|x|·|y|) | 向量方向的一致性,忽略模长,值越大越相似 | 文本、语义搜索 |
| 内积(IP) | Σ(xi·yi) | 同时考虑方向和模长,值越大越相似 | 推荐系统、个性化排序 |
判断方法或操作流程
选择距离度量时,可以遵循以下决策路径:
- 检查嵌入模型是否已归一化:如果向量模长为 1,则欧氏距离和余弦相似度在排序结果上等价(因为 |x - y|² = 2 - 2·cosθ)。此时优先选择余弦相似度,因为它对数值范围不敏感。
- 考虑业务语义:文本检索通常关注“方向”而非“长度”,因此余弦相似度更合适。推荐系统需要同时考虑用户偏好强度和物品特征,内积更合适。
- Milvus 参数设置:在创建 Collection 时,通过
metric_type参数指定,可选值为L2、COSINE、IP。
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection
# 定义字段
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]
schema = CollectionSchema(fields, description="法律文档向量")
collection = Collection(name="legal_docs", schema=schema, metric_type="COSINE")
案例拆解:图像检索中的度量选择
假设我们构建一个商品图像检索系统,使用 ResNet50 提取 2048 维特征。初始阶段我们使用欧氏距离,但发现检索结果中经常出现亮度不同但内容相似的商品被漏掉。分析原因:ResNet 特征对光照敏感,导致同一商品在不同光照下的向量模长差异较大,欧氏距离放大了这种差异。
解决方案:对特征进行 L2 归一化,并改用余弦相似度。修改后,检索准确率从 78% 提升至 91%。代价是归一化增加了少量预处理时间(每张图约 0.2ms),但整体检索性能不受影响。
常见误区或总结复盘
- 误区一:混淆“相似度”和“距离”的排序方向。欧氏距离越小越相似,余弦相似度和内积越大越相似。在 Milvus 中,
L2返回距离升序,COSINE和IP返回分数降序。 - 误区二:忽略数值溢出。当向量维度很高时,内积计算可能导致浮点溢出,建议使用归一化向量。
- 误区三:认为三种度量可以随意互换。实际上,如果业务逻辑依赖模长信息(如用户活跃度),使用余弦相似度会丢失这部分信息。
metric_type 不能修改。如果后续发现度量选择错误,只能删除 Collection 并重建。因此,在项目初期务必通过小规模实验验证度量方式的合理性。
2.3 距离度量的数学直觉与业务映射
核心原理
欧氏距离的直觉是“空间中的直线距离”,适合数据点在空间中均匀分布的场景。余弦相似度的直觉是“方向的一致性”,它只关心两个向量是否指向同一方向,而不关心模长。内积的直觉是“投影长度”,它同时考虑方向和模长,适合需要区分“强度”的场景。
为了更直观地理解,我们可以想象一个二维空间:
- 点 A (1, 0) 和点 B (0, 1):欧氏距离为 √2,余弦相似度为 0(正交),内积为 0。
- 点 A (1, 0) 和点 C (2, 0):欧氏距离为 1,余弦相似度为 1(同向),内积为 2。
从这个例子可以看出,余弦相似度认为 A 和 C 完全相似(方向相同),而内积认为 C 比 A 更“强”。
判断方法或操作流程
在实际业务中,可以通过以下问题来辅助决策:
| 业务问题 | 推荐度量 | 原因 |
|---|---|---|
| “这两个文档是否讨论同一主题?” | 余弦相似度 | 主题相关性只与方向有关 |
| “这两张图片是否包含相同物体?” | 欧氏距离 | 图像特征对模长敏感 |
| “这个用户对哪个物品偏好更强?” | 内积 | 需要同时考虑用户向量和物品向量的模长 |
案例拆解:推荐系统中的内积应用
在短视频推荐中,我们使用内积作为度量。用户向量表示兴趣偏好,视频向量表示内容特征。内积值越大,表示用户对该视频的偏好程度越高。具体实现中,我们将用户向量和视频向量都归一化到模长为 1 的球面上,此时内积等价于余弦相似度,但保留了排序一致性。通过这种方式,我们实现了每秒 10 万次查询的实时推荐服务。
常见误区或总结复盘
- 误区一:在未归一化的情况下直接比较内积和余弦相似度的数值。两者量纲不同,不能直接对比。
- 误区二:忽略度量选择对索引类型的影响。例如,HNSW 索引在 L2 和 IP 下表现良好,但 COSINE 需要额外处理。
- 误区三:认为距离度量是万能的。实际上,嵌入模型的质量对检索效果的影响远大于度量选择。一个差的嵌入模型,无论用什么度量都无法得到好的结果。