feat(p11.0): BGE-M3 跨主機一致性驗證 + 每週日 04:30 cron
Some checks failed
CD Pipeline / deploy (push) Has been cancelled

Operation Ollama-First v5.0 / Phase 11.0 收尾(ADR-033 護欄 #3 完整落地)

services/rag_service.py 新增:
- verify_embedding_consistency() — 跨三主機 BGE-M3 embedding 一致性驗證
  測試文字「momo電商競品分析測試向量一致性檢查」分別呼叫 GCP Primary /
  Secondary / 111 三主機,計算兩兩 cosine 距離。
  max_diff > 1e-4 視為不一致(模型版本漂移)→ logger.error。
- _cosine_distance() — 純 Python,不依賴 numpy
- fail-safe:< 2 主機可達也回 ok=True(戰時部分主機暫斷不算錯)

run_scheduler.py 新增:
- run_embed_consistency_check task wrapper
- schedule.every().sunday.at("04:30").do(...) — 每週一次足夠
  (不需每次啟動驗證,過頻會打三主機 Ollama 浪費)

落地 ADR-033 護欄 #3 完整版:
  簽名鎖定(migration 026 embedding_signature 欄位) 既有
  程式端簽名計算(rag_service.get_embedding_signature) 既有
  RAG 查詢時簽名比對過濾(rag_service._select_hits) 既有
  跨主機一致性驗證 cron  新增 
  既有 14k+ 筆回填  待手動跑 enqueue_missing_insight_embeddings()

regression: 47 unit tests 全綠

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
OoO
2026-05-04 09:31:31 +08:00
parent 84a8c07e4a
commit 97c446303c
2 changed files with 147 additions and 0 deletions

View File

@@ -116,6 +116,11 @@ def _register_schedules():
schedule.every(4).hours.do(run_expire_stale_reviews)
logger.info("📅 每 4 小時expire_stale_reviews24h 無回應降權 0.5")
# Phase 11.0 護欄 #3BGE-M3 跨主機一致性驗證ADR-033
# 每週一次足夠(驗證模型版本未漂移;不需每次啟動)
schedule.every().sunday.at("04:30").do(run_embed_consistency_check)
logger.info("📅 每週日 04:30bge-m3 跨主機一致性驗證")
schedule.every().day.at("03:00").do(run_db_backup_task)
logger.info("📅 每日 03:00db_backup")
@@ -225,6 +230,29 @@ def run_expire_stale_reviews():
logger.error(f"[ExpireStale] task failed: {e}", exc_info=True)
def run_embed_consistency_check():
"""每週日 04:30 — BGE-M3 跨主機一致性驗證ADR-033 護欄 #3
跑 verify_embedding_consistency不一致時 logger.errorok 時 logger.info。
每週一次足夠(驗證模型版本未漂移;過頻會打三主機 Ollama 浪費)。
"""
try:
from services.rag_service import verify_embedding_consistency
result = verify_embedding_consistency()
logger.info(
"[EmbedConsistency] ok=%s reachable=%s max_diff=%.2e signature=%s",
result['ok'], result['reachable'],
result['max_diff'], result['signature'],
)
if not result['ok']:
logger.error(
"[EmbedConsistency] ⚠️ INCONSISTENT — RAG 召回率將下降;"
"檢查三主機 bge-m3 模型版本是否同步ollama list"
)
except Exception as e:
logger.error(f"[EmbedConsistency] task failed: {e}", exc_info=True)
def run_cleanup_agent_context():
"""每日 03:30 — 清理 agent_context 表中已過期的 TTL 記錄migration 018 定義)"""
from database.manager import get_session