이 과정의 앞부분에서 메시지 사전 채우기(pre-fill)와 중지 시퀀스를 사용하여 Claude로부터 구조화된 출력을 얻는 방법을 다루었습니다. 이 접근 방식은 잘 작동하고 설정하기 쉽지만, 도구를 사용하면 더 신뢰할 수 있는 출력을 얻을 수 있습니다. 이 방법은 구현하기 더 복잡하지만, JSON과 같은 구조화된 데이터를 추출할 때 더 나은 일관성을 제공합니다.
두 가지 접근 방식을 모두 배워야 하는 이유
도구가 더 신뢰할 수 있다면 왜 처음부터 도구로 시작하지 않았는지 궁금할 수 있습니다. 답은 간단합니다: 도구는 훨씬 더 많은 설정과 복잡성을 필요로 합니다. 두 가지 기법을 모두 사용할 수 있으면 유연성이 생깁니다 - 때로는 빠른 프롬프트 기반 접근 방식을 원할 것이고, 다른 때는 도구가 제공하는 신뢰성이 필요할 것입니다.
도구 기반 구조화된 출력의 작동 방식
핵심 개념은 간단합니다: Claude에게 응답을 JSON으로 포맷하도록 요청하는 대신, 추출하려는 데이터의 정확한 구조와 일치하는 입력 매개변수를 가진 도구를 만듭니다. 그러면 Claude는 추출된 데이터를 인수로 사용하여 이 도구를 "호출"합니다.

과정은 다음과 같습니다:
- 원하는 데이터의 구조를 설명하는 JSON 스키마를 작성합니다
- 해당 스키마를 입력 사양으로 하는 도구를 만듭니다
- 데이터와 도구 스키마를 Claude에 전송합니다
toolChoice매개변수로 Claude가 도구를 사용하도록 강제합니다- 도구 호출 인수에서 구조화된 데이터를 추출합니다

흐름은 다음과 같습니다: 서버가 Claude에게 데이터를 분석하고 특정 도구를 호출하도록 요청하는 프롬프트를 보냅니다. Claude는 추출된 JSON 데이터가 포함된 도구 사용 메시지로 응답합니다. 이 시점에서 데이터를 가져와 대화를 종료하면 됩니다 - 추가 후속 작업이 필요하지 않습니다.
도구 사용 제어하기
구조화된 출력을 위해 도구를 사용할 때, Claude가 추출 도구를 사용하도록 보장하고 싶을 것입니다. toolChoice 매개변수는 세 가지 옵션을 제공합니다:

{"toolChoice": {"auto": {}}}- 모델이 도구를 사용해야 하는지 결정합니다 (기본값){"toolChoice": {"any": {}}}- 모델은 도구를 사용해야 하지만, 어떤 도구를 사용할지 선택할 수 있습니다{"toolChoice": {"tool": {"name": "tool-name"}}}- 모델은 지정된 도구를 사용해야 합니다
구조화된 출력을 위해서는 Claude가 추출 도구를 사용하도록 보장하기 위해 거의 항상 세 번째 옵션을 원할 것입니다.
실용적인 예시
기사에서 제목, 저자, 주요 주제를 추출하고 싶다고 가정해 보겠습니다. 먼저 도구 스키마를 만듭니다:
그런 다음 데이터와 함께 Claude를 호출하고 도구를 사용하도록 강제합니다. 저희의 chat 헬퍼는 도구 이름을 tool_choice 인수로 직접 받으므로, 중첩된 toolChoice 객체를 직접 만들 필요가 없습니다:
Claude는 지정한 정확한 형식으로 추출된 데이터가 포함된 도구 사용 메시지로 응답합니다. 도구 호출 인수에는 애플리케이션에서 바로 사용할 수 있는 구조화된 JSON 데이터가 포함됩니다.
주요 이점
- 프롬프트 기반 추출보다 더 신뢰할 수 있습니다
- 스키마와 일치하는 구조가 보장됩니다
- 메시지 사전 채우기나 중지 시퀀스가 필요하지 않습니다
- 도구 스키마를 통한 내장 검증
주요 트레이드오프는 복잡성입니다 - 상세한 스키마를 작성하고 도구 응답을 처리해야 합니다. 하지만 일관되고 신뢰할 수 있는 구조화된 출력이 필요할 때는 도구가 최선의 방법입니다.