跳转至

提示词写作规范

oh-mai-agent 提示词统一写作风格。精简、指令式、中文关键词优先。

适用范围:prompt/templates/ 下的模板文件、prompt/builders/ 生成的动态片段、以及工具描述(tools/ 下各通道的 description)。

关键词

采用 RFC 2119 中文等价词,作为提示词的规范语言。关键词本身即是标记,禁止将其用于普通陈述。

关键词 优先级 含义
必须 P0 绝对要求,不可违反。替换"请确保"、"一定要"。
禁止 P0 绝对禁止。替换"不要"、"切勿"。与"必须"同权重。
应当 P1 强烈推荐。有已知取舍时可偏离。替换"最好"、"建议"。
避免 P1 强烈不推荐。替换"尽量别"、"不建议"。
建议 P2 可选,提供参考但不强制。替换"可以"、"不妨"。

优先级规则:P0 > P1 > P2。高优先级覆盖低优先级。禁止和必须冲突时,禁止优先。

关键词不得用于:事实性描述("此工具返回 JSON")、代码块、示例、模板变量 {{var}} 占位语法。

当前模板示例:

Bad:  3. 需要向用户提问或确认时,使用 ask_user 工具。
Good: 3. 需要向用户提问或确认时,必须调用 ask_user 工具。

标签语义

XML 标签是结构性标记,模型将其视为权威指令。每个标签的含义必须与其名称严格一致,禁止发明装饰性标签(<directives><protocol> 等)。

本仓库当前使用的标签:

标签 位置 用途
<plugin_injected_instruction> 运行时注入 包裹插件动态指令,优先处理
<plugin_context_note> 运行时注入 包裹上下文提示,用于理解对话

计划引入的标签(来自 oh-my-pi 实践,Wave 4 后启用):

标签 位置 用途
<system-conventions> 提示词开头 定义标签语义 + 关键词契约
<critical> 开头 + 结尾 不可违反的规则。长提示(>150 行)必须在结尾重复 1-2 条最关键规则
<stakes> 开头 领域基调,说明"为什么正确性重要"
<communication> 开头 语气、回复格式、人称
<completeness> 结尾 "完成"的定义,反收缩规则
<yielding> 结尾 产出前检查清单

"迷失在中间"原则:模型对首尾内容的注意力显著高于中间部分(中间衰减约 20%)。关键约束必须放在开头和结尾,参考材料、环境配置和模板变量填充内容放在中间。

密度

提示词按 token 计费,每条句子必须有决策价值。每行只承载一个要点。

密度规则:

  • 一行一意:每条要点只说一件事。子句若不影响行为则删除。
  • 不用粗体标题后重复正文:标题命名了规则,正文无需再说一遍。
    Bad:  - **禁止编造哈希。** 绝对不要编造哈希值,哈希是内容指纹,不能猜。
    Good: - **禁止编造哈希。** 缺了就再读一次。
    
  • 条件前置X?则 Y。 替代 如果 X,那么 Y。 当 X 是快速判断时适用。
  • 内联理由仅当改变决策"否则会重复" 保留;"这样可以提高效率" 删除。
  • 符号优于文字=+/-1..5。枚举用紧凑格式。
  • 战术级要点 5-15 字。更长的要点仅当包含多个不可拆分的子约束。

禁止压缩的范围:事实性参考(工具返回格式、参数定义)、完整示例(示例本身就是解释)、首次出现的非自明术语。

本仓库模板示例:

Good (agent_system.md):
  规则:
  1. 只完成当前任务,不要做额外的事情。
  2. 使用工具获取信息、执行操作。工具列表已在请求中提供,
     如需更多工具请先调用 list_tools 查看可按需发现的工具,
     然后调用 get_tool_schema 获取其完整参数定义。
  3. 需要向用户提问或确认时,使用 ask_user 工具。
  4. 任务完成后直接输出最终结果,简洁明了,不要废话。

注意:现有模板较为简洁,后续重构时按本节规则进一步压缩。

语气规则

直接、指令式、第二人称。用"你必须"、"你禁止",不用"你可能想"、"请注意"、"最好能"。

Bad:  你可能想用 list_tools 查看一下有哪些额外工具。
Good: 必须调用 list_tools 查看可发现工具。

Bad:  请注意,任务结束时应当说明完成情况。
Good: 禁止无结果结束。成功输出结果,失败说明原因。

否定必须配正向替代(替代方案不显然时)。否则 禁止 X。 可独立使用。

抗收缩措辞: - 用"持续执行直到完成",不用"高效使用 token"(后者触发模型过早放弃) - 用"遇到困难必须坚持",不用"请尽力"(后者暗示可以放弃) - 禁止在提示词中提及 token 预算、会话限制、轮次上限(属于引擎层配置,模型不应关心)

Checklist

提示词定稿前逐项自查:

  • [ ] 所有指令性语句使用关键词(必须/禁止/应当/避免/建议),无口语化祈使
  • [ ] <critical> 规则在开头和结尾均出现(长提示 > 150 行时要求更严)
  • [ ] 战术级要点 5-15 字;更长要点有明确的多子约束理由
  • [ ] 粗体标题后未重复正文内容
  • [ ] 否定配正向替代(替代方不显然时)
  • [ ] 无装饰性/凑数标签
  • [ ] 无礼貌填充("请"、"谢谢"、"麻烦你")
  • [ ] 无贿赂("我会给你小费")
  • [ ] 无关门总结("以上就是..."、"祝你顺利")
  • [ ] 验证路径明确(测试命令、lint 命令、类型检查),不用"复查你的工作"
  • [ ] 模板变量使用 {{var}} 语法,变量名在 index.json 中声明
  • [ ] 提示词中未硬编码运行时数据(任务标题、聊天记录等),均通过 {{var}} 注入