实战工单 Agent 03:加入护栏、人工审核和证据链

先理解:护栏不是限制 Agent,而是让它能上线

没有护栏的 Agent 只能做 Demo。真实工单里会涉及退款、补偿、账号封禁、数据修改,这些动作必须有权限、审核和证据链。

本篇会加入风险判断、人工审核和证据链。目标不是让 Agent 什么都自动做,而是让它知道哪些能自动处理,哪些必须交给人。

证据链为什么重要

Agent 的建议如果没有依据,人工客服很难信任。证据链至少要包含:命中的知识、调用过的工具、关键判断原因、建议动作。这样出错时可以复盘,正确时也能被采纳。

高风险动作处理

高风险动作不要直接执行。更安全的方式是生成待确认请求,让有权限的人审核后执行。这样既保留效率,也避免 Agent 越权。

本篇增强安全性。高风险工单和违规草稿会进入人工审核队列。

护栏模块

src/guardrails.py

python
import json
from pathlib import Path

ACTION_RISK = {
    "get_order_status": "L1",
    "search_kb": "L1",
    "create_reply_draft": "L2",
    "issue_refund": "L3",
    "ban_account": "L3",
}

FORBIDDEN_PHRASES = ["一定赔偿", "保证退款", "马上封号", "无需审核"]
REVIEW_FILE = Path("data/review_queue.jsonl")

def action_allowed(action: str) -> bool:
    return ACTION_RISK.get(action) in ["L1", "L2"]

def check_draft(text: str) -> list[str]:
    return [p for p in FORBIDDEN_PHRASES if p in text]

def enqueue_review(ticket_id: str, reason: str, payload: dict):
    REVIEW_FILE.parent.mkdir(exist_ok=True)
    row = {
        "ticket_id": ticket_id,
        "reason": reason,
        "payload": payload,
        "status": "pending",
    }
    with REVIEW_FILE.open("a", encoding="utf-8") as f:
        f.write(json.dumps(row, ensure_ascii=False) + "\n")

接入高风险审核

修改 src/agent.py,导入:

python
from src.guardrails import check_draft, enqueue_review

高风险分支加入:

python
if triage_result.risk_level == "high":
    payload = {
        "triage": triage_result.model_dump(),
        "tool_results": tool_results,
        "evidence": evidence,
    }
    enqueue_review(ticket.ticket_id, "high_risk_ticket", payload)
    return {**payload, "draft": None, "handoff": True}

草稿生成后加入:

python
violations = check_draft(draft["draft"])
if violations:
    payload = {
        "triage": triage_result.model_dump(),
        "evidence": evidence,
        "draft": draft,
        "violations": violations,
    }
    enqueue_review(ticket.ticket_id, "draft_violation", payload)
    return {**payload, "handoff": True}

证据链要求

审核队列中的每条记录至少包含:

  • 工单 ID。
  • 分类和优先级。
  • 工具结果。
  • 使用过的知识文本。
  • 触发审核的原因。

验收

bash
python - <<'PY'
from src.schema import Ticket
from src.agent import handle_ticket

t = Ticket(ticket_id="T003", title="要求赔偿", body="客户要求赔偿 500 元")
print(handle_ticket(t))
PY
cat data/review_queue.jsonl

确认:

  • 输出 handoff: True
  • 审核队列有记录。
  • 记录里包含 evidence
实战工单 Agent 04:提供 API、评测并灰度上线
实战工单 Agent 02:实现工具调用和知识检索