标准答案

  1. system 消息通常承载应用级行为约束、输出格式和稳定规则;user 消息代表本轮用户输入;assistant 消息代表历史回答或对话上下文。具体优先级和可用角色以供应商接口定义为准。
  2. 工具调用通常还会有 tool、function 或同类消息,用来表示模型请求工具以及工具返回结果。工具返回值应作为不可信数据处理,不能因为它出现在对话结构中就自动获得系统指令级别的信任。
  3. 服务端应自己组装系统消息和历史,不应允许客户端直接提交任意 system 消息覆盖安全规则。模型输出还要经过结构校验、权限校验和业务动作确认。

题目解析

消息角色的核心价值是区分上下文来源,帮助模型理解任务边界;它不是传统访问控制。攻击者仍可能在 user 输入、网页内容或检索文档中写入“忽略之前指令”,因此应用要做信任分层和工具权限控制。

assistant 历史不能无条件视为事实。它可能是模型以前的错误回答,也可能包含已经撤销的权限或过时的业务状态。涉及金额、身份、权限和当前状态时,应回到数据库或权威服务查询。

多轮对话要保存结构化事件,而不是只拼一段文本。至少区分用户消息、模型消息、工具调用、工具结果和人工修订,便于重放、审计和定位上下文污染。

不同供应商的新接口可能把文本、图片、工具调用和响应事件建模成不同结构。业务层应定义自己的中间表示,避免页面和业务逻辑直接依赖某家消息格式。

常见误区

  • 认为 system 消息可以阻止所有 Prompt Injection。它只能表达约束,不能替代工具白名单、权限校验和输出验证。
  • 把客户端传来的 system 字段原样转发给模型。系统规则必须由可信服务端生成,用户可控部分应被明确隔离。
  • 把 assistant 历史当作数据库事实。需要实时准确的数据时,应调用权威业务接口,而不是相信旧对话。

作者信息