🧠AI Prompt 与上下文

System User Tool消息分工

面试回答

常见问法

System、User、Tool 这几类消息各自该放什么?为什么分工很重要?

回答

这几类消息的价值不只是“格式不同”,而是职责不同:

  • System:定义角色、边界、规则、总体行为
  • User:表达当前任务和输入
  • Tool:承载外部工具返回的结构化结果

如果把这些角色混在一起,系统容易出现:

  • 指令冲突
  • 上下文污染
  • 工具结果被模型误解

追问

  • 为什么不建议把所有规则都塞进 User message
  • Tool 返回内容为什么通常不该伪装成 User
  • System Prompt 和业务 Prompt 冲突时怎么处理

原理展开

一个常见稳定设计是:

messages = [
    {"role": "system", "content": "你是一个客服助手,必须基于工具结果回答。"},
    {"role": "user", "content": "帮我查一下订单状态"},
    {"role": "tool", "content": '{"order_id": "123", "status": "shipped"}'},
]

这样模型更容易理解:

  • 哪些是系统原则
  • 哪些是用户诉求
  • 哪些是外部事实

面试里最好点出来: “消息分工本质上是在做上下文治理,不是为了消息字段好看。”

易错点

  • 把业务规则、工具结果、用户输入全拼成一大段
  • Tool 结果格式不稳定,导致模型难以消费
  • System Prompt 太长太散,反而压不住行为

记忆技巧

记住一句:

  1. System 定边界
  2. User 提任务
  3. Tool 给事实