
摘要调用阿里云百炼DashScope的向量化接口时单次传入的文本条数不能超过20。超过就报400错误。本文讲清楚错误原因、报错信息长什么样以及怎么用分批处理解决。一、报错长什么样调用向量化接口时如果一次性传入超过20条文本会收到如下错误json{ detail: status_code: 400 \n code: InvalidParameter \n message: 400 InternalError.Al go.InvalidParameter: Value error, batch size is invalid, it should not be larger than 20.: input.contents }关键信息batch size is invalid, it should not be larger than 20含义阿里云百炼向量模型接口限制单次批量输入的contents数组不能超过20条。你传的批次大于20服务直接拒绝。二、错误代码假设原来是这样写的pythonasync def add_chunks(self, document: PolicyDocument, chunks: list[DocumentChunk]) - None: embedding get_embeddings() # 所有chunk的内容一次性拿去向量化 content_list [chunk.content for chunk in chunks] vectors await asyncio.to_thread(embedding.embed_documents, content_list) # 构建doc_list... doc_list [...] # 一次性全部存入Milvus vector_store.add_documents(doc_list)当chunks数量超过20时embed_documents内部向阿里云百炼发起请求一次性传了超过20条文本触发接口限制报400错误。三、解决办法分批处理两种分批方式向量化时分批调用embed_documents之前先把content_list切成每批≤20条的小块入库时分批构建doc_list时控制每批数量你贴的修改方案采用的是第二种入库时分批。修改后代码pythonasync def add_chunks(self, document: PolicyDocument, chunks: list[DocumentChunk]) - None: # 提取内容、ID、元数据 texts [chunk.content for chunk in chunks] chunk_ids [chunk.id for chunk in chunks] metadatas [] for chunk in chunks: effective_date document.effective_date.isoformat() if document.effective_date else metadatas.append({ document_id: document.id, filename: document.filename, topic: document.topic or , effective_date: effective_date, section: chunk.section or , page: chunk.page or 0, parent_id: chunk.parent_id or , }) doc_list [] vector_store get_vector_store() # 关键每10条一批分批入库 for chunk_id, content, metadata in zip(chunk_ids, texts, metadatas): doc Document(page_contentcontent, metadatametadata, idchunk_id) doc_list.append(doc) if len(doc_list) 10: vector_store.add_documents(doc_list) doc_list [] # 清空准备下一批 # 处理最后一批不足10条的情况 if doc_list: vector_store.add_documents(doc_list)改动要点改动前改动后doc_list全部构建完一次性入库每凑够10条就入库一批一次入库可能包含几百条每批最多10条安全遗漏最后不足一批的数据循环结束后检查并入库剩余数据四、为什么要设成10而不是20代码里设的是10小于接口限制的20。留有余量有两个原因避免向量化接口和入库接口各自的限制冲突即使后续接口限制收紧比如降到10代码仍然可用如果你想卡着接口上限用20也行但10更稳妥。五、错误还可能是向量化阶段发生的如果你的代码是先向量化再入库而embed_documents一次性传了超过20条那么错误发生在向量化阶段入库代码根本执行不到。这种情况下需要在向量化之前就分批pythonimport asyncio async def add_chunks(self, document: PolicyDocument, chunks: list[DocumentChunk]) - None: embedding get_embeddings() content_list [chunk.content for chunk in chunks] # 分批向量化每批20条 batch_size 20 all_vectors [] for i in range(0, len(content_list), batch_size): batch content_list[i:i batch_size] vectors await asyncio.to_thread(embedding.embed_documents, batch) all_vectors.extend(vectors) # 后续处理所有向量...总结阿里云百炼向量接口单次最多20条超过就400。解决办法就是分批处理——每批控制在20条以内在向量化阶段或入库阶段分批都可以。代码里改成每10条一批入库留足余量。