30秒快速回答: Embedding 是「把语义变成数字」的技术。一段文字、一张图片、一段音频,经过 Embedding 模型处理后,变成一个固定长度的数字数组(向量)。神奇之处在于:语义越相似的内容,它们的向量在空间中距离越近。「猫」和「小猫」的向量距离很近,「猫」和「汽车」的距离很远。
一张图理解 Embedding
想象一个简化的 2 维空间(实际是 768-1536 维):
↑ 维度2
|
「猫」 · 「狗」 ·
|
| 「汽车」 ·
|
─────────┼──────────────→ 维度1
|
「苹果」·
|
「香蕉」·
|
- “猫”和”狗”的向量距离很近(都是宠物)
- “苹果”和”香蕉”的向量距离很近(都是水果)
- “猫”和”汽车”距离很远(不相关)
Embedding 模型把这个直觉扩展到了数百维——在这些维度中,模型学习到的关系远超我们的直觉。
Embedding 能做什么?
| 应用 | 原理 | 典型场景 |
|---|---|---|
| 语义搜索 | 用户问题→向量,找最相似的文档向量 | RAG、企业搜索 |
| 文本分类 | 文本→向量→用传统分类器分类 | 情感分析、垃圾过滤 |
| 聚类分析 | 大量文本→向量→K-Means 聚类 | 用户分组、话题发现 |
| 相似推荐 | 物品→向量→找最近的邻居 | 商品推荐、内容推荐 |
| 异常检测 | 正常模式→向量,检测偏离的 | 欺诈检测、异常日志 |
| 跨模态检索 | 文字向量和图片向量在同一空间 | 图文搜索、以文搜图 |
实战:用 Embedding 做语义搜索
# 安装: pip install openai numpy scipy
from openai import OpenAI
import numpy as np
from scipy.spatial.distance import cosine
client = OpenAI()
# 1. 定义待搜索的文档
documents = [
"Python 是一种广泛使用的编程语言,特别适合数据科学。",
"养猫需要准备猫砂盆、猫粮和猫抓板。",
"JavaScript 是 Web 前端开发的核心语言。",
"如何训练狗狗定点上厕所?需要耐心和奖励机制。",
"pandas 是 Python 最强大的数据分析库。",
"猫咪的寿命通常在 12-18 年,需要定期体检。",
]
# 2. 将所有文档转为向量
def get_embedding(text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
doc_embeddings = [get_embedding(doc) for doc in documents]
# 3. 用户查询也转为向量
query = "我想养一只猫,需要准备什么?"
query_embedding = get_embedding(query)
# 4. 计算相似度(用余弦距离,越小越相似)
similarities = [1 - cosine(query_embedding, doc_emb) for doc_emb in doc_embeddings]
# 5. 排序输出最相关的结果
ranked = sorted(
zip(documents, similarities),
key=lambda x: x[1],
reverse=True
)
print(f"查询: {query}\n")
for i, (doc, score) in enumerate(ranked[:3]):
print(f"Top {i+1} [相似度 {score:.3f}]: {doc}")
输出:
查询: 我想养一只猫,需要准备什么?
Top 1 [相似度 0.876]: 养猫需要准备猫砂盆、猫粮和猫抓板。
Top 2 [相似度 0.742]: 猫咪的寿命通常在 12-18 年,需要定期体检。
Top 3 [相似度 0.321]: 如何训练狗狗定点上厕所?需要耐心和奖励机制。
注意:没有一条文档出现”我想养一只猫”这些字,但 Embedding 准确地找到了最相关的内容。
2026 年主流 Embedding 模型对比
| 模型 | 维度 | 中文支持 | 价格 | 适用场景 |
|---|---|---|---|---|
| text-embedding-3-small | 1536 | 好 | $0.02/百万Token | 通用,性价比高 |
| text-embedding-3-large | 3072 | 优秀 | $0.13/百万Token | 高精度场景 |
| bge-large-zh-v1.5 | 1024 | 极好 | 免费(开源) | 中文专用 |
| text2vec-base-chinese | 768 | 好 | 免费(开源) | 本地部署、小模型 |
| gte-large-zh | 1024 | 优秀 | 免费(开源) | 中文检索 |
| jina-embeddings-v3 | 1024 | 好 | 有免费额度 | 多语言、长文本 |
| Cohere Embed v3 | 1024 | 好 | 有免费额度 | 多语言、企业级 |
| Voyage AI | 1024/2048 | 好 | 付费 | 法律、金融垂直领域 |
选择建议
个人学习 / 原型开发 → text2vec-base-chinese(本地免费)
中文生产环境 → bge-large-zh-v1.5(开源最佳)
多语言混合 → text-embedding-3-small(OpenAI)
追求最高精度 → text-embedding-3-large
本地 + 隐私敏感 → bge-large-zh 或 gte-large-zh
Embedding 的进阶优化技巧
1. 选择合适的 Chunk 策略
Embedding 模型对短文本效果好,长文本需要切分:
# 不要:一整篇 5000 字的文章直接 Embedding
embedding = get_embedding(long_article) # 信息被稀释
# 应该:切成 500 字的段落分别 Embedding
chunks = split_text(long_article, chunk_size=500, overlap=50)
embeddings = [get_embedding(chunk) for chunk in chunks]
2. 查询重写
用户的口语化问题直接 Embedding 可能效果不佳:
# 原始查询
query = "那个东西咋整来着?"
# 用 LLM 重写为更规范的查询
rewritten_query = llm.rewrite_for_search(query)
# → "如何使用XXX功能?步骤是什么?"
3. 混合搜索
纯粹基于 Embedding 的搜索可能漏掉精确匹配:
# 混合搜索 = 语义分数 × 0.7 + 关键词分数 × 0.3
final_score = semantic_score * 0.7 + keyword_score * 0.3
常见问题
Q: Embedding 和模型的 hidden states 是一回事吗?
不是。Embedding 模型是专门训练的,输出专门用于语义比较。而大模型的 hidden states 虽然也是向量,但未必适合直接做相似度计算。
Q: Embedding 模型需要 GPU 吗?
小模型(768 维以下)在 CPU 上就很快。bge-large 等大模型推荐用 GPU 加速。但生产环境建议用 API(OpenAI、Cohere 等)——省心、快、便宜。
Q: Embedding 向量的维度越高越好吗?
不一定。1536 维通常比 768 维更精准,但存储和计算成本也翻倍。对于大多数场景,1024 维是一个甜点。OpenAI 的 text-embedding-3 系列支持动态降维(如从 1536 降到 512),精度损失很小。
Q: Embedding 能处理多语言吗?
多语言 Embedding 模型(如 text-embedding-3、jina、Cohere)可以将不同语言的相似语义映射到相近位置。中文”猫”和英文”cat”的向量会很接近。
下一步建议: 用本文代码 + 你自己的文档,搭建一个本地语义搜索引擎。对比关键词搜索和 Embedding 搜索的效果差异,你会立刻感受到 Embedding 的威力。