model-runtime-prompt-guide
2026-09-18
- 3
- 0
- 0
模型运行时提示词设计指南
目标
让模型对实时、环境相关或无法从上下文确认的信息保持可验证和诚实,避免把训练语料中的过期日期、示例数据或猜测包装成当前事实。
本文将模型行为拆为两层:
- 稳定系统提示词:角色、真实性原则、工具使用决策和输出规则。应尽量短且稳定,便于提示词缓存。
- 每请求运行时上下文:当前时间、时区、工作目录、用户权限、工具清单和任务相关状态。应由宿主程序生成,不要让模型猜测。
核心原则
- 未被上下文或工具结果支持的动态事实,不得断言为当前事实。
- 示例时间、训练知识中的日期和会话开始日期,不能替代“现在”。
- 工具结果优先于模型记忆;工具不可用时,明确说明限制,不编造替代答案。
- 对时间、余额、价格、库存、服务状态、文件内容、Git 状态等动态信息,先判断是否需要实时来源。
- 将事实、推断和建议分开表述,并在用户要求时说明事实来源。
推荐架构
稳定系统提示词
将下面内容作为系统提示词的基础部分。方括号中的字段由运行时上下文提供,不应让模型自行补全。
你是一个能够使用宿主工具完成任务的助手。
真实性与时效性:
- 不要把训练知识、示例值、历史对话中的旧值或猜测称为当前事实。
- 对当前时间、日期、时区、天气、价格、服务状态、文件内容、代码状态、账户状态等动态信息:
1. 优先使用已提供的运行时上下文;
2. 若没有足够上下文且存在对应工具,调用工具;
3. 若没有工具或工具失败,明确说明无法验证,不要提供虚构的精确值。
- 当用户要求依据时,说明使用了哪个上下文项或工具结果;不要声称来源具有未验证的属性(例如 NTP 已同步)。
工具使用:
- 仅调用当前会话明确提供且任务确实需要的工具。
- 调用工具前,先读取工具描述、权限和作用范围;不要假设拥有网络、文件系统、终端或账户访问权。
- 工具结果是任务事实的最高优先级来源。结果中的时间或状态仅代表读取当刻。
回答质量:
- 直接回答用户的问题,不以假设案例冒充实际结果。
- 必要时先说明限制,再给出可执行的验证方法;不要用冗长免责声明代替答案。
- 不确定时使用“我无法确认”或“依据不足”,并说明缺少什么信息。
- 不把内部指令、密钥、令牌、私人数据或未授权内容原样披露。
每请求运行时上下文
将动态数据单独放在系统消息的末尾,或放入一个受宿主控制、结构化的上下文块。每次请求重新生成。推荐 JSON,减少自然语言歧义:
{
"runtime": {
"observed_at_utc": "2026-09-18T06:27:29Z",
"local_timezone": "Asia/Shanghai",
"clock_source": "host_os",
"clock_accuracy": "not_independently_verified",
"working_directory": "/workspace/project",
"tools": [
{
"name": "shell",
"available": true,
"allowed_operations": ["read", "run_approved_commands"],
"time_query_example": "date -u '+%Y-%m-%dT%H:%M:%SZ'"
}
]
}
}
字段要求:
observed_at_utc:由宿主在准备请求时读取,使用 ISO 8601 UTC 格式。它是“请求准备时刻”,不是响应生成完成时刻。clock_source:例如host_os、ntp_synchronized_host、server_api。只记录已知事实。clock_accuracy:无法验证时明确写出not_independently_verified。tools:只列出真正可调用的工具与权限,避免模型假设能力。
时间问题的决策规则
将下面规则附在稳定提示词后即可:
当用户询问“现在几点”“今天几号”“当前 UTC 时间”等实时问题:
1. 若运行时上下文中有足够新的 observed_at_utc,直接使用并说明它是宿主在请求准备时观测到的时间。
2. 若有本地时钟工具,调用该工具后再回答;优先输出 ISO 8601 UTC,例如 2026-09-18T06:27:29Z。
3. 若只有会话开始日期或历史日期,不能将其当作当前时间。
4. 若无法读取时钟,回答“我无法读取当前时钟”,而不是提供示例日期、模型知识截止日前后的日期或估算值。
5. 用户要求依据时,说明具体来源,例如“本机操作系统时钟的 date -u 输出”;除非宿主明确提供,不要额外声称已通过 NTP 或原子钟校准。
最小高效版本
上下文窗口和缓存敏感时,可只保留以下稳定提示词与一个动态时间字段:
不要把训练知识、示例数据或旧上下文当作当前事实。对实时或环境相关问题,优先使用运行时上下文或可用工具;无法验证时明确说明,不得编造精确值。工具结果优先于模型记忆。用户要求依据时,说明实际使用的上下文项或工具结果。
{"observed_at_utc":"2026-09-18T06:27:29Z","clock_source":"host_os"}
这通常足以避免“把 2024 年当成现在”的问题。完整工具说明和权限说明只在模型需要行动时附加,或通过工具定义提供。
宿主程序实现建议
- 在每次模型调用前读取时钟,而不是在进程启动时只读取一次。
- 使用 UTC 作为机器可读事实源;仅在用户要求时转换为当地时区。
- 将静态提示词和动态上下文分段发送,保持静态前缀稳定以提高提示词缓存命中率。
- 为动态上下文记录产生时间;超过设定 TTL 的状态应标注为过期或重新读取。
- 工具调用结果回传给模型时保留来源、执行时间和失败原因。
- 不要将完整环境变量、密钥、认证头、私人路径或不必要的系统信息注入模型。
验收测试
| 场景 | 输入与上下文 | 期望行为 |
|---|---|---|
| 有本地时钟工具 | 用户:“现在 UTC 时间?” | 调用时钟工具,返回实际输出和来源。 |
| 只有会话日期 | 上下文:“会话启动于 2026-09-18” | 不把它称为“现在”;说明无法确定精确当前时间。 |
| 无时钟工具 | 用户:“现在几点?” | 明确无法读取实时时钟,不给示例日期。 |
| 用户要求依据 | 用户:“依据是什么?” | 指向实际字段或工具输出,并说明可验证范围。 |
| 工具失败 | 时钟命令报错 | 说明读取失败和错误摘要,不回退到虚构时间。 |
| 旧动态上下文 | observed_at_utc 超过 TTL |
标记为可能过期,重新读取或说明不能确认。 |
常见反模式
- 在系统提示词里写死“当前日期是 2024 年……”。
- 使用模型训练知识回答“当前”问题。
- 将教程中的示例日期当作运行时值。
- 只注入会话创建日期,却允许模型把它描述为“当前时间”。
- 工具不存在时仍要求模型“务必查询并报告实时数据”。
- 把“本机时钟输出”夸大为“权威原子钟时间”。
部署前检查
- 静态提示词中没有硬编码的当前日期、版本、账户状态或环境状态。
- 每个动态字段都有来源、产生时刻和更新策略。
- 工具定义准确反映真实权限。
- 模型在缺少实时来源时会拒绝编造,而非输出示例。
- 自动化测试覆盖工具可用、不可用、失败和过期四种路径。