如果你正在研究人工智能(AI)开发,或者打算在这个领域大展身手,你一定会频繁听到一个词:嵌入模型(Embedding Models)。

通俗地说,嵌入模型就是一个“语义地图”。在底层逻辑上,它是一个神经网络,负责将单词或句子映射到一个连续的向量空间(Vector Space)中。其核心目标非常直观:用数学的方法,让意思相近的对象在空间位置上也靠在一起。

1. 脑洞大开:假如图书馆有一张“藏宝图”

想象一个传统的图书馆,书籍通常按作者或标题排序。但在嵌入模型的世界里,分类维度变成了无数个“隐藏属性”:氛围、话题、情感色彩、写作风格等。

再打个比方:假设你不擅长地理,不知道东京和纽约在哪里。如果我提议:“我们去纽约吃早餐,然后去东京吃午饭吧!”你可能会觉得这主意不错。

但一旦我给了你这两座城市的经纬度坐标,并在地图上标出来,你瞬间就会发现:这两地远隔重洋,根本没法这么玩。

嵌入(Embedding)就是这些坐标,它赋予了抽象文字以物理位置,让 AI 能一眼看出它们之间的距离。

2. 地图是怎么绘出来的?

在模型正式“上岗”回答问题前,它已经过大量的预训练。它阅读了数以亿计的句子,并敏锐地捕捉到了规律:

“猫”和“小猫”经常出现在相似的句子里。

“猫”和“电冰箱”几乎从不同台演出。

基于这些模式,模型为每个词分配了一组数学坐标:

相似概念(如“猫”和“小猫”)在地图上几乎重叠。

相关概念(如“猫”和“狗”)在同一个街区,但有一定距离。

无关概念(如“猫”和“量子物理”)则各占地图一角,如同纽约与东京。

小贴士: 构建这种大规模 AI 模型需要极高的算力保障。在部署个人项目或测试环境时,选择一个稳定、低延迟的服务器至关重要。比如不少开发者青睐的 Hostease 提供的海外高性能服务器,就能为这类计算密集型任务提供扎实的底层支撑。

3. 数字指纹:它是如何工作的?

有了这张图,当我们输入一句话(如“那只毛茸茸的小猫在睡觉”)时,会发生什么?

不再看字母: AI 不再纠结单词拼写,而是直接去地图上找每个词的坐标。

寻找重心: 它计算这些点位的“中心点”(平均值)。这个中心点就是整句话的**“数字指纹”**。

邻域搜索: AI 在指纹周围画一个圆圈,看看还有哪些“指纹”掉在这个范围内。

语义匹配: 即便某些文档里没有出现“毛茸茸”或“睡觉”这些词,只要它们在地图上住得近,模型就会认为它们是匹配的。

4. 嵌入模型的操作手册(七步法)

当模型收到请求时,流程如下:

文本摄取: 接收原始文本。

分词(Tokenization): 将短语拆解为最小单位(Token),通常是单词或词根。

分块(Chunking): 就像吃大餐要切块,文本被拆成约 512 个 Token 的小块,防止系统信息过载。

嵌入映射: 将每一块转化为一长串数字(向量),即“数字指纹”。

向量搜索: 快速计算数据库中哪些片段的数字与提问最接近。

结果返回: 找出那些数学上最相似的文本块。

生成阶段(RAG): 如果是检索增强生成(RAG),这些“获胜”的片段会被喂给 LLM(大语言模型),由它整理成自然流畅的人话。

5. 实战演练:写几行代码试试

让我们用最经典的 BERT 模型来看看它是如何将文本数字化的。

Python

from transformers import BertTokenizer

# 加载 BERT 分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
text = "Embedding models are so cool!"

# 步骤 1:分词
tokens = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
print(tokens['input_ids'])

你会发现每个词都变成了一个 ID。其中 ID 101 代表 [CLS](句子的整体含义标签),而 102 代表 [SEP](句子的分隔符)。

紧接着,我们可以利用 Qdrant 这样的向量数据库来模拟一个简单的搜索过程:

Python

from qdrant_client import QdrantClient, models
from sentence_transformers import SentenceTransformer

# 1. 加载全能型嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. 初始化内存数据库
client = QdrantClient(":memory:")

# 3. 存储三个文档
docs = ["退款政策", "定价详情", "账号注销"]
vectors = model.encode(docs).tolist()

# 4. 创建集合并上传
client.create_collection(collection_name="test", vectors_config=models.VectorParams(size=384, distance=models.Distance.COSINE))
client.upload_collection(collection_name="test", vectors=vectors, payload=[{"source": d} for d in docs])

# 5. 搜索问题
query_vec = model.encode("我该怎么注销订阅?")
result = client.query_points(collection_name="test", query=query_vec, limit=1)

print(result.points[0].payload) # 输出:{'source': '账号注销'}

6. 深度进阶:微调(Fine-Tuning)你的地图

为什么要微调?因为通用地图并不总能覆盖你的“私人领地”。例如,在你的业务逻辑里,“零度可乐”和“普通可乐”应该属于完全不同的分类,但在通用模型眼里,它们可能非常接近。

通过对比学习(Contrastive Learning),我们可以:

拉近(Pull): 把“可乐”和“苏打水”拉得更近。

推开(Push): 把“可乐”和“无糖版”推得更远。

这就是模型训练中的对齐(Alignment)均匀性(Uniformity)之间的博弈。优秀的模型应当既能精准捕捉相似性,又能把不相关的概念散布在广阔的数学空间中,互不干扰。

写在最后

在 AI 爆发的今天,嵌入模型是连接人类自然语言与机器二进制世界的桥梁。无论是构建 RAG 系统还是高性能搜索,理解“数字指纹”的原理都能让你事半功倍。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐