在本课程的前面部分,我们介绍了如何使用消息预填充和停止序列从Claude获取结构化输出。虽然这种方法效果良好且易于设置,但我们可以使用工具获得更可靠的输出。这种方法实现起来更复杂,但在提取像JSON这样的结构化数据时能提供更好的一致性。
为什么要学习这两种方法?
您可能会想,如果工具更可靠,为什么我们不直接从工具开始。答案很简单:工具需要更多的设置和复杂性。同时掌握这两种技术能给您带来灵活性——有时您会想要快速的基于提示的方法,有时您则需要工具所提供的可靠性。
基于工具的结构化输出如何工作
核心概念很简单:不是要求Claude将其响应格式化为JSON,而是创建一个工具,其输入参数与您想要提取的数据的确切结构相匹配。然后Claude会用提取出的数据作为参数来"调用"这个工具。

具体流程如下:
- 编写一个描述您想要的数据结构的JSON schema
- 创建一个以该schema作为输入规范的工具
- 将您的数据和工具schema发送给Claude
- 使用
toolChoice参数强制Claude使用该工具 - 从工具调用参数中提取结构化数据

整个流程是这样的:您的服务器发送一个提示,要求Claude分析数据并调用特定的工具。Claude会用一条包含提取出的JSON数据的工具使用消息作为响应。此时,您只需获取数据并结束对话——无需后续跟进。
控制工具使用
在使用工具进行结构化输出时,您希望确保Claude使用您的提取工具。toolChoice参数为您提供了三个选项:

{"toolChoice": {"auto": {}}}- 模型自行决定是否需要使用工具(默认){"toolChoice": {"any": {}}}- 模型必须使用某个工具,但可以选择使用哪一个{"toolChoice": {"tool": {"name": "tool-name"}}}- 模型必须使用指定的工具
对于结构化输出,您几乎总是希望使用第三个选项,以确保Claude使用您的提取工具。
实际示例
假设您想从一篇文章中提取标题、作者和关键主题。首先,您需要创建一个工具schema:
article_details_schema = {
"toolSpec": {
"name": "article_details",
"description": "Extracts key information from an article",
"inputSchema": {
"json": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The title of the article"
},
"author": {
"type": "string",
"description": "The author's name"
},
"topics": {
"type": "array",
"items": {"type": "string"},
"description": "List of key topics mentioned"
}
},
"required": ["title", "author", "topics"]
}
}
}
}然后,您需要用您的数据调用Claude,并强制它使用该工具。我们的chat辅助函数直接将工具名称作为其tool_choice参数,因此您不必自己构建嵌套的toolChoice对象:
messages = []
add_user_message(messages, f"""
Analyze the article below and extract key data. Then call the article_details tool.
<article_text>
{article_text}
</article_text>
""")
result = chat(messages, tools=[article_details_schema], tool_choice="article_details")Claude会用一条工具使用消息作为响应,其中包含按您指定的确切格式提取出的数据。工具调用参数将包含您的结构化JSON数据,可直接在您的应用程序中使用。
主要优势
- 比基于提示的提取更可靠
- 保证与您的schema相匹配的结构
- 无需消息预填充或停止序列
- 通过工具schema实现内置验证
主要的权衡在于复杂性——您需要编写详细的schema并处理工具响应。但当您需要一致、可靠的结构化输出时,工具是正确的选择。