AI_500_ERROR_FIX.md 6.3 KB

AI分析500错误修复方案

🔍 错误原因分析

错误信息

Failed to load resource: the server responded with a status of 500 (Internal Server Error)
fmode.query.mjs:8 Response
ERROR Error: [object Object]

根本原因

提示词(Prompt)过长导致豆包1.6模型API调用失败

  1. 提示词内容过长

    • 基础提示词:约200字符
    • 8个详细分析维度:约5000字符
    • 对话历史:每轮对话可能数千字符
    • 深度思考模式:额外200字符
    • 输出示例:约2000字符
    • 总计可能超过10000字符,远超模型上下文限制(约4K-8K tokens)
  2. 对话历史累积

    • 多轮对话后,历史记录会不断增长
    • 每次追问都会携带完整的对话历史
    • 导致提示词呈指数级增长
  3. 其他可能原因

    • 图片URL无法访问
    • 图片数量过多
    • API并发限制
    • 网络超时

✅ 已实施的修复

1. 增强错误日志(已完成) ✅

// 添加详细的调试日志
console.log('🤖 调用豆包1.6模型...');
console.log('📸 图片数量:', options.images.length);
console.log('📝 提示词长度:', prompt.length, '字符');
console.log('🏠 空间类型:', options.spaceType);
console.log('💬 对话历史:', conversationHistory?.length || 0, '条');

// 检查提示词长度
if (prompt.length > 10000) {
  console.warn('⚠️ 提示词过长,可能导致API调用失败');
}

2. 改进错误处理(已完成) ✅

error: (err) => {
  console.error('❌ AI分析失败,详细错误:', err);
  console.error('❌ 错误类型:', err?.constructor?.name);
  console.error('❌ 错误消息:', err?.message);
  console.error('❌ 错误详情:', JSON.stringify(err, null, 2));
  
  // 根据错误类型提供更具体的错误信息
  let errorMessage = 'AI分析失败';
  if (err?.message?.includes('500')) {
    errorMessage = 'AI服务暂时不可用(服务器错误),请稍后重试';
  } else if (err?.message?.includes('timeout')) {
    errorMessage = 'AI分析超时,请减少图片数量或简化需求后重试';
  } else if (err?.message?.includes('token')) {
    errorMessage = '提示词过长,请简化描述或减少对话历史';
  } else if (err?.message) {
    errorMessage = `AI分析失败: ${err.message}`;
  }
  
  reject(new Error(errorMessage));
  subscription?.unsubscribe();
}

3. 限制对话历史长度(已完成) ✅

// 限制最近3轮对话(用户+AI各3条)
if (conversationHistory && conversationHistory.length > 0) {
  const recentHistory = conversationHistory.slice(-6); // 最近3轮对话
  prompt += `\n\n【对话历史】\n以下是最近的对话记录:\n\n`;
  recentHistory.forEach((msg, index) => {
    const role = msg.role === 'user' ? '用户' : 'AI助手';
    // 限制每条消息最多500字符
    const content = msg.content.length > 500 
      ? msg.content.substring(0, 500) + '...' 
      : msg.content;
    prompt += `${role}:${content}\n\n`;
  });
}

🔧 使用建议

测试步骤

  1. 首次分析(无对话历史)

    上传1-2张图片 → 点击"AI分析" → 等待响应
    
    • 查看控制台日志:提示词长度应该 < 8000字符
    • 如果成功,说明首次分析没问题
  2. 追问测试(有对话历史)

    在对话框输入:"请详细分析色彩搭配" → 发送
    
    • 查看控制台日志:对话历史应该只有最近6条
    • 每条消息应该 ≤ 500字符
  3. 错误检查

    • 如果仍出现500错误,查看控制台完整错误信息
    • 检查提示词长度是否超过10000字符
    • 检查图片URL是否可访问

用户操作建议

  1. 减少图片数量

    • 首次分析建议上传1-3张关键图片
    • 不要一次上传超过5张图片
  2. 简化文字描述

    • 文字描述控制在100-200字以内
    • 避免复制大段文字
  3. 清空对话历史

    • 多轮对话后,如果出现错误,点击"清空对话"重新开始
    • 或者切换到其他空间,开始新的分析
  4. 分阶段提问

    • 不要在一次对话中问太多问题
    • 将复杂需求拆分为多个简单问题

📊 后续优化建议

短期优化(1-2天)

  1. 动态调整提示词

    // 根据是否有对话历史,使用不同的提示词版本
    if (conversationHistory && conversationHistory.length > 0) {
     // 使用简化版提示词(只包含核心维度)
     prompt = this.buildSimplePrompt(...);
    } else {
     // 使用完整版提示词(包含详细说明)
     prompt = this.buildFullPrompt(...);
    }
    
  2. 添加提示词压缩

    // 移除多余的空格和换行
    prompt = prompt.replace(/\n{3,}/g, '\n\n').trim();
    
  3. 图片预处理

    // 检查图片URL是否可访问
    // 压缩图片大小
    // 限制图片分辨率
    

中期优化(1周)

  1. 实现提示词模板系统

    • 基础模板:首次分析用(完整详细)
    • 追问模板:后续对话用(简化版)
    • 快速模板:快速分析用(极简版)
  2. 添加重试机制

    // 如果失败,自动简化提示词重试
    async function analyzeWithRetry(options) {
     try {
       return await analyze(options);
     } catch (err) {
       if (err.message.includes('500') || err.message.includes('token')) {
         // 使用简化版提示词重试
         return await analyzeSimple(options);
       }
       throw err;
     }
    }
    
  3. 提示词缓存

    • 缓存常用的分析维度模板
    • 减少重复构建提示词的开销

长期优化(1个月)

  1. 分片分析

    • 将8个维度分为2-3次分析
    • 每次只分析部分维度
    • 最后合并结果
  2. 流式优化

    • 利用流式API的优势
    • 实时显示分析进度
    • 允许用户提前查看部分结果
  3. 智能上下文管理

    • AI自动总结对话历史
    • 压缩长对话为简短摘要
    • 只保留关键信息

🚀 立即可用

现在的修复已经可以:

  1. ✅ 详细的错误日志,帮助定位问题
  2. ✅ 友好的错误提示,告诉用户如何解决
  3. ✅ 限制对话历史,防止提示词过长
  4. ✅ 提示词长度检查,提前预警

建议立即测试,如果还有500错误,查看控制台的详细错误信息。