| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /**
- * 多模型大纲生成对比测试
- * 使用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);
|