2026/8/11 4:14:47

阿里云百炼向量模型使用笔记:单次请求20条上限的坑与填坑指南

阿里云百炼向量模型使用笔记:单次请求20条上限的坑与填坑指南 最近在用阿里云百炼DashScope的向量模型做RAG应用文档切分后调用embedding接口生成向量结果被一个400错误卡住了。翻了一圈官方文档才发现text-embedding-v3模型单次请求最多只能传20条文本——超过就报错。下面是问题复现和几种解决思路。一、问题是怎么出现的使用LangChain的DashScopeEmbeddings时把切分好的文本列表一次性传给embed_documents方法from langchain_community.embeddings import DashScopeEmbeddings embeddings DashScopeEmbeddings(modeltext-embedding-v3) # 假设文档被切成了50个chunk texts [chunk1, chunk2, ..., chunk50] # 一次性传入 —— 然后报错 vectors embeddings.embed_documents(texts) # ❌报错信息长这样{ 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 }或者通过OpenAI兼容接口调用时openai.BadRequestError: Error code: 400 - {error: {code: InvalidParameter, message: The input is invalid...}}二、为什么会有这个限制查了阿里云官方文档text-embedding-v3的接口限制如下限制项限制值单次请求最多输入条数20 条单条文本最大 Token 数8192单次请求总 Token 数约 32000限制原因大概是控制单次请求的计算量避免超时保证服务稳定性防止单用户占用过多资源小批量更容易定位错误而LangChain的embed_documents()默认就是一次性全传不会自动拆包所以只要chunk数超过20必然触发400。三、几种解决思路思路一写一个分批循环最直接自己控制分批逻辑每批20条循环调用from langchain_community.embeddings import DashScopeEmbeddings embeddings DashScopeEmbeddings(modeltext-embedding-v3) def batch_embed(embeddings, texts, batch_size20): all_vectors [] for i in range(0, len(texts), batch_size): batch texts[i:i batch_size] vectors embeddings.embed_documents(batch) all_vectors.extend(vectors) print(f已完成 {min(i batch_size, len(texts))}/{len(texts)} 条) return all_vectors # 使用 texts [chunk1, chunk2, ..., chunk50] vectors batch_embed(embeddings, texts, batch_size20)思路二继承DashScopeEmbeddings让类自己处理分批把分批逻辑封装到类内部对外保持统一的调用方式from langchain_community.embeddings import DashScopeEmbeddings from typing import List class BatchDashScopeEmbeddings(DashScopeEmbeddings): 自带分批能力的DashScope Embeddings batch_size: int 20 def embed_documents(self, texts: List[str]) - List[List[float]]: all_embeddings [] for i in range(0, len(texts), self.batch_size): batch texts[i:i self.batch_size] batch_embeddings super().embed_documents(batch) all_embeddings.extend(batch_embeddings) return all_embeddings # 使用 embeddings BatchDashScopeEmbeddings( modeltext-embedding-v3, batch_size20 ) vectors embeddings.embed_documents(texts) # ✅ 内部自动分批思路三使用OpenAI兼容接口靠chunk_size自动分批阿里云百炼提供了兼容OpenAI的接口LangChain的OpenAIEmbeddings支持chunk_size参数可以直接用from langchain_openai import OpenAIEmbeddings embeddings OpenAIEmbeddings( modeltext-embedding-v3, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1, openai_api_keyyour-api-key, chunk_size20 # 关键参数自动分批 ) vectors embeddings.embed_documents(texts) # ✅ 自动分批不用自己写循环这个方式代码最简洁推荐优先考虑。四、其他向量模型的限制对比模型单次最大条数单条最大Token备注阿里云 text-embedding-v3208192本文主角阿里云 text-embedding-v2252048旧版本OpenAI text-embedding-3-small20488191限制宽松OpenAI text-embedding-3-large20488191限制宽松智谱 embedding-3258192类似限制不同模型限制差异很大使用前最好先翻一下官方文档。五、几个常见问题Q1batch_size设多少合适官方上限是20建议直接设20保守一点可以设15留点余量。Q2能不能并发处理多个批次可以用asyncio加信号量控制并发数比如5个并发能加快整体速度但注意不要触发阿里云的限流。Q3报错之后怎么恢复上面提到的断点续传方案可以解决处理到一半失败了重新跑会从上次成功的位置继续。六、小结要点说明问题根源阿里云百炼向量模型单次最多传20条报错现象超过20条返回400错误核心解法分批处理每批不超过20条推荐方案使用OpenAIEmbeddings(chunk_size20)最省事最佳实践一句话用OpenAI兼容接口加上chunk_size20代码最干净不用自己写循环也不用改LangChain的默认行为。from langchain_openai import OpenAIEmbeddings embeddings OpenAIEmbeddings( modeltext-embedding-v3, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1, openai_api_keyyour-api-key, chunk_size20 # 搞定 )