feat(p11.0): BGE-M3 跨主機一致性驗證 + 每週日 04:30 cron
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
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:
@@ -116,6 +116,11 @@ def _register_schedules():
|
||||
schedule.every(4).hours.do(run_expire_stale_reviews)
|
||||
logger.info("📅 每 4 小時:expire_stale_reviews(24h 無回應降權 0.5)")
|
||||
|
||||
# Phase 11.0 護欄 #3:BGE-M3 跨主機一致性驗證(ADR-033)
|
||||
# 每週一次足夠(驗證模型版本未漂移;不需每次啟動)
|
||||
schedule.every().sunday.at("04:30").do(run_embed_consistency_check)
|
||||
logger.info("📅 每週日 04:30:bge-m3 跨主機一致性驗證")
|
||||
|
||||
schedule.every().day.at("03:00").do(run_db_backup_task)
|
||||
logger.info("📅 每日 03:00:db_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.error;ok 時 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
|
||||
|
||||
Reference in New Issue
Block a user