Embedding 与生成模型:AI “理解世界” 和 “说话” 的秘密

0 阅读7分钟

# AI编程基础学习:什么是 Embedding?

Embedding 和生成模型不是同一个东西,但关系很密。

  • Embedding:负责把内容变成可计算的向量,核心是理解、匹配、检索信息
  • 生成模型(比如大语言模型 LLM):用这些向量学习语言规律,核心是创作、生成新内容
  • 二者是深度绑定的搭档:生成模型依赖 Embedding 理解语言,Embedding 靠生成模型落地成可用的交互体验

以我们常用的 GPT、文心一言、Llama 这类大语言模型为例:

  1. 输入文字 → 先转换成 Token Embedding(词嵌入向量)
  2. 模型学习这些向量,理解输入的语义
  3. 最后输出概率分布,逐字生成通顺的回答

所以可以说:生成模型 = 理解(Embedding) + 预测(生成)

类型输入输出主要用途
Embedding 模型文本/图片等向量搜索、匹配、推荐
生成模型文本上下文新文本写作、问答、代码、对话

实际落地场景(RAG 架构)

现在主流的知识库问答、RAG(检索增强生成)系统,就是二者配合的经典场景:

  1. 先把文档切成小段 → 用 Embedding 模型转成向量,存入向量数据库
  2. 用户提问 → 同样把问题转成 Embedding 向量
  3. 在向量库中快速找到语义最相似的文档片段
  4. 把这些片段作为参考资料,丢给生成模型,让它整理成通顺、准确的回答

简单来说:Embedding 负责 “精准找资料”,生成模型负责 “把资料写成人话”。

用户问题
  ↓
转成 embedding
  ↓
去向量数据库里找相似文档
  ↓
把找到的文档交给生成模型
  ↓
生成模型基于文档回答

面试中直接可用的总结:

  1. 基础面试版本

Embedding 本质是把文本等信息转换成高维稠密向量,核心是把语义数字化,让语义相似的内容向量也相似,用来做检索、匹配、分类。它和生成模型是深度搭档:生成模型(比如大语言模型)内部就依赖 Embedding 来理解输入语义,再做内容生成;实际场景中,比如 RAG 架构里,Embedding 负责检索知识库,生成模型负责把检索到的内容整理成回答,二者配合实现更准确的问答。

  1. 技术岗面试版本

Embedding 是 AI 中用于信息表示的核心技术,它将文本、图像等非结构化数据映射为高维稠密向量,核心特性是语义相似性保留—— 语义相近的内容,向量在高维空间的距离更近,这是检索、推荐、RAG 等系统的基础。

它和生成模型(尤其是大语言模型)是强依赖关系:一方面,生成模型的输入层就需要 Token Embedding 来将文字转为可计算的向量,是模型理解语义的基础;另一方面,在 RAG 这类落地场景中,Embedding 负责从知识库中检索相关上下文,生成模型基于上下文生成回答,二者分工明确、协同工作,是当前大模型落地的核心架构之一。

1.3. 代码示例

可直接运行的 Python 示例,覆盖 3 件事:

  1. 把句子变成 Embedding 向量
  2. 计算两个句子的语义相似度
  3. 用一个极简 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 检索 + 生成模型回答