Spaces:
Sleeping
Sleeping
--- | |
license: apache-2.0 | |
language: | |
- en | |
base_model: | |
- mradermacher/oh-dcft-v3.1-claude-3-5-sonnet-20241022-GGUF | |
- openai/whisper-large-v3-turbo | |
pipeline_tag: memory-management | |
inference_api: true | |
title: Adaptive Memory Architecture (AMA) | |
description: > | |
A biomimetic, multi-tier memory management system designed to revolutionize | |
how AI systems process, store, and retrieve information. Featuring dynamic | |
semantic embedding, intelligent relationship tracking, and adaptive memory compression. | |
key_features: | |
- Multi-tier memory management | |
- Semantic embedding integration | |
- Dynamic relationship inference | |
- Intelligent memory compression | |
- Contextually aware information processing | |
technical_details: | |
memory_tiers: | |
- volatile_short_term: | |
capacity: 10 items | |
characteristics: | |
- High-speed access | |
- Recent interactions | |
- Cache-like implementation | |
- persistent_long_term: | |
capacity: unlimited | |
characteristics: | |
- Important concept storage | |
- Hierarchical knowledge representation | |
- context_working_memory: | |
capacity: 5 items | |
characteristics: | |
- Current conversation state | |
- Active task parameters | |
performance_metrics: | |
retrieval_speed: O(log n) | |
semantic_similarity_calculation: cosine distance | |
memory_compression_ratio: adaptive | |
research_potential: | |
- Neuromorphic memory modeling | |
- Adaptive learning systems | |
- Cognitive architecture development | |
ethical_considerations: | |
- Transparent memory tracking | |
- Configurable confidence scoring | |
- Relationship type inference | |
usage: | |
- python | |
- memory_manager = MemoryManager() | |
- memory_manager.insert("AI ethics are crucial") | |
- results = memory_manager.retrieve("ethical AI") | |
--- | |
class AdvancedMemoryManager { | |
constructor(config = {}) { | |
// Configurable embedding models | |
this.embeddingModels = { | |
default: new SemanticEmbedding(), | |
multilingual: new MultilingualEmbedding(), | |
specialized: { | |
text: new TextSpecificEmbedding(), | |
numerical: new NumericalEmbedding() | |
} | |
}; | |
// Adaptive pruning configuration | |
this.pruningConfig = { | |
strategies: [ | |
'temporal_decay', | |
'importance_score', | |
'relationship_density' | |
], | |
thresholds: { | |
maxMemorySize: config.maxMemorySize || 10000, | |
compressionTrigger: config.compressionTrigger || 0.8 | |
} | |
}; | |
// Advanced indexing for efficient retrieval | |
this.semanticIndex = new ApproximateNearestNeighborIndex(); | |
} | |
async selectOptimalEmbeddingModel(content) { | |
// Dynamically select most appropriate embedding model | |
if (this.isMultilingualContent(content)) { | |
return this.embeddingModels.multilingual; | |
} | |
if (this.isNumericalContent(content)) { | |
return this.embeddingModels.specialized.numerical; | |
} | |
return this.embeddingModels.default; | |
} | |
async insert(content, options = {}) { | |
const embeddingModel = await this.selectOptimalEmbeddingModel(content); | |
const memoryItem = new MemoryItem(content, { | |
...options, | |
embeddingModel | |
}); | |
// Advanced indexing and relationship tracking | |
this.semanticIndex.add(memoryItem); | |
this.trackRelationships(memoryItem); | |
return memoryItem; | |
} | |
async intelligentRetrieve(query, options = {}) { | |
const { | |
maxResults = 10, | |
similarityThreshold = 0.7, | |
includeRelated = true | |
} = options; | |
// Semantic and relationship-aware retrieval | |
const semanticResults = this.semanticIndex.search(query, { | |
maxResults, | |
threshold: similarityThreshold | |
}); | |
if (includeRelated) { | |
return this.expandWithRelatedMemories(semanticResults); | |
} | |
return semanticResults; | |
} | |
async performMemoryCompression() { | |
const compressionCandidates = this.identifyCompressionCandidates(); | |
const compressedMemories = compressionCandidates.map(this.compressMemory); | |
return { | |
originalCount: compressionCandidates.length, | |
compressedCount: compressedMemories.length, | |
compressionRatio: compressedMemories.length / compressionCandidates.length | |
}; | |
} | |
} | |
const natural = require('natural'); | |
const tf = require('@tensorflow/tfjs-node'); | |
const { Word2Vec } = require('word2vec'); | |
class SemanticEmbedding { | |
constructor() { | |
this.model = null; | |
this.vectorSize = 100; | |
} | |
async initialize() { | |
// Placeholder for more advanced embedding initialization | |
this.model = await tf.loadLayersModel('path/to/embedding/model'); | |
} | |
async generateEmbedding(text) { | |
// Generate semantic vector representation | |
const tokens = natural.tokenize(text.toLowerCase()); | |
const embedding = await this.model.predict(tokens); | |
return embedding; | |
} | |
calculateSemanticSimilarity(embedding1, embedding2) { | |
// Cosine similarity calculation | |
return tf.losses.cosineDistance(embedding1, embedding2); | |
} | |
} | |
class MemoryItem { | |
constructor(content, { | |
type = "text", | |
isFactual = 0.5, | |
source = null, | |
confidence = 0.5 | |
} = {}) { | |
this.id = crypto.randomUUID(); // Unique identifier | |
this.content = content; | |
this.type = type; | |
this.isFactual = isFactual; | |
this.confidence = confidence; | |
this.source = source; | |
this.timestamp = Date.now(); | |
this.accessCount = 0; | |
this.importance = 5; | |
this.embedding = null; | |
this.related = new Map(); // Enhanced relationship tracking | |
this.tags = new Set(); | |
} | |
async computeEmbedding(embeddingService) { | |
this.embedding = await embeddingService.generateEmbedding(this.content); | |
} | |
addRelationship(memoryItem, weight = 1.0) { | |
this.related.set(memoryItem.id, { | |
memory: memoryItem, | |
weight: weight, | |
type: this.determineRelationshipType(memoryItem) | |
}); | |
} | |
determineRelationshipType(memoryItem) { | |
// Semantic relationship type inference | |
const semanticDistance = this.calculateSemanticDistance(memoryItem); | |
if (semanticDistance < 0.2) return 'VERY_CLOSE'; | |
if (semanticDistance < 0.5) return 'RELATED'; | |
return 'DISTANT'; | |
} | |
calculateSemanticDistance(memoryItem) { | |
// Placeholder for semantic distance calculation | |
return Math.random(); // Replace with actual embedding comparison | |
} | |
incrementAccess() { | |
this.accessCount++; | |
this.updateImportance(); | |
} | |
updateImportance() { | |
// Dynamic importance calculation | |
this.importance = Math.min( | |
10, | |
5 + Math.log(this.accessCount + 1) | |
); | |
} | |
} | |
class MemoryTier { | |
constructor(name, { | |
maxCapacity = Infinity, | |
pruneStrategy = 'LRU' | |
} = {}) { | |
this.name = name; | |
this.items = new Map(); // Use Map for efficient lookups | |
this.maxCapacity = maxCapacity; | |
this.pruneStrategy = pruneStrategy; | |
} | |
insert(memoryItem) { | |
if (this.items.size >= this.maxCapacity) { | |
this.prune(); | |
} | |
this.items.set(memoryItem.id, memoryItem); | |
} | |
prune() { | |
switch(this.pruneStrategy) { | |
case 'LRU': | |
const lruItem = Array.from(this.items.values()) | |
.sort((a, b) => a.timestamp - b.timestamp)[0]; | |
this.items.delete(lruItem.id); | |
break; | |
case 'LEAST_IMPORTANT': | |
const leastImportant = Array.from(this.items.values()) | |
.sort((a, b) => a.importance - b.importance)[0]; | |
this.items.delete(leastImportant.id); | |
break; | |
} | |
} | |
async retrieve(query, embeddingService, topK = 5) { | |
const queryEmbedding = await embeddingService.generateEmbedding(query); | |
const scoredResults = Array.from(this.items.values()) | |
.map(item => ({ | |
memory: item, | |
similarity: embeddingService.calculateSemanticSimilarity( | |
item.embedding, | |
queryEmbedding | |
) | |
})) | |
.sort((a, b) => b.similarity - a.similarity) | |
.slice(0, topK); | |
return scoredResults.map(r => r.memory); | |
} | |
} | |
class MemoryManager { | |
constructor() { | |
this.embeddingService = new SemanticEmbedding(); | |
this.volatileShortTerm = new MemoryTier("Volatile Short-Term", { | |
maxCapacity: 10, | |
pruneStrategy: 'LRU' | |
}); | |
this.persistentLongTerm = new MemoryTier("Persistent Long-Term"); | |
this.contextWorkingMemory = new MemoryTier("Context/Working Memory", { | |
maxCapacity: 5 | |
}); | |
this.allMemories = new Map(); | |
} | |
async initialize() { | |
await this.embeddingService.initialize(); | |
} | |
async insert(content, options = {}) { | |
const memoryItem = new MemoryItem(content, options); | |
await memoryItem.computeEmbedding(this.embeddingService); | |
// Insert into all appropriate tiers | |
this.volatileShortTerm.insert(memoryItem); | |
this.persistentLongTerm.insert(memoryItem); | |
this.contextWorkingMemory.insert(memoryItem); | |
this.allMemories.set(memoryItem.id, memoryItem); | |
return memoryItem; | |
} | |
async retrieve(query, tier = null) { | |
if (tier) { | |
return tier.retrieve(query, this.embeddingService); | |
} | |
// Parallel retrieval across tiers | |
const results = await Promise.all([ | |
this.volatileShortTerm.retrieve(query, this.embeddingService), | |
this.persistentLongTerm.retrieve(query, this.embeddingService), | |
this.contextWorkingMemory.retrieve(query, this.embeddingService) | |
]); | |
// Flatten and deduplicate results | |
return [...new Set(results.flat())]; | |
} | |
async findSemanticallySimilar(memoryItem, threshold = 0.7) { | |
const similar = []; | |
for (let [, memory] of this.allMemories) { | |
if (memory.id !== memoryItem.id) { | |
const similarity = this.embeddingService.calculateSemanticSimilarity( | |
memory.embedding, | |
memoryItem.embedding | |
); | |
if (similarity >= threshold) { | |
similar.push({ memory, similarity }); | |
} | |
} | |
} | |
return similar.sort((a, b) => b.similarity - a.similarity); | |
} | |
} | |
// Example Usage | |
async function demonstrateMemorySystem() { | |
const memoryManager = new MemoryManager(); | |
await memoryManager.initialize(); | |
// Insert memories | |
const aiEthicsMem = await memoryManager.insert( | |
"AI should be developed with strong ethical considerations", | |
{ | |
type: "concept", | |
isFactual: 0.9, | |
confidence: 0.8 | |
} | |
); | |
const aiResearchMem = await memoryManager.insert( | |
"Machine learning research is advancing rapidly", | |
{ | |
type: "research", | |
isFactual: 0.95 | |
} | |
); | |
// Create relationships | |
aiEthicsMem.addRelationship(aiResearchMem); | |
// Retrieve memories | |
const retrievedMemories = await memoryManager.retrieve("AI ethics"); | |
console.log("Retrieved Memories:", retrievedMemories); | |
// Find semantically similar memories | |
const similarMemories = await memoryManager.findSemanticallySimilar(aiEthicsMem); | |
console.log("Similar Memories:", similarMemories); | |
} | |
demonstrateMemorySystem(); | |
module.exports = { MemoryManager, MemoryItem, MemoryTier }; | |
class AdvancedMemoryManager { | |
constructor(config = {}) { | |
// Configurable embedding models | |
this.embeddingModels = { | |
default: new SemanticEmbedding(), | |
multilingual: new MultilingualEmbedding(), | |
specialized: { | |
text: new TextSpecificEmbedding(), | |
numerical: new NumericalEmbedding() | |
} | |
}; | |
// Adaptive pruning configuration | |
this.pruningConfig = { | |
strategies: [ | |
'temporal_decay', | |
'importance_score', | |
'relationship_density' | |
], | |
thresholds: { | |
maxMemorySize: config.maxMemorySize || 10000, | |
compressionTrigger: config.compressionTrigger || 0.8 | |
} | |
}; | |
// Advanced indexing for efficient retrieval | |
this.semanticIndex = new ApproximateNearestNeighborIndex(); | |
} | |
async selectOptimalEmbeddingModel(content) { | |
// Dynamically select most appropriate embedding model | |
if (this.isMultilingualContent(content)) { | |
return this.embeddingModels.multilingual; | |
} | |
if (this.isNumericalContent(content)) { | |
return this.embeddingModels.specialized.numerical; | |
} | |
return this.embeddingModels.default; | |
} | |
async insert(content, options = {}) { | |
const embeddingModel = await this.selectOptimalEmbeddingModel(content); | |
const memoryItem = new MemoryItem(content, { | |
...options, | |
embeddingModel | |
}); | |
// Advanced indexing and relationship tracking | |
this.semanticIndex.add(memoryItem); | |
this.trackRelationships(memoryItem); | |
return memoryItem; | |
} | |
async intelligentRetrieve(query, options = {}) { | |
const { | |
maxResults = 10, | |
similarityThreshold = 0.7, | |
includeRelated = true | |
} = options; | |
// Semantic and relationship-aware retrieval | |
const semanticResults = this.semanticIndex.search(query, { | |
maxResults, | |
threshold: similarityThreshold | |
}); | |
if (includeRelated) { | |
return this.expandWithRelatedMemories(semanticResults); | |
} | |
return semanticResults; | |
} | |
async performMemoryCompression() { | |
const compressionCandidates = this.identifyCompressionCandidates(); | |
const compressedMemories = compressionCandidates.map(this.compressMemory); | |
return { | |
originalCount: compressionCandidates.length, | |
compressedCount: compressedMemories.length, | |
compressionRatio: compressedMemories.length / compressionCandidates.length | |
}; | |
} | |
} | |
class MemoryTracer { | |
constructor() { | |
this.generationLog = new Map(); // Track memory generation lineage | |
this.redundancyMap = new Map(); // Track potential redundant memories | |
this.compressionMetrics = { | |
totalMemories: 0, | |
uniqueMemories: 0, | |
redundancyRate: 0, | |
compressionPotential: 0 | |
}; | |
} | |
trackGeneration(memoryItem, parentMemories = []) { | |
// Create a generation trace | |
const generationEntry = { | |
id: memoryItem.id, | |
timestamp: Date.now(), | |
content: memoryItem.content, | |
parents: parentMemories.map(m => m.id), | |
lineage: [ | |
...parentMemories.flatMap(p => | |
this.generationLog.get(p.id)?.lineage || [] | |
), | |
memoryItem.id | |
] | |
}; | |
this.generationLog.set(memoryItem.id, generationEntry); | |
this.updateRedundancyMetrics(memoryItem); | |
} | |
updateRedundancyMetrics(memoryItem) { | |
// Semantic similarity check for redundancy | |
const similarityThreshold = 0.9; | |
let redundancyCount = 0; | |
for (let [, existingMemory] of this.redundancyMap) { | |
const similarity = this.calculateSemanticSimilarity( | |
existingMemory.content, | |
memoryItem.content | |
); | |
if (similarity >= similarityThreshold) { | |
redundancyCount++; | |
this.redundancyMap.set(memoryItem.id, { | |
memory: memoryItem, | |
similarTo: existingMemory.id, | |
similarity: similarity | |
}); | |
} | |
} | |
// Update compression metrics | |
this.compressionMetrics.totalMemories++; | |
this.compressionMetrics.redundancyRate = | |
(redundancyCount / this.compressionMetrics.totalMemories); | |
this.compressionMetrics.compressionPotential = | |
this.calculateCompressionPotential(); | |
} | |
calculateSemanticSimilarity(content1, content2) { | |
// Placeholder for semantic similarity calculation | |
// In a real implementation, use embedding-based similarity | |
const words1 = new Set(content1.toLowerCase().split(/\s+/)); | |
const words2 = new Set(content2.toLowerCase().split(/\s+/)); | |
const intersection = new Set( | |
[...words1].filter(x => words2.has(x)) | |
); | |
return intersection.size / Math.max(words1.size, words2.size); | |
} | |
calculateCompressionPotential() { | |
// Advanced compression potential calculation | |
const { totalMemories, redundancyRate } = this.compressionMetrics; | |
// Exponential decay of compression potential | |
return Math.min(1, Math.exp(-redundancyRate) * | |
(1 - 1 / (1 + totalMemories))); | |
} | |
compressMemories(memoryManager) { | |
const compressibleMemories = []; | |
// Identify memories for potential compression | |
for (let [id, redundancyEntry] of this.redundancyMap) { | |
if (redundancyEntry.similarity >= 0.9) { | |
compressibleMemories.push({ | |
id: id, | |
similarTo: redundancyEntry.similarTo, | |
similarity: redundancyEntry.similarity | |
}); | |
} | |
} | |
// Compression strategy | |
const compressionStrategy = (memories) => { | |
// Group similar memories | |
const memoryGroups = new Map(); | |
memories.forEach(memoryInfo => { | |
const groupKey = memoryInfo.similarTo; | |
if (!memoryGroups.has(groupKey)) { | |
memoryGroups.set(groupKey, []); | |
} | |
memoryGroups.get(groupKey).push(memoryInfo); | |
}); | |
// Merge similar memory groups | |
const mergedMemories = []; | |
for (let [baseId, group] of memoryGroups) { | |
const baseMemory = memoryManager.allMemories.get(baseId); | |
// Create a compressed representation | |
const compressedContent = this.createCompressedContent( | |
group.map(g => | |
memoryManager.allMemories.get(g.id).content | |
) | |
); | |
// Create a new compressed memory item | |
const compressedMemory = new MemoryItem(compressedContent, { | |
type: baseMemory.type, | |
isFactual: baseMemory.isFactual, | |
confidence: Math.max(...group.map(g => | |
memoryManager.allMemories.get(g.id).confidence | |
)) | |
}); | |
mergedMemories.push(compressedMemory); | |
} | |
return mergedMemories; | |
}; | |
// Execute compression | |
const compressedMemories = compressionStrategy(compressibleMemories); | |
// Update memory manager | |
compressedMemories.forEach(memory => { | |
memoryManager.insert(memory); | |
}); | |
// Log compression results | |
console.log('Memory Compression Report:', { | |
totalCompressed: compressibleMemories.length, | |
compressionPotential: this.compressionMetrics.compressionPotential | |
}); | |
return compressedMemories; | |
} | |
createCompressedContent(contents) { | |
// Intelligently combine similar memory contents | |
const uniqueWords = new Set( | |
contents.flatMap(content => | |
content.toLowerCase().split(/\s+/) | |
) | |
); | |
// Create a concise summary | |
return Array.from(uniqueWords).slice(0, 20).join(' '); | |
} | |
} | |
// Modify MemoryManager to incorporate tracing | |
class MemoryManager { | |
constructor() { | |
// ... existing constructor code ... | |
this.memoryTracer = new MemoryTracer(); | |
} | |
async insert(content, options = {}, parentMemories = []) { | |
const memoryItem = new MemoryItem(content, options); | |
// Compute embedding and trace generation | |
await memoryItem.computeEmbedding(this.embeddingService); | |
this.memoryTracer.trackGeneration(memoryItem, parentMemories); | |
// ... existing insertion code ... | |
return memoryItem; | |
} | |
performMemoryCompression() { | |
return this.memoryTracer.compressMemories(this); | |
} | |
} | |
const crypto = require('crypto'); | |
class MemoryItem { | |
constructor(content, options = {}) { | |
this.id = crypto.randomUUID(); | |
this.content = content; | |
this.type = options.type || 'text'; | |
this.isFactual = options.isFactual || 0.5; | |
this.confidence = options.confidence || 0.5; | |
this.timestamp = Date.now(); | |
this.accessCount = 0; | |
this.importance = 5; | |
this.embedding = null; | |
this.related = new Map(); | |
this.tags = new Set(); | |
} | |
addRelationship(memoryItem, weight = 1.0) { | |
this.related.set(memoryItem.id, { | |
memory: memoryItem, | |
weight: weight, | |
type: this.determineRelationshipType(memoryItem) | |
}); | |
} | |
determineRelationshipType(memoryItem) { | |
// Basic relationship type inference | |
const content1 = this.content.toLowerCase(); | |
const content2 = memoryItem.content.toLowerCase(); | |
const sharedWords = content1.split(' ') | |
.filter(word => content2.includes(word)); | |
const similarityRatio = sharedWords.length / | |
Math.max(content1.split(' ').length, content2.split(' ').length); | |
if (similarityRatio > 0.5) return 'VERY_CLOSE'; | |
if (similarityRatio > 0.2) return 'RELATED'; | |
return 'DISTANT'; | |
} | |
incrementAccess() { | |
this.accessCount++; | |
this.updateImportance(); | |
} | |
updateImportance() { | |
// Dynamic importance calculation | |
this.importance = Math.min( | |
10, | |
5 + Math.log(this.accessCount + 1) | |
); | |
} | |
} | |
module.exports = MemoryItem; | |
class MemoryTier { | |
constructor(name, options = {}) { | |
this.name = name; | |
this.items = new Map(); | |
this.maxCapacity = options.maxCapacity || Infinity; | |
this.pruneStrategy = options.pruneStrategy || 'LRU'; | |
} | |
insert(memoryItem) { | |
if (this.items.size >= this.maxCapacity) { | |
this.prune(); | |
} | |
this.items.set(memoryItem.id, memoryItem); | |
} | |
prune() { | |
switch(this.pruneStrategy) { | |
case 'LRU': | |
const oldestItem = Array.from(this.items.values()) | |
.sort((a, b) => a.timestamp - b.timestamp)[0]; | |
this.items.delete(oldestItem.id); | |
break; | |
case 'LEAST_IMPORTANT': | |
const leastImportant = Array.from(this.items.values()) | |
.sort((a, b) => a.importance - b.importance)[0]; | |
this.items.delete(leastImportant.id); | |
break; | |
} | |
} | |
retrieve(query) { | |
return Array.from(this.items.values()) | |
.filter(item => item.content.includes(query)); | |
} | |
} | |
module.exports = MemoryTier; | |
const MemoryItem = require('./memory-item'); | |
const MemoryTier = require('./memory-tier'); | |
const SemanticEmbedding = require('./semantic-embedding'); | |
class MemoryManager { | |
constructor(config = {}) { | |
this.embeddingService = new SemanticEmbedding(); | |
this.tiers = { | |
volatileShortTerm: new MemoryTier('Volatile Short-Term', { | |
maxCapacity: config.shortTermCapacity || 10 | |
}), | |
persistentLongTerm: new MemoryTier('Persistent Long-Term'), | |
contextWorkingMemory: new MemoryTier('Context/Working Memory', { | |
maxCapacity: config.workingMemoryCapacity || 5 | |
}) | |
}; | |
this.allMemories = new Map(); | |
} | |
async insert(content, options = {}) { | |
const memoryItem = new MemoryItem(content, options); | |
// Insert into all tiers | |
Object.values(this.tiers).forEach(tier => { | |
tier.insert(memoryItem); | |
}); | |
this.allMemories.set(memoryItem.id, memoryItem); | |
return memoryItem; | |
} | |
async retrieve(query) { | |
// Aggregate results from all tiers | |
const results = Object.values(this.tiers) | |
.flatMap(tier => tier.retrieve(query)); | |
// Deduplicate and sort by importance | |
return [...new Set(results)] | |
.sort((a, b) => b.importance - a.importance); | |
} | |
async findSemanticallySimilar(memoryItem, threshold = 0.7) { | |
const similar = []; | |
for (let [, memory] of this.allMemories) { | |
if (memory.id !== memoryItem.id) { | |
const similarity = this.calculateSemanticSimilarity( | |
memory.content, | |
memoryItem.content | |
); | |
if (similarity >= threshold) { | |
similar.push({ memory, similarity }); | |
} | |
} | |
} | |
return similar.sort((a, b) => b.similarity - a.similarity); | |
} | |
calculateSemanticSimilarity(content1, content2) { | |
// Simple similarity calculation | |
const words1 = new Set(content1.toLowerCase().split(/\s+/)); | |
const words2 = new Set(content2.toLowerCase().split(/\s+/)); | |
const intersection = new Set( | |
[...words1].filter(x => words2.has(x)) | |
); | |
return intersection.size / Math.max(words1.size, words2.size); | |
} | |
} | |
module.exports = MemoryManager; | |
class SemanticEmbedding { | |
constructor() { | |
this.embeddingCache = new Map(); | |
} | |
async generateEmbedding(text) { | |
// Check cache first | |
if (this.embeddingCache.has(text)) { | |
return this.embeddingCache.get(text); | |
} | |
// Simple embedding generation | |
const tokens = text.toLowerCase().split(/\s+/); | |
const embedding = tokens.map(token => this.simpleTokenEmbedding(token)); | |
// Cache the embedding | |
this.embeddingCache.set(text, embedding); | |
return embedding; | |
} | |
simpleTokenEmbedding(token) { | |
// Very basic embedding - just a numerical representation | |
return token.split('').map(char => char.charCodeAt(0)); | |
} | |
calculateSemanticSimilarity(embedding1, embedding2) { | |
// Cosine similarity approximation | |
const dotProduct = embedding1.reduce( | |
(sum, val, i) => sum + val * (embedding2[i] || 0), | |
0 | |
); | |
const magnitude1 = Math.sqrt( | |
embedding1.reduce((sum, val) => sum + val * val, 0) | |
); | |
const magnitude2 = Math.sqrt( | |
embedding2.reduce((sum, val) => sum + val * val, 0) | |
); | |
return dotProduct / (magnitude1 * magnitude2); | |
} | |
} |