Twin Agent:用“残差压缩”搞定特权分离
特权分离(Privilege Separation)在安全领域是常识,但在 LLM Agent 里是个大麻烦。很多所谓的安全设计为了防 Prompt Injection,直接把不可信的观察结果和执行权限给切断了,结果就是 Agent 变傻了,任务成功率断崖式下跌。这种“为了安全牺牲可用性”的死循环,本质上是因为信息流控制得太死,导致 Safe Agent 拿不到关键上下文。
如果想在自己的 Agent 工作流中尝试类似的隔离模式,可以参考这个简单的逻辑伪代码:
下一篇
别总盯着那些炸裂的“AI发疯”案例 →
我看 Twin Agent 这个方案挺有意思,它没有在拦截规则上死磕,而是借鉴了信号处理里的“残差编码”思路,搞了一套双 Agent 架构:一个 Explore Agent(探路者)和一个 Safe Agent(执行者)。
具体逻辑是这样的:Explore Agent 负责去接触那些不可信的外部信息(比如网页内容、用户输入),但它没有执行特权。关键点在于,Explore Agent 在分析时能看到 Safe Agent 当前的上下文,但它回传给 Safe Agent 的不是原始信息,而是经过压缩的、极短的“提示(Hints)”。
这种设计把安全边界划在了“信息密度”上。因为传给 Safe Agent 的只是极简的指令暗示,而非大段的外部文本,攻击者很难在这么短的 Token 空间里植入复杂的注入指令。
我在关注这个方案时,重点看了它的实测数据,这比空谈架构要有说服力得多:
- 性能表现: 在 SWE-bench Lite(长周期软件工程任务)和 AgentDojo 这种多工具交互基准测试中,Twin Agent 在维持高任务成功率的同时,显著降低了 Prompt Injection 的成功率。
- 权衡曲线: 论文里有个细节很硬核,他们实测了 Hint 长度与攻击成功率/任务效能的关系。结论是:只要 Hint 长度控制在一定阈值内,就可以在几乎不损失 Utility 的情况下,把攻击面压缩到极低。
如果想在自己的 Agent 工作流中尝试类似的隔离模式,可以参考这个简单的逻辑伪代码:
# 伪代码:Twin Agent 隔离逻辑简化版
class TwinAgentSystem:
def __init__(self, explore_llm, safe_llm):
self.explore_agent = explore_llm # 接触不可信数据,无特权
self.safe_agent = safe_llm # 拥有工具执行权,仅接收压缩指令
def run_step(self, untrusted_input, current_state):
# 1. Explore Agent 分析不可信输入,并参考当前状态
# 重点:要求其输出必须是极其精简的 Hint (例如 < 20 tokens)
hint = self.explore_agent.generate_hint(
context=current_state,
observation=untrusted_input,
constraint="Output only a concise action hint."
)
# 2. Safe Agent 根据 Hint 执行具体动作
# 此时 Safe Agent 根本没看到 untrusted_input,从而免疫直接注入
final_action = self.safe_agent.execute(
state=current_state,
hint=hint
)
return final_action这个方案最聪明的地方在于它承认了“完全隔离=低效”,所以用一种类似“情报员(Explore)汇报给指挥官(Safe)”的模式来解决。情报员可以被洗脑,但只要他汇报的内容足够简练,指挥官依然能掌控全局且不被误导。
对于现在做 AI Agent 部署的人来说,这种模式比单纯写一段“你是一个安全的助手”这种弱提示词要可靠得多。真正的安全应该建立在架构的物理隔离上,而不是依赖模型的自律。