CCA-F 练习题库· Prompt Engineering & Structured Output
你希望 Claude 总是调用你的 classify_ticket 工具,并且先以文本形式输出一句话的理由。你设置了 tool_choice: {"type": "tool", "name": "classify_ticket"}。按照 Anthropic 的文档,实际会发生什么?
- A由于强制指定某个工具会预填 assistant 消息,即使你要求了,Claude 也会直接输出 tool_use 块,前面不带任何自然语言文本;要拿到理由文本,应改用 tool_choice "auto",并在 user 消息中指示 Claude 使用该工具。
- BClaude 会先输出说明理由的文本块、再输出 tool_use 块,完全按你的要求来,因为 tool_choice 只决定调用哪个工具;它从不抑制同一轮里的自然语言内容,所以文本块和 tool_use 块在一次响应里总是可以共存。
- C请求会返回 400 错误,因为 tool_choice "tool" 在整段对话当中都禁止任何形式的文本输出,API 会直接拒绝那条在强制工具调用之外还索要理由的 user 消息,因此这两个诉求必须拆成两次请求来分别发送。
- DClaude 会把理由放在 API 响应的顶层 "reasoning" 字段里,与 content 数组分开,因此你从该字段读取那句话、照常从 content 读取 tool_use 块,无需改动 tool_choice。
- EClaude 会忽略掉 tool_choice,改用散文形式回复,因为 user 消息当中的显式指令总是压过 tool_choice 这个参数,所以你会拿到那句理由,但整个响应中的任何地方都不会有 tool_use 块出现。
正确答案:A
解析
- A正确,且与 Anthropic 的 tool-use 文档直接吻合。当 tool_choice 为 "any" 或 "tool" 时,API 会预填 assistant 消息以强制使用某个工具,因此模型不会在 tool_use 内容块之前输出任何自然语言回复或解释,哪怕你明确要求它这么做。请求不会报错,tool_choice 也会被遵守,只是会跳过你要求的那段理由文本。文档给出的、想在工具调用之外拿到说明文字的变通做法是:使用默认的 tool_choice "auto",并在 user 消息中加入一条明确指示(例如 "Use the classify_ticket tool in your response")。据此可以排除其余选项。
- B不对:不会先输出任何文本。
- C不对:不会有 400 错误——请求是合法的,只是做了预填;强制工具使用并不会“在整段对话中禁止文本”。
- D不对:Messages API 响应中并没有顶层 "reasoning" 字段。
- E不对:tool_choice 并未被忽略。另有一条文档记载的约束:强制工具使用("any"/"tool")与手动 extended thinking 不兼容,会返回错误(不过 adaptive/默认开启的 thinking 是支持的),这与本题正交。
延伸阅读
本题为本站自有原创练习题,非任何官方考试内容;解析对照 Anthropic 公开文档撰写, 如与最新文档不符请以官方为准。想在限时环境下检验水平,可参加 模拟考(题目与本页题库不重叠)。