Embedding 是 AI 应用的”地基”。选对模型,RAG 和向量搜索的效果就成功了一半。
什么是 Embedding?
Embedding(向量嵌入)是将文本、图片、音频等数据转换成固定长度向量的技术:
文本 → [0.123, -0.456, 0.789, ...] (1536/3072 维度)
相似文本 → 相似的向量
"苹果水果" ≈ "新鲜苹果"
"苹果手机" ≠ "新鲜苹果"
Embedding 的核心价值:
- 让”语义相似”变成”数学可计算”
- 向量距离 ≈ 语义距离
- 余弦相似度最高 = 语义最相近
主流 Embedding 模型对比
英文模型
| 模型 | 维度 | MTEB 得分 | 特点 | 适用场景 |
|---|---|---|---|---|
| text-embedding-3-large | 3072 | 64.6% | OpenAI 最新最强 | 通用、高质量 |
| text-embedding-3-small | 1536 | 62.0% | 性价比高 | 快速原型 |
| embed-english-v3.0 | 1024 | 65.0% | Cohere 最新 | 多语言支持好 |
| bge-large-en-v1.5 | 1024 | 63.3% | 开源、中文也强 | 开源首选 |
| E5-mistral-7b | 1024 | 66.6% | 开源最强 | 高精度场景 |
中文模型
| 模型 | 维度 | MTEB 得分 | 特点 | 适用场景 |
|---|---|---|---|---|
| bge-large-zh | 1024 | 64.5% | 中文优化,开源 | 中文生产环境 |
| m3e-large | 1024 | 63.0% | 中文开源,轻量 | 私有部署 |
| text-embedding-3-large | 3072 | 64.6% | 多语言支持 | 中英双语 |
| GTE-large-zh | 1024 | 64.3% | 阿里开源 | 中文通用 |
开源 vs 闭源
| 维度 | 开源模型 | 闭源模型(OpenAI/Cohere) |
|---|---|---|
| 成本 | 免费 | 按 token 付费 |
| 部署 | 需 GPU / CPU | API 调用 |
| 数据隐私 | 完全私有 | 数据离境 |
| 定制性 | 可微调 | 不可修改 |
| 质量 | 中等偏上 | 最好 |
MTEB 基准测试解读
MTEB(Massive Text Embedding Benchmark)是评估 Embedding 模型的标准:
MTEB 排行榜:https://huggingface.co/spaces/mteb/leaderboard
评估维度:
├── 分类 (Classification)
├── 聚类 (Clustering)
├── 成对排序 (Pair Classification)
├── 重排序 (Reranking)
├── 检索 (Retrieval) ← RAG 最看重这个
├── STS (语义相似度)
└── Summarization
Retrieval 得分对比:
| 模型 | Retrieval | 中文检索 |
|---|---|---|
| text-embedding-3-large | 64.6% | 很强 |
| bge-large-en-v1.5 | 63.3% | 英文更强 |
| bge-large-zh | 64.5% | 中文最强 |
| m3e-large | 63.0% | 中文可用 |
实战选型指南
场景 1:纯中文知识库
# 推荐:bge-large-zh
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
# 编码
query = "如何配置 Nginx 反向代理?"
docs = ["Nginx配置教程", "Apache使用指南", "Docker部署"]
query_emb = model.encode(query)
doc_embs = model.encode(docs)
# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity([query_emb], doc_embs)[0]
# [0.89, 0.32, 0.45]
场景 2:中英双语知识库
# 推荐:text-embedding-3-large 或 bge-large-en-v1.5
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-large",
input="K8s deployment guide"
)
embedding = response.data[0].embedding # 3072 维
场景 3:本地部署、低成本
# 推荐:m3e-large 或 bge-small
from sentence_transformers import SentenceTransformer
# CPU 友好,推理快
model = SentenceTransformer('moka-ai/m3e-base')
# 批量编码
embeddings = model.encode(documents, batch_size=32, show_progress_bar=True)
场景 4:极致精度(学术/法律)
# 推荐:E5-mistral-7b(开源最强)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('intfloat/e5-mistral-7b-instruct')
# E5 系列需要加前缀
query = "query: " + user_query
doc = "passage: " + document
query_emb = model.encode(query)
doc_emb = model.encode(doc)
Embedding 调优技巧
1. 分块策略(Chunking)
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 中文推荐:按段落 + 固定长度
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块 500 tokens
chunk_overlap=50, # 重叠 50 tokens 保连贯
separators=["\n\n", "\n", "。", "?", "!"]
)
chunks = splitter.split_text(long_document)
不同场景的 chunk 大小:
| 场景 | Chunk Size | 说明 |
|---|---|---|
| 论文/书籍 | 1000+ tokens | 长段落语义完整 |
| 文档/报告 | 500 tokens | 平衡精度和召回 |
| 代码 | 200-500 tokens | 按函数/类分块 |
| QA 对 | 100-200 tokens | 短小精悍 |
2. 混合检索
# 语义向量检索 + 关键词 BM25 检索
def hybrid_search(query, top_k=10):
# 1. 向量检索
vector_results = vector_db.similarity_search(query, k=top_k*2)
# 2. 关键词检索
keyword_results = bm25.search(query, k=top_k*2)
# 3. RRF 融合
fused = reciprocal_rank_fusion(
[vector_results, keyword_results],
k=60 # RRF 参数
)
return fused[:top_k]
3. 重排序(Rerank)
from sentence_transformers import CrossEncoder
reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6')
def rerank(query, documents, top_k=5):
pairs = [(query, doc) for doc in documents]
scores = reranker.predict(pairs)
# 按分数排序
ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
return ranked[:top_k]
Embedding 模型使用成本对比
| 模型 | 100万 tokens 成本 | 维度 | 说明 |
|---|---|---|---|
| text-embedding-3-large | $0.13 | 3072 | OpenAI API |
| text-embedding-3-small | $0.02 | 1536 | OpenAI API |
| bge-large-zh | 免费 | 1024 | 开源,自托管 |
| m3e-large | 免费 | 1024 | 开源,轻量 |
本地部署成本估算:
| 模型 | GPU 显存 | CPU 推理速度 |
|---|---|---|
| bge-large-zh | 2GB | ~100 docs/s |
| m3e-base | 1GB | ~500 docs/s |
| E5-mistral-7b | 16GB | ~10 docs/s |
💡 小结
Embedding 选型决策树:
需要中文?
├── 是 → 需要微调?
│ ├── 是 → 用 bge-large-zh 微调
│ └── 否 → 数据隐私?
│ ├── 是 → bge-large-zh(本地部署)
│ └── 否 → text-embedding-3-large
└── 否(英文为主)
├── 追求精度 → E5-mistral-7b
├── 追求性价比 → bge-large-en-v1.5
└── 快速原型 → text-embedding-3-small
实践建议:
- 先用 MTEB 榜单选 3-5 个候选模型
- 用自己的数据测——benchmark 不代表你的场景
- 中文场景优先 bge-large-zh,开源免费效果好
- 精度优先用 text-embedding-3-large,成本可接受