You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:00:07