Claude Code 中的 AskUserQuestion:让 AI 主动问你问题
深入讲解 Claude Code 内置工具 AskUserQuestion 的使用方法,通过实际案例展示如何让 AI 在关键决策点主动向用户提问
使用 Claude Code 时,你可能会遇到这样的情况:AI 直接执行了一个操作,但结果并不是你想要的。比如让它删除文件,它直接删了;让它修改代码,改错了方向。
问题出在哪里?AI 没有在关键决策点问你的意见。
Claude Code 提供了一个内置工具 AskUserQuestion,专门解决这个问题——让 AI 在需要你做决定时,主动停下来问你。
AskUserQuestion 是 Claude Code 的内置交互工具,用于在 AI 执行操作前向用户提问获取决策。
- 单选 / 多选 — 支持选择一个或多个选项
- 自定义输入 — 用户可以通过「Other」提供自定义回答
- 预览功能 — 选项可以带代码片段、ASCII 图示等预览
- 阻塞式 — AI 会等待你回答后才继续执行
| 场景 | 说明 |
|---|---|
| 创建计划 | 让 AI 先出方案,你确认后再执行 |
| 代码执行前决策 | 修改代码前,让你选择实现方式 |
| 操作前确认 | 删除、覆盖等风险操作前确认 |
| 需求澄清 | 信息不足时追问,确保理解正确 |
这是一个关键问题:AskUserQuestion 是 AI 自己决策调用,还是用户可以主动控制?
答案是:两者都可以。
Claude Code 会根据操作的风险等级自动决定是否提问:
| 操作类型 | AI 的行为 |
|---|---|
| 删除/覆盖文件 | 主动提问确认 |
| 发送网络请求 | 主动提问确认 |
| 读取文件内容 | 直接执行 |
| 搜索代码 | 直接执行 |
| 代码格式化 | 直接执行 |
你可以在 CLAUDE.md 中明确告诉 AI 什么情况下必须提问:
## 交互规则
- 删除任何文件前,必须先用 AskUserQuestion 确认- 修改 package.json 前,必须先问我- 执行 git push 前,必须先确认- 涉及环境变量的操作,必须先确认这样 AI 会在这些场景下强制触发提问,而不是自己判断。
你也可以在对话中直接要求:
> 删除 src/old-component.ts,删除前先问我确认
> 帮我重构这个函数,但修改方案先给我选择AI 会在执行前用 AskUserQuestion 让你确认或选择。
当你提出一个复杂需求时,AI 不应该直接动手,而是先给你一个计划让你确认。这就是 AskUserQuestion 最有价值的场景之一。
> 帮我给这个项目添加用户认证功能Claude Code 不会直接写代码,而是先分析需求,然后用 AskUserQuestion 让你选择方案:
┌─────────────────────────────────────────┐│ 认证方案 ││ ││ 你想用哪种认证方式? ││ ││ ● JWT Token ││ 无状态,适合 API 服务 ││ 前端存储在 localStorage ││ ││ ○ Session + Cookie ││ 传统方式,服务端存储会话 ││ 更安全,但需要服务端内存 ││ ││ ○ OAuth 2.0 ││ 支持第三方登录(GitHub、Google) ││ 实现复杂,但用户体验好 ││ ││ [确认] │└─────────────────────────────────────────┘你选择后,AI 才会基于你的选择制定具体的实施计划。
> 帮我把数据库访问层从 MySQL 迁移到 PostgreSQLAI 先确认迁移范围:
┌─────────────────────────────────────────┐│ 迁移范围 ││ ││ 你想怎么处理这次迁移? ││ ││ ● 渐进式迁移 ││ 先兼容两种数据库,逐步切换 ││ 风险低,但工作量大 ││ ││ ○ 一次性切换 ││ 直接替换所有数据库调用 ││ 快速完成,但风险高 ││ ││ ○ 先做兼容层 ││ 抽象数据库接口,后续切换更灵活 ││ 中等风险,可扩展性好 ││ ││ [确认] │└─────────────────────────────────────────┘创建计划时,AskUserQuestion 的价值在于:
- 防止方向错误 — 先确认方向,再动手
- 明确需求边界 — 通过选项帮你理清思路
- 降低返工成本 — 计划确认后再执行,避免推倒重来
在代码编写或修改过程中,AI 经常面临多种实现方式的选择。通过 AskUserQuestion,让你在代码执行前做出决策。
> 给这个函数添加缓存功能Claude Code 分析后提供两种方案:
┌─────────────────────────────────────────┐│ 实现方案 ││ ││ 这个功能你想用哪种方式实现? ││ ││ ● 方案A — 内存缓存 ││ 优点:无依赖,简单高效 ││ 缺点:进程重启后缓存丢失 ││ ││ ○ 方案B — Redis 缓存 ││ 优点:持久化,支持分布式 ││ 缺点:需要额外的 Redis 服务 ││ ││ [确认] │└─────────────────────────────────────────┘> 帮我重写这个工具函数AI 给出两种风格选项:
┌─────────────────────────────────────────┐│ 代码风格 ││ ││ 你希望用什么风格重写? ││ ││ ● 简洁风格 ││ 最少代码量,快速实现 ││ ││ ○ 详细风格 ││ 包含完整类型定义和注释 ││ ││ [确认] │└─────────────────────────────────────────┘> 帮我优化这个组件的性能AI 发现多种优化方向,于是提问:
┌─────────────────────────────────────────┐│ 优化方向 ││ ││ 你想优先优化哪个方面? ││ ││ ● 首屏加载速度 ││ 减少初始加载的 JS/CSS 体积 ││ ││ ○ 交互响应速度 ││ 优化事件处理和动画流畅度 ││ ││ ○ 两者兼顾 ││ 全面优化,但工作量较大 ││ ││ [确认] │└─────────────────────────────────────────┘代码执行前决策的价值在于:
- 控制实现方式 — 让你决定用什么技术方案
- 避免过度实现 — AI 不会擅自添加你不需要的功能
- 保持代码风格一致 — 让你选择符合项目规范的写法
| 应该问 | 不需要问 |
|---|---|
| 选择实现方案 | 读取文件内容 |
| 确认修改范围 | 代码格式化 |
| 删除/覆盖操作 | 运行测试 |
| 涉及外部服务 | 搜索代码 |
- 互斥清晰 — 每个选项代表不同的方向
- 描述准确 — 让用户不看代码也能理解
- 数量适中 — 2-4 个选项最佳
- 提供默认 — 推荐的选项放在第一位
把你的偏好写在 CLAUDE.md 中,让 AI 养成「先问再做」的习惯:
## 交互规则
- 创建计划前,必须先让我确认方案- 修改代码前,必须先让我选择实现方式- 删除文件前必须确认- 默认使用 TypeScriptClaude Code 会判断操作的风险等级。读取文件、搜索代码这类只读操作不需要确认;删除、覆盖、发送请求这类有风险的操作才会触发提问。但你可以通过 CLAUDE.md 覆盖这个行为。
可以。在 Claude Code 启动时使用 --dangerously-skip-permissions 参数会跳过所有权限检查(不推荐用于生产环境)。
Claude Code 会智能判断何时需要提问。如果你觉得某个操作不需要确认,可以在 CLAUDE.md 中说明,AI 会记住你的偏好。
可以。在 CLAUDE.md 中写「任何修改操作前都必须先问我」,AI 就会在每次修改前触发提问。
AskUserQuestion 是 Claude Code 中一个看似简单但非常重要的工具。它让 AI 从「自作主张」变成「主动请示」,在关键决策点把选择权交还给用户。
通过本文,你应该已经理解了:
- 基本用法 — 单选、多选、自定义输入
- 控制权 — AI 默认自动判断,但你可以通过 CLAUDE.md 或对话指令主动控制
- 核心场景 — 创建计划时确认方案,代码执行前选择实现方式
- 最佳实践 — 何时该问、选项设计、规则设定
善用 AskUserQuestion,让 AI 成为一个更可靠的编程伙伴。
💡 提示:下次使用 Claude Code 时,注意观察它什么时候会主动问你问题。如果有操作它没问就执行了,可以在 CLAUDE.md 中补充规则,让 AI 养成「先问再做」的习惯。