- Authors

- Name
- Kai Kang
- Role
- Staff Software Engineer @ Meta · Solo App Builder
我做了一个基于 embedding 的小游戏 :)
Embedding 是什么,为什么需要它?

现代神经网络的语言是数字数组、数字列表,也就是 tensor 或向量。 Embedding 向量本质上就是“数字列表”。比如 。
但它有一个很有意思的性质:语义相近的词,对应的向量也会相近。比如 “Cat” 和 “dog” 是相近的词,所以它们的向量也相近。它们和 “Hamburger” 差得很远,所以你也可以预期 hamburger 对应的 embedding 向量会很不一样。
我们需要 embedding 的原因是:就像英语、中文、日语是人类使用的语言一样,向量是神经网络和 LLM 使用的语言。
LLM 可以在 embedding 向量上做数学运算,这也是它只“理解” tensor / vector,却能输出人类语言的核心原因之一。最经典的例子是: 。

Embedding 怎么进入 LLM?

当 “cat” 这样的词进入 LLM 时,它首先会被 tokenized。tokenization 这个概念我会在另一篇文章里讲。现在可以先理解成:一个词会变成一个 token(实际不是一一对应,一个词也可能被切成多个 token;为了简化先当作一个 token)。这个 token 再通过 lookup table 被转换成 embedding 向量。这个 embedding lookup table 来自 LLM 的训练过程。
initial_embedding = embedding_table[token]
contextual_embedding = ...
next_token = ...
更细节的内容我会放在 LLM 相关笔记里。
怎么拿到预训练 embedding
[1] OpenAI 提供在线 API:
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-small",
input="The dog is playing in the park."
)
embedding = response.data[0].embedding
print(len(embedding))
[2] Sentence Transformers 是标准的 Python 离线方案:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
texts = [
"A dog is running outside.",
"A puppy is playing in the park.",
"I want to eat a hamburger."
]
embeddings = model.encode(texts)
print(embeddings.shape)
[3] Hugging Face 可以直接访问模型,灵活性更高:
from transformers import AutoTokenizer, AutoModel
import torch
model_name = "sentence-transformers/all-MiniLM-L6-v2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
text = "A dog is running outside."
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
outputs = model(**inputs)
token_embeddings = outputs.last_hidden_state
sentence_embedding = token_embeddings.mean(dim=1)
应用
- 搜索(RAG)
- RAG: embedding vector -> vector DB
- 推荐系统
- User Embedding, Item Embedding
这篇有意思的 Food Embeddings 论文展示了每个食材也可以有 embedding。Embedding 空间不是客观存在的,它编码的是你选择训练或检索的关系:比如哪些东西常被一起烹饪,或者哪些东西可以互相替代。