# 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. 增强错误日志(已完成) ✅ ```typescript // 添加详细的调试日志 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. 改进错误处理(已完成) ✅ ```typescript 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. 限制对话历史长度(已完成) ✅ ```typescript // 限制最近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. **动态调整提示词** ```typescript // 根据是否有对话历史,使用不同的提示词版本 if (conversationHistory && conversationHistory.length > 0) { // 使用简化版提示词(只包含核心维度) prompt = this.buildSimplePrompt(...); } else { // 使用完整版提示词(包含详细说明) prompt = this.buildFullPrompt(...); } ``` 2. **添加提示词压缩** ```typescript // 移除多余的空格和换行 prompt = prompt.replace(/\n{3,}/g, '\n\n').trim(); ``` 3. **图片预处理** ```typescript // 检查图片URL是否可访问 // 压缩图片大小 // 限制图片分辨率 ``` ### 中期优化(1周) 1. **实现提示词模板系统** - 基础模板:首次分析用(完整详细) - 追问模板:后续对话用(简化版) - 快速模板:快速分析用(极简版) 2. **添加重试机制** ```typescript // 如果失败,自动简化提示词重试 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错误,查看控制台的详细错误信息。**