AI가 답만 하지 않고 실제 일을 하게 하려면?

Spring AI Tool Calling에서 모델이 도구를 요청하고 애플리케이션이 실행하는 과정을 학교 축제 예약 예제로 설명합니다. @Tool과 인증·인가·멱등성·사람 승인도 살펴봅니다.

Spring AI로 챗봇을 넘어 일하는 AI 만들기 7/9

Java·Spring 개발자가 LLM, RAG, Tool Calling, MCP를 공부하며 이해한 것들

이전 글 — 문서를 넣었는데 RAG는 왜 틀릴까?

학교 축제를 앞두고 반장이 AI 도우미에게 말합니다. “우리 반 김밥 20줄 예약해 줘.” 챗봇이 “예약하면 좋겠습니다”라고 답하면 정말 예약 장부에도 기록됐을까요?

말만 그럴듯하게 만든 것이라면 아무 일도 일어나지 않았습니다. 실제 예약을 만들려면 모델의 요청을 애플리케이션이 받아 검증하고, 허용된 Java 메서드나 API(Application Programming Interface, 프로그램끼리 기능을 요청하는 통로)를 실행해야 합니다. 이 연결 방식이 Tool Calling(도구 호출)입니다.

여기서 가장 중요한 경계가 있습니다. 모델은 실행할 도구의 이름과 입력값을 제안할 뿐입니다. API, 데이터베이스와 Java 메서드를 실제로 실행하는 주체는 Spring 애플리케이션입니다.

모델의 도구 선택은 실행 명령이 아니라 검증이 필요한 요청서입니다. 모델이 결정했다는 이유만으로 예약이나 송금을 실행해서는 안 됩니다.

이 글의 학교, 학생, 메뉴와 예약 번호는 이해를 위한 가상 예시입니다. 게시 흐름은 2026년 4월 16일이며, 개념과 코드는 2026년 8월 15일 Spring AI 2.0.0 공식 문서를 기준으로 다시 확인했습니다. 실제 학교 시스템이나 금융 프로덕션에서 Tool Calling을 운영한 결과가 아닙니다.

답을 만드는 것과 일을 실행하는 것은 다르다

6편까지는 회사 문서를 찾아 답에 사용할 근거를 가져오는 RAG를 살펴봤습니다. 하지만 “재고가 있나요?”에 답하는 일과 “두 개 예약해 주세요”를 실행하는 일은 다릅니다.

대규모 언어 모델인 LLM(Large Language Model)은 다음 Token을 생성해 문장을 만듭니다. 예약 테이블을 수정하거나 결제 API를 부르는 능력이 모델 안에 자동으로 생기는 것은 아닙니다.

Tool Calling은 Function Calling(함수 호출)이라고도 불립니다. 모델에게 사용할 수 있는 기능의 이름, 설명과 입력 형식을 알려주고, 필요할 때 어떤 기능을 어떤 인자로 호출할지 요청하게 하는 패턴입니다.

모델이 reserveFestivalSnack을 선택했다고 해서 예약이 끝난 것은 아닙니다. 이는 “이 도구를 이 인자로 호출해 달라”는 구조화된 제안입니다. 애플리케이션이 이 제안을 검증하고 실행해야 실제 상태가 바뀝니다.

학교 축제 예시를 실제 시스템에 연결하면 다음과 같습니다.

학교 축제 이야기 실제 시스템
반장의 말 User Message
AI가 작성한 예약 요청서 Tool Call
예약 도구 설명서 Tool Definition
메뉴와 수량 입력란 JSON Schema
학생과 권한 확인 Authentication·Authorization
수량과 예산 확인 Validation·Business Rule
간식 예약 시스템 실제 API 또는 서비스
예약 번호 Tool Result
완료 안내 모델의 최종 응답

Tool Calling은 어떤 순서로 움직일까?

전체 흐름은 다음과 같습니다.

  1. 애플리케이션이 사용할 수 있는 도구의 이름, 설명과 입력 Schema를 모델에 전달합니다.
  2. 모델이 사용자 요청을 보고 도구 이름과 인자를 제안합니다.
  3. 애플리케이션이 인증, 권한, 입력값과 업무 규칙을 검사합니다.
  4. 허용된 경우에만 Java 메서드나 외부 API를 실행합니다.
  5. 실행 결과를 모델에 다시 전달합니다.
  6. 모델이 그 결과를 참고해 사용자에게 최종 답을 만듭니다.

JSON Schema(JSON 입력 데이터의 구조와 규칙)는 데이터의 모양과 조건을 설명합니다. 예를 들어 메뉴 이름은 문자열이고 수량은 숫자라는 사실을 모델에 알려줍니다. 그러나 Schema에 맞는 값이라고 해서 그 작업이 안전하거나 허용됐다는 뜻은 아닙니다.

모델은 도구를 사용하지 않고 문장만 답할 수도 있습니다. 한 요청에서 현재 시각을 조회한 뒤 예약 도구를 부르는 것처럼 여러 도구를 순서대로 요청할 수도 있습니다. 운영 환경에서는 반복 횟수와 총 실행 시간에 제한을 두어 끝없는 호출과 예상 밖의 비용을 막아야 합니다.

AI의 요청은 어디에서 실제 행동이 될까?

정상 예약과 수량 제한을 넘은 위험 요청이 모델, 애플리케이션 보호 경계, 업무 시스템을 지나는 과정을 비교합니다.

사용자 요청을 받은 모델이 도구 이름과 인자를 제안하고, 애플리케이션이 인증·권한·수량·중복을 확인한 뒤 업무 시스템이 실제 작업을 실행하는 흐름입니다. 정상 요청은 사람의 승인을 받아 계속되고 위험 요청은 검증 단계에서 멈춥니다.

사용자 요청

우리 반 김밥 20줄 예약해줘!

LLM의 도구 호출 제안

reserveFestivalSnack({ menu: "김밥", quantity: 20 })

모델은 도구 이름과 인자를 제안할 뿐 직접 실행하지 않습니다.

애플리케이션 보호 경계

  • 인증된 사용자인가?
  • 이 작업을 할 권한이 있는가?
  • 입력값이 업무 규칙에 맞는가?

사람의 확인

검증 통과: 상태 변경 전 사용자 확인 필요

업무 시스템

멱등성 키를 확인한 뒤 예약 API를 한 번만 실행합니다.

도구 결과와 최종 답변

예약번호 F-204

승인한 내용으로 김밥 20줄 예약이 완료됐습니다.

사람의 승인을 기다립니다. 상태 변경 전 사람의 실행 승인을 기다립니다.

학교 축제, 김밥 예약, 수량 제한과 예약 번호는 원리를 설명하기 위한 가상 예시입니다. 실제로 실행한 모델 응답이나 운영 결과가 아닙니다.

시각 자료의 정상 요청은 사람의 승인 앞에서 멈춥니다. 위험 요청은 모델이 quantity: 2000을 제안하더라도 애플리케이션의 수량 검증에서 차단되고, 예약 API까지 도착하지 않습니다.

Function Calling과 Tool Calling은 다른 기술일까?

두 용어는 완전히 별개의 기술이 아닙니다. Function Calling은 모델이 호출할 함수와 인자를 구조화해 요청하는 표현으로 널리 쓰였습니다. Tool Calling은 함수뿐 아니라 API, 검색과 데이터 조회 같은 더 넓은 기능을 도구로 바라보는 이름입니다.

Spring AI 2.0.0 공식 마이그레이션 문서는 이전 FunctionCallback API에서 ToolCallback 중심 API로 이동하도록 안내합니다. ChatClient.functions() 대신 ChatClient.tools()를 사용합니다. 이 글의 코드는 1.x 방식과 섞지 않고 2.0.0의 도구 API만 사용합니다.

Spring AI에서는 도구를 어떻게 정의할까?

Spring AI 2.0.0에서는 Java 메서드에 @Tool을 붙여 도구로 선언할 수 있습니다. @ToolParam은 입력값의 뜻과 조건을 모델이 이해하도록 설명합니다.

다음 예제는 간식 예약 도구의 구조를 단순화한 것입니다.

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.ai.chat.model.ToolContext;

final class FestivalTools {

    private final ReservationService reservationService;

    FestivalTools(ReservationService reservationService) {
        this.reservationService = reservationService;
    }

    @Tool(description = "학교 축제 간식을 예약한다. 메뉴와 수량이 필요하다.")
    ReservationResult reserveFestivalSnack(
        @ToolParam(description = "예약할 간식 이름") String menu,
        @ToolParam(description = "예약 수량. 1 이상 30 이하여야 한다.") int quantity,
        ToolContext toolContext
    ) {
        String userId = (String) toolContext.getContext()
            .get("authenticatedUserId");
        String idempotencyKey = (String) toolContext.getContext()
            .get("idempotencyKey");

        // 모델이 만든 menu와 quantity는 신뢰하지 않는다.
        // 서비스가 권한, 수량, 예산과 중복 요청을 다시 검사한다.
        return reservationService.reserve(
            userId, menu, quantity, idempotencyKey
        );
    }
}

@Tool의 설명은 모델이 언제 이 메서드를 선택할지 판단하는 단서입니다. @ToolParam은 입력값의 형식과 의미를 알려줍니다. Spring AI는 메서드 정보를 이용해 모델에 전달할 JSON Schema를 만듭니다.

도구 이름은 한 요청에서 고유해야 합니다. 도구의 Java 코드와 데이터베이스 비밀번호가 모델에 전달되는 것은 아닙니다. 모델은 도구 정의를 보고 호출을 요청합니다. 메서드 안에서는 모델의 판단을 신뢰하지 말고 평소의 서비스 코드처럼 입력과 권한을 다시 검사해야 합니다.

ChatClient에 도구를 연결한다

도구 객체는 ChatClient 요청의 tools()에 전달할 수 있습니다.

import java.util.Map;

String answer = ChatClient.create(chatModel)
    .prompt()
    .user("우리 반 김밥 20줄 예약해 줘.")
    .tools(new FestivalTools(reservationService))
    .toolContext(Map.of(
        "authenticatedUserId", authenticatedUserId,
        "idempotencyKey", serverGeneratedRequestId
    ))
    .call()
    .content();

이 코드는 Spring AI 2.0.0 공식 문서의 API 흐름을 바탕으로 만든 학습 예제입니다. 현재 블로그 환경에서 모델과 간식 시스템을 연결해 실행한 결과는 아닙니다.

ChatClient는 기본적으로 ToolCallingAdvisor를 등록합니다. 모델 응답에 도구 호출 요청이 있으면 Advisor가 ToolCallingManager에 실행을 맡기고, 결과를 ToolResponseMessage로 모델에 돌려보냅니다. 모델은 그 결과를 이용해 최종 문장을 만듭니다.

ToolCallback은 Spring AI에서 도구를 나타내는 핵심 추상화입니다. @Tool 메서드는 내부적으로 ToolCallback으로 변환될 수 있습니다. 더 세밀한 제어가 필요하면 MethodToolCallback이나 FunctionToolCallback을 직접 구성할 수도 있지만, 처음에는 선언형 @Tool만 이해해도 흐름을 잡을 수 있습니다.

조회와 상태 변경은 같은 수준으로 열면 안 된다

도구는 크게 두 종류로 생각할 수 있습니다.

구분 예시 실패했을 때의 영향 기본 보호 방향
조회 재고 확인, 배송 상태 조회 잘못된 정보 노출, 과도한 조회 권한 검사, 조회 범위 제한, timeout
상태 변경 예약 생성, 송금, 삭제, 승인 중복 처리, 금전·데이터 손실 사람 확인, 멱등성, 강한 권한 검사, 감사 기록
되돌리기 어려운 작업 계정 삭제, 대량 발송, 계약 승인 복구가 어렵거나 외부 피해 발생 별도 승인, 추가 인증, 복구 절차

조회라고 무조건 안전하지는 않습니다. 다른 사용자의 주문이나 개인정보를 읽을 수 있다면 심각한 사고가 됩니다. 다만 등록·수정·삭제는 시스템 상태를 바꾸므로 보통 더 강한 통제가 필요합니다.

은행을 예로 들면 “내 잔액을 알려 줘”와 “친구에게 50만 원을 보내 줘”는 위험도가 다릅니다. 모델이 송금 의도를 이해했다는 사실은 송금 권한을 증명하지 않습니다. 기존 인증, 인가, 한도, 추가 인증과 이상 거래 탐지 같은 통제를 그대로 거쳐야 합니다.

이는 금융 백엔드에서 확인해야 할 설계 원칙을 설명한 것이며, 실제 은행에서 이 구조를 운영했다는 주장이 아닙니다. AI가 기존 보안 절차를 우회하는 지름길이 되어서는 안 됩니다.

특히 송금, 계약 승인, 개인정보 삭제와 같은 고위험 작업은 모델의 도구 선택만으로 실행하지 않는 편이 안전합니다. 실행 전 내용을 사용자에게 다시 보여주고 명시적인 승인을 받는 Human-in-the-loop(사람을 처리 과정에 포함해 중요한 행동을 승인하게 하는 방식)를 둘 수 있습니다.

Schema가 있어도 신청이 승인된 것은 아니다

모델이 quantity: 20을 만들었다고 해서 바로 서비스 메서드에 넘기면 안 됩니다. Validation(검증)은 입력값이 허용된 형식과 범위인지 확인하는 과정입니다. 웹 요청의 입력값을 검증하듯 도구 인자도 검증해야 합니다.

  • 메뉴가 실제로 존재하는가?
  • 수량이 허용 범위 안에 있는가?
  • 예약 시간이 끝나지 않았는가?
  • 로그인한 사용자가 이 작업을 할 권한이 있는가?
  • 화면에서 승인한 내용과 실제 실행 인자가 같은가?

Prompt에 “올바른 값만 보내라”라고 적는 것은 보안 검사가 아닙니다. 업무 규칙은 결정 가능한 Java 코드와 서버 정책으로 확인해야 합니다.

Schema는 신청서의 칸을 정할 뿐, 신청을 승인하지는 않습니다.

인증(Authentication)은 사용자가 누구인지 확인하는 과정입니다. 인가(Authorization)는 그 사용자가 해당 작업을 할 수 있는지 확인하는 과정입니다. 둘 다 모델이 아니라 애플리케이션이 책임져야 합니다.

사용자 정보는 모델 인자와 분리한다

Spring AI의 ToolContext는 도구 실행에 추가 문맥을 전달합니다. 공식 문서에 따르면 이 데이터는 모델로 전송되지 않습니다.

인증된 사용자 ID나 테넌트 정보처럼 모델이 만들면 안 되는 값은 서버가 확인한 뒤 Tool Context에 넣을 수 있습니다. 클라이언트가 보낸 사용자 ID를 검증 없이 복사하거나 모델이 생성한 ID를 권한 판단에 사용하면 안 됩니다.

앞의 ChatClient 예제처럼 .toolContext(Map.of(...))로 전달할 수 있습니다. Tool Context가 보안을 자동으로 해결하는 것은 아닙니다. 도구 메서드와 서비스 계층에서 값의 출처, 권한과 소유권을 확인해야 합니다.

Timeout, Retry와 멱등성은 어디에서 처리할까?

외부 예약 API가 늦게 응답하면 Tool Calling 전체도 기다리게 됩니다. Timeout은 요청을 언제 포기할지 정하는 제한 시간입니다. 이 제한은 모델에게 부탁하는 문장이 아니라 HTTP 클라이언트와 서비스 코드에서 설정해야 합니다.

Retry(재시도)는 실패한 작업을 다시 시도하는 방식입니다. 조회는 조건에 따라 재시도할 수 있지만, 예약 생성이나 결제를 그대로 재시도하면 같은 작업이 두 번 실행될 수 있습니다.

Idempotency(멱등성)는 같은 요청을 여러 번 보내도 결과가 한 번 실행한 것과 같도록 만드는 성질입니다. 상태 변경 도구에는 서버가 만든 멱등성 키와 업무 시스템의 중복 방지 규칙이 필요할 수 있습니다. 모델이 임의로 만든 키에 이 책임을 맡기면 안 됩니다.

Timeout 뒤 결과를 모르는 상태도 다뤄야 합니다. 응답이 늦었다고 무조건 실패로 단정하고 다시 예약하면 중복이 생길 수 있습니다. 작업 상태 조회, 재처리 정책과 사용자가 이해할 수 있는 오류 메시지를 함께 설계해야 합니다.

사람의 승인이 필요한 흐름은 어떻게 만들까?

Spring AI의 자동 도구 실행은 단순하고 위험이 낮은 흐름에 편리합니다. 하지만 상태 변경 전에 승인 화면을 넣으려면 도구 호출 수명 주기를 애플리케이션이 직접 제어할 수 있어야 합니다.

Spring AI 2.0.0은 ToolCallingAdvisor 자동 등록을 요청별로 끄고, 모델이 요청한 도구 호출을 애플리케이션이 직접 검사하는 방식을 제공합니다.

ChatClientResponse firstResponse = chatClient.prompt()
    .user(userMessage)
    .tools(new FestivalTools(reservationService))
    .advisors(AdvisorParams.toolCallingAdvisorAutoRegister(false))
    .call()
    .chatClientResponse();

이후 애플리케이션은 도구 이름과 인자를 확인하고, 필요하면 사용자 승인을 기다린 뒤 ToolCallingManager로 실행 루프를 이어갈 수 있습니다. 위 코드는 첫 응답을 받는 지점만 보여줍니다. 승인 저장, 만료, 재개와 오류 복구는 서비스가 별도로 설계해야 합니다.

사람의 승인도 만능은 아닙니다. 사용자가 무엇을 승인하는지 이해할 수 있도록 대상, 수량, 금액과 변경 결과를 분명히 보여줘야 합니다. 승인한 내용과 실제 실행 인자가 달라지지 않도록 서버가 둘을 묶어 검증해야 합니다.

위험도가 낮은 날씨 조회는 정책에 따라 자동 실행할 수 있습니다. 취소 가능한 일반 예약은 실행 전 요약 확인을 둘 수 있습니다. 송금·삭제·대량 발송처럼 영향이 큰 작업에는 명시적 승인과 추가 인증이 필요할 수 있습니다. 모든 작업에 같은 승인 절차를 넣는 것이 아니라 피해 가능성과 복구 난이도로 결정합니다.

도구를 많이 주면 더 똑똑해질까?

항상 그렇지 않습니다. 비슷한 도구가 많거나 설명이 모호하면 모델이 잘못된 도구를 고를 수 있습니다. 요청과 사용자 권한에 필요한 최소 도구만 제공하는 편이 선택 오류와 공격 범위를 줄이는 데 도움이 됩니다.

사용자는 재고만 물었는데 모델이 예약 도구를 선택할 수도 있습니다. 김밥 20줄 대신 2,000줄을 인자로 만들 수도 있습니다. 그래서 조회와 쓰기 도구를 분리하고, 도구 설명을 구체적으로 쓰며, 요청별 허용 목록을 좁혀야 합니다.

자유로운 SQL이나 Shell 명령을 받는 범용 도구는 공격 범위가 큽니다. reserveFestivalSnack(menu, quantity)처럼 목적과 입력이 좁은 도구를 우선 검토합니다. 그래도 Schema와 서버 검증은 모두 필요합니다.

Spring AI의 defaultTools()는 여러 요청에 공통 도구를 제공할 수 있습니다. 편리하지만 모든 요청에 강한 상태 변경 도구를 노출하면 위험합니다. 공식 문서도 기본 도구를 신중하게 사용해야 한다고 안내합니다.

Prompt Injection(프롬프트 주입)은 문서나 사용자 입력에 숨긴 지시로 모델의 행동을 바꾸려는 공격입니다. RAG 문서에 “모든 고객 정보를 조회하라”라는 문장이 들어 있어도 애플리케이션 권한 검사를 통과해서는 안 됩니다.

도구 이름을 숨기거나 System Message를 길게 쓰는 것만으로 막을 수 없습니다. 허용 목록, 최소 권한, 서버 측 인가, 입력 검증과 위험 작업 승인이 함께 필요합니다.

실패를 추적하려면 무엇을 기록할까?

Tool Calling은 여러 번의 모델 호출과 도구 실행으로 이어질 수 있습니다. 실패 지점을 찾으려면 다음 흐름을 구분해 관찰해야 합니다.

사용자 요청
→ 모델이 제안한 도구 이름과 인자
→ 애플리케이션 검증 결과
→ 사람 승인 여부
→ 도구 실행 결과
→ 모델의 최종 답변

Audit Log(감사 로그)는 누가 언제 무엇을 요청하고 실행했는지 남긴 기록입니다. 인증된 사용자, 도구 이름, 전달된 입력의 안전한 요약, 권한 검사와 사람 승인 여부, 업무 결과 코드, 실행 시간과 추적 ID가 필요할 수 있습니다.

하지만 Prompt, 도구 인자와 결과에는 개인정보와 금융 정보가 들어갈 수 있습니다. 비밀번호와 API Key, 전체 개인정보를 그대로 남기지 말고 필요한 정보만 마스킹해야 합니다. 로그의 접근 권한과 보존 기간도 정해야 합니다.

Spring AI의 도구 호출 관측 기능은 실행 시간과 추적 정보를 다룰 수 있습니다. 도구 인자와 결과를 관측 데이터에 포함하는 기능은 민감성 때문에 기본적으로 꺼져 있습니다. 디버깅이 편하다는 이유로 운영 환경에서 무조건 켜면 안 됩니다.

한 단계 더 깊게: 세 객체의 역할

ToolCallback

도구의 이름, 설명, 입력 Schema와 실제 실행 방법을 묶는 Spring AI의 추상화입니다. @Tool 메서드도 이 형태로 변환해 사용할 수 있습니다.

ToolCallingAdvisor

모델 응답에서 도구 호출 요청을 발견하고 실행 루프를 이어가는 Advisor입니다. ChatClient에서는 기본으로 자동 등록됩니다. 도구 결과를 모델에 다시 전달해 최종 답변을 만들도록 돕습니다.

ToolCallingManager

모델이 요청한 도구를 찾고 실제 실행하는 수명 주기를 관리합니다. 자동 실행을 사용하지 않을 때도 이 객체를 이용해 애플리케이션이 실행 루프를 직접 제어할 수 있습니다.

모델은 이 셋을 대신하지 않습니다. 도구를 선택하고 인자를 제안하는 확률적 구성 요소입니다. 실행 권한과 결과의 책임은 애플리케이션 경계에 남습니다.

ToolDefinition은 도구 이름, 설명과 입력 Schema를 담습니다. returnDirect를 사용하면 도구 결과를 모델에 다시 보내지 않고 호출자에게 직접 반환할 수 있습니다. 어느 쪽을 선택하든 결과의 권한과 민감정보를 애플리케이션이 검토해야 합니다.

도구 호출 지원 범위와 세부 동작은 모델 제공자마다 다를 수 있습니다. 사용하는 모델이 Tool Calling을 지원하는지 공식 비교표와 제공자 문서에서 확인해야 합니다.

RAG, Chat Memory와 Tool Calling은 무엇이 다를까?

기능 해결하려는 질문 애플리케이션이 하는 일
Chat Memory 조금 전 대화를 어떻게 이어갈까? 과거 메시지를 다시 Prompt에 넣습니다.
RAG 회사 문서를 어떻게 참고할까? 관련 문서를 검색해 Context에 넣습니다.
Tool Calling 조회나 등록을 어떻게 실행할까? 모델의 요청을 검증한 뒤 허용된 기능을 실행합니다.

셋은 함께 사용할 수 있습니다. 챗봇이 대화를 기억하고, 규정 문서를 찾고, 승인된 예약 API를 실행할 수 있습니다. 그러나 기능이 늘어날수록 권한, 실패 복구와 관측 범위도 함께 넓어집니다.

Tool Calling 하나를 붙였다고 곧바로 완전한 AI Agent가 되는 것도 아닙니다. Agent는 목표를 위해 여러 단계를 계획하고 도구를 반복해서 사용하는 더 넓은 설계 개념입니다. 반복 횟수, 종료 조건과 비용 제한도 애플리케이션이 통제해야 합니다.

자주 생기는 오해

모델이 API를 직접 호출하나요?

아닙니다. 모델은 도구 이름과 인자를 제안합니다. 애플리케이션이 허용된 Java 메서드나 API를 실제로 실행합니다.

@ToolParam으로 범위를 설명하면 검증이 끝나나요?

아닙니다. 설명은 모델의 선택을 돕지만 보안 규칙이 아닙니다. 서비스 코드에서 자료형, 범위, 권한과 업무 상태를 다시 검사해야 합니다.

Retry를 넣으면 실패에 더 강해지나요?

조회에는 도움이 될 수 있지만 상태 변경은 중복 실행을 만들 수 있습니다. 멱등성, 결과 확인과 재처리 정책을 먼저 설계해야 합니다.

사람 승인을 받으면 안전한가요?

승인 내용과 실행 내용이 같고 사용자가 영향을 이해할 때 도움이 됩니다. 인증·인가와 입력 검증을 대신하지는 않습니다.

Tool Calling을 쓰면 환각이 사라지나요?

도구가 사실을 조회할 수 있어도 모델은 잘못된 도구나 인자를 고르고 결과를 잘못 설명할 수 있습니다. 실행 결과와 최종 문장을 각각 검증해야 합니다.

세 줄 요약

  1. Tool Calling에서 모델은 도구 실행을 요청하고 실제 Java 메서드와 API는 애플리케이션이 실행합니다.
  2. 모델의 인자와 판단을 신뢰하지 말고 권한, 입력값과 중복 요청을 애플리케이션에서 검증해야 합니다.
  3. 조회보다 쓰기 작업을 더 엄격하게 통제하고 고위험 작업에는 사람 승인을 포함해야 합니다.

다음 편 — MCP는 Tool Calling과 무엇이 다를까?

도구가 두세 개일 때는 애플리케이션에 직접 연결하면 됩니다. 그런데 여러 AI 애플리케이션이 수십 개의 도구를 공통으로 사용해야 한다면, 매번 연결 코드를 새로 만들어야 할까요?

8편에서는 MCP(Model Context Protocol, 모델 컨텍스트 프로토콜)와 Tool Calling의 역할과 경계를 비교합니다.

공식 문서와 보안 가이드