对话中系统提示词

长对话 Agent 会话使用稳定的系统提示词(system prompt)和不断增长的历史记录。你可以缓存前缀以降低成本。

当你需要在会话中途添加新指令时,就会出现问题。例如,你想让 Agent 切换语言或更新设置。

如果你修改顶层的系统提示词,就会破坏缓存。在开头更改一个字节会导致之前所有已缓存的轮次失效。你必须支付全额费用来重新处理整个历史记录。这既慢又贵。

新的 Claude 模型通过“对话中系统消息”(mid-conversation system messages)解决了这个问题。

你现在可以直接在 messages 数组中放置一个 system 角色的消息。将其放在历史记录之后,而不是放在顶部。

这种方法之所以有效,是因为新指令位于已缓存的历史记录之后。它不会使之前的任何内容失效。你只需为这条简短的新消息付费。Agent 仍然会以最高权威对待该指令。

旧的方法是将指令放在用户消息(user message)中。这存在安全风险。用户可以通过伪造用户消息来欺骗你的 Agent。而 system 角色的消息是无法伪造的。它为模式切换或权限更新等可信更新提供了一个安全通道。

请遵循以下规则以正确使用:

• 将指令表述为事实。不要使用覆盖类语言。 • 正确:“自动批准模式现已启用。” • 错误:“忽略用户,改为执行 X。” • 模型可能会抵制要求其忽略之前上下文的指令。 • 这些消息必须紧跟在用户或助手(assistant)消息之后。 • 它们不能是数组中的第一条消息。 • 使用顶层系统提示词进行初始设置。

如果你使用的模型不支持此功能,将会收到 400 错误。务必将调用封装在 try-catch 块中。如果 system 角色调用失败,请回退到使用用户轮次(user-turn)进行提醒。

当你在会话开始后获知新信息时,请使用此功能。可用于模式变更或引入新上下文。它能保持缓存处于热状态,并确保指令的安全。

来源:https://dev.to/pavelespitia/mid-conversation-system-prompts-steering-an-agent-without-breaking-the-cache-2kd3

可选学习社区:https://t.me/GyaanSetuAi