BrainBank
AI 课堂/技能Claude Code Deep Dive

AskUserQuestionTool:向用户提问

2026/8/2 14:54:38 · 更新于 2026/8/2 14:55:31 · 来源

#claude-code#skill#askuserqueationtool#agent-interaction#structured-query#plan-mode#multi-select

AskUserQuestionTool 将 Agent 执行过程中的需求澄清从零散的自然语言提问升级为正式的结构化表单交互,支持多选、preview 对比与唯一性约束。

这个工具为什么比“直接问一句话”更高级

很多人第一次看到 AskUserQuestionTool,会觉得它不就是“向用户提问”吗?
但在 Claude Code 里,它其实解决的是一个更深的问题:

当模型执行到一半需要补信息时,如何把“提问”做成正式、结构化、可交互的系统能力,而不是随手打一句自然语言。

这对于 Agent 产品特别重要,因为它关系到:

  • 需求澄清
  • 多选决策
  • 方案比较
  • Plan Mode 中的信息补全

源码先看 schema

tools/AskUserQuestionTool/AskUserQuestionTool.tsx

const inputSchema = z.strictObject({
  questions: z.array(questionSchema()).min(1).max(4),
  answers: z.record(z.string(), z.string()).optional(),
  annotations: annotationsSchema(),
  metadata: z.object({ source: z.string().optional() }).optional(),
})

而单个问题本身也有非常完整的结构:

const questionSchema = z.object({
  question: z.string(),
  header: z.string(),
  options: z.array(questionOptionSchema()).min(2).max(4),
  multiSelect: z.boolean().default(false),
})

这说明它不是普通聊天,而是一个正式的表单式交互工具

它甚至支持选项预览

tools/AskUserQuestionTool/prompt.ts 里专门定义了 preview 机制:

Use the optional `preview` field on options when presenting concrete artifacts that users need to visually compare:
- ASCII mockups of UI layouts or components
- Code snippets showing different implementations
- Diagram variations

这很有意思,因为它意味着这个工具并不只是问选择题,而是已经能支持:

  • 方案 A / 方案 B 对比
  • UI 草图对比
  • 配置示例对比
  • 代码实现对比

也就是说,Anthropic 把“互动式澄清”做成了一个产品层能力。

一张图看它在执行流程里的位置

模型执行中遇到歧义 > AskUserQuestionTool > 生成结构化问题与选项 > 前端渲染交互卡片 > 用户选择/填写 > 答案结构化回流 > 模型继续执行

它和 Plan Mode 的关系尤其重要

prompt 文件里有一段非常关键:

Plan mode note: In plan mode, use this tool to clarify requirements or choose between approaches BEFORE finalizing your plan.
Do NOT use this tool to ask "Is my plan ready?" or "Should I proceed?" - use ExitPlanMode for plan approval.

中文含义

  • 在 Plan Mode 里,如果你还缺需求信息,先用这个工具补齐
  • 但如果你已经写完计划,想问“计划行不行”,那不该再用它
  • 这时应该交给 ExitPlanModeTool

这段 prompt 很有代表性,因为它说明:

AskUserQuestionTool 不只是问问题,它还承担工具职责边界的一部分

它会严格约束问题结构

源码里还有一个很重要的唯一性校验:

const UNIQUENESS_REFINE = {
  message: 'Question texts must be unique, option labels must be unique within each question'
}

也就是说,Claude Code 不允许它胡乱生成重复问题、重复选项。
这和随便输出一段聊天文本完全不同。

Anthropic 很明显是把这类提问当成“正式用户交互”,而不是附属对话。

一次典型使用路径

比如 Claude 在实现功能时发现有两个方案都成立:

  1. 它不应该自己拍脑袋决定
  2. 它会用 AskUserQuestionTool 把选项列出来
  3. 用户选完后,答案会回流到主线程
  4. Claude 再按选中的方向继续执行

这条路径和普通聊天最大的不同是:

  • 结果可结构化
  • 选项可解释
  • 还能附带 preview

一张图看它和相邻工具的边界

image.png

也就是说:

  • AskUserQuestionTool:我还缺信息,继续问
  • ExitPlanModeTool:计划已经完成,请你审批

这两个工具不能混用。

它为什么对 Agent 产品特别重要

如果没有这个工具,模型在遇到歧义时只有两个糟糕选择:

  1. 自己瞎猜
  2. 在自然语言里随便问一句

而 Claude Code 的做法是第三种:

把提问做成正式交互协议

这会让系统在几个方面明显更稳定:

  • 提问更简洁
  • 用户选择更清晰
  • 后续执行更可控
  • 统计与产品迭代更容易

最容易误解它的地方

误解一:这只是个 UI 小工具

不是。
它实际上是 Claude Code 的“用户协同接口”。

误解二:所有需要问用户的事都该用它

也不对。
计划审批、权限申请、某些系统确认有其他专门机制。

误解三:它只是单选题

并不是。
它支持多问题、多选、注释、preview。

小结

如果你想抓住它的本质,可以记这句话:

AskUserQuestionTool 把“执行中的需求澄清”做成了结构化的产品交互能力,它不是普通聊天问句,而是 Claude Code 主循环中的正式协作接口。

学习地图

AskUserQuestionTool 学习路线

📌 第一阶段:理解其设计理念

  • 认识「直接问一句话」vs「结构化表单式提问」的区别
  • 理解为什么 Agent 需要正式的用户提问协议

📌 第二阶段:掌握 Schema 结构

  • questions(1~4 题)、answersannotations
  • 单题结构:question / header / options(2 ~ 4) / multiSelect
  • preview 字段的作用与格式(ASCII mockup / 代码片段 / 配置示例)

📌 第三阶段:在 Plan Mode 中正确调用

  • 缺失需求信息 → 先 AskUserQuestionTool
  • 计划已成 → 再用 ExitPlanModeTool
  • 不要混淆两者的职责边界

📌 第四阶段:理解约束与最佳实践

  • 问题文本 & 选项标签唯一性校验
  • 何时该用 vs 不该用(审批/权限 ≠ 此工具范围)
  • 多问题 + 多选 + annotations 的综合用例

动手实践——分步指南

  1. 安装 Claude Code: npm install -g @anthropic-ai/claude
  2. 在你的仓库根目录初始化项目:mkdir demo-agent && cd demo-agent && claude --login
  3. 新建一个提示文件 prompt.txt,写入你的需求和背景信息
  4. 在对话中当 Claude 遇到歧义时,主动说"请列出具体的可选项给我选择"来触发 AskUserQuestionTool
  5. 观察终端渲染出的交互卡片:检查每个题目的 question/header/options/multiSelect 字段是否完整
  6. 练习使用多选模式:说"请列出至少两个方案,支持我多个同时选中"
  7. 要求附加 preview:"为每个选项提供代码片段或配置示例的预览"
  8. 验证唯一性约束:尝试提出语义重复的选项,观察 Claude Code 的拒绝机制
  9. Plan Mode 实践:先 /planmode 进入计划模式 → AskUserQuestionTool 补齐缺失信息 → ExitPlanModeTool 提交审批
  10. 查看 askUserQuestionTimeout 配置(默认 60s):在 settings.json 中修改为 "5m" 延长等待时间,验证超时行为

三大推荐资源

  1. 1
    Claude Code Tools Reference - AskUserQuestion

    官方文档完整工具列表,包含 AskUserQuestion 的描述、权限配置选项与超时设置。

    https://docs.anthropic.com/en/docs/claude-code/tools#askuserquestion-tool-behavior

  2. 2
    Claude Code GitHub 仓库

    Anthropic 官方发布的 Claude Code CLI,包含源码(含 AskUserQuestionTool.tsx/schema 定义)与完整文档。

    https://github.com/anthropics/claude-code

  3. 3
    Anthropic API Reference - Tool Use

    官方 Tool Use 概念指南,解释结构化输入/输出、多轮交互流的设计原则,帮助理解 AskUserQuestionTool 在 Claude 系统中的定位。

    https://docs.anthropic.com/en/api/tool-use

链接由 AI 推荐——使用前建议快速核实。