在做一个 Prompt Optimizer 时,我意外触发了图片生成

初稿由GPT-5.5编写,经过人工润色。

最近在开发一个很简单的功能:

text 复制代码
用户输入 Prompt
↓
模型优化 Prompt
↓
返回优化后的 Prompt

目标很明确:这是一个 Prompt Rewrite 服务,而不是图片生成服务。

但测试过程中发生了一件很有意思的事情。

我输入了一段典型的图像生成 Prompt,本来希望模型帮我优化描述,结果LLM调用了图片生成工具: Image Generation Call 花费 25050, 我的token QAQ

第一反应当然是:

模型是不是被越狱了?

后来分析下来发现,这件事远比「越狱」有意思。

因为问题的本质并不是模型说了不该说的话,而是系统做了不该做的事。

事情是怎么发生的

最初的架构大概是这样的:

text 复制代码
User
 ↓
Prompt Optimizer
 ↓
LLM
 ↓
Optimized Prompt

理论上这是一个纯文本服务。

权限模型应该是:

text 复制代码
输入文本
↓
输出文本

但实际运行时,Prompt Optimizer 所使用的模型Responses API接口同时具备工具调用能力:

text 复制代码
response = client.responses.create(
            model=model,
            input=[
                {"role": "system", "content": instruction},
                {"role": "user", "content": request.prompt},
            ]
            // 这里没有限制工具调用
        )

于是一个原本只负责改写文本的组件,自动发起了一个图片生成请求。

这算越狱吗?

严格来说,不完全是。

类型 攻击目标 失败表现
传统越狱 输出内容 说了不该说的话
Prompt Injection 控制推理流程 模型执行了错误任务
Tool Injection 控制工具调用 模型调用了错误工具
能力边界失效 控制系统权限 系统执行了错误动作

Prompt Injection 已经不只是 Prompt 问题了

问题在于:

为什么 Prompt Optimizer 拥有图片生成权限?

这是一个系统设计问题,而不是模型行为问题。

如果用传统软件工程类比:

text 复制代码
一个 SQL 优化器

本来应该:

text 复制代码
输入 SQL
↓
输出优化后的 SQL

结果却拥有:执行数据库语句的权限。

那么当它执行:DROP TABLE users;时,问题已经不在于 SQL 本身。而在于权限设计。

在 Agent 系统中,Prompt Injection 的影响范围已经扩大了。

因为用户输入不再只是被模型理解。

它还可能影响:

text 复制代码
Tool Selection
Workflow Routing
Memory Access
External Actions

修复方式:不要用 Prompt 限制能力

很多人第一反应是继续强化系统提示词:

text 复制代码
你只能优化文本
不能生成图片
不能调用工具

这当然有帮助。

但这并不是根本解决方案。

因为提示词属于软约束。

真正的解决方案应该是能力隔离。

python 复制代码
prompt_payload = json.dumps(
        {
            「task」: 「rewrite_image_prompt_text_only」,
            「prompt」: request.prompt,
        },
        ensure_ascii=False,
    )

response = client.responses.create(
            model=model,
            instructions=instruction,
            input=prompt_payload, # 输入做 json 结构化,最好输出也是结构化
            tools=[],
            tool_choice=「none」,
            max_tool_calls=0,
        )

这里最重要的其实不是 Prompt。

而是:

python 复制代码
tools=[]

因为这意味着:

text 复制代码
图片生成能力根本不存在

而不是:

text 复制代码
图片生成能力存在,但被要求不要使用

安全工程里有一句很经典的话:

不存在的权限,比被禁止的权限更安全。

数据平面与控制平面

后来回头看这个问题,我觉得它本质上是一个数据平面与控制平面混淆的问题。

对于 Prompt Optimizer 来说:

json 复制代码
{
  "task": "rewrite_image_prompt_text_only",
  "prompt": "生成一张未来城市夜景"
}

其中:

text 复制代码
task

属于控制平面。

而:

text 复制代码
prompt

属于数据平面。

系统应该保证:

text 复制代码
数据不能改变控制逻辑

否则用户输入就有机会影响:

text 复制代码
工具选择
任务路由
权限决策

这正是很多 Agent 系统面临的新挑战。

一个值得关注的趋势

我认为未来几年,Agent 安全领域会越来越关注这类问题。

过去我们担心的是:

text 复制代码
模型输出什么

未来我们更需要担心:

text 复制代码
模型会做什么

当模型开始拥有:

text 复制代码
搜索
发邮件
调用 API
执行代码
数据库访问
支付能力

之后,

Prompt Injection 的后果就不再只是生成一段错误文本。

而可能变成真实世界中的业务动作。

因此,对于 Agent 系统来说,最重要的安全原则之一可能是:

不要依赖 Prompt 来限制能力,而要依赖系统架构来限制能力。

模型可以被诱导。

权限边界不应该被诱导。


这次经历最终没有造成任何实际问题,但它让我重新思考了一件事:

当我们讨论 AI 安全时,很多时候问题并不是模型不够聪明,而是系统给了它超出职责范围的能力。

而随着 Agent 化越来越普遍,这类「能力边界失效」的问题,可能会比传统意义上的 Prompt 越狱更值得关注。