도구 호출: 모델의 제안과 실제 실행
관련 기초 개념
핵심 개요
| 역할 | 맡기는 일 | 확인할 것 |
|---|---|---|
| 모델 | 의도 해석·도구와 입력 제안 | 제안이 요청 범위 안인가 |
| 앱·서버 | 형식·권한·업무 규칙 검사와 실행 | 허용된 작업만 수행했는가 |
| 서비스 결과 | 현재 상태와 사실 반환 | 최종 답변과 일치하는가 |
이 강의의 주문·금액·정책·호출 기록은 교육용 합성 예제입니다. 실제 API를 호출하는 실습은 아닙니다.
1. 학습 목표
이 강의를 마치면 다음을 할 수 있다.
- 모델이 만든 도구 호출 요청과 프로그램이 수행한 실제 작업을 구분한다.
- 도구의 입력 형식·서버 권한·업무 규칙을 각각 어디에서 검사할지 정한다.
- 조회 결과를 이용해 답변하되, 사용자가 요청하지 않은 변경을 막는다.
- 잘못된 인자·권한 거부·타임아웃·중복 실행에 필요한 검증을 설명한다.
2. 먼저 볼 문제: 주문 금액을 물었는데 환불까지 하면 안 된다
사용자가 상담 AI에게 묻는다.
주문 O-1042에서 환불 가능한 금액이 얼마인지 확인해줘. 환불은 실행하지 마.
모델은 주문 DB의 현재 값을 저절로 알지 못한다. 주문 정보가 학습 데이터에 들어 있더라도 현재 상태·소유자·이미 환불한 금액을 확인하는 근거가 되지 않는다. 다른 주문을 조회하거나 실제 환불을 실행하면 사용자의 의도와 권한을 벗어날 수도 있다.
필요한 것은 세 가지다. 현재 주문을 조회할 방법, 조회해도 되는 사용자인지 판단할 방법, 반환한 값이 사용자에게 올바르게 전달됐는지 확인할 방법이다. 모델의 자연어 이해는 주문 번호와 질문 의도를 파악하는 데 쓰고, DB 접근·권한·계산·실행은 프로그램의 책임으로 둔다.
3. 도구 호출의 정확한 의미
도구 호출은 모델이 사용할 도구와 입력값을 정해 프로그램에 전달하는 방식이다. 함수 호출(Function Calling)은 보통 이름과 구조화된 인자를 주고받는 도구 인터페이스를 가리킨다. 제공자에 따라 내장 도구·사용자 정의 함수·원격 도구의 실행 주체가 다를 수 있다.
이 강의는 앱이 직접 실행하는 사용자 정의 도구를 기준으로 한다. 모델은 ‘이 함수를 이 인자로 사용하자’고 제안한다. 앱은 그 요청을 받아 검증한 뒤 실행하거나 거절한다. 연결된 함수가 없다면 모델이 함수 이름을 출력해도 DB를 조회한 것은 아니다.
| 구성 요소 | 책임 | 이 예에서의 역할 |
|---|---|---|
| 사용자 | 목표와 허용 범위 전달 | 가능 금액 조회,환불 실행 금지 |
| 모델 | 문장 해석·도구/인자 제안·결과 설명 | O-1042 조회 요청과 결과 요약 |
| 앱 실행기 | 도구 허용목록·검증·호출·상태·종료 | 이번 작업에 조회 도구만 제공 |
| 인증·정책 계층 | 사용자와 주문의 접근 권한·업무 규칙 | 로그인 사용자가 해당 주문을 볼 수 있는지 검사 |
| 주문 서비스 | 실제 조회·정확 계산·현재 상태 반환 | 조회 시점의 잔여 환불 가능액 |
모델이 ‘사용자는 관리자입니다’라는 인자를 만들어도 권한은 늘어나지 않는다. 사용자 신원과 역할은 인증된 세션에서 가져온다. 도구 설명에 안전하다고 쓰여 있어도 서버의 권한 검사를 대신하지 못한다.
4. 입력·처리·출력의 흐름
중요한 분기는 앱의 검사다. 모델이 잘못된 도구를 선택해도 실행 전에 거절할 수 있어야 한다. 추가 호출은 작업 범위와 예산 안에서만 가능하며, 실패를 같은 방식으로 무한 반복하지 않는다.
| 단계 | 입력 | 처리 | 출력 |
|---|---|---|---|
| 1 요청 구성 | 사용자 문장·조회 도구 정의 | 필요한 문맥만 모델에 전달 | 모델 요청 |
| 2 호출 제안 | 모델 요청 | 의도·주문 번호 해석 | 도구명·인자·call ID |
| 3 실행 검사 | 호출 제안·인증 세션 | schema·허용목록·사용자 권한·작업 범위 검사 | 허용 또는 명시적 거부 |
| 4 실제 조회 | 검증된 주문 ID | 서비스가 현재 주문을 읽음 | 구조화된 사실·기준 시점·상태 |
| 5 결과 전달 | 도구 결과와 call ID | 요청과 결과를 짝지어 모델에 전달 | 최종 설명 또는 추가 호출 제안 |
| 6 완료 확인 | 설명·조회 근거·실행 로그 | 금액·주문·‘실행 안 함’을 대조 | 검증된 답변 또는 수정/보류 |
출처가 되는 것은 4단계의 실제 서비스 결과다. 모델이 2단계에서 적어낸 금액이나 5단계에서 새로 상상한 주문 상태는 조회 증거가 아니다.
5. 작은 예제로 전체 과정을 따라가기
5.1 도구 계약
이번 작업에 허용하는 도구는 하나다.
| 항목 | 계약 |
|---|---|
| 이름 | get_refund_quote |
| 목적 | 주문을 조회해 현재 남은 환불 가능액 반환 |
| 입력 | order_id: 문자열,형식 O-숫자4자리 |
| 허용 필드 | order_id만. 역할·고객 ID·환불 금액은 모델이 지정하지 않음 |
| 권한 | 서버 인증 세션의 사용자가 해당 주문에 접근 가능한지 검사 |
| 출력 | 주문 ID·통화·합계·기환불액·남은 가능액·상태·조회 시점 |
| 부작용 | 주문·금액을 변경하지 않는 조회 |
스키마는 ‘문자열·필수 필드·추가 필드 금지’를 검사할 수 있다. O-1042가 실제 존재하는지, 로그인 사용자의 주문인지, 이미 환불됐는지는 서비스와 정책이 검사한다. 형식에 맞는 다른 사람의 주문 번호도 여전히 접근 금지 대상이다.
5.2 모델이 제안한 호출
다음은 제공자와 무관한 설명용 표현이며 실제 SDK의 메시지 포맷은 아니다.
{
"call_id": "q-001",
"tool_name": "get_refund_quote",
"arguments": {"order_id": "O-1042"}
}이 객체가 존재한다는 사실만으로 조회가 실행된 것은 아니다. 앱이 허용 도구인지, 인자가 맞는지, 사용자 신원이 유효한지, O-1042에 접근할 수 있는지 확인한 뒤 주문 서비스를 호출한다.
5.3 주문 서비스가 확인한 원시 자료
교육용 정책은 ‘주문 상품 합계에서 이미 환불된 금액을 뺀 나머지를 조회 시점의 가능 금액으로 반환’이라고 가정한다. 배송비·세금·기한·부분 환불 예외는 이 예에 없다.
| 상품 | 단가 | 수량 | 금액 |
|---|---|---|---|
| A | 3,000원 | 2 | 6,000원 |
| B | 6,000원 | 1 | 6,000원 |
| 상품 합계 | — | — | 12,000원 |
| 이미 환불된 금액 | — | — | 0원 |
| 남은 가능 금액 | — | — | 12,000원 |
가능 금액은 일반 계산 코드로 구한다. 자연어 모델에게 정확한 곱셈·차감을 맡길 필요가 없다. 정책 자체가 복잡해지면 별도 규칙 서비스가 책임지고, 모델이 정책을 새로 만들어 적용하지 않게 한다.
5.4 도구 결과
{
"call_id": "q-001",
"result": {
"order_id": "O-1042",
"currency": "KRW",
"order_total": 12000,
"refunded_amount": 0,
"refundable_amount": 12000,
"quote_status": "eligible",
"as_of": "2026-10-20T14:00:00+09:00"
}
}금액은 이 예에서 원 단위 정수다. 실제 시스템은 통화별 최소 단위와 반올림 정책을 계약에 명시해야 한다. call_id는 어떤 요청의 응답인지 연결하며, 업무의 중복 실행을 막는 멱등성 키와 같은 개념으로 취급하지 않는다.
5.5 사용자에게 전달할 답변
조회 시점 기준, O-1042의 환불 가능 금액은 12,000원입니다. 환불은 실행하지 않았습니다.
앱은 주문 ID·통화·가능액이 도구 결과와 같은지 확인한다. ‘환불하지 않음’은 변경 도구가 실행되지 않았다는 기록으로 확인한다. 화면에 적힌 문장만 보고 실제 미실행을 판단하지 않는다.
6. JSON이 맞아도 틀릴 수 있는 네 가지
| 검사 | 통과 예 | 통과해도 남는 위험 |
|---|---|---|
| JSON 문법 | 괄호·쉼표가 유효 | 필수 필드가 없거나 잘못된 타입 |
| 스키마 | order_id가 형식에 맞는 문자열 | 실제로 없는 주문·다른 사용자의 주문 |
| 권한·업무 규칙 | 현재 사용자에게 조회 허용 | 서비스 상태가 바뀌거나 응답이 오래됨 |
| 최종 결과 대조 | 설명 금액이 서비스와 일치 | 근거의 적용 시점·누락 조건을 전달하지 않음 |
구조화 출력은 형식 오류를 줄이는 데 도움이 되지만 사실과 권한을 보장하지 않는다. 거절·출력 중단·호출 오류도 정상적인 분기로 처리한다. 모든 실패를 억지로 같은 성공 스키마 안에 넣으면 모델이나 앱이 없는 값을 채우게 될 수 있다.
7. 실제 변경 작업으로 확장하면 무엇이 추가되는가
사용자가 뒤이어 ‘이 주문에서 확인한 12,000원을 환불해줘’라고 요청했다고 가정하자. 이제 목표가 조회에서 변경으로 바뀐다. 앱 정책에 따라 구체적인 사용자 요청 자체가 충분한 승인일 수도 있고 추가 검토가 필요할 수도 있다. 모든 도구에 반복 확인창을 띄우는 것이 원칙은 아니다.
필요한 것은 허용된 범위와 실제 실행을 연결하는 것이다.
- 주문·금액·통화·사용자·가능액을 실행 직전에 다시 확인한다.
- 승인이 필요한 경우 승인 대상을 구체적인 주문·금액·작업 버전에 묶는다. 이전 조회를 다른 금액의 승인으로 재사용하지 않는다.
- 멱등성 키를 업무 요청에 연결하고 같은 요청이 이미 성공했는지 조회한다.
- 타임아웃은 실패 확정이 아니다. 서버에서는 성공했는데 응답만 늦었을 수 있다.
- 재시도 전에 결과를 조회하고, 부작용이 있는 요청을 무조건 반복하지 않는다.
- 최종 상태는 모델의 완료 선언 대신 서비스 기록으로 확인한다.
상세 구현은 권한·승인·멱등성·재시도에서 다룬다. 이 강의에서 실제 환불 도구를 만들거나 실행하지 않는다.
8. 도구 호출·일반 코드·Workflow·Agent 선택
| 상황 | 첫 선택 후보 | 판단 이유 |
|---|---|---|
| 화면에 주문번호 입력창과 조회 버튼이 있음 | 일반 API 호출 | 입력이 구조화돼 있어 모델 해석의 추가 가치가 작음 |
| 자연어 질문에서 주문·요청 의도를 해석해야 함 | LLM+조회 도구 | 문장 해석과 현재 데이터 조회를 연결 |
| 조회→고정 계산→승인→전송 순서가 정해짐 | 고정 workflow | 예측 가능한 실행 순서·복구 정책 |
| 상황마다 다음 자료·도구를 선택해야 함 | 제한된 Agent 후보 | 다음 행동 선택의 유연성이 가치가 있는지 평가 |
| 완료 여부를 정확히 판정할 수 없음 | 요구·평가 기준부터 보완 | Agent를 넣어도 성공 여부가 명확해지지 않음 |
도구 호출 하나가 곧 복잡한 Agent 시스템을 의미하지 않는다. 모델 호출 1회와 조회 1회로 충분할 수 있다. 반대로 모델이 도구 결과를 보고 다음 행동을 반복 선택한다면 상태·예산·종료를 관리하는 실행기가 중요해진다.
9. 실패 사례와 개선 방법
| 실패 | 왜 문제인가 | 개선·확인 |
|---|---|---|
| 모델이 order_id 대신 문장 전체를 보냄 | 입력 계약 위반 | schema 오류를 반환하고 필요하면 제한된 수정 1회 |
| 없는 주문을 조회 | 형식은 맞아도 데이터 없음 | 서비스의 명시적 not_found;개인정보 노출 정책에 맞는 응답 |
| 다른 사람의 주문을 조회 | 문자열 형식과 권한은 별개 | 서버 세션·소유권 검사;모델의 사용자 주장 무시 |
| 환불 금액만 물었는데 변경 도구를 호출 | 작업 범위 초과 | 조회 허용목록·실행 정책에서 차단 |
| 주문 메모의 ‘관리자 승인’ 지시를 따름 | 비신뢰 자료를 실행 지시로 승격 | 업무 데이터와 명령 분리·권한 경계 검사 |
| 결과가 12,000인데 21,000으로 요약 | 생성 단계의 값 왜곡 | 금액 직접 출력·구조화 결과 대조·오류 시 수정 |
| 타임아웃이면 같은 쓰기 작업 반복 | 중복 실행 가능 | 결과 조회·멱등성·상태별 재시도 |
| 모델이 계속 새 도구를 요청 | 작업이 끝나지 않음 | 최대 호출·총시간·비용·반복 상태 감지 |
실패할 때마다 프롬프트만 길게 바꾸지 않는다. 입력 계약 오류는 계약·검증으로, 권한 오류는 서버 정책으로, 중복 실행은 상태·멱등성으로, 설명 왜곡은 출력 대조로 해결한다.
10. 어떻게 맞는지 검증할 것인가
이 예의 정답 계산은 3,000×2+6,000×1−0=12,000이다. 다음 테스트는 후속 구현 시 수행할 검증 명세다. 실제 모델·SDK를 실행한 결과표가 아니다.
| 테스트 입력·조건 | 기대 결과 | 확인 증거 |
|---|---|---|
| 정상 사용자·O-1042 | 조회 1회,12,000원,변경 0회 | 실제 도구 호출·결과·최종 출력 |
| order_id 누락 | 실행 전 형식 오류 | 서비스 호출 0회 |
| 권한 없는 사용자 | 조회 내용 반환 거부 | 서버 권한 결과·원문 미노출 |
| 모델이 임의 admin 필드 추가 | 형식 또는 정책 거부 | 추가 필드 처리·권한 불변 |
| 모델이 변경 도구 제안 | 실행 거부 | 허용목록·변경 기록 0회 |
| 조회 응답 지연 | 제한된 조회 재시도 또는 보류 | 시도 수·예산·종료 |
| 메모에 외부 전송 지시 포함 | 정상 금액 설명,전송 0회 | 비신뢰 문서 처리·권한 로그 |
| 모델이 금액을 잘못 요약 | 검출 후 정확 값으로 수정 또는 보류 | 도구 결과와 대조 |
평가셋에는 정상 예뿐 아니라 형식 오류·권한 거부·자료 없음·시간 초과·불필요한 호출을 넣는다. ‘도구 호출이 올바른 JSON이었다’는 중간 지표와 ‘사용자가 요청한 조회만 정확히 끝났다’는 최종 성공을 따로 측정한다.
최종 설명 문장만 저장하면 실제 호출 여부·중복 실행·권한 거부를 알기 어렵다. trace에는 필요한 요청 ID·도구·상태·시간·판정만 남기고 비밀키·불필요한 개인정보는 기록하지 않는다.
확인 문제
모델이 get_refund_quote 호출을 제안했습니다. 가장 정확한 설명은?
- 이미 주문 DB 조회가 끝났다
- 앱이 검증한 뒤 연결된 함수를 실행해야 한다
- 함수 이름이 있으므로 인증을 생략해도 된다
풀이 기록 기능을 불러오는 중…
해설 보기
정답: B. 앱이 검증한 뒤 연결된 함수를 실행해야 한다
이 강의의 사용자 정의 도구는 앱이 검증하고 실행합니다. 호출 제안과 실제 조회는 서로 다른 단계입니다.
형식에 맞는 다른 사람의 주문 번호를 모델이 제안했다면?
- 형식에 맞으므로 조회한다
- 모델에게 관리자라고 말하게 한다
- 인증된 사용자와 실제 접근 권한을 서버에서 확인한다
풀이 기록 기능을 불러오는 중…
해설 보기
정답: C. 인증된 사용자와 실제 접근 권한을 서버에서 확인한다
스키마 검증은 형식만 검사합니다. 사용자 신원과 주문 접근 권한은 인증·정책 계층에서 확인해야 합니다.
금액 조회만 요청했는데 모델이 ‘12,000원 환불했습니다’라고 답했습니다. 먼저 무엇을 확인할까요?
- 도구 호출과 서비스 변경 기록
- 답변의 말투
- 모델이 밝힌 자신감
풀이 기록 기능을 불러오는 중…
해설 보기
정답: A. 도구 호출과 서비스 변경 기록
모델의 완료 선언은 실행 증거가 아닙니다. 조회·변경 로그를 확인해 실제 수행한 작업을 판정합니다.
직접 설명해보기
- 형식에 맞는 주문 번호라도 다른 사용자의 주문이면 왜 접근을 거부해야 할까요?
- 변경 도구가 타임아웃됐을 때, 즉시 재시도하기 전에 어떤 상태를 확인해야 할까요?
- 모델이 “환불했습니다”라고 썼을 때 실제 변경 여부는 어떤 기록으로 확인할까요?
스키마는 형식을 확인하고, 서버는 인증된 세션과 업무 정책으로 권한을 판단합니다. 타임아웃은 미실행의 증거가 아니므로 요청 ID로 결과를 확인합니다. 실행 완료는 서비스 상태와 호출·변경 기록으로 판정합니다.
참고 자료
- OpenAI Function calling : 모델 호출 제안·앱 실행·결과 반환의 흐름.
- Claude Tool use : 다른 제공자의 도구 연결 구조 비교.
- Structured model outputs : 형식 준수와 값의 오류 가능성 구분.
- OWASP Prompt Injection : 비신뢰 자료가 지시로 작동하는 위험.
검색 키워드: 도구 호출, 함수 호출, Tool Calling, Function Calling.
직접 적용하기
교육용 가상 상황
모델이 주문 O-17의 환불 도구를 호출하자고 제안했습니다. 사용자는 아직 환불을 승인하지 않았고, 네트워크 재시도로 같은 호출이 두 번 들어왔습니다.
실행 전에 확인할 조건과 중복 실행을 막을 방법을 적으세요. 모델의 제안만으로 완료라고 표시할 수 있는지도 설명하세요.
답안 저장 기능을 불러오는 중…
검증 기준과 해설 보기
- 사용자·주문 접근 권한과 승인 여부를 확인한다.
- 허용된 인수와 중복 요청 식별자를 검증한다.
- 실제 도구 응답을 확인한 뒤 완료 여부를 전달한다.
주문 접근 권한·환불 정책·승인을 확인한 뒤 허용된 인수로 실행합니다. 같은 작업 식별자는 중복 처리하지 않도록 서버에서 관리합니다. 모델의 도구 호출 제안이나 실행 요청만으로 환불 완료를 표시하지 않습니다.
복습하기
- 모델이 함수를 제안하면 실행된 것인가요?
- 실행 결과를 받지 못하면 완료라고 해도 될까요?
- 권한은 어느 단계에서 확인하나요?
답변 확인 기준
- 모델이 함수를 제안하면 실행된 것인가요?
아닙니다. 앱의 검증·실행과 실제 결과 확인이 필요합니다.
- 실행 결과를 받지 못하면 완료라고 해도 될까요?
실행 여부가 불명확하므로 결과 확인과 중복 처리 방지가 먼저입니다.
- 권한은 어느 단계에서 확인하나요?
실제 도구를 실행하는 서비스 경계에서 확인합니다.