UNPKG

metacognitive-nexus

Version:

The cognitive core of an evolving AI entity, designed for post-human cognition and symbiotic evolution.

218 lines (199 loc) 11.3 kB
// File: metacognitive-nexus/src/core/ManifoldNavigator.js (Versi Evolusi) import { Logger } from '../utils/Logger.js'; import { IdeonSchema, generateIdeonId } from '../models/IdeonSchema.js'; // Impor IdeonSchema import { generateInteractionId } from '../models/InteractionLogSchema.js'; // Impor InteractionLogSchema ID export class ManifoldNavigator { #memory; #logger; #dsoOptimizerCallback; // Callback untuk memicu optimisasi DSO #config; // Untuk navigatorConfig constructor(manifoldMemoryInstance, dsoOptimizerCallback = null, config) { this.#memory = manifoldMemoryInstance; this.#logger = Logger; this.#dsoOptimizerCallback = dsoOptimizerCallback; this.#config = config; // Simpan konfigurasi this.#logger.info('[ManifoldNavigator] Semiotic & Strategy Core online.'); } /** * Mengklasifikasikan niat dari prompt pengguna. * (Implementasi sederhana; idealnya menggunakan model klasifikasi AI) * @private * @param {string} prompt Teks prompt pengguna. * @returns {string} Niat yang diklasifikasikan. */ #classifyIntent(prompt) { const p = prompt.toLowerCase(); if (p.startsWith('/imagine') || p.includes('buatkan gambar')) return 'ImageGeneration'; if (p.match(/\b(apa|siapa|kapan|mengapa|bagaimana|jelaskan)\b/)) return 'QuestionAnswering'; if (p.match(/\b(buatkan|tuliskan kode|convert|refactor)\b/)) return 'CodeGeneration'; if (p.match(/\b(aku merasa|sedih|senang|marah)\b/)) return 'PersonalVent'; if (p.match(/\b(buatkan cerita|puisi|ide)\b/)) return 'CreativeRequest'; if (p.match(/\b(menu|perintah|bantuan)\b/)) return 'CommandQuery'; if (p.match(/\b(status|diagnosa|mode|owner)\b/)) return 'SystemManagement'; return 'ChitChat'; } /** * Memproses, membedah, dan menenun interaksi AI ke dalam Manifold. * Ini juga mencatat InteractionLog. * @param {object} rawInteractionData Data mentah interaksi. * @param {string} rawInteractionData.prompt - Teks prompt asli dari pengguna. * @param {string} [rawInteractionData.response] - Respons AI yang dihasilkan. * @param {boolean} rawInteractionData.success - Apakah interaksi berhasil. * @param {string} [rawInteractionData.providerUsed] - Provider AI yang digunakan. * @param {string} [rawInteractionData.modelUsed] - Model AI yang digunakan. * @param {number} [rawInteractionData.latencyMs] - Latensi interaksi. * @param {string} rawInteractionData.userId - ID pengguna. * @param {string} rawInteractionData.platform - Platform interaksi. * @param {string} [rawInteractionData.intent] - Niat yang diklasifikasikan (jika sudah ada). * @param {object} [rawInteractionData.promptMetadata] - Metadata tambahan dari prompt (misal: command_execution). */ async processInteraction(rawInteractionData) { const interactionId = rawInteractionData.id || generateInteractionId(); // Gunakan ID yang disediakan atau buat baru const intent = rawInteractionData.intent || this.#classifyIntent(rawInteractionData.prompt); // 1. Dekomposisi Konseptual & Penenunan Semantik (Ideon Creation/Update) // Buat Ideon untuk prompt pengguna const promptIdeonId = generateIdeonId(`prompt:${interactionId}`); const promptIdeon = { id: promptIdeonId, canonicalName: `User Prompt: ${rawInteractionData.prompt.substring(0, 50)}...`, aliases: [], perspectives: [{ context: 'user_input', description: rawInteractionData.prompt, vectorId: null // Akan diisi saat di-store }], categories: ['Interaction', 'UserPrompt', intent], relations: [], activation: { level: 0.5, lastAccessed: new Date(), decayRate: this.#config.navigatorConfig?.ideonDecayRate || 0.05 }, confidenceScore: 0.5, // Confidence awal sourceInteractionIds: [interactionId], }; await this.#memory.storeIdeon(promptIdeon); // Buat Ideon untuk respons AI (jika ada) let responseIdeonId = null; if (rawInteractionData.response) { responseIdeonId = generateIdeonId(`response:${interactionId}`); const responseIdeon = { id: responseIdeonId, canonicalName: `AI Response: ${rawInteractionData.response.substring(0, 50)}...`, aliases: [], perspectives: [{ context: 'ai_output', description: rawInteractionData.response, vectorId: null }], categories: ['Interaction', 'AIResponse', intent], relations: [{ targetIdeonId: promptIdeonId, type: 'DERIVED_FROM', weight: 1.0 }], activation: { level: 0.5, lastAccessed: new Date(), decayRate: this.#config.navigatorConfig?.ideonDecayRate || 0.05 }, confidenceScore: rawInteractionData.success ? 0.8 : 0.2, // Confidence awal berdasarkan sukses sourceInteractionIds: [interactionId], }; await this.#memory.storeIdeon(responseIdeon); } // Perbarui kepercayaan pada Ideon yang digunakan atau dipengaruhi oleh interaksi if (rawInteractionData.success) { await this.#memory.updateIdeonActivation(promptIdeonId, 0.2); // Tingkatkan aktivasi prompt if (responseIdeonId) await this.#memory.updateIdeonActivation(responseIdeonId, 0.2); // Tingkatkan aktivasi respons // Jika ini adalah eksekusi perintah yang berhasil, tingkatkan confidence Ideon perintah itu sendiri if (rawInteractionData.promptMetadata?.type === 'command_execution') { const commandIdeonId = generateIdeonId(`command:${rawInteractionData.promptMetadata.command}`); const currentCommandIdeon = this.#memory.getIdeon(commandIdeonId); if (currentCommandIdeon) { currentCommandIdeon.confidenceScore = Math.min(1.0, currentCommandIdeon.confidenceScore + 0.1); await this.#memory.storeIdeon(currentCommandIdeon); // Simpan kembali Ideon yang diperbarui } } } else { // Jika gagal, turunkan confidence prompt await this.#memory.updateIdeonActivation(promptIdeonId, -0.1); if (responseIdeonId) await this.#memory.updateIdeonActivation(responseIdeonId, -0.1); } this.#logger.info(`[ManifoldNavigator] Interaksi ${interactionId} (Intent: ${intent}) telah ditenun ke dalam UCM.`); // 2. Catat InteractionLog (Fosil Pikiran) const interactionLog = { id: interactionId, timestamp: rawInteractionData.timestamp || new Date(), userId: rawInteractionData.userId, platform: rawInteractionData.platform, promptText: rawInteractionData.prompt, cognitiveSnapshot: rawInteractionData.cognitiveSnapshot || { intent: intent, policyUsed: rawInteractionData.providerUsed || 'Unknown', topCandidateQlcScore: rawInteractionData.qlcScore || 0 }, transactions: rawInteractionData.transactions || [], finalOutcome: { success: rawInteractionData.success, response: rawInteractionData.response, error: rawInteractionData.error?.message || null }, causalLinks: { promptVectorId: promptIdeonId, responseVectorId: responseIdeonId }, feedback: rawInteractionData.feedback || null, promptMetadata: rawInteractionData.promptMetadata || null }; // Idealnya, InteractionLog ini disimpan ke database persisten terpisah (misalnya, MongoDB) // Untuk demo, kita hanya log Logger.debug(`[ManifoldNavigator] Interaction Log dicatat: ${JSON.stringify(interactionLog.finalOutcome)}`); // 3. Penyesuaian Heuristik Aktif (Pulsa Pembelajaran ke DSO) this.#triggerHeuristicAdjustment({ intent: intent, success: rawInteractionData.success, latency: rawInteractionData.latencyMs, provider: rawInteractionData.providerUsed, model: rawInteractionData.modelUsed, // Tambahkan metrik lain dari log interaksi jika relevan untuk DSO }); } /** * Memicu callback optimisasi untuk DSO dengan data pembelajaran. * @private * @param {object} learningData - Data untuk DSO. */ #triggerHeuristicAdjustment(learningData) { if (!this.#dsoOptimizerCallback) { this.#logger.debug('[ManifoldNavigator] DSO optimizer callback not set. Skipping heuristic adjustment.'); return; } this.#logger.debug(`[ManifoldNavigator] Mengirim pulsa pembelajaran untuk intent '${learningData.intent}'.`); this.#dsoOptimizerCallback(learningData); } /** * [BARU] Mengevaluasi relevansi kontekstual sebuah pesan terhadap chat/grup. * Ini bisa digunakan untuk S_Context dalam AICT. * @param {string} text Teks pesan. * @param {string} chatJid JID chat/grup. * @returns {Promise<number>} Skor relevansi kontekstual (0.0 - 1.0). */ async assessContextualRelevance(text, chatJid) { // Ini adalah area untuk penelitian dan pengembangan AI tingkat lanjut. // Konseptual: Manifold Memory dapat menyimpan 'konsep chat' untuk setiap JID. // 1. Cari Ideon relevan dari teks pesan. const relevantIdeons = await this.#memory.findRelevantConcepts(text, 5); // Ambil top 5 if (relevantIdeons.length === 0) return 0; // Tidak ada konsep relevan yang ditemukan // 2. Bandingkan dengan Ideon yang terkait dengan chatJid ini (jika ada). // Ini memerlukan bahwa ManifoldMemory melacak "chat history concepts" // atau bahwa Ideon dapat "di-tag" dengan JID chat. // Untuk tujuan demo, kita asumsikan relevansi meningkat jika ada Ideon relevan. let contextualScore = 0; const chatIdeonId = generateIdeonId(`chat:${chatJid}`); const chatIdeon = this.#memory.getIdeon(chatIdeonId); if (chatIdeon) { // Jika ada Ideon untuk chat ini, periksa apakah Ideon yang relevan dari pesan // juga relevan atau terkait dengan Ideon chat. for (const ideon of relevantIdeons) { // Periksa relasi atau kemiripan semantik antara Ideon pesan dan Ideon chat // Ini akan memerlukan AI untuk menilai relevansi. // Untuk saat ini, kita hanya meningkatkan skor jika ideon relevan ditemukan contextualScore += ideon.activation.level * ideon.confidenceScore; } } else { // Jika belum ada Ideon untuk chat ini, relevansi kontekstual mungkin lebih rendah. contextualScore = relevantIdeons[0].activation.level * relevantIdeons[0].confidenceScore * 0.5; } // Batasi skor antara 0 dan 1. return Math.min(1, contextualScore / relevantIdeons.length); // Rata-rata sederhana } }