test-multi-model-outline.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * 多模型大纲生成对比测试
  3. * 使用book.id=1的信息,用不同厂商的模型生成大纲
  4. */
  5. import { callLLMWithMessages } from './src/services/llm/index.js';
  6. // 测试的模型列表(不同厂商)
  7. const TEST_MODELS = [
  8. { id: 'MiniMax-M2.7', vendor: 'MiniMax', desc: 'MiniMax M2.7 (默认)' },
  9. { id: 'qwen3.6-plus', vendor: '阿里云', desc: '通义千问 3.6 Plus' },
  10. { id: 'qwen3.5-122b-a10b', vendor: '阿里云', desc: '通义千问 3.5 (122B)' },
  11. { id: 'doubao-seed-2.0-code', vendor: '火山引擎', desc: '豆包 Seed 2.0' },
  12. ];
  13. // 提示词(与系统一致)
  14. const OUTLINE_SYSTEM_PROMPT = `你是一位专业的图书策划编辑,擅长为各类主题设计清晰、严谨、有逻辑递进的书籍大纲。
  15. ## 你的职责
  16. 根据用户提供的书名、类型和主题,设计一份完整的书籍大纲,包含章节列表。
  17. ## 工作要求
  18. 1. 章数必须在配置的章节范围内
  19. 2. 章之间有清晰的逻辑递进关系(由浅入深、由理论到实践等)
  20. 3. 每章的知识点要具体,不能泛泛而谈
  21. 4. **动态分配每章字数**:核心章节多分配,次要章节少分配,总和≈全书总字数范围中值
  22. ## 输出格式
  23. 必须返回 JSON,不要包含任何 markdown 代码块标记:
  24. {
  25. "mainTheme": "主题一句话描述",
  26. "structureLogic": "章节组织逻辑说明",
  27. "chapters": [
  28. {
  29. "number": 1,
  30. "title": "章标题",
  31. "summary": "本章概述(2-3句话)",
  32. "keyPoints": ["知识点1", "知识点2"],
  33. "estimatedWords": 10000
  34. }
  35. ]
  36. }`;
  37. async function testModelOutline(model, topic, bookScale) {
  38. console.log(`\n${'='.repeat(80)}`);
  39. console.log(`测试模型: ${model.desc}`);
  40. console.log(`${'='.repeat(80)}`);
  41. const messages = [
  42. { role: 'system', content: OUTLINE_SYSTEM_PROMPT },
  43. {
  44. role: 'user',
  45. content: `书名:《${topic}》\n规模:大学专业教材\n章节范围:10-12章\n\n请生成完整的书籍大纲,只包含章节列表(不含节和小节)。`,
  46. },
  47. ];
  48. try {
  49. const startTime = Date.now();
  50. const response = await callLLMWithMessages(messages, model.id);
  51. const duration = ((Date.now() - startTime) / 1000).toFixed(2);
  52. console.log(`\n⏱️ 耗时: ${duration}秒`);
  53. console.log(`\n📝 生成的大纲:\n`);
  54. console.log(response);
  55. console.log(`\n${'-'.repeat(80)}`);
  56. // 尝试解析JSON
  57. try {
  58. let jsonStr = response.trim();
  59. const match = jsonStr.match(/\{[\s\S]*\}/);
  60. if (match) jsonStr = match[0];
  61. const outline = JSON.parse(jsonStr);
  62. console.log(`\n✅ JSON解析成功`);
  63. console.log(`📊 章节数: ${outline.chapters?.length || 0}`);
  64. console.log(`📖 主题: ${outline.mainTheme}`);
  65. console.log(`🔗 逻辑: ${outline.structureLogic}`);
  66. // 分析章节分布
  67. if (outline.chapters) {
  68. const totalWords = outline.chapters.reduce((sum, c) => sum + (c.estimatedWords || 0), 0);
  69. console.log(`📈 总字数: ${totalWords}`);
  70. console.log(`📊 平均每章: ${Math.round(totalWords / outline.chapters.length)}字`);
  71. // 检查章节分布
  72. console.log(`\n章节列表:`);
  73. outline.chapters.forEach(ch => {
  74. console.log(` ${ch.number}. ${ch.title} (${ch.estimatedWords}字)`);
  75. });
  76. }
  77. } catch (e) {
  78. console.log(`\n❌ JSON解析失败: ${e.message}`);
  79. }
  80. return { model: model.desc, response, success: true, duration };
  81. } catch (error) {
  82. console.log(`\n❌ 生成失败: ${error.message}`);
  83. return { model: model.desc, error: error.message, success: false };
  84. }
  85. }
  86. async function main() {
  87. console.log('🚀 开始多模型大纲生成对比测试\n');
  88. // book.id=1的信息(操作系统教材)
  89. const TOPIC = '操作系统引论';
  90. const BOOK_SCALE = '大学专业教材';
  91. console.log(`📚 书籍主题: ${TOPIC}`);
  92. console.log(`📏 书籍类型: ${BOOK_SCALE}`);
  93. console.log(`🔢 测试模型数: ${TEST_MODELS.length}`);
  94. const results = [];
  95. for (const model of TEST_MODELS) {
  96. const result = await testModelOutline(model, TOPIC, BOOK_SCALE);
  97. results.push(result);
  98. // 等待一下避免限流
  99. await new Promise(resolve => setTimeout(resolve, 2000));
  100. }
  101. // 输出总结
  102. console.log(`\n\n${'='.repeat(80)}`);
  103. console.log('📊 测试结果汇总');
  104. console.log(`${'='.repeat(80)}\n`);
  105. results.forEach((r, i) => {
  106. console.log(`${i + 1}. ${r.model}`);
  107. if (r.success) {
  108. console.log(` ✅ 成功 | 耗时: ${r.duration}秒`);
  109. } else {
  110. console.log(` ❌ 失败: ${r.error}`);
  111. }
  112. console.log();
  113. });
  114. console.log('测试完成!');
  115. }
  116. main().catch(console.error);