目录

Embedding 嵌入模型

系列 - AIGC 必知必会

Embedding(嵌入)可以理解为:把文字、图片、音频、用户等对象,转换成一串数字向量,用这些数字来表示它们的 “语义特征” 或 “含义”。

因为大模型的本质就是处理数字,而我们输入的文本需要先经过 tokenization,再被转换成 embedding 向量,才能进入模型参与计算;因为表示的是语义特征,所以语义相近的文本在向量空间中的距离往往更近,因为这个特性,它在语义搜索、上下文检索和 RAG 等场景中非常重要。

例如 “我喜欢吃苹果” 对应的是 [0.12, -0.35, 0.87, 0.44, ...]

这个向量通常有几十、几百甚至几千个维度。它本身对人不直观,但机器可以用它来计算相似度、做搜索、分类、聚类等任务。

为什么需要 Embedding? 计算机本质上更擅长处理数字(或者说只能处理数字),而不是直接理解文字。

例如下面的两句话:

我喜欢吃苹果
我爱吃水果
今天股票大跌

从字面看,它们不完全一样,前两句但语义上比较接近。

如果只用关键词匹配,可能无法很好判断它们的关系。但如果把它们转换成 Embedding 向量,它们在向量空间中的距离可能会比较近,说明语义相似,语义完全不相干的“今天股票大跌”在向量空间中就非常远。

Embedding 的核心思想是:语义相近的对象,在向量空间中距离也应该相近。

Embedding 嵌入模型就是专门用来把输入数据转换成向量的模型(文本 → 向量)。

这个模型不会像 LLM 那样主要用来生成长文本,而是用来生成 “语义向量”。

常见的一些用途:

  • 语义搜索

    知识库搜索、文档搜索、问答系统

  • RAG 检索增强生成

    RAG 中通常会把文档切分后转成 Embedding 存入向量数据库。

    用户提问时,也把问题转成 Embedding,然后检索相关内容,再交给大模型回答(召回)。

  • 推荐系统

    推荐相似商品、相似视频、相似文章

  • 聚类分类

    把大量文本变成向量后,可以自动根据类型分组

  • 去重和内容相似检测

    判断两段文字是否表达了相似意思。

常见向量数据库有:

  • Milvus
  • FAISS
  • Pinecone
  • Weaviate
  • Chroma
  • Elasticsearch / OpenSearch 向量检索
  • PostgreSQL + pgvector

首先,大语言模型本质上不能直接处理自然语言字符,它需要先把文本变成数字,上一篇我们知道了什么是 Token,LLM 中可以理解是一个数字对应着一个 Token,就像一本字典一样。

文本 (我喜欢苹果)
→ 分词 Tokenization ("我", "喜欢", "苹果")
→ Token ID ([1024, 5892, 3011])
→ Token Embedding  
→ Transformer 层
→ 输出预测

我喜欢苹果
→ "我", "喜欢", "苹果"
→ [1024, 5892, 3011]
→ 1024 → [0.12, -0.33, ...]、5892 → [0.65, 0.07, ...]、3011 → [-0.18, 0.92, ...]
→ Transformer 层
→ 输出预测

所以,LLM 内部一定有 Embedding 机制,但是和嵌入模型不是完全一回事;

LLM 内部的 Embedding 主要是为了让模型能处理 token(再次提醒 1 Token 并不一定表示 1 个单词)。

Tokenization 主要负责把 Token 和数字的转换,可以识别多少 token 叫做词表大小 vocab size;以 gpt-4o 模型来说,词表就有 20w,这个过程算作是预处理,还不算是大模型的一部分。

我们平时说的 Embedding 模型,一般指用于语义检索、相似度计算的模型。

可以理解为:

  • Embedding 模型

    把句子 / 段落转成语义向量,用于检索和比较;

    一段文本一个向量

  • LLM 中的 Embedding

    帮助大模型理解 token 并生成文本;

    每个 token 一个向量;

    其中把 Token ID 转换成向量的过程一般是训练出来的,不可能人为去定义这么多维度的向量。

    它关注的不是某一维的含义,而是两个向量之间的距离/角度是否能反映语义相似度。

理论上,LLM 中间层也会产生向量表示,可以拿来做 embedding。

但普通生成式 LLM 不一定特别适合直接做语义检索,因为它训练目标主要是 “预测下一个 token”,不是 “让相似句子距离更近”。

所以通常会专门训练或微调 embedding 模型,使它更适合相似度任务。

每家公司用的 Embedding 转换算法通常是不一样的,不同公司或不同模型可能在这些方面都不同;

因为每个模型的 分词器、词表、向量维度、训练数据、训练目标都可能是不同的。 所以不同 Embedding 模型生成的向量也不能混用。

上面说“转换成向量的过程一般是训练出来的”,这句话详细解释下,例如: 苹果、Apple、橘子。

这三个词如果定义,苹果和 Apple 实际是一个意思,但是不是一种语言,那么理论上应该要离得近;苹果和橘子都是水果,那么也应该离的很近,那么橘子和 Apple 这个就的设计就很复杂,有一种既近又远的感觉;

解决这个问题也很简单,增加维度(变成多维向量),维度越多(例如按语言、形状、颜色、类别分类,每一个都是一个维度),越能准确的表达这种关系,但是维度一多,人为的再去定义就是不太可能的,所以只能也是训练得出。

以 DeepseekR1 为例,有 7168 个维度,gpt5 这类模型预估最少也要上万。

所以想让这上万个维度合理的分配,人工是不可能的,训练出来的这种关系,人是肯定无法理解的,我们也不知道是不是一个维度代表一个特征,只能说是最后的结果是好的。

最后 LLM 的和 RAG 的训练侧重点是不一样的,例如:

LLM 文字接龙:我 -> 我爱 -> 我爱吃 -> 我爱吃苹 -> 我爱吃苹果;

RAG 语义相近(正样本):我喜欢吃苹果 -> 我喜欢吃橘子

想用 Embedding 但是不想自己从头搞怎么办,感谢赛博菩萨 Cloudflare 提供的免费套餐,进入 Cloudflare 控制台,在 AI 下的 Workers AI 菜单下,点击右上角的 Workers AI REST API,创建一个 Workers AI API 令牌。

在需要的地方填入:

token:创建的令牌

端点:https://api.cloudflare.com/client/v4/accounts/<帐户ID>/ai/v1

模型:@cf/baai/bge-m3

如果只需要英文,可以看看 bge 的其他模型,目前我看到的只有这个是多语言。