Langchain+Qdrant写入超时问题求助(TimeoutError)
问题场景
我通过以下代码将带嵌入向量的文档存入Qdrant向量存储:
embeddings = OpenAIEmbeddings(openai_api_key=settings.OPENAI_API_KEY,headers=headers) db = Qdrant.from_documents( documents=documents, embedding=embeddings, collection_name=collection_name, url=settings.QDRANT_CONNECTION_STRING, force_recreate=False, ) db.add_documents(documents)
运行时随机出现超时错误:
TimeoutError: The write operation timed out
项目架构为前端上传文档,后端生成嵌入向量并完成入库操作。文档大小覆盖50KB到100MB,上传耗时从5秒到10分钟不等,超时错误无规律出现在不同大小和耗时的场景中。使用的Python库版本:langchain==0.0.350、qdrant-client==1.7.0
解决方案
调整Qdrant客户端超时参数
显式设置更长的超时时间覆盖默认值,避免因单次请求耗时过长触发超时:from qdrant_client import QdrantClient qdrant_client = QdrantClient( url=settings.QDRANT_CONNECTION_STRING, timeout=300 # 单位:秒,可根据实际场景调整 ) db = Qdrant.from_documents( documents=documents, embedding=embeddings, collection_name=collection_name, client=qdrant_client, force_recreate=False, )分批处理文档
将大文档拆分为小批量后逐个添加,降低单次请求的负载压力:from langchain.text_splitter import RecursiveCharacterTextSplitter # 先将文档拆分为更小的块(若未拆分) text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) split_docs = text_splitter.split_documents(documents) # 按批次添加,比如每50个文档为一批 batch_size = 50 for i in range(0, len(split_docs), batch_size): batch = split_docs[i:i+batch_size] db.add_documents(batch)优化嵌入向量生成环节
给OpenAI Embedding API配置超时参数,同时确保文档块大小合理,避免单个请求过大:embeddings = OpenAIEmbeddings( openai_api_key=settings.OPENAI_API_KEY, headers=headers, request_timeout=120 # 设置API请求超时,单位:秒 )添加重试机制
针对超时错误实现自动重试,降低随机超时的影响:from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10), retry=retry_if_exception_type(TimeoutError) ) def add_documents_with_retry(db, docs): db.add_documents(docs) # 使用重试函数添加文档 add_documents_with_retry(db, documents)检查Qdrant服务端状态
若为自托管Qdrant,确认服务端CPU、内存、网络带宽充足,可修改qdrant_config.yaml中的grpc或http超时参数,延长服务端的等待时间。
内容的提问来源于stack exchange,提问作者Ashish Kumar
相关产品推荐
相关产品推荐

