이 도구 사용 형식은 구식입니다

가능한 한 빨리 개선된 도구 사용 구조로 전환할 것을 강력히 권장합니다. 이는 더 안정적이며 특히 더 복잡한 도구 사용 작업에 대해 더 높은 품질의 성능을 가능하게 합니다.

이 도구 사용 형식은 Claude 3에 최적화되어 있지 않으며 업데이트된 도구 사용 형식보다 성능이 떨어질 수 있습니다.


레거시 도구 사용 방식

레거시 도구 사용에서는 프롬프트 자체 내에 함수가 정의됩니다. Claude에게 사용할 수 있는 도구와 함수에 대한 설명을 제공하면 Claude는 질문에 답하고 작업을 완료하는 데 도움이 되는 도구를 언제 어떻게 사용할지 지능적으로 결정할 수 있습니다.

예를 들어, 주어진 위치에 대한 현재 날씨를 검색하는 get_weather(location) 함수를 Claude에게 (프롬프트에) 제공한다고 가정해 보겠습니다. 사용자가 “지금 런던의 날씨는 어떤가요?”라고 묻는다면 Claude는 제공한 get_weather 함수를 사용하여 답을 찾을 수 있음을 인식할 것입니다.

이는 내부적으로 다음과 같은 다단계 프로세스입니다:

  1. 함수 정의와 사용자 질문이 모두 단일 프롬프트로 Claude에게 전달됩니다.
    • Claude가 도구를 사용할지 여부를 성공적으로 결정하려면 도구와 그 설명뿐만 아니라 사용 사례와 도구의 복잡성에 따라 그러한 도구를 사용해야 하는 상황의 예시도 함께 제공해야 할 것입니다.
  2. Claude는 사용자의 질문을 평가하고 어떤 함수를 호출할지, 어떤 인수를 사용할지 결정합니다.
  3. Claude는 적절한 형식의 함수 호출을 구성합니다.
  4. 함수 호출은 명확한 stop_sequence를 사용하여 클라이언트 코드에 의해 가로채어지고 실제 함수는 클라이언트 측에서 실행됩니다.
  5. 함수 결과가 Claude에게 다시 전달됩니다.
  6. Claude는 함수 결과를 사용하여 사용자에 대한 최종 응답을 작성합니다.

이 기술을 통해 Claude는 대화형 인터페이스를 유지하면서도 외부 지식과 기능을 활용할 수 있습니다.


함수 정의하기

함수는 XML 태그로 래핑된 함수 설명을 Claude에게 제공하여 정의됩니다. 설명에는 다음이 포함되어야 합니다:

  • 함수 이름
  • 함수가 수행하는 작업에 대한 일반 텍스트 설명
  • 예상 매개변수, 해당 유형 및 설명
  • 반환 값 및 유형
  • 발생할 수 있는 예외

다음은 함수 정의의 예시입니다:

XML
<tool_description>
<tool_name>get_weather</tool_name>
<description>
지정된 위치에 대한 현재 날씨를 검색합니다.
두 개의 필드가 있는 딕셔너리를 반환합니다:
- temperature: float, 화씨로 표시된 현재 온도
- conditions: string, 현재 날씨 상태에 대한 간단한 설명
제공된 위치를 찾을 수 없는 경우 ValueError를 발생시킵니다.
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>도시와 주, 예: San Francisco, CA</description>
</parameter>
</parameters>
</tool_description>

좋은 함수 설명을 작성하기 위한 몇 가지 팁:

  • 명확하고 간결하게 작성하되 Claude가 함수를 언제 사용해야 하는지 이해할 수 있을 만큼 충분한 세부 정보를 제공하세요.
  • 매개변수와 반환 값의 유형을 지정하세요.
  • 발생할 수 있는 관련 예외를 언급하세요.
  • 코드 구문이 아닌 일반 텍스트 설명을 사용하세요.

레거시 도구 사용 형식

Claude가 함수를 호출하려면 매우 특정한 형식의 XML 블록을 출력해야 합니다. 형식은 다음과 같습니다:

XML
<function_calls>
<invoke>
<tool_name>function_name</tool_name>
<parameters>
<param1>value1</param1>
<param2>value2</param2>
</parameters>
</invoke>
</function_calls>

Claude가 둘 이상의 함수를 동시에 호출하는 경우 <function_calls> 블록에 여러 개의 <invoke> 블록이 포함될 수 있습니다. 각 <invoke>에는 호출되는 함수의 이름과 전달되는 매개변수가 포함됩니다.

Claude가 함수 호출을 완료하면 텍스트 생성을 중지하도록 하려면 </function_calls>를 API 호출의 stop_sequence로 전달해야 합니다.

<function_calls> 블록 이후에 적절한 중지 시퀀스가 있다고 가정하면 Claude는 생성을 중지하고 다음과 같은 <function_results> 블록에 함수 결과가 전달될 때까지 기다립니다:

XML
<function_results>
<result>
<tool_name>function_name</tool_name>
<stdout>
function result goes here
</stdout>
</result>
</function_results>

함수 결과는 <stdout> 태그 안에 배치되어야 합니다. 함수에서 예외가 발생한 경우 다음과 같이 반환되어야 합니다:

XML
<function_results>
<error>
error message goes here
</error>
</function_results>

전체 함수 결과는 이전 대화를 계속하는 메시지로 Claude에게 다시 전달되어야 합니다. 함수 결과를 받은 후 Claude는 결과를 응답에 통합하기 위해 계속 생성합니다.


레거시 도구 사용 프롬프트 예시

다음은 Claude에게 두 개의 함수를 제공하고 이를 사용해야 하는 질문을 하는 프롬프트의 전체 예시입니다:

Content
System이 환경에서는 사용자의 질문에 답하기 위해 사용할 수 있는 도구 세트에 액세스할 수 있습니다.

다음과 같이 호출할 수 있습니다:
<function_calls>
<invoke>
<tool_name>$TOOL_NAME</tool_name>
<parameters>
<$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>

</parameters>
</invoke>
</function_calls>

사용 가능한 도구는 다음과 같습니다:
<tools>
<tool_description>
<tool_name>get_current_stock_price
</tool_name><description>회사의 현재 주가를 가져옵니다. float 반환: 현재 주가.
ValueError 발생: 입력 기호가 잘못되었거나 알 수 없는 경우.</description>
<parameters>
<parameter>
<name>symbol</name>
<type>string</type>
<description>가격을 가져올 회사의 주식 기호입니다.</description>
</parameter>
</parameters>
</tool_description>

<tool_description>
<tool_name>get_ticker_symbol</tool_name>
<description>이름으로 검색된 회사의 주식 티커 기호를 가져옵니다. str 반환: 회사 주식의 티커 기호. TickerNotFound 발생: 일치하는 티커 기호를 찾을 수 없는 경우.
</description>
<parameters>
<parameter>
<name>company_name</name>
<type>string</type>
<description>회사의 이름입니다.</description>
</parameter>
</parameters>
</tool_description></tools>
UserGeneral Motors의 현재 주가는 얼마인가요?

Claude는 다음과 같이 응답할 것입니다:

Content
Assistant<scratchpad>
이 질문에 답하려면 다음이 필요합니다:

1. get_ticker_symbol() 함수를 사용하여 General Motors의 티커 기호를 가져옵니다.
2. 반환된 티커 기호를 사용하여 get_current_stock_price() 함수로 현재 주가를 가져옵니다.</scratchpad>

<function_calls>
<invoke>
<tool_name>get_ticker_symbol</tool_name>
<parameters>
<company_name>General Motors</company_name>
</parameters>
</invoke>
</function_calls>

Claude는 먼저 get_ticker_symbol을 호출하여 General Motors의 티커 기호를 검색합니다. </function calls> 중지 시퀀스를 통해 Claude가 함수를 호출하려고 한다는 것을 인식할 수 있습니다. 관련 XML 태그 사이의 관련 데이터를 추출하고 Claude를 대신하여 함수를 실행합니다. 그런 다음 <function_results> 태그에 결과를 Claude에게 다시 전달합니다.

Content
User<function_results>
<result>
<tool_name>get_ticker_symbol</tool_name>
<stdout>
GM
</stdout>
</result>
</function_results>

이제 티커 기호를 알게 되었으므로 Claude는 get_current_stock_price를 호출하고 현재 가격을 가져와야 한다고 결정할 것입니다.

Content
Assistant<function_calls>
<invoke>
<tool_name>get_current_stock_price</tool_name>
<parameters>
<symbol>GM</symbol>
</parameters>
</invoke>
</function_calls>

이 결과도 다시 전달합니다.

Content
User<function_results>
<result>
<tool_name>get_current_stock_price</tool_name>
<stdout>
38.50
</stdout>
</result>
</function_results>

이 전체 대화 체인이 Claude에게 필요한 모든 세부 정보를 제공하면 Claude는 최종 출력으로 사용자에게 답변을 제공할 수 있습니다.

Content
<answer>
General Motors의 현재 주가는 $38.50입니다.
</answer>

레거시 도구 사용 FAQ

주어진 상호 작용에서 Claude에게 얼마나 많은 도구를 전달할 수 있나요?

Claude가 사용할 도구와 함수를 원하는 만큼 정의할 수 있지만, 현재는 이 레거시 도구 사용 구조에 대해 사용 사례와 관련 함수의 복잡성에 따라 3-5개를 초과하지 않는 것이 좋습니다.

Claude에는 알고 있는 내장 도구가 있나요?

아니요. Claude가 사용하기를 원하는 도구는 도구 사용 프롬프트 내에서 직접 정의해야 합니다. Claude에는 가장 잘 작동하는 미리 정의된 함수 및 정의 목록이 없습니다.

새로운 도구 사용 형식은 언제 Vertex AI 또는 Amazon Bedrock에 제공되나요?

가까운 시일 내에 제공될 예정입니다!