name: embedding-optimization description: 通过模型选择、分块策略、缓存和性能调优,优化用于RAG系统的向量嵌入。在构建需要成本效益高、高质量的嵌入的语义搜索、RAG管道或文档检索系统时使用。
嵌入优化
在RAG和语义搜索系统中,优化嵌入生成的成本、性能和质量。
何时使用此技能
在以下情况下触发此技能:
- 构建RAG(检索增强生成)系统
- 实施语义搜索或相似性检测
- 优化嵌入API成本(降低70-90%)
- 通过更好的分块提高文档检索质量
- 处理大型文档语料库(数千到数百万个文档)
- 在基于API和本地嵌入模型之间进行选择
模型选择框架
根据需求选择最优嵌入模型:
快速推荐:
- 初创/MVP:
all-MiniLM-L6-v2(本地,384维,零API成本) - 生产环境:
text-embedding-3-small(API,1,536维,平衡质量/成本) - 高质量:
text-embedding-3-large(API,3,072维,高级) - 多语言:
multilingual-e5-base(本地,768维)或Cohereembed-multilingual-v3.0
有关详细决策框架,包括成本比较、质量基准和数据隐私考虑,请参阅references/model-selection-guide.md。
模型比较摘要:
| 模型 | 类型 | 维度 | 每百万令牌成本 | 最佳适用场景 |
|---|---|---|---|---|
| all-MiniLM-L6-v2 | 本地 | 384 | $0(仅计算成本) | 高容量,预算紧张 |
| BGE-base-en-v1.5 | 本地 | 768 | $0(仅计算成本) | 质量+成本平衡 |
| text-embedding-3-small | API | 1,536 | $0.02 | 通用生产目的 |
| text-embedding-3-large | API | 3,072 | $0.13 | 高质量需求 |
| embed-multilingual-v3.0 | API | 1,024 | $0.10 | 支持100+种语言 |
分块策略
基于内容类型和用例选择分块策略:
内容类型 → 策略映射:
- 文档: 递归(标题感知),800字符,100重叠
- 代码: 递归(函数级别),1,000字符,100重叠
- 问答/FAQ: 固定大小,500字符,50重叠(精确检索)
- 法律/技术: 语义(大),1,500字符,200重叠(上下文保存)
- 博客文章: 语义(段落),1,000字符,100重叠
- 学术论文: 递归(章节感知),1,200字符,150重叠
有关详细分块模式、决策树和实施指南,请参阅references/chunking-strategies.md。
使用CLI快速开始:
python scripts/chunk_document.py \
--input document.txt \
--content-type markdown \
--chunk-size 800 \
--overlap 100 \
--output chunks.jsonl
缓存实施
通过内容寻址缓存实现80-90%的成本降低。
按查询量缓存的架构:
- <10K查询/月: 内存缓存(Python
lru_cache) - 10K-100K查询/月: Redis(快速,基于TTL过期)
- 100K-1M查询/月: Redis(热)+ PostgreSQL(温)
- >1M查询/月: 多层(Redis + PostgreSQL + S3)
生产环境缓存与Redis:
# 启用缓存嵌入文档
python scripts/cached_embedder.py \
--model text-embedding-3-small \
--input documents.jsonl \
--output embeddings.npy \
--cache-backend redis \
--cache-ttl 2592000 # 30天
缓存ROI示例:
- 50,000文档块
- 20%重复内容
- 无缓存:$0.50 API成本
- 有缓存(60%命中率):$0.20 API成本
- 节省:60%($0.30)
维度权衡
平衡存储、搜索速度和质量:
| 维度 | 存储(100万向量) | 搜索速度(p95) | 质量 | 用例 |
|---|---|---|---|---|
| 384 | 1.5 GB | 10毫秒 | 良好 | 大规模搜索 |
| 768 | 3 GB | 15毫秒 | 高 | 通用RAG |
| 1,536 | 6 GB | 25毫秒 | 很高 | 高质量检索 |
| 3,072 | 12 GB | 40毫秒 | 最高 | 高级应用 |
关键见解: 对于大多数RAG应用,768维度(BGE-base-en-v1.5本地或等效)提供最佳质量/成本/速度平衡。
批量处理优化
最大化大规模摄入的吞吐量:
OpenAI API:
- 每请求批处理最多2,048个输入
- 实施速率限制(取决于层级:500-5,000 RPM)
- 使用并行请求,在速率限制时退避
本地模型(sentence-transformers):
- GPU加速(CUDA,Apple Silicon的MPS)
- 批量大小调优(基于GPU内存,32-128)
- 多GPU支持,最大化吞吐量
预期吞吐量:
- OpenAI API:1,000-5,000文本/分钟(取决于速率限制)
- 本地GPU(RTX 3090):5,000-10,000文本/分钟
- 本地CPU:100-500文本/分钟
性能监控
跟踪优化关键指标:
关键指标:
- 延迟: 嵌入生成时间(p50,p95,p99)
- 吞吐量: 每秒/分钟嵌入数
- 成本: API使用跟踪(每1K/1M令牌的美元)
- 缓存效率: 命中率百分比
有关详细监控设置、指标收集模式和仪表板,请参阅references/performance-monitoring.md。
使用包装器监控:
from scripts.performance_monitor import MonitoredEmbedder
monitored = MonitoredEmbedder(
embedder=your_embedder,
cost_per_1k_tokens=0.00002 # OpenAI定价
)
embeddings = monitored.embed_batch(texts)
metrics = monitored.get_metrics()
print(f"缓存命中率:{metrics['cache_hit_rate_pct']}%")
print(f"总成本:${metrics['total_cost_usd']}")
工作示例
参见examples/目录以获取完整实现:
Python示例:
examples/openai_cached.py- 带Redis缓存的OpenAI嵌入examples/local_embedder.py- sentence-transformers本地嵌入examples/smart_chunker.py- 内容感知递归分块examples/performance_monitor.py- 管道性能跟踪examples/batch_processor.py- 大规模文档处理
所有示例包括:
- 完整、可运行代码
- 依赖安装说明
- 错误处理和重试逻辑
- 配置选项
集成点
上游(此技能提供至):
- 向量数据库: 嵌入流至Pinecone、Weaviate、Qdrant、pgvector
- RAG系统: 优化嵌入用于检索管道
- 语义搜索: 查询和文档嵌入用于相似性搜索
下游(此技能使用自):
- 文档处理: 嵌入前分块文档
- 数据摄入: 从各种源处理文档
相关技能:
- 对于RAG架构,参见
building-ai-chat技能 - 对于向量数据库操作,参见
databases-vector技能 - 对于数据摄入管道,参见
ingesting-data技能
常见模式
模式1:RAG管道
文档 → 分块 → 嵌入 → 存储(向量数据库) → 检索
模式2:语义搜索
查询 → 嵌入 → 搜索(向量数据库) → 排名 → 显示
模式3:多阶段检索(成本优化)
查询 → 廉价嵌入(384维) → 初始搜索 →
昂贵嵌入(1,536维) → 重排Top-K → 返回
成本节省: 相比单阶段昂贵嵌入,减少70%
快速参考清单
模型选择:
- [ ] 识别数据隐私需求(本地vs. API)
- [ ] 计算预期查询量
- [ ] 确定质量要求(良好/高/最高)
- [ ] 检查多语言支持需求
分块:
- [ ] 分析内容类型(代码、文档、法律等)
- [ ] 选择合适分块大小(500-1,500字符)
- [ ] 设置重叠以防止上下文丢失(50-200字符)
- [ ] 验证分块保存语义边界
缓存:
- [ ] 实施内容寻址哈希
- [ ] 选择缓存后端(Redis、PostgreSQL)
- [ ] 基于内容波动性设置TTL
- [ ] 监控缓存命中率(目标:>60%)
性能:
- [ ] 跟踪延迟(嵌入生成时间)
- [ ] 测量吞吐量(嵌入/秒)
- [ ] 监控成本(API调用的美元支出)
- [ ] 优化批量大小以实现最大效率