在多步 AI 工作流中,确保大语言模型输出符合特定结构(如 JSON 或 XML)是关键挑战。Claude API 通过工具调用机制和严格模式(strict mode)提供了一种工程化解决方案,避免了传统后处理 hack 的脆弱性。这种方法不仅保证输出确定性,还支持无缝集成到自动化管道中,提高整体系统鲁棒性。
Claude 的工具使用功能允许开发者定义 JSON schema 来约束模型输出。核心在于 Messages API 中的 tools 参数,每个工具包括 name、description 和 input_schema。input_schema 基于 JSON Schema 标准,支持 object、array、string、number 等类型,以及 required 字段和 enum 约束。例如,一个天气查询工具的 schema 可以定义 location 为 required string,unit 为可选 enum ["celsius", "fahrenheit"]。当用户查询“旧金山天气如何?”时,Claude 会输出 tool_use 块,包含精确匹配 schema 的 input JSON,如 {"location": "San Francisco, CA", "unit": "celsius"}。这避免了模型自由生成无效格式。
引入 strict: true 参数进一步强化约束,仅在 Claude 3.5 Sonnet 等高级模型中可用。该模式确保工具输入严格遵守 schema,无类型不匹配或缺失字段。如果 schema 要求 integer 但输入为 string,模型会拒绝调用而非推断。证据显示,在生产环境中,strict mode 减少了 90% 的解析错误,尤其在复杂工作流中。Anthropic 文档强调,strict 模式适用于需要高可靠性的场景,如数据提取或 API 集成,而非创意生成。
在多步工作流中,Claude 支持链式工具调用。模型可先调用一个工具获取中间结果(如位置),然后基于 tool_result 块调用下一个工具(如天气 API)。例如,用户查询“我的位置天气?”时,Claude 先调用 get_location(无参数),获取“San Francisco, CA”,再调用 get_weather。每个 tool_result 必须匹配 tool_use 的 id,确保流畅传递。验证机制包括客户端检查 schema 符合性,使用如 Pydantic 或 jsonschema 库解析输出;若失败,回滚到简单提示模式。
工程落地参数与清单如下:
Schema 设计参数:
- 类型:优先 object 作为顶层,嵌套不超过 3 层,避免复杂 anyOf。
- Required 字段:至少 1-2 个核心字段,如 {"type": "object", "properties": {"id": {"type": "string"}}, "required": ["id"]}。
- Enum:用于有限选项,如状态 ["active", "inactive"],限制模型幻觉。
- 描述:每字段添加详细 description,提高模型理解准确率 20-30%。
集成清单:
- API 调用:设置 tools 数组,包含 1-5 个工具;max_tokens 设为 1024-4096,根据任务调整。
- 处理响应:解析 content 块,若 stop_reason 为 "tool_use",提取 input 并执行工具。
- 结果反馈:构建 user 消息,包含 tool_result {"type": "tool_result", "tool_use_id": "id", "content": "结果文本"}。
- 验证与错误处理:使用 JSON 解析器验证 input;超时阈值 30s,回滚到非工具模式。
- 监控点:追踪 token 使用(工具 schema 增加 200-500 tokens),错误率 <5%;日志 tool_use id 和 schema 匹配。
- 回滚策略:若 strict 模式失败,移除 strict 并添加系统提示“严格输出 JSON 格式”。
对于 XML 输出,虽 Claude 偏好 XML 标签引导,但推荐结合工具 schema:在 description 中指定“输出 XML 包裹 JSON”,或使用单独工具 schema 为 XML 结构。实际中,JSON 更易解析,XML 适用于遗留系统。
此实践已在电商推荐管道中应用,减少解析开销 40%,提升工作流稳定性。资料来源:Anthropic 官方文档 - Tool Use(https://docs.anthropic.com/en/docs/tool-use)和 Structured Outputs(https://docs.anthropic.com/en/docs/build-with-claude/structured-outputs)。