Embedding 核心概念

向量维度,到底在说什么?

从零开始理解 Embedding 维度——为什么 768 和 3072 不只是数字大小的区别,以及它如何影响你的 AI 应用。

01

Embedding 和维度是什么

Embedding 的本质很简单:把一段文本变成一组数字。这组数字叫做"向量",数字的个数就是"维度"。

输入
"猫喜欢鱼"
Embedding 模型
神经网络
输出向量
[0.23, -0.87, ...]
维度
= 数字个数

如果模型输出 768 个浮点数,我们就说这个 Embedding 是 768 维的。每个维度编码了一种语义特征——虽然这些特征是模型自动学到的,不是人工命名的。

为什么不直接用关键词?

关键词匹配是"字面对字面",而 Embedding 能理解语义。"如何养猫"和"猫咪饲养指南"关键词完全不同,但它们的向量在高维空间中非常接近——这就是语义搜索、RAG、推荐系统的基础。

维度就像描述一个人的维度

📏
1 个维度
只有身高 → 无法区分同样高的人
📐
3 个维度
身高 + 体重 + 年龄 → 好一些了
🧬
768 个维度
性格、爱好、技能… → 几乎能唯一描述一个人

Embedding 模型对文本做的事情和这一模一样:维度越高,能捕捉的语义细节就越丰富。

02

交互:感受维度的力量

拖动下面的滑块,从 1 维到 3 维,观察词语在空间中如何分布。维度越高,语义相近的词(同色)聚得越紧,语义不同的词离得越远。

2

核心启发

在真实的 Embedding 模型中,维度是 768 到 3072——远远超出人类能可视化的范围,但原理完全相同:更多维度 = 更多角度描述语义 = 更精准地区分细微差异。

03

主流模型维度对比

不同模型的维度选择差异很大。以下是 2026 年主流 Embedding 模型的关键参数:

模型 来源 维度 上下文 特点
text-embedding-3-small OpenAI 1536 8K 性价比首选,$0.02/M tokens
text-embedding-3-large OpenAI 3072 8K 最高精度,支持 MRL 降维
Gemini Embedding 001 Google 3072 8K MTEB 英文榜首,极低价格
Qwen3-Embedding-8B Alibaba 32–4096 32K 灵活维度,多语言冠军
BGE-M3 BAAI 1024 8K 开源,支持稠密+稀疏+多向量
Jina Embeddings v4 Jina AI 1024 8K 多模态,任务特定 LoRA
Voyage 3.5 Voyage AI 1024 32K 企业级语义搜索
Snowflake Arctic-Embed-L v2 Snowflake 32–1024 8K Apache 2.0,MRL 支持

维度不是越大越好

维度翻倍意味着存储翻倍、检索变慢。在 MTEB 基准测试中,OpenAI 的 3072 维模型仅比 1536 维高出约 2 分,但价格贵了 6.5 倍。选维度的本质是在精度和成本之间找平衡点。

04

代码实战:生成 Embedding

点击切换不同平台的 API 调用示例——从获取向量到计算相似度,几行代码搞定。

from openai import OpenAI client = OpenAI() # 生成 Embedding response = client.embeddings.create( model="text-embedding-3-small", # 1536 维 input="猫喜欢鱼" ) vector = response.data[0].embedding print(f"维度: {len(vector)}") # → 维度: 1536 print(vector[:5]) # → [0.023, -0.871, 0.445, ...] # 降低维度(MRL 特性) response_256 = client.embeddings.create( model="text-embedding-3-small", input="猫喜欢鱼", dimensions=256 # 只保留前 256 维 )
# 使用 Sentence Transformers 本地运行 Qwen3 from sentence_transformers import SentenceTransformer # 加载模型(首次会自动下载) model = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B") # 生成 Embedding sentences = ["猫喜欢鱼", "狗喜欢骨头", "Python 是编程语言"] embeddings = model.encode(sentences) print(f"shape: {embeddings.shape}") # → shape: (3, 1024) 即 3 个句子,每个 1024 维 # 指定维度(灵活维度特性) embeddings_256 = model.encode( sentences, output_dimensionality=256 # 可选 32~4096 )
import numpy as np def cosine_similarity(a, b): """余弦相似度:两个向量的夹角余弦值""" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 假设已获取三段文本的 Embedding vec_cat = get_embedding("猫喜欢鱼") vec_dog = get_embedding("狗喜欢骨头") vec_python = get_embedding("Python 是编程语言") print(cosine_similarity(vec_cat, vec_dog)) # → 0.87 ← 都是"动物+食物",语义很近 print(cosine_similarity(vec_cat, vec_python)) # → 0.12 ← 完全不同的话题,很远

余弦相似度 vs 欧几里得距离

Embedding 通常用余弦相似度衡量距离,因为它关注的是方向(语义)而非长度(数量)。值域 -1 到 1,越接近 1 越相似。

05

维度成本计算器

调整参数,实时看到不同维度选择对存储和成本的影响。

100K
1536
float32

实战建议

对于百万级文档,从 3072 维降到 1024 维可以节省约 67% 的存储,同时用 int8 量化再省 75%。许多场景下 1024 维 + int8 就能获得足够好的召回率。

06

进阶话题

掌握了基础后,这里有三个实际工程中经常遇到的进阶主题。

Matryoshka Representation Learning (MRL)

像俄罗斯套娃一样——模型在训练时就确保前 N 个维度本身就是一个有效的 Embedding。这意味着你可以在部署时自由截断维度,不需要重新训练。

3072 维
最高精度
1024 维
平衡之选
256 维
高速检索
64 维
粗筛/过滤

支持 MRL 的模型:OpenAI text-embedding-3 系列、Gemini Embedding 001、Qwen3-Embedding、Snowflake Arctic Embed v2 等。

量化压缩:用更少的 bit 存储每个维度

Embedding 的每个维度通常是 float32(32 bit)。量化就是用更少的 bit 来近似表示,大幅减少内存。

精度每维度1M 文档 × 1024 维精度损失
float32 4 字节 3.8 GB
float16 2 字节 1.9 GB 几乎无
int8 1 字节 0.95 GB < 1% 召回下降
binary 1 bit 0.12 GB 适合粗筛 + 重排

常见组合:先用 binary 快速过滤 Top-100,再用 float32 对 Top-100 做精排。

我该选哪个模型?

根据你的具体场景,按以下路径决策:

① 数据量 < 10 万条,且主要是英文
→ OpenAI text-embedding-3-small(1536 维),简单好用,成本极低。

② 需要多语言 / 中文为主
→ Qwen3-Embedding(开源免费),或 Gemini Embedding 001(API 极便宜)。

③ 数据量百万级,成本敏感
→ 自托管 BGE-M3 或 Snowflake Arctic,用 MRL 降到 256~512 维 + int8 量化。

④ 需要处理图片 + 文本混合
→ Jina Embeddings v4 或 Cohere Embed v4(多模态)。

⑤ 追求最高精度,成本不限
→ Gemini Embedding 001(3072 维)或 Qwen3-Embedding-8B(4096 维)。