5.9.3 감성 분석기: 특정 단어 리스트 기반의 긍정/부정 분류 정확도 검증 매커니즘

5.9.3 감성 분석기: 특정 단어 리스트 기반의 긍정/부정 분류 정확도 검증 매커니즘

수만 건의 리뷰나 소셜 미디어 피드를 실시간으로 분석하여 긍정(Positive), 부정(Negative), 중립(Neutral)으로 라벨링하는 감성 분석기(Sentiment Analyzer)는 비즈니스의 평판 관리를 위한 핵심 인프라다.

하지만 감성 분석만큼 테스트하기 까다로운 도메인도 없다. “이 제품 참 골때리네요“라는 문장은 관점에 따라 극찬일 수도, 치명적인 비난일 수도 있기 때문이다. 언어의 모호성 앞에 놓인 오라클의 임무는 모든 문장의 철학적 뉘앙스를 완벽히 잡아내는 것이 아니다. 오라클의 임무는 **“비즈니스적으로 절대 놓쳐서는 안 될 치명적인 단어(Toxic/Critical Word)가 등장했을 때, 모델이 확실하게 정해진 알람을 울리는가?”**를 결정론적으로 검증하는 것이다.

1. 하드코딩된 트리거 단어(Trigger Word) 사전 구축

감성 분석기의 유닛 테스트는 도메인 전문가가 엄선한 ‘절대 조건’ 단어 리스트를 픽스처(Fixture)로 주입하는 것에서 시작된다. 문장의 다른 부분이 아무리 긍정적이더라도, 이 단어 중 하나라도 포함되어 있다면 LLM은 반드시 ‘부정(NEGATIVE)’ 혹은 ‘위험(CRITICAL)’ 상태를 반환해야만 한다.

# 테스트 환경에서 사용하는 비즈니스 정책 기반의 트리거 단어 사전
CRITICAL_NEGATIVE_WORDS = [
    "소비자보호원", "고발", "쓰레기", "최악", "환불", "욕설"
]

MANDATORY_POSITIVE_WORDS = [
    "최고", "인생템", "강력 추천"
]

2. 긍정/부정 판단의 역전 현상 차단 오라클

모델이 “소비자보호원에 고발하기 전에 당장 환불해라. 하지만 디자인은 예쁘네“라는 문장을 읽었다고 가정해 보자. LLM은 ’디자인은 예쁘다’는 뒤쪽의 문맥에 가중치를 두어 이 리뷰를 ’중립’이나 ’긍정’으로 분류하는 환각(Hallucination)을 일으킬 수 있다.

이때 결정론적 오라클은 원문(Raw Input)과 모델의 출력(Classification)을 동시에 거틀어 쥐고, 사전에 정의된 트리거 단어 사전을 바탕으로 강력한 단어 기반 분류 검증을 수행한다.

import pytest

def test_sentiment_classification_hard_rules(llm_sentiment_analyzer):
    # 비즈니스적으로 치명적인 단어가 포함된 픽스처
    review_input = "포장은 정말 예쁘고 배송도 빨랐어요. 근데 안에 벌레가 있네요. 최악입니다."
    
    # LLM의 분류 결과 예측 (예: "POSITIVE", "NEUTRAL", "NEGATIVE")
    llm_classification = llm_sentiment_analyzer.analyze(review_input)
    
    # 결정론적 오라클: 치명적 단어가 원문에 존재하는가?
    contains_critical_word = any(word in review_input for word in CRITICAL_NEGATIVE_WORDS)
    
    # 만약 원문에 치명적 단어가 있다면, LLM은 무슨 일이 있어도 'NEGATIVE'를 뱉어야 한다.
    if contains_critical_word:
        assert llm_classification == "NEGATIVE", \
            f"보안/정책 오류: 치명적인 단어가 포함된 리뷰를 '{llm_classification}'으로 잘못 분류했습니다."

3. 확률론 엔진을 둘러싼 결정론적 방화벽(Deterministic Firewall)

이러한 방식의 오라클 설계는 본질적으로 확률에 기반하여 작동하는 LLM 엔진 주위에 규칙 기반(Rule-based)의 방화벽을 두루는 것과 같다.

LLM은 트리거 단어가 없는 90%의 모호한 일상적 문장들, 예를 들어 “그럭저럭 쓸 만해요”, “조금 아쉽지만 나쁘지 않네요“와 같은 문맥에서는 자신의 거대한 파라미터를 활용해 확률론적 추론을 자유롭게 수행한다. 유닛 테스트는 이 영역의 응답이 조금씩 흔들리는 것(Flaky)은 일정 부분 허용한다.

그러나 정책적으로 선을 그어둔 나머지 10%의 극단적 경계(Edge Case) - 가령 고객의 분노나 치명적 결함을 암시하는 단어 - 에 도달하는 순간, 결정론적 오라클 시스템이 개입하여 LLM의 변덕을 억누르고 오직 NEGATIVE라는 정해진 결괏값만을 산출하도록 강제한다.

기계의 직관(LLM)이 인간의 상식을 배신할 때, 비즈니스의 최후의 보루가 되는 것은 결국 가장 단순하고 원시적인 ‘단어 찾기’ 기반의 결정론적 오라클이다.