先理解:护栏不是限制 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。

