{"id":"msg_01Aq9w938a90dw8q","model":"claude-3-opus-20240229","stop_reason":"tool_use","role":"assistant","content":[{"type":"text","text":"<thinking>get_weather 함수를 호출해야 하고, 사용자는 SF를 원하는데, 이는 아마도 San Francisco, CA일 것입니다.</thinking>"},{"type":"tool_use","id":"toolu_01A09q90qw90lq917835lq9","name":"get_weather","input":{"location":"San Francisco, CA","unit":"celsius"}}]}
그런 다음 제공된 입력으로 get_weather 함수를 실행하고 새로운 user 메시지에서 결과를 반환해야 합니다:
{"id":"msg_01Aq9w938a90dw8q","model":"claude-3-opus-20240229","stop_reason":"stop_sequence","role":"assistant","content":[{"type":"text","text":"현재 샌프란시스코의 날씨는 섭씨 15도(화씨 59도)입니다. 만의 도시에서는 서늘한 날씨입니다!"}]}
사용자의 프롬프트에 도구의 모든 필수 매개변수를 채우기에 충분한 정보가 포함되어 있지 않은 경우, Claude 3 Opus는 매개변수가 누락되었음을 인식하고 요청할 가능성이 훨씬 높습니다. Claude 3 Sonnet은 도구 요청을 출력하기 전에 생각하라는 메시지가 표시될 때 특히 요청할 수 있습니다. 그러나 합리적인 값을 추론하기 위해 최선을 다할 수도 있습니다.
예를 들어, 위의 get_weather 도구를 사용하여 위치를 지정하지 않고 Claude에게 “날씨가 어떤가요?”라고 묻는 경우, 특히 Claude 3 Sonnet은 도구 입력을 추측할 수 있습니다:
JSON
{"type":"tool_use","id":"toolu_01A09q90qw90lq917835lq9","name":"get_weather","input":{"location":"New York, NY","unit":"fahrenheit"}}
이 동작은 보장되지 않으며, 특히 모호한 프롬프트와 Claude 3 Opus보다 지능이 낮은 모델의 경우에는 더욱 그렇습니다. Claude 3 Opus에 필요한 매개변수를 채울 만한 충분한 컨텍스트가 없는 경우, 도구 호출을 하는 대신 명확한 질문으로 응답할 가능성이 훨씬 더 높습니다.
이 경우 Claude는 사용자의 질문에 완전히 답하기 위해 get_weather와 get_time이라는 두 개의 별도 도구를 한 번에 하나씩 사용하려고 할 가능성이 높습니다. 그러나 특히 서로 의존하지 않는 경우에는 두 개의 tool_use 블록을 한 번에 출력하기도 합니다. 각 도구를 실행하고 단일 user 메시지 내에서 별도의 tool_result 블록에 결과를 반환해야 합니다.
일부 작업은 한 도구의 출력을 다른 도구의 입력으로 사용하여 여러 도구를 순차적으로 호출해야 할 수 있습니다. 이런 경우 Claude는 한 번에 하나의 도구를 호출합니다. 모든 도구를 한 번에 호출하라는 메시지가 표시되면 Claude는 업스트림에 있는 도구의 도구 결과에 의존하는 다운스트림에 있는 도구의 매개변수를 추측할 가능성이 높습니다.
다음은 get_location 도구를 사용하여 사용자의 위치를 가져온 다음 해당 위치를 get_weather 도구에 전달하는 예입니다:
curl https://api.anthropic.com/v1/messages \--header"x-api-key: $ANTHROPIC_API_KEY"\--header"anthropic-version: 2023-06-01"\--header"content-type: application/json"\--data\'{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [
{
"name": "get_location",
"description": "IP 주소를 기반으로 현재 사용자 위치를 가져옵니다. 이 도구에는 매개변수나 인수가 없습니다.",
"input_schema": {
"type": "object",
"properties": {}
}
},
{
"name": "get_weather",
"description": "주어진 위치의 현재 날씨 가져오기",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "도시와 주, 예: San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "온도 단위, 'celsius' 또는 'fahrenheit'"
}
},
"required": ["location"]
}
}
],
"messages": [{
"role": "user",
"content": "내가 있는 곳의 날씨는 어떤가요?"
}]
}'
이 경우 Claude는 먼저 get_location 도구를 호출하여 사용자의 위치를 가져옵니다. tool_result에서 위치를 반환한 후 Claude는 해당 위치로 get_weather를 호출하여 최종 답변을 얻습니다.
전체 대화는 다음과 같을 수 있습니다:
역할
내용
사용자
내가 있는 곳의 날씨는 어떤가요?
어시스턴트
<thinking>이 질문에 답하려면 먼저 get_location 도구를 사용하여 사용자의 위치를 확인해야 합니다. 그런 다음 해당 위치를 get_weather 도구에 전달하여 현재 날씨를 찾을 수 있습니다.</thinking>[get_location에 대한 도구 사용]
사용자
[일치하는 ID와 San Francisco, CA 결과가 있는 get_location에 대한 도구 결과]
기본적으로 Claude 3 Opus는 도구가 필요한지, 어떤 도구를 사용할지, 적절한 매개변수는 무엇인지 가장 잘 판단하기 위해 도구 사용 쿼리에 답하기 전에 생각하도록 프롬프트됩니다. Claude 3 Sonnet과 Claude 3 Haiku는 가능한 한 많은 도구를 사용하도록 프롬프트되며 불필요한 도구를 호출하거나 누락된 매개변수를 추론할 가능성이 더 높습니다. Sonnet 또는 Haiku가 도구 호출을 하기 전에 사용자 쿼리를 더 잘 평가하도록 프롬프트하려면 다음 프롬프트를 사용할 수 있습니다:
사고 연쇄 프롬프트
관련 도구(사용 가능한 경우)를 사용하여 사용자의 요청에 답하세요. 도구를 호출하기 전에 \<thinking>\</thinking> 태그 내에서 분석을 수행하세요. 먼저 제공된 도구 중 사용자의 요청에 답하는 데 관련된 도구가 무엇인지 생각해 보세요. 둘째, 관련 도구의 필수 매개변수를 하나씩 살펴보고 사용자가 직접 제공했거나 값을 추론할 수 있는 충분한 정보를 제공했는지 확인하세요. 매개변수를 추론할 수 있는지 결정할 때는 특정 값을 지원하는지 모든 컨텍스트를 신중하게 고려하세요. 모든 필수 매개변수가 있거나 합리적으로 추론할 수 있는 경우 생각 태그를 닫고 도구 호출을 진행하세요. 그러나 필수 매개변수 중 하나의 값이 누락된 경우 함수를 호출하지 마세요(누락된 매개변수에 대한 필러도 사용하지 마세요). 대신 사용자에게 누락된 매개변수를 제공하도록 요청하세요. 제공되지 않은 경우 선택적 매개변수에 대한 추가 정보를 요청하지 마세요.