Embedding 和生成模型不是同一个东西,但关系很密。
- Embedding:负责把内容变成可计算的向量,核心是理解、匹配、检索信息
- 生成模型(比如大语言模型 LLM):用这些向量学习语言规律,核心是创作、生成新内容
- 二者是深度绑定的搭档:生成模型依赖 Embedding 理解语言,Embedding 靠生成模型落地成可用的交互体验
以我们常用的 GPT、文心一言、Llama 这类大语言模型为例:
- 输入文字 → 先转换成 Token Embedding(词嵌入向量)
- 模型学习这些向量,理解输入的语义
- 最后输出概率分布,逐字生成通顺的回答
所以可以说:生成模型 = 理解(Embedding) + 预测(生成)
| 类型 | 输入 | 输出 | 主要用途 |
|---|---|---|---|
| Embedding 模型 | 文本/图片等 | 向量 | 搜索、匹配、推荐 |
| 生成模型 | 文本上下文 | 新文本 | 写作、问答、代码、对话 |
实际落地场景(RAG 架构)
现在主流的知识库问答、RAG(检索增强生成)系统,就是二者配合的经典场景:
- 先把文档切成小段 → 用 Embedding 模型转成向量,存入向量数据库
- 用户提问 → 同样把问题转成 Embedding 向量
- 在向量库中快速找到语义最相似的文档片段
- 把这些片段作为参考资料,丢给生成模型,让它整理成通顺、准确的回答
简单来说:Embedding 负责 “精准找资料”,生成模型负责 “把资料写成人话”。
用户问题
↓
转成 embedding
↓
去向量数据库里找相似文档
↓
把找到的文档交给生成模型
↓
生成模型基于文档回答
面试中直接可用的总结:
- 基础面试版本
Embedding 本质是把文本等信息转换成高维稠密向量,核心是把语义数字化,让语义相似的内容向量也相似,用来做检索、匹配、分类。它和生成模型是深度搭档:生成模型(比如大语言模型)内部就依赖 Embedding 来理解输入语义,再做内容生成;实际场景中,比如 RAG 架构里,Embedding 负责检索知识库,生成模型负责把检索到的内容整理成回答,二者配合实现更准确的问答。
- 技术岗面试版本
Embedding 是 AI 中用于信息表示的核心技术,它将文本、图像等非结构化数据映射为高维稠密向量,核心特性是语义相似性保留—— 语义相近的内容,向量在高维空间的距离更近,这是检索、推荐、RAG 等系统的基础。
它和生成模型(尤其是大语言模型)是强依赖关系:一方面,生成模型的输入层就需要 Token Embedding 来将文字转为可计算的向量,是模型理解语义的基础;另一方面,在 RAG 这类落地场景中,Embedding 负责从知识库中检索相关上下文,生成模型基于上下文生成回答,二者分工明确、协同工作,是当前大模型落地的核心架构之一。
1.3. 代码示例
可直接运行的 Python 示例,覆盖 3 件事:
- 把句子变成 Embedding 向量
- 计算两个句子的语义相似度
- 用一个极简 RAG 流程展示:Embedding 负责检索,生成模型负责回答
我们用最常用的 sentence-transformers 库。
pip install sentence-transformers numpy
1.3.1. 示例 1:把文本转成 Embedding,并计算相似度
from sentence_transformers import SentenceTransformer
import numpy as np
# 使用支持中文的 Embedding 模型
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
sentences = [
"我想订一张去上海的机票",
"我想买一张飞往上海的航班票",
"今天晚上吃什么",
"汽车发动机坏了"
]
# 把文本转换成向量
embeddings = model.encode(sentences, normalize_embeddings=True)
print("第一句话的 Embedding 向量前 10 维:")
print(embeddings[0][:10])
print("Embedding 向量维度:")
print(embeddings.shape)
def cosine_similarity(vec1, vec2):
"""
计算余弦相似度
值越接近 1,说明语义越相似
值越接近 0,说明关系越弱
"""
return float(np.dot(vec1, vec2))
base = embeddings[0]
for i in range(1, len(sentences)):
score = cosine_similarity(base, embeddings[i])
print(f"'{sentences[0]}' 和 '{sentences[i]}' 的相似度:{score:.4f}")
第一句话的 Embedding 向量前 10 维:
[ 0.0321 -0.0187 0.0445 ... ]
Embedding 向量维度:
(4, 384)
'我想订一张去上海的机票' 和 '我想买一张飞往上海的航班票' 的相似度:0.85
'我想订一张去上海的机票' 和 '今天晚上吃什么' 的相似度:0.20
'我想订一张去上海的机票' 和 '汽车发动机坏了' 的相似度:0.12
这里可以看到:
“我想订一张去上海的机票”
和
“我想买一张飞往上海的航班票”
虽然字面不同,但语义接近,所以向量相似度高。
1.3.2. 示例 2:极简 RAG 检索流程
下面模拟一个知识库问答场景。
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
# 模拟知识库文档
docs = [
"机票改签需要在航班起飞前完成,不同航空公司的改签规则可能不同。",
"酒店取消订单通常需要查看预订页面的取消政策。",
"去上海的航班通常可以选择虹桥机场或浦东机场。",
"用户可以通过订单详情页申请机票退票。",
"汽车发动机异响可能和机油、火花塞或皮带有关。"
]
# 1. 文档转成 Embedding,存入“向量库”
doc_embeddings = model.encode(docs, normalize_embeddings=True)
# 用户问题
query = "我买了去上海的机票,现在想改签怎么办?"
# 2. 用户问题也转成 Embedding
query_embedding = model.encode([query], normalize_embeddings=True)[0]
# 3. 计算用户问题和每段文档的相似度
scores = doc_embeddings @ query_embedding
# 4. 取相似度最高的前 2 条文档
top_k = 2
top_indices = np.argsort(scores)[-top_k:][::-1]
print("用户问题:", query)
print("\n检索到的相关文档:")
retrieved_docs = []
for index in top_indices:
print(f"相似度:{scores[index]:.4f}")
print(f"文档:{docs[index]}")
print()
retrieved_docs.append(docs[index])
# 5. 把检索结果拼成上下文,交给生成模型
context = "\n".join(retrieved_docs)
prompt = f"""
请基于以下资料回答用户问题。
资料:
{context}
用户问题:
{query}
回答:
"""
print("最终交给生成模型的 Prompt:")
print(prompt)
这个示例里,Embedding 做的是:
用户问题 → 向量
知识库文档 → 向量
计算相似度 → 找到最相关的资料
生成模型做的是:
拿到检索出来的资料
组织语言
生成自然、完整的回答
也就是:
- Embedding 负责找资料
- 生成模型负责写答案
1.3.3. 示例 3:Embedding 模型和生成模型的区别
# Embedding 模型:输入文本,输出向量
def embedding_model(text):
vector = model.encode([text], normalize_embeddings=True)[0]
return vector
# 生成模型:输入上下文,输出新文本
def generation_model(prompt):
"""
这里用伪代码表示。
实际项目中可以替换成 GPT、通义千问、文心一言、Llama 等模型接口。
"""
answer = "根据你提供的资料,机票改签通常需要在航班起飞前操作,并且要查看航空公司的具体规则。"
return answer
text = "我想订一张去上海的机票"
vector = embedding_model(text)
print("Embedding 输出:")
print(vector[:10])
prompt = "请回答:我想订一张去上海的机票,应该怎么做?"
answer = generation_model(prompt)
print("\n生成模型输出:")
print(answer)
Embedding 模型:
输入:我想订一张去上海的机票
输出:[0.12, -0.44, 0.87, ...]
用途:检索、匹配、推荐、分类
生成模型:
输入:请回答:我想订一张去上海的机票,应该怎么做?
输出:你可以先选择出发地、目的地、日期,然后查询航班...
用途:问答、写作、总结、代码生成
面试表达版本
可以这样说:
- Embedding 模型不会直接生成一段自然语言回答,它主要是把文本转换成向量,用来做语义匹配和检索。
- 生成模型则是根据输入上下文预测并生成新的文本。
- 在 RAG 系统中,Embedding 负责把用户问题和知识库文档都转成向量,然后从向量库中找出最相关的资料;生成模型再基于这些资料生成最终答案。
核心公式可以简单记:RAG = Embedding 检索 + 生成模型回答