阿里云百炼向量模型踩坑一次最多传20条超过就报400错误**在使用阿里云百炼DashScope的向量模型时发现文档切分后如果一次上传超过20条就会报 400 错误。本文记录问题原因和解决方案。一、问题描述在使用 LangChain 阿里云百炼做 RAG 应用时将文档切分成多个 chunk 后调用 embedding 模型生成向量fromlangchain_community.embeddingsimportDashScopeEmbeddings embeddingsDashScopeEmbeddings(modeltext-embedding-v3)# 假设切分出了 50 个 chunktexts[chunk1,chunk2,...,chunk50]# 一次性传入所有 chunkvectorsembeddings.embed_documents(texts)# ❌ 报错错误信息dashscope.common.error.InvalidParameter: HTTP code 400, {code:InvalidParameter,message:The input is invalid...,request_id:xxx}或者openai.BadRequestError: Error code: 400 - {error: {code: InvalidParameter, message: The input is invalid...}}二、原因分析2.1 官方文档的限制查阅阿里云百炼官方文档发现text-embedding-v3模型有以下限制限制项限制值单次请求最多输入条数20 条单条文本最大 Token 数8192总 Token 数单次请求约 32000关键点一次请求最多只能传入20 条文本超过就会报 400 错误2.2 LangChain 默认行为LangChain 的embed_documents()方法默认会一次性传入所有文本不会自动分批。所以当你的文档切分超过 20 个 chunk 时就会触发限制。三、解决方案方案一手动分批处理推荐fromlangchain_community.embeddingsimportDashScopeEmbeddings embeddingsDashScopeEmbeddings(modeltext-embedding-v3)defbatch_embed_documents(embeddings,texts,batch_size20):分批调用 embedding 接口all_vectors[]foriinrange(0,len(texts),batch_size):batchtexts[i:ibatch_size]vectorsembeddings.embed_documents(batch)all_vectors.extend(vectors)print(f已处理{min(ibatch_size,len(texts))}/{len(texts)}条)returnall_vectors# 使用texts[chunk1,chunk2,...,chunk50]# 假设 50 个 chunkvectorsbatch_embed_documents(embeddings,texts,batch_size20)print(f生成了{len(vectors)}个向量)方案二自定义 Embeddings 类fromlangchain_community.embeddingsimportDashScopeEmbeddingsfromtypingimportListclassBatchDashScopeEmbeddings(DashScopeEmbeddings):支持批量处理的 DashScope Embeddingsbatch_size:int20# 每批处理的条数defembed_documents(self,texts:List[str])-List[List[float]]:分批生成文档向量all_embeddings[]foriinrange(0,len(texts),self.batch_size):batchtexts[i:iself.batch_size]# 调用父类方法batch_embeddingssuper().embed_documents(batch)all_embeddings.extend(batch_embeddings)returnall_embeddings# 使用embeddingsBatchDashScopeEmbeddings(modeltext-embedding-v3,batch_size20)# 现在可以一次性传入所有文本内部会自动分批texts[chunk1,chunk2,...,chunk50]vectorsembeddings.embed_documents(texts)# ✅ 正常工作方案三使用 OpenAI 兼容接口fromlangchain_openaiimportOpenAIEmbeddings# 阿里云百炼兼容 OpenAI 接口embeddingsOpenAIEmbeddings(modeltext-embedding-v3,openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1,openai_api_keyyour-api-key,chunk_size20# 关键参数设置每批处理条数)# 使用texts[chunk1,chunk2,...,chunk50]vectorsembeddings.embed_documents(texts)# ✅ 自动分批四、完整示例代码4.1 完整的 RAG 流程fromlangchain_community.embeddingsimportDashScopeEmbeddingsfromlangchain_community.vectorstoresimportFAISSfromlangchain.text_splitterimportRecursiveCharacterTextSplitter# 1. 初始化 embeddings带批量处理classBatchDashScopeEmbeddings(DashScopeEmbeddings):batch_size:int20defembed_documents(self,texts):all_embeddings[]foriinrange(0,len(texts),self.batch_size):batchtexts[i:iself.batch_size]batch_embeddingssuper().embed_documents(batch)all_embeddings.extend(batch_embeddings)returnall_embeddings embeddingsBatchDashScopeEmbeddings(modeltext-embedding-v3,dashscope_api_keyyour-api-key)# 2. 准备文档documents[公司规定员工必须遵守...,费用报销业务活动中产生的费用...,奖惩制度对于符合下列条件的员工...,# ... 更多文档]# 3. 文档切分text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)chunkstext_splitter.split_text(\n.join(documents))print(f切分成了{len(chunks)}个 chunk)# 4. 创建向量数据库自动分批处理vectorstoreFAISS.from_texts(textschunks,embeddingembeddings)print(向量数据库创建成功)# 5. 保存和加载vectorstore.save_local(faiss_index)# vectorstore FAISS.load_local(faiss_index, embeddings)# 6. 检索测试query费用报销需要什么resultsvectorstore.similarity_search(query,k3)fordocinresults:print(doc.page_content)print(---)4.2 异常处理版本importtimefromtypingimportListfromlangchain_community.embeddingsimportDashScopeEmbeddingsclassRobustDashScopeEmbeddings(DashScopeEmbeddings):带重试和异常处理的 DashScope Embeddingsbatch_size:int20max_retries:int3retry_delay:float1.0defembed_documents(self,texts:List[str])-List[List[float]]:all_embeddings[]totallen(texts)foriinrange(0,total,self.batch_size):batchtexts[i:iself.batch_size]batch_numi//self.batch_size1forattemptinrange(self.max_retries):try:batch_embeddingssuper().embed_documents(batch)all_embeddings.extend(batch_embeddings)print(f✅ 批次{batch_num}处理成功 ({min(iself.batch_size,total)}/{total}))breakexceptExceptionase:print(f❌ 批次{batch_num}失败 (尝试{attempt1}/{self.max_retries}):{e})ifattemptself.max_retries-1:time.sleep(self.retry_delay*(attempt1))else:raiseRuntimeError(f批次{batch_num}处理失败已重试{self.max_retries}次)returnall_embeddings# 使用embeddingsRobustDashScopeEmbeddings(modeltext-embedding-v3,dashscope_api_keyyour-api-key,batch_size20,max_retries3)五、其他向量模型的限制对比模型单次最大条数单条最大 Token备注阿里云 text-embedding-v3208192本文主角阿里云 text-embedding-v2252048旧版本OpenAI text-embedding-3-small20488191限制宽松OpenAI text-embedding-3-large20488191限制宽松智谱 embedding-3258192类似限制结论不同模型的限制不同使用前一定要查看官方文档六、常见问题Q1为什么阿里云要限制 20 条主要是为了控制单次请求的计算量避免超时保证服务质量防止单个用户占用过多资源降低出错概率小批量更容易定位问题Q2batch_size 设置成多少合适推荐值20官方限制保守值10-15留点余量不推荐超过 20会报错Q3能不能异步批量处理可以使用asyncio加速importasynciofromlangchain_community.embeddingsimportDashScopeEmbeddingsasyncdefasync_batch_embed(embeddings,texts,batch_size20):异步批量处理semaphoreasyncio.Semaphore(5)# 最多 5 个并发asyncdefprocess_batch(batch):asyncwithsemaphore:returnembeddings.embed_documents(batch)tasks[]foriinrange(0,len(texts),batch_size):batchtexts[i:ibatch_size]tasks.append(process_batch(batch))resultsawaitasyncio.gather(*tasks)return[vecforbatch_vecsinresultsforvecinbatch_vecs]# 使用# vectors asyncio.run(async_batch_embed(embeddings, texts))Q4报错后如何恢复建议实现断点续传defembed_with_checkpoint(embeddings,texts,checkpoint_fileembeddings.pkl):带断点续传的 embeddingimportpickleimportos# 加载已处理的结果ifos.path.exists(checkpoint_file):withopen(checkpoint_file,rb)asf:all_embeddingspickle.load(f)start_idxlen(all_embeddings)print(f从断点恢复已处理{start_idx}条)else:all_embeddings[]start_idx0# 继续处理foriinrange(start_idx,len(texts),20):batchtexts[i:i20]batch_embeddingsembeddings.embed_documents(batch)all_embeddings.extend(batch_embeddings)# 保存断点withopen(checkpoint_file,wb)asf:pickle.dump(all_embeddings,f)print(f进度{len(all_embeddings)}/{len(texts)})returnall_embeddings七、总结要点说明问题阿里云百炼向量模型单次最多传 20 条现象超过 20 条报 400 错误解决分批处理每批 ≤ 20 条推荐使用OpenAIEmbeddings(chunk_size20)或自定义批量类最佳实践# 推荐写法使用 OpenAI 兼容接口 chunk_size 参数fromlangchain_openaiimportOpenAIEmbeddings embeddingsOpenAIEmbeddings(modeltext-embedding-v3,openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1,openai_api_keyyour-api-key,chunk_size20# 自动分批)八、参考资料阿里云百炼官方文档 - 文本嵌入模型LangChain DashScope Embeddings 文档DashScope API 错误码说明