-- ============================================================================= -- Migration 034: rag_query_log / learning_episodes embedding_signature -- Operation Ollama-First v5.0 — BGE-M3 cross-table guardrail -- 日期: 2026-05-12 台北 -- ============================================================================= -- 背景: -- migration 026 已替 ai_insights.embedding 加 embedding_signature,但 -- rag_query_log.query_embedding 與 learning_episodes.embedding 仍缺同一護欄。 -- 一旦 bge-m3:latest / normalize / dim 漂移,跨表 cosine 會退化且無法定位。 -- -- 設計: -- 1. 新增 nullable VARCHAR(64),metadata-only,不回填、不重寫大表。 -- 2. 新寫入由 services/rag_service.py 與 services/openclaw_learning_service.py 補簽名。 -- 3. 既有 NULL 代表歷史資料,查詢端可保守放行或在後續 backfill 後收緊。 -- ============================================================================= ALTER TABLE IF EXISTS rag_query_log ADD COLUMN IF NOT EXISTS embedding_signature VARCHAR(64); COMMENT ON COLUMN rag_query_log.embedding_signature IS 'BGE-M3 一致性簽名;對應 query_embedding,NULL = 歷史資料或 embedding 失敗'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_rag_query_log_embedding_signature ON rag_query_log (embedding_signature) WHERE query_embedding IS NOT NULL AND embedding_signature IS NOT NULL; ALTER TABLE IF EXISTS learning_episodes ADD COLUMN IF NOT EXISTS embedding_signature VARCHAR(64); COMMENT ON COLUMN learning_episodes.embedding_signature IS 'BGE-M3 一致性簽名;對應 embedding,NULL = 尚未 embedding 或歷史資料'; CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_le_embedding_signature ON learning_episodes (embedding_signature) WHERE embedding IS NOT NULL AND embedding_signature IS NOT NULL; DO $$ BEGIN RAISE NOTICE 'Migration 034 done: embedding_signature added to rag_query_log and learning_episodes'; END $$;