Qwen 向量嵌入机制
本文将深入解析 Gemini 与 Qwen 两大主流嵌入接口的批量处理能力、吞吐性能优化、向量维度规整及错误弹性设计。通过结合 rag-worker fast-ingest.ts
实践经验,帮助开发者系统理解两者在实际应用中的差异与优化策略,为高效构建 RAG 系统提供参考。
提供方能力对比
Gemini 与 Qwen 在嵌入接口设计上有显著差异,以下表格总结了两者在批量处理、并发策略、维度控制等方面的能力:
维度 | Gemini text-embedding-004 | Qwen text-embedding-v4 |
---|---|---|
批处理 | 不支持(单文本) | 支持批量 input[] (上限 10) |
并发策略 | 高并发抵消单请求延迟 | 适中并发 + 批量摊薄开销 |
维度控制 | outputDimensionality 可设 | 固定输出(需截断/补零) |
成本效率 | 请求数多 | 单请求承载多文本 |
失败范围 | 单条 | 整批(需整体重试) |
总体来看,Gemini 采用“多请求 + 单文本”并发模式,而 Qwen 倾向于“少请求 + 批量”以提升吞吐与成本效率。
高性能参数
嵌入批量与并发参数直接影响吞吐与稳定性,以下代码片段展示了针对不同提供方的推荐配置:
const MAX_CONCURRENT_FILES = PROVIDER === 'gemini' ? 30 : 15;
const MAX_CONCURRENT_EMBEDDINGS = PROVIDER === 'gemini' ? 50 : 25;
const EMBEDDING_BATCH_SIZE = PROVIDER === 'gemini' ? 1 : 10;
设计 rationale:Gemini 无法批量,需提升并发;Qwen 批量已接近最优,适当降低并发防止速率限制。区分“文件并发”与“嵌入并发”可避免瓶颈叠加。
Qwen 批量实现
Qwen 支持批量嵌入,以下代码演示如何一次性提交多个文本以减少握手与认证开销:
async function getBatchEmbeddings(texts: string[]): Promise<number[][]> {
const url = QWEN_BASE || 'https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings';
const r = await fetch(url, {
method: 'POST',
headers: { 'Authorization': `Bearer ${QWEN_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ model: QWEN_EMBED_MODEL, input: texts })
});
if (!r.ok) throw new Error(`Qwen API error ${r.status}`);
const j = await r.json();
return j.data.map(d => d.embedding.slice(0, EMBED_DIM));
}
Gemini 需循环单条请求,Qwen 则可批量发送数组,显著提升效率。
维度规整
嵌入向量维度需统一,以下代码用于截断或补零,确保写入向量库时维度一致:
if (vec.length > EMBED_DIM) vec = vec.slice(0, EMBED_DIM); // 截断
else if (vec.length < EMBED_DIM) vec = [...vec, ...new Array(EMBED_DIM - vec.length).fill(0)]; // 补零
这样可避免 upsert 失败,截断保留高信息密度前缀,补零则不影响相似度计算。
错误弹性
嵌入批量处理常见失败包括网络、速率限制、批内违规与超时。推荐如下弹性设计:
- try/catch 包裹批次,失败记录 sourcePath + offset
- 指数退避(可扩展,当前仅短暂延时)
- 校验长度与数值(NaN / 空数组)
- 批失败不中断主循环,提高整体覆盖率
后续将补充性能基线、成本分析与未来扩展建议。
小结
本章对 Gemini 与 Qwen 嵌入接口的批量能力、并发策略、维度规整及错误弹性进行了系统对比。Gemini 适合高并发单文本场景,Qwen 则通过批量提升整体效率。合理配置参数、统一向量维度并增强错误弹性,是高效构建 RAG 系统的关键。开发者可根据实际需求选择合适方案,优化嵌入性能与成本。