阿里云向量模型“每次只能 20 条“?

📅 发布时间:2026/8/11 4:14:50
阿里云向量模型“每次只能 20 条“? 阿里云向量模型每次只能 20 条一份可落地的分批解决方案做 RAG、语义检索、文本聚类时几乎都要先把文本转成向量。但阿里云百炼DashScope的通用文本向量模型有一个绕不开的限制单次 API 请求能处理的文本条数是有上限的。本文讲清楚限制到底是什么、超限会怎样并给出一套从最小可用到生产级的分批方案以及海量数据时的官方批量接口。一、问题背景到底限制是多少很多人笼统地说阿里云向量模型每次只能 20 条其实这个说法不够准确——上限取决于你用的是哪个模型版本。官方文档给出的限制如下模型向量维度单次最大条数单行最大 tokentext-embedding-v11536252048text-embedding-v21536252048text-embedding-v31024可降维108192text-embedding-v41024/1536/2048可降维108192qwen3.7-text-embedding可配置20128000text-embedding-async-v1/v2异步批量1536100,000单文件2048所以20 条是其中一个模型如qwen3.7-text-embedding的硬上限老一点的 v1/v2 反而能到 25 条而更新的 v3/v4 只有10 条。无论具体数字是多少本质都是单请求条数上限解法完全一致超过就分批。超限会怎样直接把所有文本一次性塞进input数组超量时会返回参数错误类似{code:InvalidParameter,message:The number of input texts exceeds the limit (max 10 for this model).}轻则整批失败、向量化中断重则在循环里每批都超量接口一直报错、Token 白扣。二、核心思路分批Batching把N条文本按batch_size取模型上限以内保险起见留点余量切成若干小批逐批调用再把每批返回的向量按原始顺序拼回去。要点只有三个切片texts[i : i batch_size]保序接口会按输入顺序返回并用text_index兼容模式叫index标记每条在批次里的位置拼回原数组即可。兜底单批失败要能重试触发限流429要退避。三、最小可用方案先跑通如果只是几百条、不在意速度下面 10 行就能解决问题importdashscopefromhttpimportHTTPStatusdefembed_batch(texts,modeltext-embedding-v3,batch_size10):分批调用向量模型返回与输入顺序一致的向量列表。results[]foriinrange(0,len(texts),batch_size):batchtexts[i:ibatch_size]respdashscope.TextEmbedding.call(modelmodel,inputbatch)ifresp.status_code!HTTPStatus.OK:raiseRuntimeError(f向量化失败:{resp.code}{resp.message})# 按 text_index 保序拼回results.extend(e[embedding]foreinresp.output[embeddings])returnresults# 用法texts[今天天气不错,阿里云向量模型有限制,这是第三条文本,...]# 任意长度vectorsembed_batch(texts,modeltext-embedding-v3,batch_size10)print(len(vectors),条向量维度,len(vectors[0]))⚠️batch_size一定要 ≤ 你所用模型的单次最大条数。v3/v4 填 10v1/v2 可填 25qwen3.7 填 20。四、生产级方案带重试、限流退避、并发真实业务里文本量大、网络会抖、还有 QPS 限流。下面这版加上了失败重试、限流指数退避、多线程并发提速、以及严格保序。importtimeimportdashscopefromhttpimportHTTPStatusfromconcurrent.futuresimportThreadPoolExecutor,as_completeddefembed_texts(texts,modeltext-embedding-v3,batch_size10,# 必须 ≤ 模型单批上限max_workers2,# 并发批数别太大易触发限流max_retries3,):生产级分批向量化保序、重试、限流退避、可选并发。results[None]*len(texts)defworker(start,chunk):last_errNoneforattemptinrange(max_retries):try:respdashscope.TextEmbedding.call(modelmodel,inputchunk)ifresp.status_codeHTTPStatus.OK:embsresp.output[embeddings]# 用 text_index 把每条向量放回原位置return[(starte[text_index],e[embedding])foreinembs]# 限流或其他错误指数退避后重试wait2**attempt last_errf{resp.code}{resp.message}time.sleep(wait)exceptExceptionase:# 网络异常等last_errstr(e)time.sleep(2**attempt)raiseRuntimeError(f批次{start}重试耗尽:{last_err})batches[(i,texts[i:ibatch_size])foriinrange(0,len(texts),batch_size)]withThreadPoolExecutor(max_workersmax_workers)asex:futures[ex.submit(worker,s,c)fors,cinbatches]forfinas_completed(futures):foridx,embinf.result():results[idx]emb# 按原下标落位顺序天然正确returnresults为什么这样写results [None] * len(texts)先占好位置最后按start text_index落位多线程乱序完成也不影响最终顺序。限流时2 ** attempt退避1s、2s、4s…避免疯狂重试把接口打挂。max_workers控制并发建议 2~4太大容易踩到 RPS 限流。五、海量数据用官方「批量/异步」接口如果要向量化的是上万甚至十万级的历史文档反复调同步接口既慢又贵。阿里云提供了专门的异步批量接口text-embedding-async-v1 / v2单次最多100,000 行文件 ≤ 200MB走「提交任务 → 轮询拿结果」两步适合离线建库成本低、不会卡限流。fromdashscopeimportBatchTextEmbedding resultBatchTextEmbedding.call(BatchTextEmbedding.Models.text_embedding_async_v2,urlhttps://your-bucket.oss-cn-beijing.aliyuncs.com/docs/embed_input.txt,# 每行一条文本text_typedocument,)print(result)异步接口拿到的是task_id需要再按 ID 轮询结果。它和上面的同步分批是互补关系实时/在线查询用同步分批离线大批量建库用异步接口。六、完整封装一个函数覆盖 90% 场景把选模型 → 定批大小 → 分批调用 → 保序合并 → 失败兜底收进一个工具函数业务侧只管传文本# 不同模型的单批上限集中管理避免硬编码出错MODEL_BATCH_LIMIT{text-embedding-v1:25,text-embedding-v2:25,text-embedding-v3:10,text-embedding-v4:10,qwen3.7-text-embedding:20,}defembed(texts,modeltext-embedding-v3,batch_sizeNone,max_workers2):limitMODEL_BATCH_LIMIT.get(model,10)batch_sizebatch_sizeorlimitifbatch_sizelimit:print(f警告: batch_size{batch_size}超过{model}上限{limit}已自动收敛)batch_sizelimitreturnembed_texts(texts,modelmodel,batch_sizebatch_size,max_workersmax_workers)这样无论换哪个模型都不会因为忘了改批大小而踩到上限。七、避坑清单批大小别拍脑袋v3/v4 只有 10 条最容易踩坑把上限写成配置表统一管理。维度要前后一致同一向量库Milvus / Chroma / DashVector建库和查询必须用同一个模型 同一维度否则向量不在同一语义空间相似度计算全错。长文本先分块单行超过模型 token 上限v1/v2 是 2048v3/v4 是 8192也要先切分否则单条就报错。query / document 要分清检索类任务建议给查询文本设text_typequery、文档设document召回效果明显更好v3/v4 支持。别用逐条调用for t in texts: embed(t)既慢又费 Token永远用批量 分批。Key 走环境变量export DASHSCOPE_API_KEYsk-xxx别硬编码进代码。总结阿里云向量模型每次只能 20 条本质是个单请求条数上限问题不同模型是 10 / 20 / 25 条不等。解法一句话把文本按模型上限切成小批逐批调用用text_index保序拼回在线实时走同步分批离线海量走异步批量接口。把上面embed()封装好以后无论模型怎么换、文本怎么涨向量化这层都不用再改。代码基于 DashScope百炼Python SDK模型上限以阿里云官方文档最新版为准。