






















文章的核心贡献是明确了一个原则:LLM 不应该是自己权限的授权者。模型决定它想做什么,一个独立的 Capability Gate 决定它能不能做。
这是 Google DeepMind CaMeL 框架的思路。LLM 提出工具调用请求,一个外部执行器在放行之前验证每个计划动作是否在允许列表中。就算模型被注入后"想"往外发数据到外部 URL,Capability Gate 直接拒绝,因为该操作根本不在允许列表中,不管模型在对话中途被灌输了什么指令。
下面是对应 Python 实现的核心逻辑:
from dataclasses import dataclass from typing import Any, Callable import jsonschema, hashlib, time, logging @dataclass class ToolCall: name: str params: dict[str, Any] session_id: str def _request_human_approval(call: ToolCall) -> str: """人工审批占位,实际系统中对接审批工作流。""" return f"[PENDING] 工具 '{call.name}' 等待人工审批——会话 {call.session_id}" class CapabilityGate: """策略逻辑在初始化时从外部配置加载,LLM 运行期间不可修改。""" def __init__(self, policy: dict): self.policy = policy self.audit_log = [] def execute(self, call: ToolCall) -> Any: if call.name not in self.policy["allowed_tools"]: self._audit(call, "BLOCKED_UNKNOWN_TOOL") raise PermissionError(f"工具 '{call.name}' 不在能力允许列表中") tool_policy = self.policy["allowed_tools"][call.name] try: jsonschema.validate(call.params, tool_policy["param_schema"]) except jsonschema.ValidationError as e: self._audit(call, "BLOCKED_SCHEMA_VIOLATION", str(e)) raise if tool_policy.get("requires_human_approval"): self._audit(call, "PENDING_HUMAN_REVIEW") return self._request_human_approval(call) self._audit(call, "EXECUTED") handler: Callable = tool_policy["handler"] return handler(**call.params) def _audit(self, call: ToolCall, outcome: str, detail: str = ""): entry = { "ts": time.time(), "session": call.session_id, "tool": call.name, "params_hash": hashlib.sha256( str(call.params).encode() ).hexdigest()[:16], "outcome": outcome, } self.audit_log.append(entry) logging.info( "[GATE] %s | %s | session=%s", call.name, outcome, call.session_id )
代码的关键在 `__init__` 那一行:policy 在启动时加载,注入的模型无法改写自己的允许列表。不管模型被什么指令操控,gate 只允许执行工程师部署时注册的工具。
验证结果:
测试 1:合法工具调用 结果: 搜索 'prompt injection防御' 返回 10 条结果 状态: 通过 测试 2:未知工具拦截 拦截: 工具 'send_http_request' 不在能力允许列表中 状态: 通过 测试 3:参数 schema 违规拦截 拦截: 9999 is greater than the maximum of 100 状态: 通过 测试 4:高风险操作要求人工审批 结果: [PENDING] 工具 'delete_database' 等待人工审批——会话 test-session-001 状态: 通过
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。