도구를 사용한 구조화된 데이터

강의 308분
Sign in to save your progressYou can keep reading without an account, but completed lessons won't be saved.
Sign in

이 과정의 앞부분에서 메시지 사전 채우기(pre-fill)와 중지 시퀀스를 사용하여 Claude로부터 구조화된 출력을 얻는 방법을 다루었습니다. 이 접근 방식은 잘 작동하고 설정하기 쉽지만, 도구를 사용하면 더 신뢰할 수 있는 출력을 얻을 수 있습니다. 이 방법은 구현하기 더 복잡하지만, JSON과 같은 구조화된 데이터를 추출할 때 더 나은 일관성을 제공합니다.

두 가지 접근 방식을 모두 배워야 하는 이유

도구가 더 신뢰할 수 있다면 왜 처음부터 도구로 시작하지 않았는지 궁금할 수 있습니다. 답은 간단합니다: 도구는 훨씬 더 많은 설정과 복잡성을 필요로 합니다. 두 가지 기법을 모두 사용할 수 있으면 유연성이 생깁니다 - 때로는 빠른 프롬프트 기반 접근 방식을 원할 것이고, 다른 때는 도구가 제공하는 신뢰성이 필요할 것입니다.

도구 기반 구조화된 출력의 작동 방식

핵심 개념은 간단합니다: Claude에게 응답을 JSON으로 포맷하도록 요청하는 대신, 추출하려는 데이터의 정확한 구조와 일치하는 입력 매개변수를 가진 도구를 만듭니다. 그러면 Claude는 추출된 데이터를 인수로 사용하여 이 도구를 "호출"합니다.

과정은 다음과 같습니다:

  1. 원하는 데이터의 구조를 설명하는 JSON 스키마를 작성합니다
  2. 해당 스키마를 입력 사양으로 하는 도구를 만듭니다
  3. 데이터와 도구 스키마를 Claude에 전송합니다
  4. toolChoice 매개변수로 Claude가 도구를 사용하도록 강제합니다
  5. 도구 호출 인수에서 구조화된 데이터를 추출합니다

흐름은 다음과 같습니다: 서버가 Claude에게 데이터를 분석하고 특정 도구를 호출하도록 요청하는 프롬프트를 보냅니다. Claude는 추출된 JSON 데이터가 포함된 도구 사용 메시지로 응답합니다. 이 시점에서 데이터를 가져와 대화를 종료하면 됩니다 - 추가 후속 작업이 필요하지 않습니다.

도구 사용 제어하기

구조화된 출력을 위해 도구를 사용할 때, Claude가 추출 도구를 사용하도록 보장하고 싶을 것입니다. toolChoice 매개변수는 세 가지 옵션을 제공합니다:

  • {"toolChoice": {"auto": {}}} - 모델이 도구를 사용해야 하는지 결정합니다 (기본값)
  • {"toolChoice": {"any": {}}} - 모델은 도구를 사용해야 하지만, 어떤 도구를 사용할지 선택할 수 있습니다
  • {"toolChoice": {"tool": {"name": "tool-name"}}} - 모델은 지정된 도구를 사용해야 합니다

구조화된 출력을 위해서는 Claude가 추출 도구를 사용하도록 보장하기 위해 거의 항상 세 번째 옵션을 원할 것입니다.

실용적인 예시

기사에서 제목, 저자, 주요 주제를 추출하고 싶다고 가정해 보겠습니다. 먼저 도구 스키마를 만듭니다:

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 데이터가 포함됩니다.

주요 이점

  • 프롬프트 기반 추출보다 더 신뢰할 수 있습니다
  • 스키마와 일치하는 구조가 보장됩니다
  • 메시지 사전 채우기나 중지 시퀀스가 필요하지 않습니다
  • 도구 스키마를 통한 내장 검증

주요 트레이드오프는 복잡성입니다 - 상세한 스키마를 작성하고 도구 응답을 처리해야 합니다. 하지만 일관되고 신뢰할 수 있는 구조화된 출력이 필요할 때는 도구가 최선의 방법입니다.