在使用 Claude Code 处理复杂任务时,你是否遇到过这样的场景:AI 默默地做了一大堆工作,最终交出的结果却完全不是你想要的?或者,AI 在关键节点做出了一个错误的假设,导致整个方向跑偏?
AskUserQuestion 工具正是为了解决这个问题而存在的。它让 Claude 具备了"开口提问"的能力,在模糊、关键或多选的节点上主动与你确认,而不是自行猜测。
什么是 AskUserQuestion?
AskUserQuestion 是 Claude Code 内置的一个工具(Tool),专门用于在任务执行过程中向用户收集信息或决策。
与普通的文字对话不同,AskUserQuestion 会渲染一个结构化的交互组件,提供:
- 清晰的问题说明
- 预设的可选答案(2-4 个选项)
- 可选的 Markdown 预览(适合对比代码、UI 布局等)
- 多选模式(允许用户选择多个选项)
- 用户始终可以选择"Other"并输入自定义文本
从用户体验角度看,这远比 AI 在聊天框里输出一段文字问题更加清晰、高效。
核心参数解析
AskUserQuestion 接受如下结构的参数:
{
"questions": [
{
"question": "你希望使用哪种认证方式?",
"header": "Auth method",
"multiSelect": false,
"options": [
{
"label": "JWT Token",
"description": "无状态,适合分布式系统,前端自行管理 token。",
"markdown": "// JWT 示例\nconst token = jwt.sign({ userId }, SECRET, { expiresIn: '7d' });"
},
{
"label": "Session Cookie",
"description": "服务端管理状态,适合传统 Web 应用。"
},
{
"label": "OAuth 2.0",
"description": "支持第三方登录,适合需要集成 GitHub/Google 等场景。"
}
]
}
]
}
关键字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
question | string | 完整的问题文本,应以问号结尾 |
header | string | 显示为标签/芯片的简短标题,最多 12 个字符 |
multiSelect | boolean | 是否允许多选,默认 false |
options | array | 2-4 个选项,每项包含 label、description,可选 markdown |
options.markdown | string | 可选的预览内容,支持代码片段、ASCII 图、配置示例 |
适用场景
Claude 在以下情况下应当使用 AskUserQuestion:
1. 需求模糊,存在多种合理解读
用户说"优化数据库查询"——是加索引?改 ORM 写法?引入缓存?还是拆分查询?
在动手之前,先问清楚,省去反复返工。
2. 存在多个同等合理的技术方案
实现实时通信,可以选 WebSocket、Server-Sent Events 或轮询。
每种方案各有取舍,让用户做决策,而不是 AI 擅自选一个。
3. 即将执行高风险或不可逆操作
即将删除数据库表、强制推送 git、覆盖现有配置文件……
这类操作应当暂停并明确征得用户同意,即使用户之前说过"自动执行"。
4. 偏好问题,没有标准答案
代码风格选 Prettier 还是 ESLint?注释用中文还是英文?
5. 发现了预期之外的状态
发现了不认识的配置文件、未知分支、异常的文件结构——先问再动。
Claude 在什么时候不该使用 AskUserQuestion?
工具有使用边界,滥用反而会让 AI 显得犹豫不决、烦人啰嗦。
- 任务指令已经非常明确,不存在歧义
- 问题可以通过读取项目文件、配置、文档自行推断
- 属于显而易见的单步操作(比如"修复拼写错误")
- 询问"我的计划可以吗?"——这种确认场景应该使用
ExitPlanMode,而不是AskUserQuestion
在 Windows 平台上使用 Claude Code
安装 Claude Code
Claude Code 基于 Node.js,在 Windows 上通过 npm 全局安装:
# 全局安装 Claude Code
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version
推荐:在 Windows 上使用 Windows Terminal + PowerShell 7,获得更好的 ANSI 颜色支持和 Unicode 渲染效果。
配置 API Key
# 设置环境变量(当前会话)
$env:ANTHROPIC_API_KEY = "sk-ant-xxxxx"
# 或永久写入用户环境变量
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", "sk-ant-xxxxx", "User")
也可以通过 Claude Code 内置的认证流程:
claude
# 按照提示完成认证
启动并体验 AskUserQuestion
在项目目录下启动 Claude Code:
cd C:\Projects\MyApp
claude
当 Claude 遇到需要你决策的节点时,AskUserQuestion 工具会被自动调用,终端中将渲染出交互式选项界面。
实战示例:AskUserQuestion 改变工作流的场景
场景一:添加用户认证功能
用户:给我的 Express 应用添加用户认证
没有 AskUserQuestion,AI 可能默默实现了一套基于 Session 的认证,而你其实想要 JWT。
有了 AskUserQuestion,Claude 会先问:
? 请选择认证方式
① JWT Token(无状态,适合前后端分离)
② Session Cookie(有状态,适合传统 Web)
③ OAuth 2.0(第三方登录)
> Other
你的一次点击,节省了可能数小时的返工。
总结
| 维度 | 要点 |
|---|---|
| 本质 | Claude Code 的内置交互工具,渲染结构化问答 UI |
| 触发时机 | 模糊需求、多方案抉择、高风险操作、用户偏好 |
| Windows 配置 | Node.js + npm 安装,推荐 Windows Terminal |
| 核心价值 | 在关键节点引入人类判断,减少猜测,降低返工 |
| 使用边界 | 不适用于需求明确、可自行推断、单步操作场景 |