11.4.2 Function Calling(Tool Use)을 활용한 구조화된 파라미터 추출

11.4.2 Function Calling(Tool Use)을 활용한 구조화된 파라미터 추출

앞 절의 시스템 프롬프트가 LLM에게 오라클을 언제 호출할지 권한을 통제하는 ‘방향타’ 역할을 한다면, Function Calling(또는 Tool Use) 기능은 LLM이 고객의 더럽고 파편화된 자연어 텍스트 속에서 오라클 백엔드 API가 인식할 수 있는 정형화된 JSON 데이터를 어떻게 정확히 ’압착(Extraction)’해 낼 것인지에 대한 정밀한 엔지니어링 설계도다.

과거 규칙 기반(Rule-based) 챗봇들은 의도(Intent) 파악 이후에도 정규식이나 무거운 Named Entity Recognition(NER) 모델을 거듭 거치며 파라미터(Slot)를 수동으로 발라내어 조립해야만 했다. 그러나 최신 SOTA(State-of-The-Art) 모델에 내장된 Function Calling 아키텍처를 적시에 활용하면, 모델 가중치 내부에 거대하게 얽혀있는 컨텍스트 추론 능력을 100% 활용하여 가장 유연하고도 우아한 타겟 슬롯 필링(Target Slot Filling) 파이프라인을 구축할 수 있게 된다.

1. Tool 정의와 JSON Schema의 치밀한 매핑

11.3장에서 정의했던 결정론적 오라클의 입력 명세인 InsuranceInput 데이터 구조를 LLM 시스템에 전달할 Tools 배열 객체 내부에 JSON Schema 포맷으로 일대일(1:1) 정확히 매핑한다.

이 스키마 설계에서 엔지니어가 반드시 명심해야 할 것은 단순히 파라미터의 데이터 타입(integer, boolean)만 지정하는 것에 그쳐서는 안 된다는 점이다. 확률적 앵무새인 LLM이 인간의 모호한 문맥을 제멋대로 왜곡하여 이해하지 못하도록, 각 속성(Property)에 대한 매우 치밀하고 강압적인 description이 가이드라인으로 수반되어야 한다.

{
  "name": "calculate_premium",
  "description": "고객의 상태 정보와 특약 옵션을 바탕으로 확정적인 자동차 보험료를 계산합니다. 고객의 발화 인텐트가 '요금 문의'일 경우 시스템 지시에 따라 반드시 최우선으로 호출하세요.",
  "parameters": {
    "type": "object",
    "properties": {
      "customer_age": {
        "type": "integer",
        "description": "고객의 만 연령 숫자. 대화 문맥 중 나이에 대한 명시적인 언급이나 유추 가능한 생년(예: 95년생)이 없다면 절대로 너의 가중치로 임의의 나이를 추측(Guessing)하여 채워 넣지 마세요."
      },
      "coverage_type": {
        "type": "string",
        "enum": ["Basic", "Premium"],
        "description": "선택한 보장 범위. 고객이 '기본', '싼 거', '최소한' 등을 언급하면 'Basic'으로 매핑하고, '최고급', '다 보장되는 거', '풀옵션' 등을 언급하면 'Premium'으로 정규화하여 매핑하세요."
      },
      "has_blackbox_event": {
        "type": "boolean",
        "description": "고객 차량의 블랙박스 장착 여부. 있다고 명확히 서술하거나 최근 장착했다고 하면 true, 없거나 아예 모른다고 하면 안전하게 false로 처리하세요."
      }
    },
    "required": ["customer_age", "coverage_type", "has_blackbox_event"]
  }
}

2. 암묵적 형변환(Implicit Type Casting)과 정규화의 이점

Function Calling 기술이 비즈니스 크리티컬 파이프라인에서 가지는 가장 압도적인 강점은, LLM이 텍스트 속에 숨겨진 추상적인 개념과 모호한 비유를 JSON 스키마가 강제하는 구체적인 이진 데이터 타입으로 스스로 **암묵적 형변환(Implicit Type Casting)**을 수행해 낸다는 점이다.

  • 사용자의 비정형 발화: “나는 95년생 황금돼지띠고, 블랙박스는 어제 출고하면서 딜러가 달아줬어요. 그리고 사고 나면 젤 비싼 풀옵션 보호망으로 다 커버되게 해주세요.”
  • LLM의 런타임 Function Call 출력 (Slot Filling 결과): {"customer_age": 29, "coverage_type": "Premium", "has_blackbox_event": true}

이처럼 Function Calling은 그 자체가 오라클 및 룰 엔진 시스템의 과부하를 막는 강력한 1차 소프트웨어 ’방어막(Shield)’이다. 만약 가중치의 일시적 붕괴로 인해 LLM이 스키마에 정의되지 않은 환각적인 Enum 값("coverage_type": "Super")이나 잘못된 문자열 타입("customer_age": "스물아홉")을 내보내려 시도할 경우, API 클라이언트 라이브러리 레벨에서 즉각적인 파싱 에러(Parsing Error)를 발생시키며 런타임을 멈춰 세운다. 따라서 로컬 오라클 등 백엔드 시스템은 일일이 들어오는 타입을 검사할 필요 없이 항상 안전하게 소독되고 멸균된 JSON 인자(Arguments) 만을 전달받아 결정론적 연산을 100% 보장된 환경에서 수행할 수 있게 된다.