加载中

在本课程的前面部分,我们介绍了如何使用消息预填充和停止序列从Claude获取结构化输出。虽然这种方法效果良好且易于设置,但我们可以使用工具获得更可靠的输出。这种方法实现起来更复杂,但在提取像JSON这样的结构化数据时能提供更好的一致性。

为什么要学习这两种方法?

您可能会想,如果工具更可靠,为什么我们不直接从工具开始。答案很简单:工具需要更多的设置和复杂性。同时掌握这两种技术能给您带来灵活性——有时您会想要快速的基于提示的方法,有时您则需要工具所提供的可靠性。

基于工具的结构化输出如何工作

核心概念很简单:不是要求Claude将其响应格式化为JSON,而是创建一个工具,其输入参数与您想要提取的数据的确切结构相匹配。然后Claude会用提取出的数据作为参数来"调用"这个工具。

具体流程如下:

  1. 编写一个描述您想要的数据结构的JSON schema
  2. 创建一个以该schema作为输入规范的工具
  3. 将您的数据和工具schema发送给Claude
  4. 使用toolChoice参数强制Claude使用该工具
  5. 从工具调用参数中提取结构化数据

整个流程是这样的:您的服务器发送一个提示,要求Claude分析数据并调用特定的工具。Claude会用一条包含提取出的JSON数据的工具使用消息作为响应。此时,您只需获取数据并结束对话——无需后续跟进。

控制工具使用

在使用工具进行结构化输出时,您希望确保Claude使用您的提取工具。toolChoice参数为您提供了三个选项:

  • {"toolChoice": {"auto": {}}} - 模型自行决定是否需要使用工具(默认)
  • {"toolChoice": {"any": {}}} - 模型必须使用某个工具,但可以选择使用哪一个
  • {"toolChoice": {"tool": {"name": "tool-name"}}} - 模型必须使用指定的工具

对于结构化输出,您几乎总是希望使用第三个选项,以确保Claude使用您的提取工具。

实际示例

假设您想从一篇文章中提取标题、作者和关键主题。首先,您需要创建一个工具schema:

python
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对象:

python
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并处理工具响应。但当您需要一致、可靠的结构化输出时,工具是正确的选择。