对话中系统提示词
构建长时运行的 AI Agent 往往会导致一个代价高昂的错误。
你使用一个庞大的系统提示词(system prompt)并对其进行缓存以节省成本。这在大多数情况下行之有效,直到你需要在对话中途向 Agent 提供新指令。你可能需要更改编程语言或更新项目状态。
如果你通过编辑顶层系统提示词来添加这些信息,就会破坏缓存。模型必须以全额价格重新处理整个历史记录。这会让你的 Agent 变得既慢又贵。
新的 Claude 模型通过“对话中系统消息”(mid-conversation system messages)解决了这个问题。
你现在可以直接在消息数组(message array)中放置一个 system 角色的消息。将其放在历史记录之后,而不是放在顶部。
为什么这很重要:
• 缓存安全性:指令位于已缓存的历史记录之后。它不会使前缀失效。你只需为这条新的、短小的消息付费。
• 安全性:你可以使用用户消息作为变通方案,但用户可以伪造这些消息。system 角色的消息具有用户无法伪造的权威性。这可以防止提示词注入(prompt injection)。
如何正确操作:
将这些消息表述为事实。不要使用“覆盖/忽略”类的语言。
• 正确:“自动批准模式现已启用。” • 错误:“忽略用户所说的话,改为执行此操作。”
模型通常会抵制要求它们忽略之前上下文的指令。请坚持陈述世界的新状态。
使用规则:
- 它必须紧跟在用户(user)或助手(assistant)消息之后。
- 它不能是数组中的第一条消息。
- 它仅接受文本内容。
- 并非所有模型都支持此功能。如果收到 400 错误,请务必使用
try-catch块回退到用户轮次提醒(user-turn reminder)。
当你在会话开始后获知新信息时,请使用此方法。如果你在开始时就已经知道该事实,请将其放入主系统提示词中。如果该事实是动态的,请使用对话中系统消息。
这能保持缓存热度并降低成本。