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 的威力。