migrations 024/025/026 — 統一 LLM 遙測 + 預算告警 + RAG 一致性護欄 - 024: ai_calls 表 + 5 索引 + 6 CHECK constraint(H1/H2/M3/L3) - 025: mcp_calls + ai_call_budgets + 10 種子預算(含 ollama_secondary) - 026: ai_insights.embedding_signature + pgcrypto + CONCURRENTLY index A11 critic 三輪審查記錄完整保留: - Phase 1 schema review: 2 BLOCKER + 4 HIGH + 6 MEDIUM 全處理 - Phase 1 final sign-off: 0 BLOCKER + 2 HIGH + 4 MEDIUM - Phase 6 ADR review: 5 BLOCKER + 6 HIGH 全修 Operation Ollama-First v5.0 / Phase 0+1+6 護欄 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
67 lines
3.1 KiB
SQL
67 lines
3.1 KiB
SQL
-- =============================================================================
|
||
-- Migration 026: ai_insights.embedding_signature — BGE-M3 一致性護欄
|
||
-- Operation Ollama-First v5.0 — Phase 1 / 護欄 #3
|
||
-- 日期: 2026-05-03 台北
|
||
-- 對應: docs/phase0_audit_report_20260503.md Section 3 BGE-M3 一致性現況報告
|
||
-- =============================================================================
|
||
-- 風險背景:
|
||
-- bge-m3:latest 為 floating tag,Ollama upgrade 會悄悄跳版本,且程式未顯式
|
||
-- 傳遞 normalize / pooling 參數。RAG 召回率會無告警地退化。
|
||
--
|
||
-- 護欄設計:
|
||
-- 每筆 ai_insights.embedding 寫入時,同步記錄 signature:
|
||
-- SHA1("{model}|{normalize}|{dim}|{ollama_digest_前12碼}") 取前 12 碼
|
||
-- 範例: bge-m3:latest|true|1024|7907646426 → SHA1 → e3b0c44298fc
|
||
--
|
||
-- Phase 11 啟動前,先批次補齊既有資料:
|
||
-- UPDATE ai_insights
|
||
-- SET embedding_signature = '<current_signature>'
|
||
-- WHERE embedding IS NOT NULL AND embedding_signature IS NULL;
|
||
-- 並由 ai_calls.meta.embedding_signature 與 ai_insights.embedding_signature
|
||
-- 做 cross-check(簽名漂移時觸發 Telegram 告警)。
|
||
--
|
||
-- ALTER TABLE 安全性:
|
||
-- PostgreSQL 11+ 新增 NULL 預設值欄位為 metadata-only 變更(不重寫表,不鎖表)。
|
||
-- 生產環境 (PostgreSQL 14) 確認安全。
|
||
--
|
||
-- 回滾腳本:
|
||
-- DROP INDEX IF EXISTS idx_ai_insights_embedding_signature;
|
||
-- ALTER TABLE ai_insights DROP COLUMN IF EXISTS embedding_signature;
|
||
--
|
||
-- critic-A11 修補(B2):
|
||
-- pgcrypto extension 由本 migration 啟用;附錄 SHA1 範例不再缺前置條件。
|
||
-- =============================================================================
|
||
|
||
-- (0) critic-A11 B2 修補:pgcrypto 用於附錄 SHA1 簽名計算(IF NOT EXISTS 冪等)
|
||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||
|
||
-- (1) 新增欄位(無 DEFAULT,metadata-only,不鎖表)
|
||
ALTER TABLE ai_insights
|
||
ADD COLUMN IF NOT EXISTS embedding_signature VARCHAR(64);
|
||
|
||
COMMENT ON COLUMN ai_insights.embedding_signature IS
|
||
'BGE-M3 一致性簽名:SHA1({model}|{normalize}|{dim}|{ollama_digest})[:12],'
|
||
'Phase 11 RAG 召回前必檢查;NULL = 既有未回填資料(待批次補)';
|
||
|
||
-- (2) Partial index:只索引有 embedding 且簽名非空的列
|
||
-- 用 CONCURRENTLY 避免阻塞既有 ai_insights 寫入
|
||
-- 注意: CONCURRENTLY 不能在 transaction block 內執行;本 migration 採 PostgreSQL
|
||
-- psql 直接執行(無外層 BEGIN/COMMIT)
|
||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_ai_insights_embedding_signature
|
||
ON ai_insights (embedding_signature)
|
||
WHERE embedding IS NOT NULL;
|
||
|
||
-- 註: Phase 11 啟動前批次補簽名範例(不在本 migration 執行):
|
||
-- WITH sig AS (
|
||
-- SELECT 'bge-m3:latest|true|1024|<digest>' AS raw
|
||
-- )
|
||
-- UPDATE ai_insights
|
||
-- SET embedding_signature = SUBSTRING(ENCODE(DIGEST(sig.raw, 'sha1'), 'hex'), 1, 12)
|
||
-- FROM sig
|
||
-- WHERE embedding IS NOT NULL AND embedding_signature IS NULL;
|
||
|
||
DO $$
|
||
BEGIN
|
||
RAISE NOTICE 'Migration 026 done: ai_insights.embedding_signature + partial index (Operation Ollama-First v5.0 P1)';
|
||
END $$;
|