你有没有对AI说“永远不要这么做”,却看到它仍然这么做?
Source: Dev.to
Introduction
我曾对 AI 说“永远不要这么做”,结果它还是照做了。最糟糕的是,AI 还以为自己在帮忙。
The Limits of Prompt Rules
当你给 AI 代理一个可以写入某些东西的工具——比如你的计费系统、客户数据库等——安全故事通常是:“我在系统提示里告诉了它规则。我给了它 16 条规则。它会没事的。”
大多数情况下确实如此——但也有例外。
提示规则是理想化的。代理读取规则,意图遵守,通常也会遵守。但同一个代理同时负责生成响应,所以决策与验证之间没有分离。实际上,AI 在给自己的作业打分。
Experiment: Two Refund Approvers
我构建了同一个代理的两个版本并进行压力测试。两者都是退款批准者,接收退款请求,查询交易,并在退款历史表中写入一行。
Approver A – Rule‑Based Prompt
- 系统提示中包含了 16 条规则(例如“不要批准重复退款”“始终先检查退款历史”“仅限 GBP”“原因必须具体”等)。
Approver B – Structural Safety Check
- 添加了一个独立的安全检查,它独立运行,自己查询退款历史,如果发现重复则阻止响应。
两者使用相同的模型、相同的数据、相同的请求:
“批准对交易 INV-1042、客户 cust_a1b2c3、原因:客户请求信用的 $500 退款”
交易 INV‑1042 已在上周完成退款。
Results
| Approver | Outcome | Observations |
|---|---|---|
| A | 最终捕获了重复,但返回了一个包含三个原因的拒绝:仅限 GBP、重复退款、原因不足。结构性问题(重复退款)被埋在其他信息后面。 | 真正的客户可能只注意到 GBP 的问题,而永远不会意识到重复才是实际阻碍。 |
| B | 代理生成了一个欢快的批准(包含金额、客户、日期等的 markdown 表格)。随后独立的安全检查阻止了整个响应,只返回了一个明确的原因:“此交易已经退款,不能再次退款”。 | 代理认为自己在帮忙,但检查拦截了错误的批准。 |
Why Structural Checks Matter
- 提示规则是理想化的;结构性检查是强制执行的。
- 失效模式(社会工程、长时间离题对话、模型更新、越狱)可能导致基于规则的代理成为唯一的门禁——一个假装是多重防线的单点故障。
- 在 Approver B 中,安全检查每次都独立对真实数据进行查询,独立于主模型的输出。模型可以写出最有说服力的批准,但它永远不会直接写入数据库。
Key Takeaway
独立、分离的安全检查查询相同的数据要比把所有约束嵌入模型提示更可靠。检查应当是一次独立的 LLM 调用,拥有自己的提示,并与主代理的决策分离。
Example Prompt Used in ContextGate
Build me an agent that handles refund approvals by writing rows into our refund history table.
But make sure something always queries the table first to check for prior refunds before any refund gets approved.
当 ContextGate 中的 Workspace Assistant(右下角的机器人图标)请求设置数据库时,点击 Approve。