Field note · 2026-04-29

Topic과 Intent는 다른 것이다 — NLU 설계에서 가장 자주 혼동되는 두 개념

챗봇이나 NLU 시스템을 처음 설계할 때 가장 흔히 마주치는 혼란이 있다. Topic과 Intent를 같은 것으로 취급하거나, 어느 것을 써야 할지 모른 채 두 단어를 번갈아 사용하는 것이다. 실제로 이런 레이블 목록을 보는 일이 드물지 않다. 분류 카테고리: 결제 문의 배송 문의 환불 요청 비밀번호 변경 계정 잠김 앞의

Topic과 Intent는 다른 것이다


0. 같은 것처럼 보이는 이유

챗봇이나 NLU 시스템을 처음 설계할 때 가장 흔히 마주치는 혼란이 있다. Topic과 Intent를 같은 것으로 취급하거나, 어느 것을 써야 할지 모른 채 두 단어를 번갈아 사용하는 것이다.

실제로 이런 레이블 목록을 보는 일이 드물지 않다.

분류 카테고리:
- 결제 문의
- 배송 문의
- 환불 요청
- 비밀번호 변경
- 계정 잠김

앞의 두 개(결제 문의, 배송 문의)와 뒤의 세 개(환불 요청, 비밀번호 변경, 계정 잠김)는 근본적으로 다른 종류다. 전자는 Topic이고 후자는 Intent다. 같은 목록에 섞여 있으면 시스템이 일관되게 작동하지 않는다.

이 글은 두 개념이 기술적으로 어떻게 다른지, 왜 섞이면 안 되는지를 설명한다.


1. 질문이 다르다

두 개념의 차이는 각각이 답하려는 질문에서 시작된다.

Topic: "이 발화는 무엇에 관한 이야기인가?" Intent: "이 사용자는 무엇을 하려는가?"

같은 발화에 두 질문을 동시에 던져볼 수 있다.

발화Topic (관한)Intent (하려는)
"지난달 요금 왜 이렇게 나왔어요?"billingdispute_charge
"비밀번호 바꾸고 싶어요"accountreset_password
"주문한 상품 어디쯤 왔어요?"shippingtrack_order

Topic은 내용 영역(domain)을 가리킨다. Intent는 사용자의 구체적인 목표 행동을 가리킨다. 두 개념은 같은 발화를 서로 다른 축에서 분석한 결과다.


2. 모델이 다르다

두 개념이 다르다는 것은 모델링 방식도 다르다는 뜻이다.

Topic 모델: 생성 모델 또는 임베딩 클러스터링

Topic Modeling은 레이블 없이도 작동한다. 대표적인 두 방법을 보자.

LDA (Latent Dirichlet Allocation)

문서를 복수의 주제가 섞인 확률적 혼합으로 모델링한다. 각 주제는 단어들의 분포로 표현된다.

문서 = [주제A × 0.6] + [주제B × 0.3] + [주제C × 0.1]
주제A = {결제: 0.3, 요금: 0.2, 청구: 0.15, ...}

데이터에 레이블이 없어도 단어의 공출현 패턴만으로 주제를 발견한다. 해석 가능성이 높지만 짧은 텍스트(발화 수준)에서는 성능이 떨어진다.

BERTopic

SBERT로 문서를 임베딩한 뒤, UMAP으로 차원을 줄이고 HDBSCAN으로 클러스터링한다. 마지막으로 c-TF-IDF로 클러스터를 대표하는 단어를 추출한다. 짧은 텍스트와 현대적인 코퍼스에 적합하다.

공통점은 **비지도(unsupervised)**라는 것이다. 레이블을 미리 정의하지 않아도 데이터에서 주제 구조를 발견한다.

Intent 분류: 판별 모델

Intent Classification은 지도 학습이 기본이다. 사전에 Intent를 정의하고 레이블링된 데이터로 모델을 훈련한다.

BERT 기반 방식이 현재 표준이다. [CLS] 토큰의 표현을 classification head에 넘겨 Intent를 예측한다. 실무에서는 Intent 분류와 Slot(Entity) 추출을 동시에 수행하는 Joint 모델을 많이 사용한다.

입력: "서울에서 내일 부산 가는 기차 예약해줘"
    ↓ Joint BERT
Intent: book_train
Slots: {출발지: 서울, 목적지: 부산, 날짜: 내일}

Slot이 없으면 Intent만으로는 시스템이 할 일을 완전히 결정할 수 없다. Intent는 항상 Slot과 함께 설계해야 한다.

두 모델의 근본 차이

항목Topic 모델Intent 분류
학습 방식비지도 가능지도 학습 필수
레이블사후 발견사전 정의
출력주제 분포 또는 주제 레이블Intent 레이블 + Slots
처리 단위문서 / 긴 텍스트발화 / 단일 쿼리
다중 할당자연스러움제한적

3. 계층이 있다

두 개념이 대칭적인 것은 아니다. Topic이 상위 계층, Intent가 하위 계층이다.

Topic: billing (청구)
  ├── Intent: request_refund      (환불 요청)
  ├── Intent: check_invoice       (청구서 확인)
  └── Intent: dispute_charge      (요금 이의 제기)

Topic: account (계정)
  ├── Intent: reset_password      (비밀번호 재설정)
  ├── Intent: update_email        (이메일 변경)
  └── Intent: unlock_account      (계정 잠금 해제)

하나의 Topic 아래 여러 Intent가 존재한다. 이 관계는 설계 원칙이기도 하고, 연구에서도 확인된 구조다. Intent Discovery 연구에서는 Topic Modeling 결과를 상위 프레임으로 삼아 세밀한 Intent를 세분화하는 파이프라인을 사용한다.

이 계층 구조가 중요한 이유는 두 가지다. 첫째, Topic은 "어떤 영역의 문제인가"를 빠르게 파악하는 필터로 쓸 수 있다. 둘째, Intent는 그 영역 안에서 "구체적으로 무엇을 해야 하는가"를 결정하는 트리거로 쓸 수 있다. 둘을 분리하면 라우팅과 처리 로직이 명확히 분리된다.


4. 섞으면 어떤 일이 생기는가

Topic과 Intent를 혼용하면 세 가지 문제가 발생한다.

문제 1: 자동화 응답 불가

billing을 Intent로 정의하면 시스템은 "청구 영역이군" 하는 것만 알 뿐, 무엇을 해야 하는지 알 수 없다. request_refund라는 Intent가 있어야 환불 처리 플로우가 트리거된다.

Topic 레이블을 Intent 자리에 두면 분류 모델이 작동해도 시스템이 멈춘다.

문제 2: Taxonomy 붕괴

같은 수준에 Topic과 Intent가 섞이면 경계가 모호해진다. account(Topic)와 reset_password(Intent)가 동급 레이블로 있으면, reset_passwordaccount 아래 있어야 하는지 독립 레이블인지 어노테이터마다 다르게 판단한다. 레이블 간 일치도가 낮아지고 데이터 품질이 떨어진다.

문제 3: 모델 선택 혼란

Topic 모델(LDA, BERTopic)과 Intent 분류 모델(BERT, Joint BERT)은 아키텍처가 완전히 다르다. 무엇을 분류하는지가 명확하지 않으면 어떤 모델을 써야 하는지도 결정할 수 없다.


5. 구분하는 실용적 원칙

두 개념을 실무에서 구분하는 가장 쉬운 원칙이 있다.

Topic은 명사형 영역이다. Intent는 동사형 행동이다.

Topic  (명사형): billing / shipping / account / product
Intent (동사형): request_refund / track_order / reset_password / add_to_cart

레이블을 정의할 때 이 원칙으로 먼저 검사한다. 명사형으로 끝나면 Topic, 동사형(동사+목적어) 형태면 Intent다.

두 번째 검사는 시스템 행동 트리거 여부다. 이 레이블이 결정되면 시스템이 구체적인 행동을 수행할 수 있는가? 그렇다면 Intent다. 어떤 영역인지만 알 수 있다면 Topic이다.


6. 정리

Topic과 Intent가 자주 혼동되는 이유는 같은 발화에서 동시에 추출할 수 있기 때문이다. 그러나 두 개념이 답하는 질문이 다르고, 사용하는 모델이 다르고, 계층이 있다.

  • Topic: "관한" 것. 비지도 가능. 명사형 영역. 상위 계층.
  • Intent: "하려는" 것. 지도 학습. 동사형 행동. 하위 계층. Slot과 함께.

두 개념을 같은 레이블 목록에 섞으면 Taxonomy가 붕괴하고, 자동화 응답이 멈추고, 데이터 품질이 떨어진다.

레이블을 설계할 때 먼저 이 질문을 던지는 것으로 충분하다. "이것은 무엇에 관한가, 아니면 무엇을 하려는가?"


Evidence: [[evidence/topic-vs-intent/evidence__topic-vs-intent]]
Ontology: TI1(NLP Topic) · TI2(NLP Intent) · TI3(Topic-Intent 계층) — graph-ontology.yaml