📖 什么是 Embedding?
凌晨3点17分,我盯着屏幕上那串数字发呆。1536个浮点数,密密麻麻像某种密码。这串数字,就是"人工智能"四个字在AI眼中的样子。
Embedding 把文字变成向量,把语义压缩成坐标。有了它,"猫"和"狗"的距离,比"猫"和"汽车"近得多——因为AI懂了。
核心作用:
- 语义搜索 - 搜"如何让AI更聪明"能找到"提升模型能力的方法"
- 相似度计算 - 自动判断两段文字有多像
- 聚类分析 - 把相似的内容自动归类
- RAG 基础 - 让检索有据可依
🏆 主流模型对比
🟢 OpenAI text-embedding-3-small
性价比之王,大多数场景的首选。
维度
1536
价格
$0.02/1M tokens
MTEB 得分
62.3
推荐场景
通用/生产
🔵 OpenAI text-embedding-3-large
精度需求高时选择,贵但准。
维度
3072
价格
$0.13/1M tokens
MTEB 得分
64.6
推荐场景
高精度
🟠 Cohere embed-v3
多语言支持最好,中文场景推荐。
维度
1024
价格
$0.10/1M tokens
MTEB 得分
64.5
推荐场景
中文/多语言
🟣 Google text-embedding-004
Vertex AI 原生,Google 生态首选。
维度
768
价格
$0.03/1M tokens
MTEB 得分
63.7
推荐场景
GCP 生态
⚫ 开源方案:BGE / MTEB Top
免费但需要自己部署,数据隐私最好。
维度
768-1024
价格
免费
MTEB 得分
60-65
推荐场景
自建/隐私
⚡ OpenClaw 集成示例
1. 配置 Embedding Provider
# ~/.openclaw/config.yaml
embedding:
provider: openai # openai | cohere | google | local
model: text-embedding-3-small
# 备选配置
fallback:
provider: local
model: sentence-transformers/all-MiniLM-L6-v2
# 缓存配置
cache:
enabled: true
ttl: 86400 # 24小时
maxSize: 10000
2. 使用 Embedding Skill
# Skills 配置
skills:
- id: embedding-service
name: 向量嵌入服务
config:
# OpenAI 配置
provider: openai
model: text-embedding-3-small
apiKey: ${OPENAI_API_KEY}
# 或使用本地模型
# provider: local
# model: BAAI/bge-large-zh-v1.5
# 批处理优化
batchSize: 100
maxConcurrency: 5
3. 代码调用示例
// 生成单个文本的 embedding
const embedding = await agent.skills.embedding.embed({
text: "OpenClaw 是一个强大的 Agent 框架"
});
console.log(embedding); // [0.023, -0.015, 0.089, ...] 1536维
// 批量生成
const embeddings = await agent.skills.embedding.embedBatch({
texts: [
"人工智能正在改变世界",
"机器学习是AI的核心技术",
"今天天气真不错"
]
});
// 相似度计算
const similarity = agent.skills.embedding.cosineSimilarity(
embeddings[0],
embeddings[1]
);
// 0.82 - 前两句相似度高
// 0.12 - 和第三句相似度低
💡 选择建议
🎯 按场景选模型
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 快速原型 / MVP | text-embedding-3-small | 便宜、快、够用 |
| 中文内容为主 | Cohere embed-v3 | 多语言优化最好 |
| 高精度检索 | text-embedding-3-large | 维度高、信息保留多 |
| 数据隐私敏感 | BGE-large-zh (本地) | 数据不出服务器 |
| 成本极致压缩 | all-MiniLM-L6-v2 (本地) | 免费、速度快 |
| 大规模生产 | text-embedding-3-small + 缓存 | 平衡成本和性能 |
⚠️ 常见踩坑
- 维度不匹配 - 换模型时要重建向量索引,不能混用
- 截断问题 - 超长文本会被截断,重要信息可能丢失
- 未做归一化 - 某些场景需要 L2 归一化
- 语言不匹配 - 英文模型处理中文效果差
- 缓存缺失 - 相同文本重复计算浪费钱
🚀 性能优化技巧
1. 缓存策略
# 配置 Redis 缓存
embedding:
cache:
type: redis
host: localhost
port: 6379
ttl: 604800 # 7天
keyPrefix: "emb:"
2. 批量处理
// 避免:逐个调用
for (const text of texts) {
await embed(text); // 慢!
}
// 推荐:批量调用
await embedBatch(texts); // 快!
3. 维度压缩
# OpenAI 支持 Matryoshka 嵌套
embedding:
model: text-embedding-3-small
dimensions: 512 # 从1536压缩到512
# 精度损失约 3-5%,但存储减半