/** * 多模型大纲生成对比测试 * 使用book.id=1的信息,用不同厂商的模型生成大纲 */ import { callLLMWithMessages } from './src/services/llm/index.js'; // 测试的模型列表(不同厂商) const TEST_MODELS = [ { id: 'MiniMax-M2.7', vendor: 'MiniMax', desc: 'MiniMax M2.7 (默认)' }, { id: 'qwen3.6-plus', vendor: '阿里云', desc: '通义千问 3.6 Plus' }, { id: 'qwen3.5-122b-a10b', vendor: '阿里云', desc: '通义千问 3.5 (122B)' }, { id: 'doubao-seed-2.0-code', vendor: '火山引擎', desc: '豆包 Seed 2.0' }, ]; // 提示词(与系统一致) const OUTLINE_SYSTEM_PROMPT = `你是一位专业的图书策划编辑,擅长为各类主题设计清晰、严谨、有逻辑递进的书籍大纲。 ## 你的职责 根据用户提供的书名、类型和主题,设计一份完整的书籍大纲,包含章节列表。 ## 工作要求 1. 章数必须在配置的章节范围内 2. 章之间有清晰的逻辑递进关系(由浅入深、由理论到实践等) 3. 每章的知识点要具体,不能泛泛而谈 4. **动态分配每章字数**:核心章节多分配,次要章节少分配,总和≈全书总字数范围中值 ## 输出格式 必须返回 JSON,不要包含任何 markdown 代码块标记: { "mainTheme": "主题一句话描述", "structureLogic": "章节组织逻辑说明", "chapters": [ { "number": 1, "title": "章标题", "summary": "本章概述(2-3句话)", "keyPoints": ["知识点1", "知识点2"], "estimatedWords": 10000 } ] }`; async function testModelOutline(model, topic, bookScale) { console.log(`\n${'='.repeat(80)}`); console.log(`测试模型: ${model.desc}`); console.log(`${'='.repeat(80)}`); const messages = [ { role: 'system', content: OUTLINE_SYSTEM_PROMPT }, { role: 'user', content: `书名:《${topic}》\n规模:大学专业教材\n章节范围:10-12章\n\n请生成完整的书籍大纲,只包含章节列表(不含节和小节)。`, }, ]; try { const startTime = Date.now(); const response = await callLLMWithMessages(messages, model.id); const duration = ((Date.now() - startTime) / 1000).toFixed(2); console.log(`\n⏱️ 耗时: ${duration}秒`); console.log(`\n📝 生成的大纲:\n`); console.log(response); console.log(`\n${'-'.repeat(80)}`); // 尝试解析JSON try { let jsonStr = response.trim(); const match = jsonStr.match(/\{[\s\S]*\}/); if (match) jsonStr = match[0]; const outline = JSON.parse(jsonStr); console.log(`\n✅ JSON解析成功`); console.log(`📊 章节数: ${outline.chapters?.length || 0}`); console.log(`📖 主题: ${outline.mainTheme}`); console.log(`🔗 逻辑: ${outline.structureLogic}`); // 分析章节分布 if (outline.chapters) { const totalWords = outline.chapters.reduce((sum, c) => sum + (c.estimatedWords || 0), 0); console.log(`📈 总字数: ${totalWords}`); console.log(`📊 平均每章: ${Math.round(totalWords / outline.chapters.length)}字`); // 检查章节分布 console.log(`\n章节列表:`); outline.chapters.forEach(ch => { console.log(` ${ch.number}. ${ch.title} (${ch.estimatedWords}字)`); }); } } catch (e) { console.log(`\n❌ JSON解析失败: ${e.message}`); } return { model: model.desc, response, success: true, duration }; } catch (error) { console.log(`\n❌ 生成失败: ${error.message}`); return { model: model.desc, error: error.message, success: false }; } } async function main() { console.log('🚀 开始多模型大纲生成对比测试\n'); // book.id=1的信息(操作系统教材) const TOPIC = '操作系统引论'; const BOOK_SCALE = '大学专业教材'; console.log(`📚 书籍主题: ${TOPIC}`); console.log(`📏 书籍类型: ${BOOK_SCALE}`); console.log(`🔢 测试模型数: ${TEST_MODELS.length}`); const results = []; for (const model of TEST_MODELS) { const result = await testModelOutline(model, TOPIC, BOOK_SCALE); results.push(result); // 等待一下避免限流 await new Promise(resolve => setTimeout(resolve, 2000)); } // 输出总结 console.log(`\n\n${'='.repeat(80)}`); console.log('📊 测试结果汇总'); console.log(`${'='.repeat(80)}\n`); results.forEach((r, i) => { console.log(`${i + 1}. ${r.model}`); if (r.success) { console.log(` ✅ 成功 | 耗时: ${r.duration}秒`); } else { console.log(` ❌ 失败: ${r.error}`); } console.log(); }); console.log('测试完成!'); } main().catch(console.error);