在 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 总分。