Career
㈜휴트리온 · KT ds / Client: KT

대화 한 번으로
끝내는 유선상품 가입

KT Shop 인터넷·TV·결합 상품의 상담부터 추천·예약·가입 신청까지,
하나의 대화 흐름으로 처리하는 AI 에이전트입니다.

A conversational AI agent that handles consultation,
recommendation, and sign-up in a single flow.

2026.02 — 2026.06

Pain Point & Solution

에이전트를 움직이는 핵심 기능

유선상품 가입 과정에서 도출된 네 가지 핵심 문제 — 복잡한 상품 구조, 단절된 경험, 토큰 낭비·지연, 개인정보 우려 —를
각각 대화형 추천 · 단일 오케스트레이션 · 토큰 최적화·병렬 호출 · 보안 설계로 풀어낸 AI 백엔드의 핵심 기능입니다. 카드를 누르면 상세 구현이 펼쳐집니다.

01

PAIN

복잡한 상품 구조·약정 조건

Complexity of plans and contract terms

02

PAIN

단절된 상담·예약·가입 경험

Fragmented consult, booking and sign-up flow

03

PAIN

장황한 응답·토큰 낭비와 지연 누적

Verbose responses, token waste and latency buildup

04

PAIN

개인정보 노출 우려

Concern over personal data exposure

HOW

대화형 상품 추천

추천 단계 진입 시 분류 LLM이 발화를 먼저 읽어 유형을 판별하고, 유형별 전용 조회 경로로만 진입시켜 멀티턴 누적 시에도 불필요한 API 호출을 차단했습니다.

98%+답변 성공률
5분류추천 유형 파이프라인
01추천 유형 5분류 LLM 라우팅LLM

분류 LLM이 발화를 읽어 멀티턴 > 사은품 > 비교 > 특정상품 > 일반추천 우선순위로 분기, 유형별 전용 경로로만 진입시켜 무거운 조회를 사전 차단.

024-Step 파이프라인흐름

상품 검색 → API 추천 → 상담 전환 → 지식(RAG) Fallback으로 수렴시켜 어떤 발화도 응답 없이 끝나지 않도록 보장.

03특정상품 match_type 세분Code

단품 3단계(정확·유사·미존재)·결합 4단계로 매칭 유형을 나눠 유형별 안내 멘트와 대체 추천을 생성.

04화면 유형별 동적 UI 생성UI

상품 슬라이드·바텀시트·달력·프로모션 스크롤 등 8종 UI를 Tool 레이어가 완성 JSON으로 반환해 파싱 에러 제거.

Architecture

Agent Orchestration
전체 워크플로우 노드 그래프

매 턴 상태 객체를 읽어 '의도 분류부터 다시 태울지(최초진입), 진행 중이던 단계로 이어붙일지(재진입)'를 먼저 판정하고, 추론 책임을 상태확인 → 주제분류(9라벨) → 서브에이전트 선택 → 추천 유형 분류 → 답변 생성으로 분리해 계층적으로 통과시키는 구조입니다. 8개 서브에이전트와 가입 slot 체인(사은품→주소→일자→시간→본인인증)이 모두 종단의 답변생성 노드로 수렴합니다.

추천 유형 5분류
상품 가입 단계
상담 예약 단계
최초진입재진입상품 가입상담 예약
Query
워크플로우 라우터
멀티턴 판정
서브에이전트 라우터
의도 분류
추천 · 상담 분류
단계 진행
상품 추천
상담 예약
유선 해지
상담 조회
지식성 답변
멀티턴
사은품
비교
특정상품
일반추천
사은품 선택
설치정보 입력
본인 인증
예약정보 확인
이름·번호 입력
예약 적재 + 콜백 안내
지식(RAG·A2A)
답변생성 + 동적 UI
라우터분기서브에이전트가입·지식 단계답변 생성

Key Decisions

아키텍처를 가른 설계 결정

단일 상태 객체 기반 비선형 세션 제어 엔진

문제

멀티 에이전트 플랫폼 특성상 사용자가 가입 도중 지식·요금제·빠른상담 등 타 에이전트로 이탈 후 복귀하거나, 단계를 앞질러 발화하는 비선형 흐름에서 진행 맥락 소실·단계 꼬임·정보 재입력 요구로 가입 여정이 중단됐습니다.

결정

대화에 필요한 모든 정보(현재 단계·가입 입력값·직전 의도·선택지·경유 에이전트 코드)를 요청·응답마다 함께 주고받는 단일 JSON 상태 객체로 정의하고, 매 턴 '읽기(상태 복원) → 갱신(발화·버튼 반영) → 라우팅(다음 단계 결정)' 사이클을 수행. 상태를 서비스 코드 외부 객체로 분리해 어느 에이전트를 경유하든 동일 상태를 이어받도록 설계.

결과

슬롯 값 유무만으로 흐름을 재구성해 건너뛰기·복귀를 동일 로직으로 처리. 비선형 입력에서도 진행 맥락을 무손실 보존.

LLM ↔ 비즈니스 로직 분리 (Prompt Decomposition)

문제

하나의 LLM이 상품 조회·조건 비교·가입 절차 안내까지 모두 직접 수행하면 응답 일관성 부족·환각·운영 정책 반영 어려움의 구조적 결함이 발생합니다.

결정

추론 책임을 상태확인 → 주제분류 → 서브에이전트 선택 → 추천 유형 분류 → 답변 생성으로 분리한 다단계 라우터 구조를 설계. 실제 상품 연동·조건 비교·유효성 검증은 Python 비즈니스 로직 계층이 담당하도록 계층화.

결과

운영 정책은 백엔드 코드에서, 답변 표현은 프롬프트에서 각각 수정 가능해 변경 대응 속도 향상. LLM 판단 범위를 줄여 같은 입력에 일관된 응답 확보.

API 응답 경량 포맷 변환 — 토큰 63% 절감

문제

멀티턴 환경에서 상용 백엔드 API의 방대한 JSON 응답이 Context Window에 지속 누적돼 1회 대화당 76k+ 입력 토큰 낭비와 추론 지연이 발생했습니다.

결정

중괄호·따옴표·키가 행마다 반복되는 JSON을, 키를 한 번만 적고 값을 행으로 나열하는 경량 표 형식(TOON)으로 변환하는 커스텀 파서를 개발·적용. 추천·안내에 실제 필요한 필드만 남기도록 정제.

결과

평균 대화 입력 토큰 63.4% 절감(76.59k→27.97k), 추론 속도 향상과 API 연동 운영 비용 절감을 동시 달성.

LLM 호출 병렬화 — 응답 지연 증가 억제 (1차→2차)

문제

1차 개발 에이전트는 모든 LLM 호출이 직렬로만 실행되는 단방향 구조여서, 주제 분류·단계 판단·API 조회 등 판정 단계가 누적될수록 응답 지연이 선형적으로 증가하는 한계가 있었습니다.

결정

단방향 워크플로는 유지하되, 상호 의존성이 없는 LLM 판정·조회 호출을 병렬 실행하도록 재설계. 버튼 선택 처리 코드 3개(고정메뉴·바텀시트·리스트)도 병렬 실행 후 우선순위로 취합하고, 상품·혜택 조회는 ThreadPoolExecutor로 병렬화.

결과

다단계 분리 구조의 판정 정확도를 유지하면서 단계 누적에 따른 응답 지연 증가를 억제.

본인인증 자격 검증 조건별 분기 처리

문제

가입 최종 관문인 본인인증에서 정책상 비대면 셀프 가입이 불가한 고객 유형이 존재함에도, 백엔드 분기가 없으면 흐름 단절·세션 꼬임·오주문으로 이어질 수 있었습니다.

결정

인증 응답의 결과 구분값·자격 관련 코드를 실시간 파싱해 상태값과 UI 바인딩을 동적 제어하는 장애 격리 전처리 모듈을 설계. 셀프 가입 불가 유형은 누적 정보 초기화 후 정책 안내 멘트와 상담 전환 버튼으로 라우팅하고, 정상 고객은 입력 정보 확인 카드로 가입 신청까지 안정 연결.

결과

가입 자격 검증을 백엔드로 자동화해 엣지 케이스 이탈을 방어하고, 셀프 가입 불가 고객을 유효 상담 경로로 전환.

동적 UI 생성을 Tool로 이전 — LLM 역할 분리

문제

LLM이 슬라이드·바텀시트·버튼 구조를 직접 생성하면 형식이 불안정해 파싱 에러가 발생하고, 상품 데이터가 바뀌면 UI가 깨졌습니다.

결정

전용 UI 빌더 Tool이 상품 슬라이드·'내게 맞는 상품' 설문 폼(바텀시트)·연관 프로모션·추천 질문·피드백 버튼까지 완성된 챗봇 UI JSON을 반환하도록 설계. LLM은 도메인 판단·흐름 제어에만 집중.

결과

UI 형식을 Tool 레이어에서 보장해 파싱 에러 제거. 상품 데이터 변경이 UI에 자동 반영되고, LLM 출력 토큰도 정형화로 절감.

Challenges & Solutions

해결하기 어려웠던 문제

문제

단일 발화에 복수 의도가 섞이거나(가입·탐색 ↔ 해지·조회·변경) 도메인이 2개 이상 포함되는 케이스에서 오작동이 발생했습니다.

해결

명시적 선행 표현('~부터')을 최우선 처리하고 인과·발화 순서를 고려해 첫 의도 응답 후 다음 의도를 마지막 줄에서 문의. 2순위 의도는 임시 버퍼에 보관(최대 2개), 결합 가능 도메인은 병합 안내로 분기.

문제

사용자가 현재 단계를 앞질러 미래 단계 정보를 함께 말하는 케이스(주소 입력 화면에서 날짜·시간까지 동시 발화)에서 정보가 유실됐습니다.

해결

현재 단계에 속하지 않는 데이터(사은품·날짜·시간)와 2순위 복합 의도를 선입력 임시 버퍼(Look-ahead Buffer)에 적재했다가 해당 단계 도달 시 소비하는 구조 구현.

문제

특정 상품군 과매칭·결합상품 분리·기이용자 오가입 등 운영 사고로 직결되는 오분류·과매칭이 잦았습니다.

해결

운영 사고 케이스를 프롬프트 가드레일 규칙으로 차단 — 명시 키워드가 없으면 매칭 금지, 유사도 임계값 기반 매칭, 결합 대상 도메인 강제 병합, 기이용자·상담 필요 건은 상담 플로우로 전환하도록 규칙화.

문제

오타·구어체·비표준 단위 표현이 섞인 발화가 분류 정확도를 떨어뜨리고, 같은 의미의 표현이 제각기 다른 결과로 갈렸습니다.

해결

라우터 프롬프트 단계에서 발화를 표준 표현으로 교정하고(오타·구어체), 단위·옵션 표현을 정규화하는 전처리 사전을 두어 분류 정확도를 확보. 표준화된 발화만 하위 로직으로 흘려보내 downstream 분기의 일관성을 보장.

문제

타사 브랜드·단순 부가서비스 발화나 모호한 지식성 질의가 상품 가입 흐름으로 잘못 유입돼 오작동으로 이어졌습니다.

해결

과업 단위 분류(가입·상담·조회·해지·FAQ 등)에 경쟁사·부가서비스 예외 라벨 체계를 더한 9라벨 주제 분류를 수립하고, 지식성 질의는 검색에 적합한 완결 질문으로 재작성해 오분류율을 개선.

Beyond Sign-up

가입 외 여정까지 대화형으로 완결

상품 추천·가입뿐 아니라 상담 예약·내역 조회·해지·주소 변경까지 유선 여정 전체를 하나의 대화 흐름으로 처리하도록 백엔드를 설계했습니다.

빠른상담 예약

3-Step
  1. 1로그인 고객은 보유 이름·회선을 마스킹해 즉시 예약 확인 제시 ('다른 번호로 예약' 분기 포함)
  2. 2비로그인 고객은 이름·전화번호 입력 유도
  3. 3전화상담 주문 저장 API로 예약 적재 후 주문번호 반환 + 콜백 안내

상담 내역 조회

조회
  1. 1로그인 고객은 주문 목록 조회로 예약 내역을 카드로 안내
  2. 2비로그인 고객은 약관 조회 후 로그인/비회원 주문조회 경로 분기 제공
  3. 3타 에이전트 경유 시 직전 도메인 이력으로 '이어서 진행' 멘트 노출

유선 해지

RAG
  1. 1지식 검색 API(RAG)로 온라인 해지 절차·약정 해지 제약 안내
  2. 2[해지 예약 신청하기] 버튼 노출
  3. 3다양한 구어 표현을 표준 발화로 정규화해 인식률 확보

설치주소 변경

RAG
  1. 1지식 검색 결과(주소·연락처 일괄 변경 절차 등)로 안내
  2. 2[설치주소 변경하기] 버튼 노출
  3. 3'이사해서 옮겨야 돼'·'셋톱 이전' 등 구어를 표준 발화로 정규화

Tool Layer

직접 개발한 비즈니스 로직 Tool 계층

LLM이 직접 하지 않는 실제 상품 연동·조건 비교·유효성 검증·UI 생성을 전담하는 Python Tool 15종을 설계·개발했습니다. 무거운 조회는 ThreadPoolExecutor로 병렬화하고, 개인정보는 AES 복호화 후 서버 측에서만 처리합니다.

상품 조회5
전체 상품·혜택 병렬 조회

전 상품과 사은품을 ThreadPoolExecutor로 동시 조회해 조회 지연 최소화

도메인별 상품 조회

카테고리·도메인 코드로 조회 범위를 좁혀 필요한 상품만 로드

카테고리 조회

상품 카테고리 체계 조회로 추천 범위 결정

전화상담 전용 상품 조회

셀프 가입 불가·전화상담 전용 상품 목록 분리 조회

표준약관 조회

본인인증·동의 단계에 필요한 표준약관 조회

추천1
맞춤 상품 진단

4문항 객관식 설문 응답으로 발화가 모호한 사용자에게 맞춤 상품 추천

혜택 집계2
복수 상품 혜택 집계

여러 상품의 사은품·프로모션을 병렬 집계하고 선택지 상태를 갱신

단일 상품 혜택 병합

단일 상품의 사은품·프로모션을 조회·병합해 안내 데이터 구성

고객 정보1
고객 회선 조회

식별자를 AES 복호화해 보유 회선 정보를 실시간 조회 (LLM 비노출)

주문 조회1
주문 이력 조회

최근 예약·가입 이력을 복호화해 카드로 안내

주문 저장2
가입 주문 저장

최종 확정된 가입 신청을 안전하게 저장

전화상담 예약 저장

상담 예약을 적재하고 주문번호 반환

유효성 검증2
예약 날짜 검증

정책상 예약 가능일(영업일·비공휴일 등)만 선택 허용하도록 검증

예약 시간 검증

영업시간·정시 단위 범위로 예약 시간 제한

UI 생성1
동적 UI 빌더

상품 슬라이드·설문 폼·프로모션·추천 질문·피드백까지 완성된 챗봇 UI JSON을 조립해 반환

Integrations

이종 상용 시스템 통합

상품·혜택·주문·고객 회선 등 성격이 다른 다수의 상용 백엔드 시스템을 하나의 대화 흐름으로 묶고, 방대한 응답을 경량화해 LLM에 전달했습니다.

상품 · 혜택 · 주문 계통다수 엔드포인트

상품 조회·카테고리·사은품·프로모션·약관·맞춤 검색·주문 저장/조회를 연동. 무거운 조회는 병렬(ThreadPoolExecutor) 처리하고 추천에 필요한 필드만 정제해 호출.

고객 회선 · 할인 계통실시간 조회

로그인 고객의 보유 회선·할인 정보를 실시간 조회해 이름·번호 등을 자동 선반영. 식별자는 AES 복호화 후 서버에서만 처리.

응답 데이터 최적화 (TOON)-63% 토큰

이종 시스템의 방대한 JSON 응답을 경량 표 형식(TOON)으로 변환하는 커스텀 파서로, 멀티턴 누적 시에도 컨텍스트·API 비용이 불필요하게 늘지 않도록 통제.

Performance

숫자로 증명한 성과

78%
98%
답변 성공률
92.8k
67.4k
최대 입력 토큰
76.6k
28.0k
평균 입력 토큰
469
380
평균 응답 토큰
98%+
답변 성공률
1차 단일턴 78% → 2차 단일·멀티턴 평균
-27.3%
최대 입력 토큰
92.83k → 67.43k, 컨텍스트 오버플로우 차단
-63.4%
평균 입력 토큰
76.59k → 27.97k (TOON 변환 + 필드 정제)
-19.1%
평균 응답 토큰
469.48 → 380.02, 정형 UI 포맷 매칭

Impact

성과 · 의의

  • 평균 입력 토큰 63.4% 절감(76.59k→27.97k) + LLM 호출 병렬화로 응답 지연 증가 억제, 추론 지연·API 연동 운영 비용 동시 절감
  • 단일턴 78% → 단일·멀티턴 평균 답변 성공률 98%+ 달성 (KT 기획 테스트셋 검증)
  • 타 에이전트 경유·단계 건너뛰기·맥락 복귀 등 비선형 입력에서 세션 상태 무결성 보존
  • 복잡한 상품·약정 도메인 로직을 정확히 분석·현행화하고, API 스펙과 실제 노출값을 교차검증해 금액 불일치 리스크를 통제하며 안정적 상용 오픈을 이끌어냄
  • 설계부터 Go-Live·운영 이관까지 전 주기를 담당하며 사업부·기획·UI/UX·백엔드 API 담당 등 다수 이해관계자를 조율하고 인수인계 기술서·운영자 매뉴얼·데일리 테스트 시나리오 등 핵심 산출물 제정

Live Demo

실제 동작 화면

상담 → 추천 → 예약까지, 대화 흐름 그대로의 실제 작동 모습입니다.

Stack

Custom Agent BuilderMicrosoft AzurePython · FlaskPostgreSQLGitLab

더 자세한 이야기가 궁금하다면