认识嵌入模型

1. 什么是嵌入模型?

大语言模型是生成式模型。它理解输入并生成新的文本(回答问题、写文章)。它内部实际上也使用嵌入技术来理解输入,但最终目标是 “创造”。

而嵌入模型(Embedding Model)是表示型模型。它的目标不是生成文本,而是为输入的文本创建一个最佳的、富含语义的数值表示(向量)

由于计算机天生擅长处理数字,而不理解文字、图片的含义。嵌入(Embedding)的核心思想就是将人类世界的符号(如单词、句子、产品、用户、图片)转换为计算机能够理解的数值形式(即向量,本质上是一个数字列表),并且要求这种转换能够保留原始符号的语义和关系。

嵌入(Embedding)的核心思想,就是将人类世界的符号(如单词、句子、产品、用户、图片)转换为计算机能够理解的数值形式(向量,本质是一个数字列表),并且让这种转换精准保留原始符号的语义和关系

以三维向量为例(实际应用中是数百至数千维):

  • “开心” 对应的向量:[0.1, -0.5, 0.2]
  • “愉悦” 对应的向量:[0.1, -0.5, 0.25]
  • “生气” 对应的向量:[0.7, 0.3, -0.9]

可以看到:

  • “开心” 与 “愉悦” 的向量数值高度接近 → 代表二者语义相似、情感相近
  • “开心 / 愉悦” 与 “生气” 的向量数值差异巨大 → 代表二者语义无关、情感对立

这正是嵌入模型的本质:用数字的 “远近”,来度量语义的 “亲疏”,让计算机能通过数学计算理解人类语言的含义与关系。

度量语义?我们具体是如何进行度量的?

度量语义相似度的两种方式

1. 欧式距离:直观但有局限

欧式距离计算的是向量之间的直线空间距离,距离越短代表相似度越高。但它有一个明显问题:会受到向量长度(文本长度、词汇多少)的干扰。比如 “愉快”(2 字)和一篇围绕 “开心” 的作文(1000 字),即便语义高度相近,因为文本长度差异导致向量长度不同,欧式距离会被拉远,无法准确反映语义的相似性。

2. 余弦相似度:专注语义方向,更适合文本场景

余弦相似度只关注向量之间的方向差异,忽略长度影响。在语义世界里:

  • 方向:代表文本的核心含义、情感倾向
  • 长度:仅代表文本的字数、词汇量多少

它能精准捕捉 “开心” 和 “愉悦” 这类语义相近的内容,即便文本长度差异巨大,也能通过方向的接近程度判断语义相似;而 “开心” 与 “生气” 这类语义对立的内容,方向差异会被清晰放大,完美解决了欧式距离受长度干扰的问题。

✅ 核心结论
  • 维度越高,嵌入模型能捕捉的语义复杂度越强
  • 嵌入匹配是基于语义相似度,而非 MySQL 那样的精确字符匹配,更贴近人类理解语言的方式

我们可以把它想象成一个翻译过程,把人类语言 “翻译” 成计算机的 “数学语言”。

结论:既然是 “数学语言”,那么我们可以用数学的方式来比较向量,从而达到【度量语义】的目的!适用场景:Owen-embedding-3B 等。


2. 嵌入模型应用场景

根据嵌入的特性,由此延伸出了许多嵌入模型在 AI 应用的使用场景:

语义搜索(Semantic Search)

传统搜索:依赖将查询和文档匹配 “苹果”,只能找到包含 “苹果” 这个词的文档。【类似 MySQL 的精确匹配】

语义搜索:将查询和文档都转换为向量,通过计算向量间的相似度来找到相关内容,即使文档中没有查询的确切词汇也能被检索到。如下图所示,即使知识库中并未直接出现 “笔记本电脑无法充电” 这个词组,语义搜索也能通过向量相似度精准地找到该文档。

检索增强生成(Retrieval-Augmented Generation, RAG

这是当前大语言模型应用的核心模式。当用户向 LLM 提问时,系统首先使用嵌入模型在知识库(公司内部文档)中进行语义搜索,找到最相关的内容,然后将这些内容和问题一起交给 LLM 来生成答案。这极大地提高了答案的准确性和时效性。【RAG】

例如:一家公司的内部客服机器人接到员工提问:“我们今年新增加的带薪育儿假政策具体是怎样的?” 系统会首先使用嵌入模型在公司的具体条款,然后将这些【条款】和【问题】一起提交给 LLM,搜索到,找到关于 “今年育儿假规定” 的具体条款,然后将这些【条款更新备忘录】等资料中进行语义检索,LLM 便能生成一个准确、具体的摘要回答,而非仅凭其内部训练数据可能产生的过时或泛泛的答案。

推荐系统(Recommendation systems)

将用户(根据其历史行为、偏好)和物品(商品、电影、新闻)都转换为向量。喜欢相似物品的用户,其向量会接近;相似的物品,其向量也会接近。通过计算用户和物品向量的相似度,就可以进行精准推荐。

例如:一个流媒体平台将用户 A(喜欢观看《盗梦空间》和《黑镜》)和所有电影都表示为向量。系统发现用户 A 的向量与用户 B(同样喜欢《盗梦空间》和《黑镜》)的向量很接近,而用户 B 还喜欢《星际穿越》。于是当用户 A 从未看过《星际穿越》时,系统通过计算用户向量与电影向量的相似度,系统会将这部电影推荐给用户 A。

异常检测(Anomaly Detection)

正常数据的向量通常会聚集在一起。如果一个新数据的向量远离大多数向量的聚集区,它就可能是一个异常点(如垃圾邮件、欺诈交易)。

例如:一个信用交易反欺诈系统,通过学习海量正常交易的记录(如金额、地点、时间、商户类型等),将向量的向量形成 “正常交易聚类”。当发生一笔新的消费发生地的高频时间转换,系统则会将某标记为潜在的 “欺诈交易” 并进行警报。(例如,一笔发生在通常消费地之外的高额交易)。


3. 主流的嵌入模型

  • text-embedding-3-large(OpenAI):OpenAI 最强大的英语和非英语任务嵌入模型。默认维度 3072,可降维到 1024 等;输入长度支持 8192。
  • text-embedding-3-small(输入长度:支持 8192)
  • Owen-embedding-3B(输入长度:支持 8192;支持 100 + 种语言;上下文长度 32k;嵌入维度:最大 4096,支持用户定义的输出维度,范围从 32 到 4096。推理需要一定的 GPU 计算资源(例如,度至少需要 16GB 以上显存的 GPU 才能高效运行)。
  • gemini-embedding-001(Google):支持 100 + 种语言;默认维度 3072,可选降维版本:1536 维或 768 维;输入令牌长度支持为 2048。

其他参考:


4. 嵌入模型接入方式

嵌入模型接入和使用方式根据模型类型(开源或闭源)有根本性的不同。下图清晰地展示了两种典型的接入流程:

这是 API 接入最简单的方式,无需管理任何设施,只需要向模型提供商的服务发送一个 HTTP 请求即可。

4.1 API 接入

适用模型:text-embedding-3-largegemini-embedding-001 等。

步骤:

  1. 注册账号并获取 API Key:在对应的服务平台(如 OpenAI Platform, Google AI Studio, Vertex AI)上注册账号,获取用于身份验证的 API Key。
  2. 安装 SDK 或构造 HTTP 请求:使用官方提供的 SDK(如 openai, google-generativeai),或者直接构造 HTTP 请求。
  3. 调用 API 处理响应:发送文本,接收返回的 JSON 格式的向量数据。

示例:发送 HTTP 请求

curl https://api.openai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "input": "This is a test sentence.",
    "model": "text-embedding-3-small"
  }'

响应包含嵌入向量(浮点数列表)以及一些其他元数据:

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.0069316246,
        -0.005332426,
        -0.009326429,
        -0.042475605,
        0.020436291,
        ...
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

示例:接入 SDK(以 OpenAI Python SDK 为例)安装库:

pip install openai

代码块:

# 使用 OpenAI Python SDK
from openai import OpenAI

# 1. 设置 API Key
client = OpenAI(api_key="your-api-key")

# 2. 准备输入文本
text = "这是一段需要转为向量的文本。"

# 3. 调用 API
response = client.embeddings.create(
    input=text,
    model="text-embedding-3-small",
    dimensions=1024  # 可选:指定输出维度,例如从 3072 降维到 1024
)

# 4. 获取向量
embedding = response.data[0].embedding
print(embedding)  # [0.023, 0.487, -0.129, ..., 0.325]

4.2 本地部署(开源资源)

适用模型:Owen-embedding-3B 等。步骤:

  1. 环境准备:准备一台有足够 GPU 显存的服务器(对于 Owen-embedding-3B,需要至少 16GB 显存)。
  2. 模型下载:从 HuggingFace 等模型仓库下载模型权重和配置文件。
  3. 加载:使用 transformers 等的库来加载模型到 GPU,并进行推理。

这部分有兴趣的可以自己后面进行研究。对于大多数初创项目或原型验证,从 API 方式开始是最佳选择。当应用规模化、面临数据合规要求时,再考虑迁移到本地开源模型。

在实际应用部署,将向量用嵌入模型获取结果后,直接存入向量数据库(如 Milvus 的 Milvus, Pinecone 等),以统一的检索。为了便于接入不同的嵌入模型,很多项目会使用 LangChain 这样的框架,它们提供了统一的嵌入模型接口。

更多推荐