AI Sparkup

복잡한 AI 세상을 읽는 힘 ⚡

LLM Tool Calling 완벽 가이드: REST API부터 Spring AI까지

출처: Analytics Vidhya

AI 챗봇이 단순히 질문에 답하는 것을 넘어서 실제 비즈니스 시스템과 상호작용할 수 있다면 어떨까요? 재고를 확인하고, 데이터베이스를 조회하고, 외부 API를 호출할 수 있는 AI를 상상해보세요. 이것이 바로 LLM Tool Calling이 가능하게 하는 일입니다.

이 글은 Muthukumaran Navaneethakrishnan의 Medium 글을 중심으로 Tool Calling의 핵심 개념부터 실제 구현까지 단계별로 설명합니다. REST API를 직접 다루는 방법부터 Spring AI를 활용한 간소화된 구현법까지, 개발자가 알아야 할 모든 것을 다루겠습니다.

LLM Tool Calling 다이어그램
LLM Tool Calling의 기본 작동 원리 (출처: Medium)

Tool Calling이란 무엇인가?

Tool Calling(이전에는 Function Calling으로 불림)은 LLM이 외부 함수나 API를 호출할 수 있게 하는 기능입니다. LLM은 대화에는 뛰어나지만 실시간 데이터나 외부 시스템에 대한 정보는 알지 못합니다. Tool Calling을 통해 AI는 다음과 같은 작업을 수행할 수 있습니다:

  • 실시간 재고 정보 조회
  • 데이터베이스 쿼리 실행
  • 외부 API 호출
  • 비즈니스 로직 실행

예를 들어, 사용자가 “AirPods Pro 재고가 있나요?”라고 물으면, AI는 직접 답하는 대신 재고 확인 함수를 호출하겠다고 요청합니다. 개발자가 이 함수를 실행하고 결과를 돌려주면, AI는 이 정보를 바탕으로 최종 답변을 생성합니다.

REST API를 통한 Tool Calling 구현: 5단계 프로세스

Tool Calling의 작동 원리를 이해하기 위해 REST API를 직접 사용하는 방법을 살펴보겠습니다. 다음은 “AirPods Pro 재고가 있나요?”라는 질문을 처리하는 전체 과정입니다.

1단계: 프롬프트와 도구 정의 전송

먼저 LLM에게 사용자 질문과 함께 사용 가능한 도구들을 알려줍니다:

{
  "model": "your-model-id",
  "messages": [
    { "role": "user", "content": "Do you have AirPods Pro in stock?" }
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "findProductByName",
        "description": "Finds a product by name or description",
        "parameters": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Product name or keyword"
            }
          },
          "required": ["name"]
        }
      }
    }
  ],
  "tool_choice": "auto"
}

2단계: 모델의 Tool Call 응답

모델은 직접 답변하는 대신 도구 호출을 요청합니다:

{
  "choices": [
    {
      "message": {
        "tool_calls": [
          {
            "id": "abc123",
            "function": {
              "name": "findProductByName",
              "arguments": "{\"name\":\"AirPods Pro\"}"
            },
            "type": "function"
          }
        ]
      }
    }
  ]
}

3단계: 함수 실행

개발자는 요청받은 함수를 실행합니다:

List<Product> result = productService.findByName("AirPods Pro");
// 결과를 JSON으로 직렬화
{
  "name": "AirPods Pro",
  "price": 249,
  "stock": 5
}

4단계: 도구 결과 전송

실행 결과를 다시 모델에게 전송합니다:

{
  "messages": [
    { "role": "user", "content": "Do you have AirPods Pro in stock?" },
    {
      "role": "assistant",
      "tool_calls": [
        {
          "id": "abc123",
          "function": {
            "name": "findProductByName",
            "arguments": "{\"name\":\"AirPods Pro\"}"
          }
        }
      ]
    },
    {
      "role": "tool",
      "tool_call_id": "abc123",
      "content": "{\"name\":\"AirPods Pro\",\"price\":249,\"stock\":5}"
    }
  ]
}

5단계: 최종 답변 생성

모델이 도구 결과를 바탕으로 최종 답변을 생성합니다:

{
  "choices": [
    {
      "message": {
        "content": "네, AirPods Pro 재고가 있습니다. 가격은 $249이고, 5개 재고가 남아있습니다."
      }
    }
  ]
}

복잡한 시나리오: 멀티툴 호출과 순차적 추론

실제 비즈니스 환경에서는 더 복잡한 상황들이 발생합니다.

멀티툴 호출

사용자가 “AirPods와 Galaxy Buds 중 어떤 것이 더 나은 선택인가요?”라고 묻는다면, AI는 동시에 여러 도구를 호출할 수 있습니다:

멀티툴 호출 다이어그램
여러 도구를 동시에 호출하는 멀티툴 시나리오 (출처: Medium)

이 경우 모델은 한 번의 응답에서 두 개의 tool_calls를 반환하여 각각 AirPods와 Galaxy Buds 정보를 요청합니다.

순차적 추론

더 복잡한 시나리오는 단계적으로 추론해야 하는 경우입니다. 예를 들어 “지난 달 가장 많이 팔린 제품은 무엇인가요?”라는 질문에 답하려면:

  1. 먼저 데이터베이스 테이블 목록을 조회
  2. 관련 테이블의 스키마 확인
  3. 적절한 SQL 쿼리 생성 및 실행
순차적 추론 다이어그램
단계별로 추론하는 순차적 도구 호출 (출처: Medium)

이러한 복잡한 시나리오에서 AI는 각 단계의 결과를 바탕으로 다음 단계를 결정하며, 최종적으로 사용자에게 의미 있는 답변을 제공합니다.

수동 구현의 어려움

REST API를 직접 사용하여 Tool Calling을 구현하는 것은 여러 도전과제가 있습니다:

  • JSON 스키마 작성: 각 도구에 대한 상세한 스키마 정의 필요
  • tool_call_id 추적: 각 호출과 응답을 정확히 매칭
  • 인수 파싱 및 바인딩: JSON 형태의 인수를 실제 함수 파라미터로 변환
  • 응답 직렬화: 함수 실행 결과를 다시 JSON으로 변환
  • 멀티툴 오케스트레이션: 여러 도구 호출의 순서와 의존성 관리
  • 대화 히스토리 관리: 전체 대화 맥락 유지
  • 에러 처리: 실패한 도구 호출에 대한 적절한 처리

이러한 복잡성 때문에 개발자들은 보다 간편한 해결책을 찾게 됩니다.

Spring AI로 간소화하기

Spring AI는 동일한 REST 프로토콜을 사용하지만 복잡한 구현 세부사항을 모두 추상화해줍니다. 개발자는 비즈니스 로직에만 집중할 수 있습니다.

간단한 어노테이션 기반 구현

Spring AI에서는 다음과 같이 간단하게 도구를 정의할 수 있습니다:

@Tool(description = "Find a product by name or description")
public String findProductByName(
    @ToolParam(description = "product name", required = true) String name) {
    List<Product> products = productService.findByName(name);
    return new ObjectMapper().writeValueAsString(products);
}

컨트롤러에서의 사용법도 매우 간단합니다:

@PostMapping("/chat")
public ChatBotResponse chatWithInventory(@RequestBody ChatBotRequest req) {
    Prompt prompt = new Prompt(List.of(new UserMessage(req.question())));

    String answer = ChatClient.builder(llmModel)
        .defaultTools(productTools)
        .build()
        .prompt(prompt)
        .call()
        .content();

    return new ChatBotResponse(req.question(), answer);
}

Spring AI의 자동 처리 기능

Spring AI는 개발자를 위해 다음과 같은 작업들을 자동으로 처리합니다:

  • 도구 스키마 자동 생성: 메서드 시그니처에서 JSON 스키마 자동 생성
  • 인수 바인딩: JSON 인수를 Java 메서드 파라미터로 자동 변환
  • tool_call_id 매핑: 호출과 응답 간의 ID 매핑 자동 관리
  • 메시지 상태 관리: 대화 히스토리와 컨텍스트 자동 유지
  • 병렬 도구 오케스트레이션: 멀티툴 호출의 병렬 처리
  • 순차적 도구 라우팅: 단계별 추론 시나리오 자동 관리
  • Spring Boot 통합: 의존성 주입, 유효성 검사, 관찰 가능성 지원
  • 다중 제공자 호환성: OpenAI, Mistral, Gemini 등 다양한 LLM 제공자 지원

추가 기능: MCP 프로토콜 지원

Spring AI는 Model Context Protocol(MCP) 지원을 통해 더욱 강력한 상호 운용성을 제공합니다:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>

이 의존성을 추가하면 @Tool 어노테이션으로 정의한 모든 메서드가 자동으로 MCP 호환 엔드포인트가 됩니다. 추가 코드나 설정 없이 다른 에이전트나 프론트엔드 클라이언트에서도 동일한 도구를 사용할 수 있습니다.

실제 비즈니스 활용 사례

Tool Calling은 다양한 산업에서 실질적인 가치를 제공하고 있습니다. 대표적인 활용 사례 3가지를 살펴보겠습니다:

전자상거래: 스마트 쇼핑 어시스턴트
고객이 “iPhone 14 Pro 재고 있나요?”라고 물으면 AI가 실시간으로 재고 시스템을 조회하고, 가격 정보와 배송 옵션까지 함께 제공합니다. 단순한 정보 조회를 넘어 장바구니 추가나 주문 상태 확인까지 자동화할 수 있습니다.

금융 서비스: 개인화된 금융 상담
“이번 달 카드 사용 내역을 분석해주세요”라는 요청에 AI가 계좌 시스템에 접근하여 거래 내역을 분석하고, 소비 패턴을 파악하여 맞춤형 절약 방안을 제시합니다. 실시간 데이터를 바탕으로 한 개인화된 금융 조언이 가능해집니다.

고객 서비스: 지능형 지원 시스템
고객이 “내 주문이 언제 도착하나요?”라고 문의하면 AI가 주문 관리 시스템과 배송 추적 API를 조회하여 정확한 배송 상태와 예상 도착 시간을 실시간으로 제공합니다. 복잡한 문제는 적절한 담당자에게 자동 에스컬레이션됩니다.

구현 시 고려사항

Tool Calling을 성공적으로 구현하기 위한 주요 고려사항을 정리하면 다음과 같습니다:

분야주요 고려사항구체적 내용
보안접근 제어 및 데이터 보호도구 접근 권한 제어, 입력 데이터 검증, 민감한 정보 노출 방지
성능응답 시간 최적화도구 호출 시간 제한 설정, 캐싱 전략 수립, 병렬 처리 최적화
안정성오류 처리 및 복구도구 실행 실패 시 대안 제공, 타임아웃 처리, 사용자 친화적 오류 메시지
운영모니터링 및 관리도구 사용 패턴 분석, 성능 지표 추적, 비용 모니터링

맺음말

LLM Tool Calling은 AI 애플리케이션의 가능성을 크게 확장시키는 핵심 기술입니다. REST API를 직접 사용하는 방법을 이해하는 것은 Tool Calling의 작동 원리를 파악하는 데 중요하지만, 실제 프로덕션 환경에서는 Spring AI와 같은 프레임워크를 활용하는 것이 훨씬 효율적입니다.

Spring AI의 @Tool 어노테이션을 사용하면 복잡한 구현 세부사항은 프레임워크가 처리하고, 개발자는 실제 비즈니스 가치를 창출하는 로직에 집중할 수 있습니다. 또한 MCP 프로토콜 지원을 통해 미래의 AI 생태계와의 호환성도 보장받을 수 있습니다.

AI가 단순한 대화를 넘어서 실제 시스템과 상호작용할 수 있게 하는 Tool Calling은 이제 선택이 아닌 필수가 되고 있습니다. 이 기술을 마스터하는 것은 차세대 AI 애플리케이션 개발의 핵심 역량이 될 것입니다.


참고자료:

Comments