-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmeta_train.js
More file actions
147 lines (120 loc) · 7.53 KB
/
meta_train.js
File metadata and controls
147 lines (120 loc) · 7.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// reasoningHeuristicAI/meta_train.js
// --- Финальная версия: ИИ как "Редактор", выбирающий лучшее из предложенных улучшений ---
import { Orchestrator } from './core/orchestrator.js';
import { exec } from 'child_process';
import util from 'util';
import fs from 'fs/promises';
import path from 'path';
const execPromise = util.promisify(exec);
const META_CONFIG = {
targetFile: 'core/slmnet/Ops.js',
mutationsDir: 'core/slmnet_mutations',
agentModelPath: './models/rHAI_v1_final.json',
};
/**
* Запускает бенчмарк и парсит его вывод, чтобы получить loss и time.
* @returns {Promise<{loss: number, time: number}>} Объект с результатами производительности.
*/
async function runBenchmark() {
console.log('[Мета-Контроллер] ⏱️ Запускаю бенчмарк для текущей версии slmnet...');
try {
const { stdout, stderr } = await execPromise('node benchmark.js');
if (stderr) {
console.warn('[Мета-Контроллер] Предупреждение при выполнении бенчмарка:', stderr);
}
const lossMatch = stdout.match(/Final Loss: (\d+\.\d+)/);
const timeMatch = stdout.match(/Time: (\d+)ms/);
if (!lossMatch || !timeMatch) {
throw new Error("Не удалось распарсить вывод бенчмарка. Вывод:\n" + stdout);
}
const performance = {
loss: parseFloat(lossMatch[1]),
time: parseInt(timeMatch[1], 10),
};
console.log(`[Мета-Контроллер] 📊 Результат: Loss = ${performance.loss.toFixed(4)}, Time = ${performance.time}ms`);
return performance;
} catch (error) {
console.error('[Мета-Контроллер] ❌ КРИТИЧЕСКАЯ ОШИБКА БЕНЧМАРКА.');
console.error(error.message);
return { loss: Infinity, time: Infinity };
}
}
/**
* Главная функция мета-обучения.
*/
async function main() {
console.log('=====================================================');
console.log('🤖 Запуск Мета-Контроллера rHAI (Режим Редактора) 🤖');
console.log('=====================================================');
const agent = new Orchestrator();
try {
await agent.init(META_CONFIG.agentModelPath);
} catch(e) {
console.error(`\n❌ Не удалось загрузить модель агента по пути: ${META_CONFIG.agentModelPath}`);
console.error("Пожалуйста, убедитесь, что вы сначала успешно обучили модель командой `npm run train`.");
return;
}
let bestPerformance = await runBenchmark();
if (bestPerformance.loss === Infinity) {
console.error("[Мета-Контроллер] Не удалось получить базовые метрики. Прерывание работы.");
await agent.shutdown();
return;
}
let originalCode = await fs.readFile(META_CONFIG.targetFile, 'utf-8');
const mutationFiles = await fs.readdir(META_CONFIG.mutationsDir);
console.log(`[Мета-Контроллер] Найдено ${mutationFiles.length} кандидатов на улучшение в '${META_CONFIG.mutationsDir}'.`);
for (const mutationFile of mutationFiles) {
console.log(`\n\n--- ИТЕРАЦИЯ: Рассматриваем кандидата '${mutationFile}' ---`);
const candidateCode = await fs.readFile(path.join(META_CONFIG.mutationsDir, mutationFile), 'utf-8');
const goal = `
МОЯ ЗАДАЧА: Я - ИИ-инженер, выступающий в роли редактора. Моя цель - решить, стоит ли тестировать предложенное изменение кода.
КОНТЕКСТ:
1. Текущая производительность кода (Версия А): Loss=${bestPerformance.loss.toFixed(4)}, Time=${bestPerformance.time}ms.
2. Мне предложен новый код (Версия Б) с потенциальным улучшением.
ПЛАН ДЕЙСТВИЙ:
1. Внимательно сравнить Версию А и Версию Б.
2. Сформулировать гипотезу, почему Версия Б может быть лучше или хуже.
3. Принять решение: стоит ли тратить время на тестирование Версии Б?
4. Ответить в формате JSON с полями "thoughts" и "parameters.choice", установив его в "ДА" или "НЕТ".
--- Версия А (Текущий код '${META_CONFIG.targetFile}') ---
\`\`\`javascript
${originalCode.substring(0, 1000)}...
\`\`\`
--- Версия Б (Кандидат '${mutationFile}') ---
\`\`\`javascript
${candidateCode.substring(0, 1000)}...
\`\`\`
`;
const responseJson = await agent.run(goal, true);
if (responseJson && responseJson.parameters && responseJson.parameters.choice && responseJson.parameters.choice.toUpperCase() === 'ДА') {
console.log(`[Мета-Контроллер] 🧠 Решение Агента: ДА. Применяем '${mutationFile}' и запускаем тест.`);
await fs.writeFile(META_CONFIG.targetFile, candidateCode, 'utf-8');
const newPerformance = await runBenchmark();
if (newPerformance.loss < bestPerformance.loss || newPerformance.time < bestPerformance.time) {
console.log(`[Мета-Контроллер] ✅ УСПЕХ! Производительность улучшена. Сохраняем новую версию.`);
bestPerformance = newPerformance;
originalCode = candidateCode;
} else {
console.log(`[Мета-Контроллер] ⏪ НЕУДАЧА. Улучшений нет. Откат изменений.`);
await fs.writeFile(META_CONFIG.targetFile, originalCode, 'utf-8');
}
} else {
console.log(`[Мета-Контроллер] 🧠 Решение Агента: НЕТ (или не удалось получить ответ). Пропускаем кандидата '${mutationFile}'.`);
if (responseJson && responseJson.thoughts) {
console.log(`[Мета-Контроллер] Мысли агента: ${responseJson.thoughts}`);
}
}
}
console.log('\n\n=====================================================');
console.log('🏁 Цикл самооптимизации завершен.');
console.log(`Итоговые лучшие показатели: Loss=${bestPerformance.loss.toFixed(4)}, Time=${bestPerformance.time}ms`);
console.log(`Финальная версия кода сохранена в '${META_CONFIG.targetFile}'`);
console.log('=====================================================');
await agent.shutdown();
}
main().catch(async (error) => {
console.error("Произошла критическая ошибка в Мета-Контроллере:", error);
const agent = new Orchestrator();
await agent.shutdown();
process.exit(1);
});