UNPKG

aicf-core

Version:

Universal AI Context Format (AICF) - Enterprise-grade AI memory infrastructure with 95.5% compression and zero semantic loss

316 lines (260 loc) 8.93 kB
/** * AICF v3.1 Integration Example: Vector Database * * This example demonstrates how to integrate AICF v3.1 memory management * with vector databases for semantic search and retrieval. * * Supported Vector Databases: * - Pinecone * - Weaviate * - Qdrant * - Chroma * * Based on Google ADK patterns for production-scale semantic retrieval. */ const fs = require('fs').promises; const path = require('path'); // ===== MOCK VECTOR DATABASE CLIENT ===== // In production, replace with actual vector DB client (Pinecone, Weaviate, etc.) class MockVectorDB { constructor(config) { this.config = config; this.vectors = new Map(); console.log(`✅ Connected to ${config.provider} vector database`); } async upsert(id, vector, metadata) { this.vectors.set(id, { vector, metadata }); console.log(`✅ Upserted vector ${id} (dimension: ${vector.length})`); } async query(vector, topK = 5, threshold = 0.85) { // Calculate cosine similarity for all vectors const results = []; for (const [id, data] of this.vectors.entries()) { const similarity = this.cosineSimilarity(vector, data.vector); if (similarity >= threshold) { results.push({ id, score: similarity, metadata: data.metadata }); } } // Sort by similarity (descending) and return top K results.sort((a, b) => b.score - a.score); return results.slice(0, topK); } cosineSimilarity(vecA, vecB) { let dotProduct = 0; let normA = 0; let normB = 0; for (let i = 0; i < vecA.length; i++) { dotProduct += vecA[i] * vecB[i]; normA += vecA[i] * vecA[i]; normB += vecB[i] * vecB[i]; } return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB)); } async delete(id) { this.vectors.delete(id); console.log(`✅ Deleted vector ${id}`); } } // ===== MOCK EMBEDDING SERVICE ===== // In production, replace with actual embedding service (OpenAI, Cohere, etc.) class MockEmbeddingService { constructor(config) { this.config = config; this.dimension = config.dimension || 1536; console.log(`✅ Initialized ${config.model} embedding service (dimension: ${this.dimension})`); } async embed(text) { // Generate mock embedding (in production, call actual API) const vector = Array.from({ length: this.dimension }, () => Math.random() * 2 - 1); // Normalize vector const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0)); const normalized = vector.map(val => val / norm); return normalized; } } // ===== AICF + VECTOR DB INTEGRATION ===== class AICFVectorIntegration { constructor(config) { this.aicfDir = config.aicfDir || '.aicf'; this.vectorDB = new MockVectorDB(config.vectorDB); this.embeddings = new MockEmbeddingService(config.embeddings); } /** * Index AICF conversation into vector database */ async indexConversation(conversationId, content, metadata = {}) { console.log(`\n📊 Indexing conversation: ${conversationId}`); // Generate embedding const vector = await this.embeddings.embed(content); // Store in vector DB await this.vectorDB.upsert(conversationId, vector, { ...metadata, content, indexed_at: new Date().toISOString(), source: 'aicf' }); // Store embedding in AICF format await this.saveEmbedding(conversationId, vector, metadata); console.log(`✅ Indexed conversation ${conversationId}`); } /** * Save embedding to AICF file */ async saveEmbedding(id, vector, metadata) { const embeddingContent = `@EMBEDDING:${id} model=${this.embeddings.config.model} dimension=${vector.length} vector=${vector.join(',')} indexed_at=${new Date().toISOString()} similarity_threshold=0.85 keywords=${metadata.keywords || ''} `; const filePath = path.join(this.aicfDir, 'embeddings.aicf'); await fs.appendFile(filePath, embeddingContent + '\n'); } /** * Semantic search across AICF conversations */ async semanticSearch(query, topK = 5, threshold = 0.85) { console.log(`\n🔍 Semantic search: "${query}"`); // Generate query embedding const queryVector = await this.embeddings.embed(query); // Search vector DB const results = await this.vectorDB.query(queryVector, topK, threshold); console.log(`✅ Found ${results.length} results`); return results; } /** * Index all AICF conversations */ async indexAllConversations() { console.log('\n📚 Indexing all AICF conversations...'); // Read conversation log const logPath = path.join(this.aicfDir, 'conversation-log.aicf'); const content = await fs.readFile(logPath, 'utf-8'); // Parse conversations (simplified) const conversations = this.parseConversations(content); // Index each conversation for (const conv of conversations) { await this.indexConversation(conv.id, conv.content, conv.metadata); } console.log(`✅ Indexed ${conversations.length} conversations`); } /** * Parse AICF conversations (simplified) */ parseConversations(content) { // In production, use proper AICF parser const conversations = []; const lines = content.split('\n'); let currentConv = null; for (const line of lines) { if (line.startsWith('@CONVERSATION:')) { if (currentConv) { conversations.push(currentConv); } currentConv = { id: line.split(':')[1], content: '', metadata: {} }; } else if (currentConv && line.trim()) { currentConv.content += line + ' '; } } if (currentConv) { conversations.push(currentConv); } return conversations; } } // ===== EXAMPLE USAGE ===== async function main() { console.log('🚀 AICF v3.1 + Vector Database Integration Example\n'); console.log('Based on Google ADK patterns for semantic retrieval\n'); // Initialize integration const integration = new AICFVectorIntegration({ aicfDir: '.aicf', vectorDB: { provider: 'pinecone', apiKey: 'mock-api-key', environment: 'us-west1-gcp', index: 'aicf-conversations' }, embeddings: { model: 'text-embedding-3-large', dimension: 1536 } }); // Example 1: Index individual conversations console.log('\n=== Example 1: Index Individual Conversations ==='); await integration.indexConversation( 'conv_001', 'Discussion about microservices architecture and scalability patterns', { keywords: 'microservices|architecture|scalability', category: 'ARCHITECTURE', priority: 'HIGH' } ); await integration.indexConversation( 'conv_002', 'Database optimization techniques for PostgreSQL and query performance', { keywords: 'database|postgresql|optimization', category: 'DATABASE', priority: 'MEDIUM' } ); await integration.indexConversation( 'conv_003', 'Frontend React component design patterns and state management', { keywords: 'react|frontend|components', category: 'FRONTEND', priority: 'MEDIUM' } ); // Example 2: Semantic search console.log('\n=== Example 2: Semantic Search ==='); const results1 = await integration.semanticSearch( 'How to scale backend services?', topK = 3, threshold = 0.7 ); console.log('\nSearch Results:'); results1.forEach((result, i) => { console.log(`${i + 1}. ${result.id} (score: ${result.score.toFixed(3)})`); console.log(` Content: ${result.metadata.content.substring(0, 60)}...`); console.log(` Keywords: ${result.metadata.keywords || 'N/A'}`); }); // Example 3: Find similar conversations console.log('\n=== Example 3: Find Similar Conversations ==='); const results2 = await integration.semanticSearch( 'database performance tuning', topK = 2, threshold = 0.7 ); console.log('\nSimilar Conversations:'); results2.forEach((result, i) => { console.log(`${i + 1}. ${result.id} (similarity: ${(result.score * 100).toFixed(1)}%)`); console.log(` ${result.metadata.content.substring(0, 80)}...`); }); console.log('\n✅ Integration example completed!'); console.log('\n📚 Next Steps:'); console.log('1. Replace MockVectorDB with actual vector database client (Pinecone, Weaviate, etc.)'); console.log('2. Replace MockEmbeddingService with actual embedding API (OpenAI, Cohere, etc.)'); console.log('3. Implement proper AICF parsing with aicf-core library'); console.log('4. Add error handling and retry logic'); console.log('5. Implement batch indexing for large datasets'); console.log('6. Add monitoring and observability'); } // Run example if (require.main === module) { main().catch(console.error); } module.exports = { AICFVectorIntegration, MockVectorDB, MockEmbeddingService };