UNPKG

semem

Version:

Semantic Memory for Intelligent Agents

63 lines (51 loc) 1.96 kB
// Validates embeddings and handles dimension standardization export class EmbeddingValidator { constructor(config = {}) { // Default dimensions for different models this.dimensionMap = { 'nomic-embed-text': 768, 'qwen2:1.5b': 1536, 'llama2': 4096, 'default': 1536 } // Override defaults with config Object.assign(this.dimensionMap, config.dimensions || {}) } getDimension(model) { return this.dimensionMap[model] || this.dimensionMap.default } validateEmbedding(embedding, expectedDimension) { if (!Array.isArray(embedding)) { throw new TypeError('Embedding must be an array') } if (!embedding.every(x => typeof x === 'number' && !isNaN(x))) { throw new TypeError('Embedding must contain only valid numbers') } const actual = embedding.length if (actual !== expectedDimension) { throw new Error(`Embedding dimension mismatch: expected ${expectedDimension}, got ${actual}`) } return true } standardizeEmbedding(embedding, targetDimension) { this.validateEmbedding(embedding, embedding.length) const current = embedding.length if (current === targetDimension) { return embedding } if (current < targetDimension) { // Pad with zeros return [...embedding, ...new Array(targetDimension - current).fill(0)] } // Truncate to target dimension return embedding.slice(0, targetDimension) } // Utility method to check if padding/truncation would be lossy wouldBeLossy(embedding, targetDimension) { if (embedding.length <= targetDimension) { return false } // Check if truncated values would be non-zero return embedding.slice(targetDimension).some(x => Math.abs(x) > 1e-7) } }