什么是 Embedding(嵌入)?

Embedding(嵌入) 是将文本、图像、音频等高维离散数据,转换为低维、稠密、连续的向量(Vector)的过程。这个向量是一串浮点数(如 [0.12, -0.34, 0.56, ...]),用来表示原始数据的“语义特征”

在 LLM/RAG 语境下,文本嵌入(Text Embedding) 就是把一段文字“翻译”成数学坐标。语义越相近的文本,它们在向量空间中的距离就越近。

一句话定义:Embedding 是大模型理解世界的“通用语言”——把万物转化为数字,让计算机能计算“相似度”。


🔬 工作原理(如何生成向量?)

  1. 输入文本:输入一段文字(如“今天天气真好”)。
  2. Tokenization:分词器将文字拆分为 Token。
  3. 神经网络编码:Tokenizer 将 Token 转为 ID 序列;Embedding 模型(通常基于 Transformer 架构,如 BERT、BGE)将这些 ID 映射为初始向量,并通过多层自注意力网络将每个 Token 的向量融合上下文的语义信息,最终将所有 Token 的信息“汇聚”成一个固定长度的向量(如 768 维、1024 维)。
  4. 输出向量:得到一个代表整句话语义的稠密向量。

🆚 嵌入模型 vs. 大语言模型(LLM)

这是面试中最容易混淆的点,务必分清:

维度 嵌入模型 大语言模型(LLM)
核心任务 理解与匹配(判别式)。把内容转化成坐标。 生成与创作(生成式)。根据上文预测下一个字。
输入/输出 输入文本,输出固定长度的向量 输入文本,输出不定长的自然语言文本
典型模型 text-embedding-ada-002BAAI/bge-large-zhsentence-transformers/all-MiniLM-L6-v2 GPT-4Claude 3Qwen-PlusDeepSeek-V3
参数量级 较小(几百万到几亿),推理极快(< 10ms)。 极大(几十亿到上万亿),推理慢且贵(1~2s)。
在 RAG 中的位置 离线:文档入库时生成向量;在线:用户 Query 生成向量。 最后一步:拿到检索结果后,组织语言生成最终回答。

总结嵌入模型决定“找不找得到”,LLM 决定“答得好不好”。


🗺️ Embedding 在 RAG 中的完整流程图

[离线阶段 - 数据入库]
PDF/Word/TXT
    ↓ 分块 (Chunking)
文本块 1, 2, 3 ...
    ↓ 嵌入模型 (Embedding Model)
向量 V1, V2, V3 ...
    ↓ 存入
向量数据库 (Chroma/Milvus/Pinecone)

[在线阶段 - 用户查询]
用户提问: "如何重置密码?"
    ↓ 嵌入模型 (同一个模型)
查询向量 Q
    ↓ 相似度搜索 (ANN)
在数据库中找离 Q 最近的 Top-K 向量 (V2, V5, V9)
    ↓ 取出对应文本块
相关上下文
    ↓ 注入 Prompt + LLM
最终答案

💻 代码实战(如何使用 Embedding?)

1. 使用 HuggingFace 本地模型(推荐,免费)
from langchain_community.embeddings import HuggingFaceEmbeddings

# 下载并加载多语言轻量级模型(~470MB)
embeddings = HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

# 生成向量
text = "今天天气真好"
vector = embeddings.embed_query(text)
print(len(vector))  # 输出: 384 (该模型维度)
print(vector[:5])   # 输出: [0.12, -0.34, 0.56, ...]
2. 计算文本相似度
from sklearn.metrics.pairwise import cosine_similarity

# 生成三个句子的向量
sentences = ["今天天气真好", "阳光明媚", "我要吃火锅"]
vectors = embeddings.embed_documents(sentences)

# 计算第一句与后两句的余弦相似度
sim1 = cosine_similarity([vectors[0]], [vectors[1]])  # 0.92 (高相关)
sim2 = cosine_similarity([vectors[0]], [vectors[2]])  # 0.12 (低相关)
3. 使用 OpenAI / 通义千问(API 调用)
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector = embeddings.embed_query("今天天气真好")

🎯 如何选择嵌入模型?(面试高频考点)

评估维度 考量因素
语言支持 纯中文选 BAAI/bge-large-zh;多语言选 multilingual-e5-largeparaphrase-multilingual...
向量维度 维度越高(如 1536 vs 384),表达能力越强,但存储和计算开销也越大。
上下文长度 需支持你的分块大小。如 BGE-M3 支持 8192 tokens,适合长文档。
MTEB 榜单 查看 MTEB Leaderboard,关注 Retrieval (NDCG@10) 指标。
推理速度 本地小模型(~300MB)比 API 大模型快,适合大规模离线处理。

❗ Embedding 的“致命伤”(面试陷阱)

  • 不知道“新鲜事”:2024 年训练的模型不知道 2025 年的新词或事件。解决方案:用新数据微调模型,或启用 混合检索(BM25 + 向量) 兜底。
  • 必须保持模型一致索引时用的模型和查询时用的模型必须完全一致。用 A 模型把文档存进库,用 B 模型去查,向量空间不对齐,结果完全错误。

💡 高频面试题与回答话术

Q:既然 LLM 能理解文本,为什么不直接用 LLM 来做检索?
A:LLM 做一次推理耗时 1~2 秒,成本高;嵌入模型算一次向量仅需 < 10ms,成本接近零。在 RAG 中,检索阶段面临海量数据(百万级),必须依赖高效的嵌入模型。

Q:如何评估一个 Embedding 模型的好坏?
A:看 MTEB(大规模文本嵌入基准测试) 排行榜。重点关注 检索(Retrieval) 任务的平均准确率(NDCG@10),以及模型在中文数据集(C-MTEB)上的表现。

Q:为什么说 Embedding 是 RAG 系统的核心瓶颈?
A:因为“垃圾进,垃圾出”。如果 Embedding 不能准确理解用户 Query 和文档的语义,后续 LLM 再强也救不回来。检索是 RAG 的上限,生成只是靠近上限。

Q:向量维度越高越好吗?
A:不是。高维度带来更强的表达能力和更高的精度,但也会带来“维度灾难”,增加存储成本和计算延迟。需权衡:通常 768 维是性价比最高的平衡点。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐