Bad Request for url: https://www.dmxapi.cn/v1/embeddings; ETA blocked until fixe...

2026年06月09日 13:34 29.97 秒 success

错误信息

AncientRAG embedding failed embedding failed after 8 attempts: 400 Client Error: Bad Request for url: https://www.dmxapi.cn/v1/embeddings; ETA blocked until fixed

AI 解决方案

🔍 分析报告

1. 🌐 错误翻译


原文:embedding failed after 8 attempts: 400 Client Error: Bad Request for url: https://www.dmxapi.cn/v1/embeddings
译文:嵌入处理失败,已重试8次:请求 https://www.dmxapi.cn/v1/embeddings 时返回400错误(客户端错误:错误的请求)

2. 🎯 原因分析


根本原因:https://www.dmxapi.cn/v1/embeddings 接口发送的Embedding请求参数无效。

具体分析:

  • HTTP 400 (Bad Request) 表示客户端发送的请求在语法或参数上存在错误,服务器无法理解。

  • 失败发生在Embedding接口:请求内容可能包含:

  • - 超出模型允许的最大文本长度
    - 不支持的特殊字符或编码问题
    - 无效的文本内容(如空字符串、纯空白)
    - 请求体格式错误(如JSON格式不正确)
    - 缺少必要的参数(如modelinput字段)
  • 重试8次后失败:系统已自动重试,表明错误是持续性的,并非临时网络问题。

  • ETA blocked until fixed:系统因该错误已阻塞后续任务,需要修复才能继续。
  • 3. 💡 解决方案

    步骤1:检查并清理输入文本

    # 示例:在调用Embedding API前验证输入
    def validate_text_for_embedding(text, max_length=8000):
        """验证文本是否适合Embedding"""
        if not text or not text.strip():
            raise ValueError("文本不能为空或纯空白")
        
        if len(text) > max_length:
            # 截断或分块处理
            text = text[:max_length]
            print(f"警告:文本已截断至{max_length}字符")
        
        # 移除可能引起问题的特殊字符
        cleaned_text = text.encode('utf-8', 'ignore').decode('utf-8')
        return cleaned_text
    

    步骤2:验证API请求格式

    import requests
    import json
    
    def make_valid_embedding_request(text, model="text-embedding-ada-002"):
        """构建正确的Embedding请求"""
        url = "https://www.dmxapi.cn/v1/embeddings"
        
        headers = {
            "Authorization": "Bearer YOUR_API_KEY",  # 替换为实际API密钥
            "Content-Type": "application/json"
        }
        
        data = {
            "model": model,
            "input": validate_text_for_embedding(text)  # 使用验证后的文本
        }
        
        try:
            response = requests.post(url, headers=headers, json=data, timeout=30)
            response.raise_for_status()  # 自动抛出HTTP错误
            return response.json()
        except requests.exceptions.HTTPError as e:
            print(f"API错误: {e.response.status_code} - {e.response.text}")
            return None
    

    步骤3:实现带指数退避的重试机制

    import time
    from requests.exceptions import RequestException
    
    def call_embedding_with_retry(text, max_retries=3):
        """带重试的Embedding调用"""
        for attempt in range(max_retries):
            result = make_valid_embedding_request(text)
            if result:
                return result
            
            if attempt < max_retries - 1:
                wait_time = 2 ** attempt  # 指数退避
                print(f"尝试 {attempt + 1} 失败,{wait_time}秒后重试...")
                time.sleep(wait_time)
        
        raise Exception(f"Embedding失败,已尝试{max_retries}次")
    

    4. 🛡️ 预防措施

    • 添加输入预处理与验证层

    • - 在调用API前验证文本长度、格式和内容
      - 实现文本清洗管道,处理编码、特殊字符等

      • 完善错误处理与监控

      • - 记录详细的请求/响应日志(不含敏感信息)
        - 设置请求超时和重试策略(建议:2-3次指数退避重试)
        - 监控API错误率,设置报警阈值

        • 测试策略

        • - 使用单元测试验证不同边界情况的文本输入
          - 在生产环境前使用测试环境验证API兼容性

          推荐工具:

        • 使用 chardet 库自动检测文本编码

        • 集成日志库(如 logging)记录API交互细节

        • 使用 tenacity 库实现专业的重试逻辑