11.4.3 대화 문맥(Context)에서의 필수 엔티티(Entity) 누락 감지 및 되물기 로직

11.4.3 대화 문맥(Context)에서의 필수 엔티티(Entity) 누락 감지 및 되물기 로직

실제 B2C 프로덕션 환경에서 사용자는 결코 개발자가 JSON Schema에 명시해 놓은 모든 필수 파라미터(Parameter)를 단 한 번의 깔끔한 발화(Utterance)에 가지런히 담아서 말해주지 않는다. “내 차 이번에 새로 샀는데 보험료 대충 얼마야?“라는 매우 흔한 단문이 들어왔을 때, 이전 절에서 정의한 오라클을 격발하기 위해 필수적인 3개의 엔티티(customer_age, coverage_type, has_blackbox_event) 중 무려 3개가 모조리 누락된 상태 트랜잭션이 발생한다.

이때 언어 모델이 사용자를 귀찮게 하지 않으려고 자신의 가중치에서 임의의 ’국민 평균 기본값(Default Model Value)’을 창작하여 억지로 슬롯을 채운 뒤 백엔드 연산을 돌려버리는 행위, 이것이 엔터프라이즈 챗봇이 겪는 가장 흔하고도 치명적인 환각(Hallucination)이다.

1. 강타입(Strong Type) 검증 에러의 피드백 루프(Feedback Loop) 활용

JSON Schema의 required 배열 속성과 백엔드의 Pydantic 클래스는 이 누락 문제를 프로그래밍적으로 해결하는 첫 번째 물리적 벽이다. LLM이 Function Calling을 급하게 수행하면서 필수 파라미터가 텅 빈 채 JSON 문자열을 생성하여 전송하려 할 때, 파이썬 백엔드 라우터는 이를 ValidationError 예외로 즉시 끊어낸다.

아키텍트는 이 400번대 에러를 그대로 트래시(Trash)하고 시스템 다운으로 처리할 것이 아니라, 예외(Exception) 객체에 담긴 메시지 자체를 문자열로 감싸 다시 LLM의 시스템 컨텍스트(Context) 창에 보이지 않는 피드백(Hidden Feedback)으로 강하게 되먹임해야 한다.

  • 백엔드 시스템 투입 메시지 (사용자에게는 보이지 않음): [System Validation Error]: 런타임 오라클 격발 실패. 'customer_age' 및 'coverage_type' 파라미터가 누락되었습니다. 임의의 값을 상상하지 말고, 고객에게 돌아가서 해당 정보의 입력을 정중하게 요청(Prompt)하세요.

이러한 내부 루프를 거치면 LLM은 즉시 자신의 실수를 교정하고 사용자에게 질문을 던지는 모드로 태세를 전환한다.

2. 상태 기계(State Machine) 기반의 점진적 슬롯 필링(Progressive Slot Filling)

오라클 기반 챗봇의 UX를 가장 세련되게 만드는 기술은, 대화 상태(Dialog State) 메모리를 관리하며 LLM 스스로 대화의 유도리 있는 흐름 속에서 부족한 정보를 하나씩 캐주얼하게 수집해 나가는 ‘점진적 슬롯 필링(Progressive Slot Filling)’ 패턴의 구현이다.

이를 위해 시스템 프롬프트 최상단에 **‘되물기(Reprompting)’**에 대한 명시적인 행동 강령 시스템을 선언한다.

  • [지시어 예시]: “도구를 호출하기 위해 필요한 파라미터 배열 중 하나라도 누락(Null)되었다면, 절대로 임의로 숫자를 추측(Guessing)하지 마라. 대신 고객에게 정중하게 해당 필드의 정보를 질문하라. 단, 취조하듯이 한 번에 3~4개의 정보를 폭격하듯 묻지 말고, 대화의 맥락에 맞게 한 번에 한 가지씩만 부드럽게 핑퐁(Ping-pong)으로 질문할 것.”

[점진적 멀티 턴(Multi-turn) 대화 시뮬레이션]

  1. 사용자: “자동차 보험료 알아보려고요.” (의도 감지됨. 파라미터 점유율 0/3)
  2. LLM: “네, 정확한 보험료 산출을 위해 몇 가지 타겟 정보를 여쭤보겠습니다. 먼저, 고객님의 만 연령이 어떻게 되시는지요?” (1차 되물기 발생)
  3. 사용자: “올해로 28살입니다.” (customer_age=28 획득. 파라미터 점유율 1/3)
  4. LLM: “감사합니다. 혹시 안전을 위해 차량에 블랙박스는 장착되어 있으신가요? 장착 시 보험료 추가 할인이 적용됩니다.” (2차 되물기)
  5. 사용자: “네, 어제 딜러분이 옵션으로 달아줬어요.” (has_blackbox_event=true 획득. 파라미터 점유율 2/3)

이러한 지능적인 되물기 로직은 챗봇이 단순히 한 번의 턴(Turn)으로 대답을 끝내버리는 구석기 시대의 문답 기계가 아니라, 깐깐한 런타임 오라클의 수학적 제약 조건(Constraints)을 100% 만족시키기 위해 고객과 인간적으로 협상하고, 어르고 달래며 데이터를 수집해 가는 고도의 **능동적 에이전트(Active Agent)**로 진화하게 만든다.