尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DashScope Embedding 分批处理实战——单批 20 条的完整解决方案
在使用阿里云 DashScope 向量模型如text-embedding-v2进行向量化时你是否遇到过batch size is invalid, it should not be larger than 20的报错本文从源码层面剖析问题根因并提供一套完整的分批处理方案让你的 embedding 流程稳如磐石。问题现象当你在项目中调用 DashScope Embedding API 时突然收到如下报错status_code: 400 code: InvalidParameter message: 400 InternalError.Algo.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这意味着 DashScope Embedding API 对单次请求的文本数量有硬性限制最多 20 条。根因分析为什么会触发这个报错在典型的 RAG 项目或知识库构建场景中我们通常会这样写代码fromlangchain.embeddingsimportDashScopeEmbeddingsfromlangchain.vectorstoresimportMilvus# 1. 初始化 embedding 模型embeddingsDashScopeEmbeddings(modeltext-embedding-v2,dashscope_api_keysk-xxxx)# 2. 文档切分后得到大量 chunkdoc_list[...]# 假设有 100 个子块content_list[doc.page_contentfordocindoc_list]# 3. 一次性调用 embedding → 报错vectorsembeddings.embed_documents(content_list)# 超过 20 条就炸# 4. 一次性写入 Milvus → 同样可能炸vector_store.add_documents(doc_list)# 内部也会调 embedding两处高危调用位置调用方式触发场景embedding 计算embeddings.embed_documents(content_list)手动批量向量化向量库存储vector_store.add_documents(doc_list)框架自动调 embedding只要content_list或doc_list的长度超过 20就会触发400 InvalidParameter。解决方案分批处理Step 1写一个通用的分批工具函数fromtypingimportList,Generatordefbatch_split(lst:list,batch_size:int20)-Generator[List,None,None]: 将列表切分为多个小批次 Args: lst: 待切分的原始列表 batch_size: 每批最大数量默认 20适配 DashScope 限制 Yields: 每批子列表 Example: items list(range(45)) for batch in batch_split(items, 20): ... print(f本批 {len(batch)} 条) ... 本批 20 条 本批 20 条 本批 5 条 foriinrange(0,len(lst),batch_size):yieldlst[i:ibatch_size]设计要点使用Generator惰性产出不占用额外内存默认batch_size20与 DashScope 限制对齐最后一批不足 20 条时自动兜底Step 2分批调用 Embeddingfromlangchain.embeddingsimportDashScopeEmbeddingsdefbatch_embed_documents(embeddings:DashScopeEmbeddings,texts:List[str],batch_size:int20)-List[List[float]]: 分批向量化文本规避 DashScope 单批 20 条限制 Args: embeddings: DashScope Embedding 实例 texts: 待向量化的文本列表 batch_size: 每批数量默认 20 Returns: 所有文本的向量结果顺序与输入一致 all_vectors[]foridx,batchinenumerate(batch_split(texts,batch_size)):print(f正在处理第{idx1}批共{len(batch)}条...)# 分批调用每次最多 20 条batch_vectorsembeddings.embed_documents(batch)all_vectors.extend(batch_vectors)# 可选添加短暂延时避免 QPS 超限# time.sleep(0.1)returnall_vectors# 使用示例texts[doc.page_contentfordocindoc_list]# 假设有 100 条vectorsbatch_embed_documents(embeddings,texts)print(f共生成{len(vectors)}个向量维度{len(vectors[0])})关键点使用batch_split将文本切成 ≤20 的小批每批调用embed_documents()结果用extend()合并顺序与输入完全一致不影响后续检索匹配Step 3分批写入向量库Milvus / Chroma / FAISS方案 A手动分批写入 Milvusfromlangchain.schemaimportDocumentfromlangchain.vectorstoresimportMilvusdefbatch_add_documents(vector_store:Milvus,documents:List[Document],batch_size:int20)-None: 分批将文档写入 Milvus规避 DashScope embedding 限制 Args: vector_store: Milvus 向量库实例 documents: 待写入的 Document 列表 batch_size: 每批数量默认 20 foridx,batchinenumerate(batch_split(documents,batch_size)):print(f正在写入第{idx1}批共{len(batch)}条...)# 分批写入框架内部会自动调 embeddingvector_store.add_documents(batch)# 使用示例batch_add_documents(vector_store,doc_list)方案 B如果你手动计算了向量直接分批插入defbatch_insert_with_vectors(vector_store:Milvus,documents:List[Document],vectors:List[List[float]],batch_size:int20)-None: 已知向量直接分批插入 Milvus # 确保文档和向量一一对应assertlen(documents)len(vectors)foridx,(doc_batch,vec_batch)inenumerate(zip(batch_split(documents,batch_size),batch_split(vectors,batch_size))):print(f正在插入第{idx1}批共{len(doc_batch)}条...)# Milvus 的 from_texts 或 add_texts 可以直接传入向量vector_store.add_texts(texts[d.page_contentfordindoc_batch],metadatas[d.metadatafordindoc_batch],embeddingsvec_batch)完整实战代码将上述方案整合为一个完整的工具类 DashScope Embedding 分批处理工具 解决 batch size 20 导致的 400 报错 fromtypingimportList,Generator,Optionalimporttimefromlangchain.embeddings.baseimportEmbeddingsfromlangchain.schemaimportDocumentfromlangchain.vectorstores.baseimportVectorStoreclassBatchEmbeddingProcessor:DashScope Embedding 分批处理器def__init__(self,embeddings:Embeddings,batch_size:int20,sleep_interval:Optional[float]None): Args: embeddings: Embedding 模型实例如 DashScopeEmbeddings batch_size: 每批最大数量默认 20 sleep_interval: 每批处理后的休眠秒数防 QPS 超限 self.embeddingsembeddings self.batch_sizebatch_size self.sleep_intervalsleep_intervalstaticmethoddefbatch_split(lst:list,batch_size:int20)-Generator[List,None,None]:切分列表为多个小批次foriinrange(0,len(lst),batch_size):yieldlst[i:ibatch_size]defembed_texts(self,texts:List[str])-List[List[float]]: 分批向量化文本 Args: texts: 待向量化的文本列表 Returns: 向量列表顺序与输入一致 all_vectors[]totallen(texts)foridx,batchinenumerate(self.batch_split(texts,self.batch_size)):print(f[Embedding] 批次{idx1}/{(total-1)//self.batch_size1}f本批{len(batch)}条)batch_vectorsself.embeddings.embed_documents(batch)all_vectors.extend(batch_vectors)ifself.sleep_interval:time.sleep(self.sleep_interval)returnall_vectorsdefadd_to_vector_store(self,vector_store:VectorStore,documents:List[Document])-None: 分批将文档写入向量库 Args: vector_store: 向量库实例Milvus / Chroma / FAISS documents: 待写入的 Document 列表 totallen(documents)foridx,batchinenumerate(self.batch_split(documents,self.batch_size)):print(f[VectorStore] 批次{idx1}/{(total-1)//self.batch_size1}f本批{len(batch)}条)vector_store.add_documents(batch)ifself.sleep_interval:time.sleep(self.sleep_interval)defprocess_documents(self,vector_store:VectorStore,documents:List[Document])-List[List[float]]: 一站式处理向量化 写入向量库 Args: vector_store: 目标向量库 documents: 待处理的文档列表 Returns: 所有向量 texts[doc.page_contentfordocindocuments]# Step 1: 分批向量化vectorsself.embed_texts(texts)# Step 2: 分批写入如果向量库支持直接传向量# 否则让 vector_store.add_documents 内部自行计算self.add_to_vector_store(vector_store,documents)returnvectors# 使用示例 if__name____main__:fromlangchain.embeddingsimportDashScopeEmbeddingsfromlangchain.vectorstoresimportMilvus# 初始化embeddingsDashScopeEmbeddings(modeltext-embedding-v2,dashscope_api_keysk-xxxx)vector_storeMilvus(embedding_functionembeddings,connection_args{host:localhost,port:19530},collection_namemy_docs)# 假设 doc_list 是从文件/网页切分出来的 100 个子块doc_list[...]# List[Document]# 使用分批处理器processorBatchEmbeddingProcessor(embeddingsembeddings,batch_size20,# DashScope 限制sleep_interval0.1# 防 QPS 超限可选)# 一站式处理vectorsprocessor.process_documents(vector_store,doc_list)print(f完成共处理{len(vectors)}条文档)方案对比方案优点缺点适用场景手动分批可控性强能看到进度代码稍多大规模文档处理BatchEmbeddingProcessor封装完整复用方便需额外封装团队项目、长期维护直接调 add_documents代码最少无法控制分批逻辑文档数量 20换用其他 Embedding 模型无分批限制需更换模型对 DashScope 有依赖时不可用进阶兼容其他模型如果你的项目需要同时支持多个 Embedding 模型可以进一步封装classUnifiedEmbeddingProcessor:统一的分批处理器兼容多种 Embedding 模型# 各模型的批量限制BATCH_LIMITS{dashscope:20,openai:2048,# OpenAI text-embedding-3 支持大批量qwen:25,# 通义千问bge:32,# BGE 模型}def__init__(self,embeddings:Embeddings,model_type:strdashscope):self.embeddingsembeddings self.batch_sizeself.BATCH_LIMITS.get(model_type,20)这样无论后端用哪个模型都能自动适配对应的 batch limit。常见坑点总结❌ 坑点 1忘了给add_documents分批# 错误内部会调 embedding同样触发 20 条限制vector_store.add_documents(doc_list)# doc_list 有 100 条 → ✅ 正确手动分批或自定义 VectorStore 子类forbatchinbatch_split(doc_list,20):vector_store.add_documents(batch)❌ 坑点 2只分批了 embedding没分批写入# 错误向量化分批了但写入还是一次性vectorsbatch_embed_documents(embeddings,texts)# ✅ 分批了vector_store.add_documents(doc_list)# ❌ 这里又炸了✅ 正确两个步骤都分批processorBatchEmbeddingProcessor(embeddings,batch_size20)processor.process_documents(vector_store,doc_list)# ✅ 全程分批❌ 坑点 3并发请求导致 QPS 超限# 错误如果用了多线程/异步可能 QPS 超限# DashScope 免费版通常限制 20 QPS✅ 正确添加延时或使用限速器processorBatchEmbeddingProcessor(embeddingsembeddings,batch_size20,sleep_interval0.1# 每批间隔 100ms控制 QPS 10)一句话总结DashScope Embedding 单批最多 20 条超过必报 400。写一个batch_split工具函数在向量化embed_documents和写入add_documents两个环节都分批处理即可彻底解决。如果这篇文章对你有帮助欢迎点赞、收藏、关注有问题可以在评论区留言讨论。
RELATED

相关推荐

CAM编程全流程与优化技巧实战指南

CAM编程全流程与优化技巧实战指南

1. CAM加工程序创建全流程解析在机械加工领域,CAM(计算机辅助制造)软件是将CAD设计转化为机床可执行代码的核心工具。作为从业十年的数控工程师,我经手过数百个加工项目,深刻体会到合理的CAM编程能提升30%以上的加工效…

📅 2026/9/12 19:15:57
从零构建AI编程智能体:基于LangChain的任务分解与工具调用实践

从零构建AI编程智能体:基于LangChain的任务分解与工具调用实践

1. 从“玩具”到“伙伴”:为什么我们需要AI编程智能体?最近几个月,我身边不少朋友和同事都在讨论一个词:AI编程智能体。从GitHub上各种新奇的开源项目,到技术社区里关于LangChain、LangGraph的讨论,再到大家…

📅 2026/9/12 18:58:50
Python数据分析实战:Pandas数据清洗、处理与聚合核心技巧

Python数据分析实战:Pandas数据清洗、处理与聚合核心技巧

1. 从“数据沼泽”到“数据绿洲”:为什么你离不开pandas 如果你刚接触Python数据分析,或者已经写了几百行代码,但每次处理Excel、CSV数据时,依然感觉像是在泥潭里挣扎——打开文件、复制粘贴、手动筛选、写一堆循环计算&#xff0…

📅 2026/9/12 18:43:30
MORE NEWS

更多资讯

📰

SQL 优化的 15 个小技巧,超实用!

SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 语句,因为它的改造成…

📰

源码深度解析,Spring 如何解决循环依赖?

1. 基础知识1.1 什么是循环依赖 ?一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用,有下面 3 种方式。我们看一个简单的 Demo,对标“情况 2”。Service public class Louzai1 {Autowiredprivate Louzai2…

📰

AIGC检测与优化工具千笔的技术原理与应用

1. 项目背景与核心价值"千笔专业降AIGC智能体"这个工具名称本身就揭示了它的核心定位——这是一款面向学术场景的AIGC内容检测与优化工具。在当前AI生成内容(AIGC)爆发的时代,教育领域面临着前所未有的挑战:如何区分学生…

📰

MLflow Skinny 轻量级客户端解析:无 SQL 存储、Server 与数据科学依赖的精简安装方案

MLflow Skinny 轻量级客户端解析:无 SQL 存储、Server 与数据科学依赖的精简安装方案 【免费下载链接】mlflow The open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and op…

📰

计算机中断处理机制:原理、流程与优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

从成分到方案:敏感肌美白产品怎么选?一个踩坑者的经验总结

写在前面: 我不是配方师,只是一个在敏感肌美白上踩了3年坑的普通人。这篇分享不讲复杂的化学原理,只讲我亲身验证过的筛选逻辑。问题:为什么敏感肌用美白产品容易翻车?敏感肌美白,和普通皮肤的提亮思路&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬