5.6.2 추론 단계와 최종 답변 간의 논리적 모순 탐지 기법

5.6.2 추론 단계와 최종 답변 간의 논리적 모순 탐지 기법

거대 언어 모델(LLM)이 생성하는 환각(Hallucination) 중 가장 탐지하기 까다롭고 위험한 유형은 ’스스로의 추론을 배신하는 결론’을 내리는 경우다. 즉, 중간 과정(Intermediate Steps)이나 Chain-of-Thought (CoT) 단계에서는 완벽한 논리 전개와 올바른 팩트를 나열했음에도 불구하고, 정작 맨 마지막 요약이나 최종 답변(Final Answer) 도출 시에 엉뚱한 결론으로 점프해버리는 현상이다.

이러한 논리적 단절(Logical Disconnect) 현상을 단위 테스트 영역에서 기계적으로 솎아내기 위해서는, 단일 출력 텍스트를 검증하는 고전적인 방식을 넘어 모델의 ‘생각의 경로’ 전체를 파싱하여 인과 관계를 따지는 다중 검사 오라클(Multi-step Verification Oracle)이 요구된다.

1. 전제(Premise)와 결론(Conclusion)의 강제 분리 파싱

논리적 모순을 탐지하기 위한 오라클 아키텍처의 첫 시발점은 출력물의 물리적 해체다.

테스트 대상이 되는 프롬프트는 애초부터 모델결과를 <Thinking>(또는 <Reasoning>) 태그와 <Answer> 태그로 엄격히 나누어 출력하도록 강제 설계되어야 한다. 단위 테스트 코드는 정규표현식이나 구조화된 파서를 이용해 두 영역을 각각 독립된 변수로 캡처(Capture)한다.

# Python 테스트 코드에서의 논리 파싱 예시
def test_logical_consistency_in_decision_making():
    prompt = "사용자 등급이 VIP이고 장바구니 총액이 10만원 이상이면 배송비는 무료입니까?"
    response = llm.generate(prompt)
    
    # 파싱: 추론부와 결론부를 분리
    thinking_part = extract_tag_content(response, "Thinking")
    answer_part = extract_tag_content(response, "Answer")
    
    # 중간 검증: 조건 만족 인지 여부 확인
    assert "VIP" in thinking_part and "10만원 이상" in thinking_part, "조건 분석 누락"
    
    # 최종 결론과의 정합성 검증
    # 논리적으로 "무료"라는 결론이 도출되어야 함을 단언(Assert)
    assert answer_part.strip().lower() in ["예", "무료", "yes", "free"], f"논리 모순 발생: 추론부({thinking_part})와 결론부({answer_part}) 불일치"

2. NLI (Natural Language Inference) 모델을 활용한 교차 검증

정규표현식 기반의 Assert 문법만으로는 복잡한 자연어 추론의 모순을 완벽히 잡아내기 어렵다. 이때 강력한 대안으로 대두되는 기법이 ‘평가용 AI(LLM-as-a-Judge)’ 또는 경량화된 NLI(자연어 추론) 토이 모델을 오라클 시스템에 삽입하는 것이다.

NLI 모델은 입력된 ’전제(Premise)’가 ’가설(Hypothesis)’을 참(Entailment), 거짓(Contradiction), 중립(Neutral) 중 어느 방향으로 이끌고 있는지 판별하는 데 특화되어 있다.

우리의 테스트 오라클 파이프라인에서:

  1. 전제(Premise): 파싱된 <Thinking> 블록의 텍스트
  2. 가설(Hypothesis): 파싱된 <Answer> 블록의 텍스트

이를 NLI 모델에 투입하여 Contradiction(모순) 스코어가 특정 임계치(Threshold)를 초과할 경우, 해당 단위 테스트를 실패(Fail) 처리한다. 이는 텍스트의 표면적 일치 여부를 넘어, 의미론적인 충돌(Semantic Collision)을 자동화된 방식으로 감지해 내는 획기적인 오라클 구축망이다.

3. 중간 상태(State)의 수학적 불변식(Invariant) 추적

수치 계산이나 데이터 전처리 로직을 다룰 때, 논리적 모순은 곧 ’보존되어야 할 값의 증발 혹은 왜곡’을 의미한다.

예를 들어, “A 계좌에서 50원을 출금하여 B 계좌로 이체하라“는 지시를 수행하는 프롬프트를 테스트할 경우, CoT 중간 단계 텍스트에서 파싱된 ’A의 출금 후 잔액’과 ’B의 입금 후 잔액’의 합계가, 항상 ’초기 총잔액’과 동일해야 한다는 수학적 불변식(Mathematical Invariant)을 오라클로 설정할 수 있다.

만약 <Thinking> 단계에서 계산된 총액과 <Answer> 단계에서 최종 보고한 시스템 상태의 총액이 일치하지 않는다면, 이는 전형적인 수리적 환각이자 논리 분리 현상이다. 테스트 코드는 이 숫자들을 정규식으로 강제 추출하여 사칙연산을 수행함으로써, 모델의 추론 과정 어딘가에 숨어든 치명적인 연산 모순을 결정론적으로 파괴하고 방어해 낸다.