Embedding API 选型指南:语义搜索与 RAG 场景下如何选对向量模型
为什么 embedding API 选型比你想的更重要
很多人搭 RAG 管道时,对 embedding 模型的态度是随便挑一个用着先。这个决策比看起来贵得多——embedding 维度决定了向量数据库的存储成本,模型的语言覆盖能力直接影响中文检索召回率,而 API 调用价格在高吞吐场景下可以差出 10 倍以上。
一个典型的语义搜索系统,假设日均检索 100 万次、文档库 500 万段落,光 embedding 这一层的月度成本就能从几百元跑到几万元。选型决策值得认真对待。
主流模型横向对比
当前可用的 embedding 模型大致分三类:OpenAI 系、Cohere 系、开源/自托管系。以下是关键维度对比:
| 模型 | 维度 | 最大 token | 价格(每 1M token) | 多语言 | 适合场景 |
|---|---|---|---|---|---|
| text-embedding-3-small | 1536 | 8191 | ~$0.02 | 一般 | 成本敏感、英文为主 |
| text-embedding-3-large | 3072 | 8191 | ~$0.13 | 较好 | 高精度、多语言混合 |
| Cohere embed-v4 | 1024 | 512 | ~$0.10 | 优秀 | 企业搜索、多语言 |
| BGE-M3(开源) | 1024 | 8192 | 自托管 | 优秀 | 中文场景、成本可控 |
| Jina embeddings-v3 | 768~1024 | 8192 | ~$0.018 | 较好 | 长文档、性价比 |
几个容易忽略的细节:
text-embedding-3-large 支持 Matryoshka Representation Learning,可以把向量截断到更低维度(比如 256 维)而不损失太多精度。如果向量库存储压力大,这个特性很实用:
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
input="你的文本",
model="text-embedding-3-large",
dimensions=256 # 截断到 256 维
)
BGE-M3 在中文 MTEB 基准上得分持续领先商业模型,如果主要处理中文文档且有 GPU 资源,自托管 BGE-M3 是性价比最高的路线。
语义搜索 vs RAG:需求不同,侧重不同
语义搜索和 RAG 虽然都用 embedding,但瓶颈位置不一样。
语义搜索的核心指标是 top-k 召回率和延迟。用户输入一个 query,系统要在毫秒级返回最相关的结果。这里 embedding 的语言理解能力比向量维度更重要——一个 768 维但语义理解强的模型,通常比 3072 维但语义对齐差的模型召回率更高。
选型建议:
- 纯英文场景:text-embedding-3-small 够用,成本低
- 中英混合或纯中文:BGE-M3 自托管,或 Cohere embed-v4(API 方式)
- 对延迟敏感(<50ms):优先选维度低的模型,向量检索时间与维度正相关
RAG 场景的压力更复杂。除了 embedding 质量,chunk 策略对最终答案质量的影响可能更大。一个常见误区是把 chunk size 设得很小(比如 128 token),认为粒度细检索就准。实际上太短的 chunk 缺乏上下文,送给 LLM 之后生成质量反而下降。
实测建议:RAG 场景下 chunk size 在 256~512 token 之间,overlap 设 10%~15%,配合 text-embedding-3-large(需要高质量)或 BGE-M3(需要控制成本)。
embedding API 选型的三个决策维度
1. 语言分布
先统计你的文档库里中文占比。中文超过 30% 就不要只靠 text-embedding-3-small,它的中文语义对齐明显弱于专门优化过的模型。一个简单验证方法:取 50 条中文 query,分别用两个模型检索,人工评估 top-5 召回质量,差异通常肉眼可见。
2. 吞吐与成本预算
粗算公式:月成本 ≈ (日均文档更新量 + 日均查询量) × 平均 token 数 × 单价 × 30
假设日均查询 10 万次、每次 query 约 50 token:
- text-embedding-3-small:100,000 × 50 × $0.00000002 × 30 ≈ $3/月
- text-embedding-3-large:同条件约 $19.5/月
文档索引是一次性成本,查询是持续成本,两者要分开算。
3. 向量数据库兼容性
不同维度的 embedding 需要提前建好对应的 index。从 text-embedding-3-small(1536 维)切换到 BGE-M3(1024 维)意味着要重建整个向量库,迁移成本不小。选型时把这个锁定成本算进去。
可操作的接入示例
以 Python + Qdrant 为例,展示一个最小可运行的语义搜索流程:
from openai import OpenAI
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = OpenAI()
qdrant = QdrantClient(":memory:")
# 建集合,维度与模型对齐
qdrant.create_collection(
collection_name="docs",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)
def embed(text: str) -> list[float]:
resp = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return resp.data[0].embedding
# 索引文档
docs = ["语义搜索的核心是向量相似度", "RAG 把检索和生成结合起来"]
points = [
PointStruct(id=i, vector=embed(doc), payload={"text": doc})
for i, doc in enumerate(docs)
]
qdrant.upsert(collection_name="docs", points=points)
# 查询
query_vec = embed("向量检索怎么工作")
results = qdrant.search(collection_name="docs", query_vector=query_vec, limit=2)
for r in results:
print(r.score, r.payload["text"])
切换模型只需改 model 参数和 size,架构不变。
我在实际项目里接触过不少团队在 embedding 这层踩坑,最后发现 API 调用开销比预期高好几倍,或者中文召回率跑不起来。如果你的场景需要同时接入 OpenAI embedding、BGE 或 Cohere 等多家模型做 A/B 对比,可以考虑 XycAi 词元平台——一个接口兼容 OpenAI 格式、覆盖 200+ 全球模型的 API 聚合平台,官方模型低至官方价 1.4 折起,支持全球节点 CN2 直连,企业用户可开全球发票,换模型测效果只需改一行 base_url,省去多账号管理的麻烦。
一个 API 接入 200+ 全球 AI 模型
GPT · Claude · Gemini 官方模型低至 1.4 折起,持大模型算法备案号,CN2 直连低至 5ms,可开全球合规发票。
立即体验 XycAi →