brainy/examples/llmAugmentationExample.js
David Snelling 7f95844434 docs: add comprehensive documentation and examples for LLM augmentation
Introduced `llm-augmentation.md`, detailing the creation, training, testing, exporting, and deployment of language models using Brainy's graph database. Added examples showcasing practical usage and pipeline integration. Included class implementations in `llmAugmentations.ts`.
2025-06-10 11:15:22 -07:00

205 lines
7.2 KiB
JavaScript

/**
* LLM Augmentation Example
*
* This example demonstrates how to use the LLM augmentation to create, train, test,
* export, and deploy an LLM model from the data in Brainy (nouns and verbs).
*/
import { BrainyData, augmentationPipeline } from '@soulcraft/brainy'
import { createLLMAugmentations } from '@soulcraft/brainy/src/augmentations/llmAugmentations.js'
// Main function to run the example
async function runLLMExample() {
console.log('Starting LLM Augmentation Example')
try {
// Initialize Brainy
const db = new BrainyData()
await db.init()
// Add some sample data if the database is empty
await populateSampleData(db)
// Create LLM augmentations
const { cognition, activation } = await createLLMAugmentations({
cognitionName: 'my-llm-cognition',
activationName: 'my-llm-activation',
brainyDb: db
})
// Register augmentations with the pipeline
augmentationPipeline.register(cognition)
augmentationPipeline.register(activation)
console.log('LLM augmentations registered successfully')
// Create a simple LLM model
const createModelResult = await cognition.createModel({
name: 'my-first-llm',
description: 'A simple LLM model trained on Brainy data',
modelType: 'simple',
vocabSize: 5000,
embeddingDim: 64,
hiddenDim: 128,
numLayers: 1,
maxSequenceLength: 50,
epochs: 5
})
if (!createModelResult.success) {
throw new Error(`Failed to create model: ${createModelResult.error}`)
}
const { modelId } = createModelResult.data
console.log(`Created model with ID: ${modelId}`)
// Train the model
console.log('Training model...')
const trainResult = await cognition.trainModel(modelId, {
maxSamples: 100,
validationSplit: 0.2,
earlyStoppingPatience: 2
})
if (!trainResult.success) {
throw new Error(`Failed to train model: ${trainResult.error}`)
}
console.log('Model trained successfully')
console.log('Training metrics:', trainResult.data.metadata.performance)
// Test the model
console.log('Testing model...')
const testResult = await cognition.testModel(modelId, {
testSize: 20,
generateSamples: true,
sampleCount: 3
})
if (!testResult.success) {
throw new Error(`Failed to test model: ${testResult.error}`)
}
console.log('Model tested successfully')
console.log('Test metrics:', testResult.data.metrics)
if (testResult.data.samples) {
console.log('Sample predictions:')
for (const sample of testResult.data.samples) {
console.log(`Input: "${sample.input}"`)
console.log(`Expected: "${sample.expected}"`)
console.log(`Generated: "${sample.generated}"`)
console.log('---')
}
}
// Generate text with the model
console.log('Generating text...')
const generateResult = await cognition.generateText(modelId, 'What is a', {
temperature: 0.7,
topK: 5
})
if (generateResult.success) {
console.log(`Generated text: "${generateResult.data}"`)
} else {
console.error(`Failed to generate text: ${generateResult.error}`)
}
// Export the model
console.log('Exporting model...')
const exportResult = await cognition.exportModel(modelId, {
format: 'json',
includeMetadata: true,
includeVocab: true
})
if (!exportResult.success) {
throw new Error(`Failed to export model: ${exportResult.error}`)
}
console.log(`Model exported in ${exportResult.data.format} format`)
// Deploy the model (browser example)
console.log('Deploying model to browser...')
const deployResult = await cognition.deployModel(modelId, {
target: 'browser'
})
if (!deployResult.success) {
throw new Error(`Failed to deploy model: ${deployResult.error}`)
}
console.log(`Model deployed to ${deployResult.data.deploymentTarget}`)
console.log(`Deployment status: ${deployResult.data.status}`)
// Using the activation augmentation through the pipeline
console.log('Using activation augmentation through pipeline...')
// Create a new model through the pipeline
const pipelineCreateResult = await augmentationPipeline.executeCognitionPipeline(
'createModel',
[{
name: 'pipeline-llm',
modelType: 'transformer',
numHeads: 2,
numLayers: 1
}]
)
if (pipelineCreateResult[0] && (await pipelineCreateResult[0]).success) {
const pipelineModelId = (await pipelineCreateResult[0]).data.modelId
console.log(`Created model through pipeline with ID: ${pipelineModelId}`)
// Train the model through the pipeline
const pipelineTrainResult = await augmentationPipeline.executeCognitionPipeline(
'trainModel',
[pipelineModelId, { maxSamples: 50 }]
)
if (pipelineTrainResult[0] && (await pipelineTrainResult[0]).success) {
console.log('Model trained through pipeline successfully')
}
}
console.log('LLM Augmentation Example completed successfully')
} catch (error) {
console.error('Error in LLM Augmentation Example:', error)
}
}
// Helper function to populate sample data
async function populateSampleData(db) {
const status = await db.status()
// Only add sample data if the database is empty
if (status.nounCount === 0) {
console.log('Adding sample data to Brainy...')
// Add some nouns (entities)
const cat = await db.add('Cats are independent pets', { noun: 'thing', category: 'animal' })
const dog = await db.add('Dogs are loyal companions', { noun: 'thing', category: 'animal' })
const house = await db.add('Houses provide shelter for people', { noun: 'place', category: 'building' })
const john = await db.add('John is a software developer', { noun: 'person', category: 'professional' })
const mary = await db.add('Mary is a data scientist', { noun: 'person', category: 'professional' })
const coding = await db.add('Coding is the process of creating software', { noun: 'concept', category: 'technology' })
const meeting = await db.add('Team meetings are held every Monday', { noun: 'event', category: 'work' })
// Add some verbs (relationships)
await db.addVerb(john, house, { verb: 'owns', description: 'John owns the house' })
await db.addVerb(john, dog, { verb: 'owns', description: 'John owns a dog' })
await db.addVerb(mary, cat, { verb: 'owns', description: 'Mary owns a cat' })
await db.addVerb(john, coding, { verb: 'created', description: 'John created code' })
await db.addVerb(mary, coding, { verb: 'created', description: 'Mary created code' })
await db.addVerb(john, meeting, { verb: 'created', description: 'John organized the meeting' })
await db.addVerb(mary, meeting, { verb: 'memberOf', description: 'Mary is part of the meeting' })
await db.addVerb(john, mary, { verb: 'worksWith', description: 'John works with Mary' })
console.log('Sample data added successfully')
} else {
console.log('Database already contains data, skipping sample data creation')
}
}
// Run the example
runLLMExample().catch(console.error)