在 RAG 系统中,用户的提问和知识库中的答案可能一个词都不一样:

问题:模型为什么越聊越慢?
文档:随着上下文长度增加,Attention 和 KV Cache 的计算、存储开销也会增加。

Embedding 模型把两段文字转换成向量,让系统能够按语义而不是关键词匹配它们。

从文本到向量

本项目使用 Qwen/Qwen3-Embedding-8B。它接收一段文本,为每段输入输出一个 4096 维向量。向本机服务 http://127.0.0.1:8001/v1/embeddings 发送:

{
  "model": "Qwen/Qwen3-Embedding-8B",
  "input": ["模型为什么越聊越慢?"],
  "encoding_format": "float"
}
```实测输入消耗 8 tokens,返回的 4096 维向量开头和结尾是:```text
[0.0003946909, -0.0171534475, -0.0102215754, -0.0153911076,
 0.0305472370, -0.0297248121, ..., -0.0078717880, -0.0152736185]

单个浮点数通常没有意义,4096 个数共同表示文本在高维语义空间中的位置。相关文本的向量靠近,无关文本的向量远离。

向量不是可还原的文本编码,也没有保存原文的全部事实。它只是模型为比较文本而学习出的表示。

Embedding 模型的功能

同一个 Embedding 模型可以为这些任务生成向量,但接口本身只负责把文本转换成向量,检索排序、分类和聚类由调用方完成。

检索

分别生成问题和文档的向量:

curl http://127.0.0.1:8001/v1/embeddings \
	-H 'Content-Type: application/json' \
	-d '{
    "model": "Qwen/Qwen3-Embedding-8B",
    "input": [
      "模型为什么越聊越慢?",
      "上下文长度增加会提高 Attention 和 KV Cache 的开销。",
      "temperature 用于控制模型输出的随机程度。"
    ],
    "encoding_format": "float"
  }'
```返回的`data [0].embedding` 是问题向量,其余是文档向量。计算问题与每篇文档的相似度并按分数降序排列,即可得到检索结果。
 
本机实测共消耗 34 tokens,每条向量为 4096 维。使用 cosine similarity 排序:
 
```text
0.414964  上下文长度增加会提高 Attention KV Cache 的开销。
0.401321  temperature 用于控制模型输出的随机程度。

第一篇文档排名更高,但两者分差不大,说明是否使用模型要求的检索指令以及业务数据评测都很重要。

文本相似度

一次生成两段文本的向量:

curl http://127.0.0.1:8001/v1/embeddings \
	-H 'Content-Type: application/json' \
	-d '{
    "model": "Qwen/Qwen3-Embedding-8B",
    "input": [
      "模型为什么越聊越慢?",
      "长对话会增加模型的计算和存储开销。"
    ],
    "encoding_format": "float"
  }'
```计算`data [0].embedding``data [1].embedding`  cosine similarity,即可得到语义相似程度。
 
本机实测共消耗 21 tokens,cosine similarity 为:
 
```text
0.632427

分类

最简单的零样本分类可以比较文本和类别描述的向量:

curl http://127.0.0.1:8001/v1/embeddings \
	-H 'Content-Type: application/json' \
	-d '{
    "model": "Qwen/Qwen3-Embedding-8B",
    "input": [
      "退款一直没有到账",
      "类别:退款和支付问题",
      "类别:账户登录问题",
      "类别:商品物流问题"
    ],
    "encoding_format": "float"
  }'

将第一条文本分到向量最相似的类别。正式分类通常使用带标签的向量训练额外的分类器,Embedding 接口不会直接返回类别。

本机实测共消耗 23 tokens:

0.588873  类别:退款和支付问题
0.488545  类别:商品物流问题
0.486071  类别:账户登录问题

最高分是 “退款和支付问题”,因此零样本分类结果符合预期。

聚类

批量生成待分组文本的向量:

curl http://127.0.0.1:8001/v1/embeddings \
	-H 'Content-Type: application/json' \
	-d '{
    "model": "Qwen/Qwen3-Embedding-8B",
    "input": [
      "退款什么时候到账?",
      "支付宝付款失败怎么办?",
      "账号密码忘记了",
      "登录时收不到验证码",
      "快递什么时候发货?",
      "如何修改收货地址?"
    ],
    "encoding_format": "float"
  }'
```再将返回的向量交给 K-means 等聚类算法。`curl`  Embedding 接口本身不执行聚类。
 
本机实测生成向量共消耗 33 tokens。使用 cosine similarity 的平均链接层次聚类分成三组后得到:
 
```text
 1 组:退款什么时候到账?
         账号密码忘记了
         登录时收不到验证码
         快递什么时候发货?
 2 组:支付宝付款失败怎么办?
 3 组:如何修改收货地址?

结果没有完全符合人工预期,说明通用语义向量和聚类算法不一定能直接表达业务分类。若项目需要聚类,应使用真实数据单独评测,而不能根据模型支持该任务就直接采用。

如何选择 Embedding 模型?

没有脱离业务数据的 “最佳模型”。公开榜单用于生成候选名单,最终选择必须由真实业务检索集决定。

MTEB Leaderboard 包含检索、分类、聚类和文本相似度等任务。

RAG 项目基本只使用 Embedding 模型的检索能力:

  • 知识库文档分块后,模型生成文档向量;
  • 用户提问时,模型生成 query 向量。

选择时先按语言、任务和部署约束筛选候选模型,再用真实业务的 “问题 — 相关文档” 数据比较 Recall@K、MRR 或 nDCG@K。对于 RAG,应重点看检索(retrieval)指标,而不是只看 MTEB 总分。