一句话定义:占位符注入(Placeholder Injection)是指应用把用户输入直接填进提示词模板的占位符(如 {{user_input}})时,没有对输入里的模板语法、引号或分隔符做转义,用户填进去的内容就能"闭合"原有结构、另起一段指令,让模型按他的意思而不是开发者的意思办事。
先看模板长什么样:
```
system: 你是订单客服,只回答物流问题。
user: {{user_input}}
```
正常情况下,用户填入"我的包裹到哪了",模板拼出来的就是一句普通提问。但如果输入里自带闭合符号和新的段落,拼接结果的结构就被改写了:原本属于"用户数据"的那段文字,从模型的视角看变成了新的指令行。模型并不理解"这是用户填的字段",它只看到一段连续文本,谁写得像指令,它就容易当指令执行。
打个生活化的比方:这很像 CSV 表格。某个格子留给用户填备注,用户却在内容里写了逗号或换行,一行数据被切成了好几列,后面所有字段整体错位。数据没有变坏,坏的是边界——内容越界成了结构。占位符注入就是提示词世界里的这次"错位"。
它和几个近邻概念容易混:
| 概念 | 出问题的层次 | 核心毛病 |
|---|---|---|
| 占位符注入 | 应用拼字符串那一步 | 结构边界被用户输入撑破 |
| 提示注入(AI 词典:Prompt Injection">Prompt Injection) | 模型读到的整段文本 | 指令和数据混在一起、无法区分 |
| 越狱(Jailbreak) | 模型的安全对齐 | 想办法绕过既有策略 |
| SQL 注入(SQL Injection) | 数据库查询拼接 | 同一个病根的老前辈 |
可以这样记:提示注入是"病症大类",占位符注入是其中一个很具体的"感染途径"——问题不在模型聪不聪明,而在你把门框尺寸交给了访客决定。反过来,即使没有占位符,纯聊天窗口一样可能有提示注入;即使占位符转义得干干净净,模型仍可能被自然语言说服。两者相关但不等同。
对从业者的实际意义,落到几条能马上做的事:别用字符串拼接去组装提示词,改用结构化的消息数组,让 system 与 user 在协议层面就分开;用户输入里出现的模板记号({{ }}、<% %>、三引号、Markdown 分隔线)要么剥离要么转义;给输入长度设上限;对模型输出做格式校验再往下游传。如果产品要做"让用户自定义提示词模板",那就等于把模板引擎开放给了外部,务必做白名单和沙箱,具体能力边界以所用框架的官方文档为准。
对普通职场人,意义更朴素:在表单里被要求"按格式填写"时别随手塞符号和换行;同时别把系统提示词当成保险箱——凡是用户能输入的地方,都可能被拿来改写规则。设计任何带填空位的流程时,先问一句:这个空,能不能被填成一段新规则?
