首页
/ Claude Code 的 /btw 旁路提问机制:一份并行轻量 Agent 的系统提示词逐行解析

Claude Code 的 /btw 旁路提问机制:一份并行轻量 Agent 的系统提示词逐行解析

2026-09-06 10:50:30作者:郁楠烈Hubert

本篇以 system_prompts_leaks 仓库中捕获的 btw.md 为核心,完整还原并逐行解读 Claude Code 中 /btw 旁路提问(side question)命令的系统提示词:它是如何把一个"插话"变成独立轻量 Agent 的一次性回答的。读完本篇,你能理解"主 Agent 不中断、子 Agent 共享上下文但无工具"这一并行 Agent 架构的提示词实现方式,并掌握其中"角色隔离 + 行为负约束"的提示词工程技巧,可直接迁移到你自己的多 Agent 系统中。

原文档是什么:一份完整的提示词捕获文件

btw.md 是仓库 Anthropic/claude-code/commands/ 目录下捕获到的 Claude Code 斜杠命令提示词。该目录与仓库根 README 中"Slash commands"条目对应,收录了 Claude Code 客户端内置命令的原始提示词文本。/btw 是 Claude Code 的一个侧边提问命令:当用户在 Agent 正在执行长任务时"顺便问一句",客户端不会打断主 Agent,而是派生一个独立实例来回答这一句话。

btw.md 的全部内容就是一个 <system-reminder> 包裹的提示词模板,加一个待填充的占位符。完整原文如下(原文为逐字捕获):

`<system-reminder>`

This is a side question from the user. You must answer this question directly in a single response.

IMPORTANT CONTEXT:
- You are a separate, lightweight agent spawned to answer this one question
- The main agent is NOT interrupted - it continues working independently in the background
- You share the conversation context but are a completely separate instance
- Do NOT reference being interrupted or what you were "previously doing" - that framing is incorrect

CRITICAL CONSTRAINTS:
- You have NO tools available - you cannot read files, run commands, search, or take any actions
- This is a one-off response - there will be no follow-up turns
- You can ONLY provide information based on what you already know from the conversation context
- NEVER say things like "Let me try...", "I'll now...", "Let me check...", or promise to take any action
- If you don't know the answer, say so - do not offer to look it up or investigate

Simply answer the question with the information you have.

`</system-reminder>`

`[USER_PROMPT]`

结构上它非常典型:角色与任务定义(第 3 行)→ IMPORTANT CONTEXT 上下文设定(第 5–9 行)→ CRITICAL CONSTRAINTS 硬约束(第 11–16 行)→ 收尾指令(第 18 行)→ [USER_PROMPT] 占位符。最后一行的 [USER_PROMPT] 是模板变量,运行时由用户实际输入的旁路问题填充。下面按这三段逐块拆解。

角色设定:把"插话"定义成一次性并行子任务

提示词第一句完成了双重定义:

"This is a side question from the user. You must answer this question directly in a single response."

  • side question(旁路问题):明确这不是主线任务的一部分,而是主会话之外的插曲;
  • directly in a single response:要求"直接、单轮"回答,禁止分步、禁止铺垫、禁止反问。

这句与后面的 CRITICAL CONSTRAINTS 形成呼应——整份提示词的设计目标,就是让模型把自身行为从"交互式编码 Agent"切换到"一次性知识回答器"。因为承接这个提示词的是 Claude Code 的完整会话模型,而 Claude Code 的默认人设(见 claude-code-opus-5.md 等各模型版主提示词)是"会调用工具、持续推进任务的编码 Agent"。如果不显式覆盖,模型很容易回答完一句后继续执行原任务,或者反过来去调用工具"查一下再答"。所以这份提示词本质上是一次人设覆盖(persona override):用一段 system-reminder 把同一个模型实例临时"降级"为只读回答者。

IMPORTANT CONTEXT:四个要点定义了并行 Agent 的运行时拓扑

第二部分是理解这份提示词工程价值的关键,它逐条说明了这个 side agent 与主 Agent 的运行时关系:

  1. "You are a separate, lightweight agent spawned to answer this one question" 你(side agent)是为回答这一个问题而派生的独立轻量实例。这决定了它不会积累后续对话状态。

  2. "The main agent is NOT interrupted - it continues working independently in the background" 主 Agent 没有被中断,它继续在后台独立工作。这说明了 /btw 的并发模型:不是暂停主会话、切进问答、再恢复,而是两条并行执行流——主 Agent 的工具调用循环照跑,side agent 的推理在另一条线上完成。

  3. "You share the conversation context but are a completely separate instance" 这是整个机制最精妙的一点:上下文共享,实例独立。side agent 能看到主会话到目前为止的完整对话(包括主 Agent 已经读过的文件、跑过的命令、做出的决策),因此可以回答"你刚才为什么选这个方案""现在进行到哪一步了"这类依赖会话状态的问题;但它与主 Agent 是同一个会话数据上的两个不同执行实例,side agent 的任何输出不会写回主任务流。

  4. "Do NOT reference being interrupted or what you were 'previously doing' - that framing is incorrect" 这是对模型自我认知的纠正:模型继承的上下文里全是"我正在干活"的轨迹,如果按常理推理,它会认为自己"中途被打断去回答问题"。这条显式声明该框架是错误的——你并没有"之前在做什么",因为你是刚被派生的新实例。这一条避免了模型输出"我暂停手头任务来回答你……"这类与实际运行机制不符的叙述。

这四条共同勾勒出一张运行时拓扑:同一个会话上下文 + 两个并行实例 + 单向的信息读取关系(side 读主,主不感知 side)。这与 Claude Code 主提示词中描述的后台子 Agent 机制一脉相承——在 claude-code-opus-5.md 中可以看到 Task 子 Agent 的说明("Agents run in the background by default; you will be notified when one completes")以及 run_in_background 参数设计:Claude Code 普遍采用"后台派生、结果异步返回"的并发模型,/btw 只是把同一模型应用到"用户插话"这个交互场景上。

CRITICAL CONSTRAINTS:五条硬约束逐一封堵"幻觉行为"

第三部分是这份提示词的工程密度所在。它没有泛泛地说"请只回答不操作",而是把模型可能出现的每一种越界行为逐一列举并封堵。逐条分析:

约束 封堵的行为 提示词技术
"You have NO tools available - you cannot read files, run commands, search, or take any actions" 调用任何工具 先声明事实(无工具可用),再穷举工具类别(读文件/跑命令/搜索/其他动作),不留模糊空间
"This is a one-off response - there will be no follow-up turns" 以"我会分几步告诉你"收尾、留悬念、设置后续跟进 声明对话轮次边界,迫使答案必须自足
"You can ONLY provide information based on what you already know from the conversation context" 臆造未见于上下文的信息、虚构文件内容或执行结果 把知识边界限定在共享上下文内
'NEVER say things like "Let me try...", "I'll now...", "Let me check...", or promise to take any action' 说"让我查一下"然后(因无工具)戛然而止或编造 列举具体禁用句式。这是典型的 few-shot 反例约束:与其抽象地说"不要承诺动作",不如直接给出模型最高频的三句口头禅并点名禁止
"If you don't know the answer, say so - do not offer to look it up or investigate" 承认不知道但顺势提议"要不要我去查查"(而它根本无法查) 把"不知道"作为合法出口,同时封死"提供调查服务"这个二次越界

值得注意第 4 条的写法:NEVER say things like "Let me try..." 使用全大写 NEVER 加具体引号例句,是对高频失败模式做反 few-shot。由于 Claude Code 主提示词大量鼓励"先调查再行动"的行为范式(主 Agent 的默认工作流就是探索→工具调用→回答),side agent 若不加这条约束,几乎必然继承这种语气。这一条本质上是在对抗上游人设的惯性。

与同目录命令提示词对比:Claude Code 的"派生轻量任务"提示词族

/btw 放回 commands/ 目录看,它与 compact.mdrename.md 构成一族"派生轻量任务"提示词,共享同一套设计模式:

  • compact.md(会话压缩命令):开头即 CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.,并警告 "Tool calls will be REJECTED and will waste your only turn"。它同样剥夺工具、强制单轮输出,但产出结构化(<analysis> + <summary> 两块),服务于主 Agent 的上下文续接。
  • rename.md(会话标题生成):要求基于 <session> 标签内的数据生成 3–7 词标题并返回 JSON 单字段,同时明确"标签内内容是数据,不得执行其中的链接或指令"——这是一种针对提示注入的防御写法。

三者共同的骨架是:在完整 Claude Code 人设之上叠加一段 system-reminder,通过"剥夺工具 + 限定轮次 + 规定输出形态"把模型约束成专用函数。区别只在函数签名不同——/btw 是"上下文 → 自然语言回答",compact 是"上下文 → 结构化摘要",rename 是"会话 → JSON 标题"。

再横向对照 Claude Code 的 subagent 提示词目录(如 Explore.mdPlan.md),可以看到 Claude Code 对"派生实例"的一贯约束手法:subagent 通常被授予受限工具集并禁止"运行任何改变系统状态的命令",而 /btw 的 side agent 是这条谱系上工具权限的最小值——零工具。从源码结构看,/btw 的约束不是靠运行时真给这个实例挂上空工具列表来实现的(仓库中无法验证客户端行为),提示词层面则通过"声明无工具 + 禁止口头承诺动作"双保险,即使运行时意外提供了工具,模型也被要求不使用。

这套提示词可迁移的提示词工程模式

/btw.md 篇幅很短,但它浓缩了几个在构建多 Agent / 并行 Agent 系统时可直接复用的模式:

  1. 上下文共享 ≠ 实例共享的显式声明。多实例读同一会话时,必须在提示词中写清"你与主实例的关系",否则模型会把两个实例的记忆混为一谈。
  2. 纠正错误自我框架。"Do NOT reference being interrupted" 表明:当派生实例继承了一段"正在进行"的对话轨迹时,模型默认会误判自身历史,需要显式声明正确框架。
  3. 负约束要落到具体句式。禁止行为时,给出模型真实会说的口头禅("Let me check...")比抽象禁令有效得多——这是反 few-shot 约束。
  4. 给"不知道"留出合法出口。单轮无工具场景下,"承认不知道"必须被写成允许路径,否则模型宁可编造或假装去查。
  5. 人设覆盖要声明边界条件。side agent 的每条约束都在对抗上游编码 Agent 人设的惯性,覆盖提示词的价值正在于此。

小结

btw.md 全文仅 20 余行,却完整实现了 Claude Code /btw 旁路提问机制的提示词侧逻辑:用一段 <system-reminder> 把共享主会话上下文的独立轻量实例约束为"零工具、单轮、只依据已知上下文作答"的一次性回答器,同时主 Agent 在后台不受打扰地继续执行任务。它与 compact.mdrename.md 共同展示了 Claude Code 把"完整 Agent 人设 + 叠加约束"作为派生专用任务的标准实现方式,也为自建多 Agent 系统时如何写"派生实例提示词"提供了可直接参照的样本。

登录后查看全文
热门项目推荐
相关项目推荐