向量(Vector) 类型
在现代机器学习和人工智能系统中,向量(Vector) 是表示数据的核心方式之一。不同的向量类型适用于不同的场景,尤其在模型推理、存储效率、计算性能等方面有显著差异。
一: 向量类型
在milvus向量数据库中,实现的向量类型有

- Binary Vector(二进制向量),
- Float Vector(浮点数向量)
- Float16 Vector(半精度浮点向量)
- BFloat16 Vector(脑浮点16位向量)
- Sparse Vector(稀疏向量)
- BM25(VarChar)
二: 数学计算原理
1️⃣ Binary Vector(二进制向量)
一句话
只用 0 和 1 表达特征:有 / 没有。
数学直觉
一个向量是:
v = [0, 1, 1, 0, 0, 1]
每一位只回答一个问题:
“这个特征存在吗?”
相似度通常用 汉明距离(Hamming Distance)
= 两个向量 不一样的位数
计算示意
A = 1 0 1 1 0
B = 1 1 0 1 0
↑ ↑ 不一样 2 位 → 距离 = 2
特点
-
✅ 极快、极省内存
-
❌ 信息极粗糙,没有“程度”
2️⃣ Float Vector(32 位浮点向量)
一句话
最标准的“AI 向量”,每一维都是一个实数。
数学直觉
v = [0.12, -0.87, 1.34, 0.55]
常用相似度:余弦相似度
cos(θ)=v⋅w∣v∣∣w∣\cos(\theta) = \frac{v \cdot w}{|v||w|}cos(θ)=∣v∣∣w∣v⋅w
图形直觉(重点)
w
/
/
θ ← 看角度,不看长度
/
----→ v
特点
-
✅ 表达能力最强(语义、语音、图像)
-
❌ 内存大、算力贵(4 字节 × 维度)
3️⃣ Float16 Vector(半精度浮点)
一句话
Float32 的“瘦身版”,精度减半,速度翻倍。
数学本质
-
数值还是实数
-
用 16 位表示(而不是 32 位)
Float32: 0.1234567 Float16: 0.1235 ← 精度变粗
特点
-
✅ 显存 / 内存减半
-
✅ GPU 友好
-
❌ 小数不准,极小数容易丢
4️⃣ BFloat16 Vector(Brain Float 16)
一句话
为“深度学习”定制的 16 位浮点,不追求小数,只保留数量级。
和 Float16 的关键区别(这是重点)
Float16 : 小数准,范围小 BFloat16 : 小数粗,范围大
直觉对比
1e-8 Float16 → 直接变 0 BFloat16 → 还能表示
特点
-
✅ 训练大模型更稳定
-
✅ Google / TPU / 新 GPU 常用
-
❌ 不适合高精度数值计算
5️⃣ Sparse Vector(稀疏向量)
一句话
“大部分是 0,只存不为 0 的那几维。”
数学形式
原始向量(假设 10 万维):
[0, 0, 0, 3.2, 0, 0, 1.1, 0, ...]
存储方式(索引 + 值):
{ 3: 3.2, 6: 1.1 }
图示
维度 → 1 2 3 4 5 6 7 8 值 → 0 0 0 5 0 2 0 0 ↑ ↑
特点
-
✅ 非常省内存
-
✅ 适合关键词、特征工程
-
❌ 维度爆炸时计算复杂
6️⃣ BM25 (VarChar)
这个严格来说不是向量模型,而是经典文本打分公式
但工程上常被“当成向量检索的一种”
一句话
“关键词匹配 + 词频 + 逆文档频率”的老牌王者。
核心思想
一个词:
-
在当前文档中 出现多 → 更重要
-
在全局文档中 很少见 → 更重要
简化公式直觉
score=TF×IDF×length_normscore = TF \times IDF \times length\_normscore=TF×IDF×length_norm
示例
查询:Java 向量 数据库 文档A:Java Java Java 文档B:Java 向量 数据库 → 文档B 分更高(覆盖更多关键词)
特点
-
✅ 可解释性极强
-
✅ 不需要训练
-
❌ 不懂“语义相近”

工程选型建议
-
向量数据库 / RAG / Embedding
→ Float32 / Float16 / BFloat16 -
大规模、高性能检索
→ Float16 / Binary -
关键词检索 + 可解释
→ BM25 + Sparse -
工业级最佳实践
→ BM25(召回) + 向量(排序)混合检索
如何选择?
- 需要高精度 + 通用性 → 使用
Float Vector - 追求性能与内存优化 → 使用
Float16或BFloat16 - 处理稀疏文本/特征 → 使用
Sparse Vector - 纯关键词匹配 → 使用
BM25(VarChar) - 极端压缩需求 → 使用
Binary Vector(但需牺牲语义)
更多推荐




所有评论(0)