test-minimax-optimized.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * 测试优化后的提示词对 MiniMax M2.7 的效果
  3. */
  4. const axios = require('axios');
  5. const fs = require('fs');
  6. const path = require('path');
  7. require('dotenv').config();
  8. // 使用 MiniMax 官方 API
  9. const MINI_MAX_CONFIG = {
  10. baseUrl: 'https://api.minimax.chat/v1',
  11. apiKey: process.env.MINIMAX_API_KEY || '',
  12. model: 'MiniMax-M2.7',
  13. };
  14. const OPTIMIZED_SYSTEM_PROMPT = `你是一位专业的图书策划编辑,擅长为各类主题设计清晰、严谨、有逻辑递进的书籍大纲。
  15. ## 你的职责
  16. 根据用户提供的书名、规模和主题,设计一份完整的书籍大纲。
  17. ## 工作要求
  18. 1. 分析主题复杂度,在允许的章节范围内决定最合适的章节数
  19. 2. 章节之间必须有清晰的逻辑递进关系(由浅入深、由理论到实践等)
  20. 3. 每章的知识点要具体,不能泛泛而谈
  21. 4. 预估字数要符合章节内容量
  22. 5. 核心知识点应独立成章,不要过度合并
  23. ## 输出格式要求(非常重要)
  24. 1. 必须且只能返回纯 JSON,不要任何解释、思考过程或其他文字
  25. 2. 不要使用 markdown 代码块标记
  26. 3. 不要包含任何标签(如details、think等)
  27. 4. 直接从 { 开始,到 } 结束
  28. 5. JSON 必须合法,可以被 JSON.parse 解析
  29. ## JSON 格式
  30. {
  31. "mainTheme": "主题一句话描述",
  32. "structureLogic": "章节组织逻辑说明",
  33. "chapters": [
  34. {
  35. "number": 1,
  36. "title": "章节标题",
  37. "summary": "章节摘要(2-3句话)",
  38. "keyPoints": ["知识点1", "知识点2"],
  39. "estimatedWords": 2000
  40. }
  41. ]
  42. }`;
  43. async function callMiniMaxAPI(messages) {
  44. const response = await axios.post(
  45. `${MINI_MAX_CONFIG.baseUrl}/chat/completions`,
  46. {
  47. model: MINI_MAX_CONFIG.model,
  48. messages: messages,
  49. temperature: 0.7,
  50. max_tokens: 4000,
  51. },
  52. {
  53. headers: {
  54. 'Content-Type': 'application/json',
  55. 'Authorization': `Bearer ${MINI_MAX_CONFIG.apiKey}`,
  56. },
  57. timeout: 120000,
  58. }
  59. );
  60. return response.data.choices?.[0]?.message?.content;
  61. }
  62. function cleanAndParseJSON(response) {
  63. if (!response) return null;
  64. let cleaned = response.trim();
  65. cleaned = cleaned.replace(/[\u003C]details[\u003E][\s\S]*?[\u003C]\/details[\u003E]/g, '');
  66. cleaned = cleaned.replace(/[\u003C]think[\u003E][\s\S]*?[\u003C]\/think[\u003E]/g, '');
  67. cleaned = cleaned.replace(/```[\s\S]*?```/g, '');
  68. const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
  69. if (!jsonMatch) return null;
  70. try {
  71. return JSON.parse(jsonMatch[0]);
  72. } catch {
  73. return null;
  74. }
  75. }
  76. async function main() {
  77. console.log('=== 测试优化后的提示词 ===\n');
  78. console.log('模型: MiniMax-M2.7');
  79. console.log('主题: 操作系统引论\n');
  80. const startTime = Date.now();
  81. try {
  82. const content = await callMiniMaxAPI([
  83. { role: 'system', content: OPTIMIZED_SYSTEM_PROMPT },
  84. { role: 'user', content: '书名:《操作系统引论》\n规模:大学专业教材\n章节范围:10-12章' },
  85. ]);
  86. if (!content) {
  87. console.log('❌ API返回内容为空');
  88. return;
  89. }
  90. const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
  91. console.log(`⏱️ 耗时: ${elapsed}秒\n`);
  92. console.log('=== 原始输出(前500字符)===');
  93. console.log(content.substring(0, 500));
  94. console.log('...\n');
  95. const parsed = cleanAndParseJSON(content);
  96. if (parsed) {
  97. console.log('✅ JSON解析成功!\n');
  98. console.log(`📊 章节数: ${parsed.chapters?.length || 0}章`);
  99. console.log(`📖 主题: ${parsed.mainTheme}\n`);
  100. console.log('=== 章节结构 ===');
  101. parsed.chapters.forEach((ch) => {
  102. console.log(`第${ch.number}章 ${ch.title} (${ch.estimatedWords}字)`);
  103. });
  104. const resultDir = path.join(__dirname, 'test-results');
  105. if (!fs.existsSync(resultDir)) {
  106. fs.mkdirSync(resultDir, { recursive: true });
  107. }
  108. fs.writeFileSync(
  109. path.join(resultDir, 'minimax-optimized.json'),
  110. JSON.stringify({ time: elapsed, chapters: parsed.chapters.length, data: parsed }, null, 2)
  111. );
  112. console.log('\n✅ 结果已保存到 test-results/minimax-optimized.json');
  113. } else {
  114. console.log('❌ JSON解析失败');
  115. console.log('\n=== 完整输出 ===');
  116. console.log(content);
  117. }
  118. } catch (error) {
  119. console.error('❌ 测试失败:', error.message);
  120. }
  121. }
  122. main();