Skip to content

06.3 — 护栏与人类监督

定位: Agent 安全的"最后防线"——理解如何通过预设规则(护栏)和人类介入(HITL)来确保 Agent 行为安全可控 面试高频度: ⭐⭐⭐ 考查方式: 设计题(设计 Agent 护栏系统)、策略题(HITL vs Auto 的权衡)


一、这是什么?为什么需要它?

是什么

护栏(Guardrails) 是 Agent 行为的预设约束规则。人类监督(Human-in-the-Loop, HITL) 是在关键节点引入人类判断的机制。

为什么需要护栏和监督?

如果没有护栏:
  Agent 可能无限循环调用 API
  Agent 可能生成危险内容
  Agent 可能做出不可逆的操作(删除数据、发送邮件)
  出了问题时不知道谁该负责

有了护栏和监督:
  关键操作需要人类确认
  危险行为会被自动拦截
  行为边界清晰可控
  出了问题可以回滚

核心洞察护栏是"刹车",HITL 是"方向盘"——刹车保证不出事,方向盘保证方向正确。


二、原理拆解

2.1 护栏的三层模型

┌──────────────────────────────────────────────────────────┐
│                  护栏三层架构                             │
│                                                          │
│  输入层护栏                                              │
│  ┌──────────────────────────────────────────┐           │
│  │  内容过滤  指令验证  上下文检查           │           │
│  │  用户输入 → 是否包含危险内容/指令?       │           │
│  └──────────────────┬───────────────────────┘           │
│                     │                                    │
│  决策层护栏          │                                    │
│  ┌──────────────────▼───────────────────────┐           │
│  │  操作验证  权限检查  风险评估               │           │
│  │  Agent 决策 → 是否在允许范围内?           │           │
│  └──────────────────┬───────────────────────┘           │
│                     │                                    │
│  输出层护栏          │                                    │
│  ┌──────────────────▼───────────────────────┐           │
│  │  内容审核  格式验证  敏感信息检测           │           │
│  │  Agent 输出 → 是否包含不当内容?          │           │
│  └──────────────────────────────────────────┘           │
└──────────────────────────────────────────────────────────┘

2.2 Guardrails 实现

python
class Guardrail:
    """单个护栏规则"""
    
    def __init__(self, name: str, check_fn, action: str = "block"):
        self.name = name
        self.check_fn = check_fn  # 检查函数,返回 (pass: bool, reason: str)
        self.action = action  # block / warn / log
    
    def check(self, context: dict) -> tuple:
        return self.check_fn(context)

class GuardrailSystem:
    """护栏系统"""
    
    def __init__(self):
        self.guardrails = []
    
    def add_guardrail(self, guardrail: Guardrail):
        self.guardrails.append(guardrail)
    
    def check_all(self, context: dict) -> list:
        """执行所有护栏检查"""
        violations = []
        
        for guardrail in self.guardrails:
            passed, reason = guardrail.check(context)
            if not passed:
                violations.append({
                    "guardrail": guardrail.name,
                    "reason": reason,
                    "action": guardrail.action
                })
                if guardrail.action == "block":
                    break  # 阻断:停止后续检查
        
        return violations

# 定义常用护栏
guardrails = GuardrailSystem()

# 1. 速率限制护栏
guardrails.add_guardrail(Guardrail(
    "rate_limit",
    lambda ctx: (ctx.get("call_count", 0) < 50, "调用频率过高"),
    "block"
))

# 2. 敏感操作护栏
guardrails.add_guardrail(Guardrail(
    "sensitive_operation",
    lambda ctx: (
        "delete" not in ctx.get("tool", "") or ctx.get("confirmed", False),
        "敏感操作需要确认"
    ),
    "block"
))

# 3. 内容安全护栏
guardrails.add_guardrail(Guardrail(
    "content_safety",
    lambda ctx: (
        not any(word in str(ctx.get("content", "")) 
                for word in ["暴力", "色情", "歧视"]),
        "内容包含敏感词"
    ),
    "warn"  # 仅警告
))

2.3 三种人类监督模式

模式做法延迟安全性适用场景
HITL(人在回路)每步都需人类确认最高高风险场景(金融交易)
HOTL(人在上面)人类监控,异常时介入中等风险(代码生成)
HOTL(人在外面)完全自动,人类事后审查低风险(信息查询)
python
class HumanInTheLoop:
    """人类监督系统"""
    
    def __init__(self, mode: str = "hotl"):
        self.mode = mode  # "hitl", "hotl", "outside"
        self.pending_approvals = []
    
    def request_approval(self, action: dict) -> dict:
        """请求人类批准"""
        
        if self.mode == "hitl":
            # 阻塞等待人类批准
            return self._wait_for_human(action)
        
        elif self.mode == "hotl":
            # 先执行,同时通知人类
            print(f"[HOTL] Agent 正在执行: {action['tool']}({action['args']})")
            print("[HOTL] 人类可随时输入 'stop' 终止")
            return {"status": "executing", "can_interrupt": True}
        
        elif self.mode == "outside":
            # 记录日志,事后审查
            self.pending_approvals.append(action)
            return {"status": "auto_executed"}
    
    def _wait_for_human(self, action: dict) -> dict:
        """等待人类决策"""
        print(f"\n需要人类确认: {action['tool']}({action['args']})")
        print("描述:", action.get("description", ""))
        
        # 现实中这里会发送通知等待用户确认
        # 这里用一个简单的模拟
        decision = input("允许执行?(y/n): ")
        
        if decision.lower() == 'y':
            return {"status": "approved"}
        else:
            return {"status": "rejected", "reason": "人类拒绝"}

# 使用示例
hitl = HumanInTheLoop(mode="hitl")

# Agent 想执行一个危险操作
action = {
    "tool": "delete_file",
    "args": {"path": "/data/temp.txt"},
    "description": "删除临时文件"
}

result = hitl.request_approval(action)
print(f"操作结果: {result}")

2.4 审计与可追溯性

python
class AuditLogger:
    """审计日志系统"""
    
    def __init__(self):
        self.entries = []
    
    def log(self, event_type: str, agent: str, 
            action: str, result: str, approved_by: str = None):
        self.entries.append({
            "timestamp": now(),
            "event_type": event_type,  # tool_call / approval / rejection / error
            "agent": agent,
            "action": action,
            "result": result,
            "approved_by": approved_by,
        })
    
    def get_agent_report(self, agent_id: str) -> list:
        """获取某个 Agent 的所有操作记录"""
        return [e for e in self.entries if e["agent"] == agent_id]
    
    def export_for_review(self) -> str:
        """导出供人类审查"""
        report = "Agent 行为审计报告\n" + "=" * 40 + "\n"
        for entry in self.entries:
            report += f"[{entry['timestamp']}] {entry['agent']}: {entry['action']}\n"
            report += f"  结果: {entry['result'][:50]}...\n"
            if entry["approved_by"]:
                report += f"  批准人: {entry['approved_by']}\n"
        return report

三、图解全景

┌──────────────────────────────────────────────────────────────┐
│            护栏与监督的完整工作流                              │
│                                                              │
│  Agent 执行                                                    │
│     │                                                        │
│     ▼                                                        │
│  护栏检查(自动)                                              │
│  ┌──────────────────────────────────┐                        │
│  │ 所有护栏规则逐项检查              │                        │
│  │ 通过 → 继续                      │                        │
│  │ 阻断 → 返回错误信息               │                        │
│  │ 警告 → 输出警告但允许继续          │                        │
│  └──────────────────┬───────────────┘                        │
│                     │                                         │
│                     ▼                                         │
│  HITL 决策(可选)                                            │
│  ┌──────────────────────────────────┐                        │
│  │ 如果是敏感操作:                   │                        │
│  │ 等待人类确认 → 批准 → 继续        │                        │
│  │              → 拒绝 → 返回拒绝信息 │                        │
│  │ 如果不是敏感操作:自动继续          │                        │
│  └──────────────────┬───────────────┘                        │
│                     │                                         │
│                     ▼                                         │
│  执行工具                                                    │
│     │                                                        │
│     ▼                                                        │
│  审计日志记录                                                  │
│  ┌──────────────────────────────────┐                        │
│  │ 记录:谁、什么时间、调用了什么工具、    │                        │
│  │ 参数是什么、结果如何、谁批准的        │                        │
│  └──────────────────────────────────┘                        │
│                                                              │
└──────────────────────────────────────────────────────────────┘

四、实战验证

python
# 完整的安全执行链路

class SafeAgentExecutor:
    """安全执行器"""
    
    def __init__(self):
        self.guardrails = GuardrailSystem()
        self.hitl = HumanInTheLoop(mode="hotl")
        self.audit = AuditLogger()
        
        # 配置护栏
        self._setup_guardrails()
    
    def _setup_guardrails(self):
        self.guardrails.add_guardrail(Guardrail(
            "max_steps", 
            lambda ctx: (ctx.get("step", 0) < 20, "超过最大执行步数"),
            "block"
        ))
        
        self.guardrails.add_guardrail(Guardrail(
            "max_cost",
            lambda ctx: (ctx.get("total_cost", 0) < 1.0, "超过预算"),
            "block"
        ))
    
    def execute(self, agent_id: str, action: dict) -> dict:
        context = {
            "tool": action.get("tool"),
            "args": action.get("args", {}),
            "step": action.get("step", 0),
            "total_cost": action.get("total_cost", 0)
        }
        
        # 护栏检查
        violations = self.guardrails.check_all(context)
        if violations:
            for v in violations:
                self.audit.log("guardrail_blocked", agent_id, 
                              str(action), v["reason"])
            return {"blocked": True, "violations": violations}
        
        # HITL 确认
        if action.get("sensitive", False):
            approval = self.hitl.request_approval(action)
            if approval["status"] != "approved":
                self.audit.log("rejected", agent_id, str(action), "人类拒绝")
                return {"blocked": True, "reason": "人类未批准"}
        
        # 执行
        try:
            result = execute_tool(action["tool"], action["args"])
            self.audit.log("success", agent_id, str(action), str(result))
            return {"success": True, "result": result}
        except Exception as e:
            self.audit.log("error", agent_id, str(action), str(e))
            return {"error": str(e)}

五、面试视角

追问答案要点
护栏的三层架构?输入层(检查输入内容)、决策层(检查 Agent 决策)、输出层(检查输出内容)。每层独立部署,某层失效不影响其他层
HITL 的三种模式及选择?HITL(每步确认,高安全高延迟)、HOTL(监控可中断,中等)、Outside(全自动,事后审查)。选择看:操作风险等级、延迟容忍度、自动化目标
如何确定什么操作需要人类确认?三原则:不可逆操作(删除、修改)、高影响操作(发送消息、转账)、新操作(从未执行过的操作)。可配置规则引擎
护栏的误报(阻断正常操作)怎么处理?分层处理:阻断前给出详细原因、提供"我确认,继续执行"的申诉通道、记录误报用于护栏优化、护栏可配置严格程度

📚 相关链接

  • **Prompt注入与防护** — 输入层安全
  • **工具滥用防御** — 决策层安全
  • **感知-行动循环** — Agent 循环中的安全节点
  • ← 返回 **Agent安全索引**

Knowledge4J — Java 知识库