UNPKG

@shirokuma-library/mcp-knowledge-base

Version:

MCP server for AI-powered knowledge management with semantic search, graph analysis, and automatic enrichment

50 lines (39 loc) 1.72 kB
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); // 量子化関数(EnhancedAIServiceV2と同じ実装) function quantizeEmbedding(embedding: number[]): Buffer { const quantized = embedding.map(x => { const scaled = Math.round(x * 127); return Math.max(-127, Math.min(127, scaled)); }); return Buffer.from(quantized.map(x => x + 128)); } async function migrateEmbeddings() { console.log('Starting embedding migration...'); // 1. 既存のJSON embeddingデータを取得 const items = await prisma.$queryRaw<Array<{id: number, embedding: string}>>` SELECT id, embedding FROM items WHERE embedding IS NOT NULL `; console.log(`Found ${items.length} items with embeddings to migrate`); // 2. 各embeddingを量子化してBytesに変換 for (const item of items) { try { const floatEmbedding = JSON.parse(item.embedding) as number[]; const quantizedBuffer = quantizeEmbedding(floatEmbedding); // データサイズ比較 const originalSize = item.embedding.length; const newSize = quantizedBuffer.length; console.log(`Item ${item.id}: ${originalSize} bytes → ${newSize} bytes (${Math.round((1-newSize/originalSize)*100)}% reduction)`); // 3. データベースを更新(後でまとめて実行) await prisma.$executeRaw` UPDATE items SET embedding = ${quantizedBuffer} WHERE id = ${item.id} `; } catch (error) { console.error(`Failed to migrate embedding for item ${item.id}:`, error); } } console.log('Embedding migration completed!'); } migrateEmbeddings() .catch(console.error) .finally(() => prisma.$disconnect());