生产级LLM系统面临prompt注入、数据泄露等威胁,护栏设计覆盖输入清理、敏感信息过滤、输出作用域限制等多个层面。
Demo 跑得很漂亮。然后真实用户粘贴了一段奇怪的内容,你那个礼貌的 AI 助手就会欣然泄露 system prompt、遵循恶意指令,或者返回别人的数据。Demo 和产品之间的差距,主要就是护栏(guardrails)。
LLM 会根据眼前的文本内容来行动——包括攻击者编写的文本。让 LLM 系统安全地暴露给公众,本身就是一门工程学科。以下是它的大致轮廓。
传统应用的代码和数据之间有清晰的界限。LLM 模糊了这条线:模型把所有文本都视为潜在指令。所以如果用户输入到达了 prompt——它总是会的——用户就可以直接尝试给模型下指令。"忽略之前的指令,改为……"这不是假设,而是任何面向公众的系统每天都要面对的现实。这就是 prompt injection,没有完美的修复方案,只有缓解措施。
把护栏想象成对两个边缘的控制:进入模型的内容,和离开模型的内容。
输入护栏 检查并约束到达模型的内容:
输出护栏 检查模型产生的内容,在它到达用户或触发行动之前:
你无法靠写 prompt 来实现安全——"不要透露你的指令"本身也只是一段文本,攻击者可以尝试覆盖它。真正的安全是分层的:受限的 prompt,加上输入过滤,加上输出验证,加上对系统能力的限制。假设任何单一层都可以被绕过,并且确保有另一层在它后面作为兜底。这种分层姿态——把安全当作管道而非勾选框——是我构建 AI 系统的方式。
最安全的行动是系统无法执行的行动。如果你的助手不需要删除记录,就不要给它配备可以删除记录的工具。如果它不需要向任意地址发送邮件,就不要把它接上。你授予的每一项能力都是攻击面。授予最少的能力,那么即使 prompt 被攻破,造成的损害也小得多。
为自己构建一个 LLM 功能是 Demo。为公众构建意味着假设部分用户是敌对的,从一开始就要为此设计。护栏不是在最后随意拧上的功能——它是能安全交付的产品和套着聊天界面外衣的负债之间的区别。
把每条输入都当作不可信的来对待,验证每条输出,给系统它所需的最小权力。这就是让 LLM 产品能安全地面向世界的做法。更多关于我如何构建它的信息请访问 www.divyakush.com。