feat(Phase 3): AgentSession 學習接線 — record_agent_session() + orchestrator 辯證訊號
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled

- learning_service.py: 新增 record_agent_session() — 5-Agent 辯證結果 → Redis analytics
  Critic 質疑 + matched_playbook_id → 輕度負向 EWMA;all_agents_degraded 記錄治理事件
- agent_orchestrator.py: run_agent_debate() 完成後 best-effort 呼叫 record_agent_session()
  Phase 3 L7×D2 學習訊號全部接線完成

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-15 21:00:18 +08:00
parent fb1bbd0e20
commit 66c4eda27a
2 changed files with 90 additions and 0 deletions

View File

@@ -117,6 +117,31 @@ async def run_agent_debate(
status=package.session_status.value,
elapsed_ms=elapsed,
)
# ADR-083 Phase 3: 辯證結果學習訊號接線L7×D2
# best-effort — 學習失敗不阻塞主流程
# 2026-04-15 ogt + Claude Sonnet 4.6(亞太)
try:
from src.services.learning_service import get_learning_service
_critic_challenges = (
package.critic_report.challenge_count
if package.critic_report else 0
)
await get_learning_service().record_agent_session(
session_id=session_id,
incident_id=incident_id,
final_confidence=package.confidence,
requires_human_approval=package.requires_human_approval,
all_agents_degraded=package.all_agents_degraded,
critic_challenge_count=_critic_challenges,
)
except Exception as _lerr:
logger.warning(
"agent_session_learning_failed",
session_id=session_id,
error=str(_lerr),
)
return package
except asyncio.TimeoutError:

View File

@@ -749,6 +749,71 @@ class LearningService:
matched_playbook_id=matched_playbook_id,
)
async def record_agent_session(
self,
session_id: str,
incident_id: str,
final_confidence: float,
requires_human_approval: bool,
all_agents_degraded: bool,
critic_challenge_count: int,
matched_playbook_id: str | None = None,
) -> None:
"""
記錄 5-Agent 辯證 Session 的學習訊號。
ADR-083 Phase 3: AgentSession 學習接線L7×D2
DB 持久化由 agent_orchestrator._write_agent_turn() 負責,
此方法負責從辯證結果提取學習訊號Redis analytics + Playbook EWMA
信號邏輯:
- all_agents_degraded=True → 系統品質警報(記錄到 Redis governance
- critic_challenge_count > 0 AND matched_playbook_id → 輕度負向 EWMACritic 質疑 Playbook
- requires_human_approval=True → 信心不足,系統整體品質下降紀錄
Args:
session_id: 辯證 Session ID
incident_id: 關聯 Incident ID
final_confidence: Coordinator 最終信心分數0-1
requires_human_approval: 是否升級人工審核
all_agents_degraded: 是否全部 Agent 降級
critic_challenge_count: Critic 提出的質疑數量
matched_playbook_id: 本次決策匹配的 Playbook若有
2026-04-15 ogt + Claude Sonnet 4.6(亞太): Phase 3 AgentSession 學習接線
"""
# 1. 記錄辯證品質到 Redis供 SLO 監控 + Governance 分析)
try:
await self._repository.record_repair(
anomaly_key=f"debate:{incident_id}",
repair_action=f"session:{session_id[:8]}",
success=not requires_human_approval,
fix_description=f"confidence={final_confidence:.2f},degraded={all_agents_degraded},critic_challenges={critic_challenge_count}",
)
except Exception as e:
logger.warning(
"record_agent_session_to_repo_failed",
session_id=session_id,
error=str(e),
)
# 2. Critic 有重大質疑 + 有匹配 Playbook → 輕度負向 EWMAPlaybook 可能不準確)
if critic_challenge_count > 0 and matched_playbook_id:
await self._update_playbook_stats(
playbook_id=matched_playbook_id,
success=False,
)
logger.info(
"agent_session_recorded",
session_id=session_id,
incident_id=incident_id,
final_confidence=final_confidence,
requires_human_approval=requires_human_approval,
all_agents_degraded=all_agents_degraded,
critic_challenge_count=critic_challenge_count,
)
async def get_recommended_fix(self, anomaly_key: str) -> dict:
"""
根據歷史學習,推薦最佳修復方案