3.3.1.1 복합 질문의 분해와 개별 검증 가능한 단위 설정
인간이 기계와 상호작용하기 위해 던지는 자연어 질의(Natural Language Query)는 본질적으로 매우 압축적이고 다의적이다. 엔터프라이즈 환경의 지식 근로자(Knowledge Worker) 사용자는 챗봇 인터페이스에서 단일 목적의 질문을 던지지 않고, 종종 “문서 A와 B의 이번 분기 매출 실적을 비교하고, 그중 더 실적이 높은 옵션의 핵심 성공 원인을 3가지로 불릿 포인트(Bullet Point) 형식으로 요약해서 영어로 번역해 줘“와 같이 여러 개의 서로 다른 차원의 지시 사항(Instructions)이 복잡하게 중첩된 **‘복합 질문(Compound Query)’**을 무심코 던진다.
이러한 치밀하지 못한 복합 질문 하나의 텍스트 덩어리(Text Chunk) 전체를, LLM을 검증하는 단 하나의 거시적인 평가 기준(Macro-level Rubric)으로 퉁쳐서 묶어버리면, 오라클 시스템은 각 지시 사항(비교 분석, 원인 도출, 포맷 제한, 번역 등)의 개별 달성 여부를 논리적으로 분리해서 판독(Resolution)할 수 없는 심각한 과소적합 평가(Under-fitted Evaluation)의 블랙박스(Black-box)에 빠지게 된다.
결정론적이고 엄격한 정답지를 설계하는 가장 첫 번째 소프트웨어 공학적 아키텍처 단계는, 이 복잡하게 엉켜있는 사용자 입력 문장을 **다시는 쪼개질 수 없는 개별 검증 가능한 최소 단위(Individually Verifiable Atomic Units)**로 가차없이 분해(Decomposition)하는 전처리(Preprocessing) 과정이다.
1. 질문 분해(Query Decomposition)의 3차원 설계 축
복합 질문을 해체하여 검증을 위한 그라운드 트루스(Ground Truth)를 설계할 때는, 일반적으로 다음의 세 가지 독립된 직교하는(Orthogonal) 축을 기준으로 삼아 각각의 원자적(Atomic) 정답지를 도출하고 매핑해야 한다.
- 사실성(Factual) 단위 - 지식 검색의 무결성 검증: AI가 환각(Hallucination) 없이 외부 지식 소스(RAG)나 주어진 문맥(Context)에서 올바른 팩트 정보를 적출하여 가져왔는가를 엄격히 묻는다.
- 원자적 검증 오라클 예시: Assert(“문서 A의 Q1 매출이 100만 달러로 본문에 정확히 명시되었는가?”), Assert(“문서 B의 Q1 매출이 120만 달러로 표기되었는가?”)
- 논리/추론(Logical/Reasoning) 단위 - 인과관계의 정합성 검증: AI가 올바른 사실 정보를 바탕으로, 사전에 지시받은 비즈니스 로직(비교, 대조, 연역 등)을 오작동 없이 수행하여 타당한 결론을 도출했는가를 묻는다.
- 원자적 검증 오라클 예시: Assert(“매출 비교 로직의 결과로서, 120만 달러인 B를 최종적으로 더 높은 실적 옵션으로 올바르게 판단 및 선택하여 식별자(
WINNER: B)를 출력 서킷에 위치시켰는가?”)
- 구조/형식(Structural/Formatting) 단위 - 기계적 지시의 준수 검증: AI가 인간이 프롬프트로 강제한 시각적/구조적 출력 형태(제약 사항)를 파서(Parser)가 읽을 수 있도록 엄격히 준수했는가를 묻는다.
- 원자적 검증 오라클 예시: Assert(“성공 원인을 설명하는 텍스트 블록이 정확히 3개의 마크다운 불릿 포인트(
-또는*) 배열로 구성되어 있는가?”), Assert(“모든 출력 텍스트가 ISO-639-1 규격에 맞는 영문(English) 텍스트로 치환 번역되었는가?”)
2. 원자적 검증 단위(Atomic Verification Units) 적용의 공학적 이점
이처럼 복잡한 복합 질문 1개를 4~5개의 독립적이고 검증 가능한 단위 정답지로 갈기갈기 분리하여 통합 테스트 파이프라인(Integration Test Pipeline)의 어설션 리스트(Assertion List)를 재구성하면, 전체 AI 시스템을 관리함에 있어 다음과 같은 압도적이고 강력한 엔지니어링 이점을 얻는다.
- 디버깅의 극한적 세분화 (Granular Debugging): CI/CD 테스트가 야간에 실패(Fail)했을 때, “AI 모델이 A와 B의 비교 분석 프롬프트 처리에 실패했다“는 개발자에게 아무런 영감을 주지 못하는 막연하고 게으른 오류 로그(Error Log) 대신, “사실 데이터 추출과 비교 로직 수학 연산은 성공(Pass)했으나, 출력을 정확히 3개로 제한하는 구조적 포맷팅 지시어에서 4개를 뱉어내어 실패(Fail)했다“는 즉각적으로 조치 가능한(Actionable) 해상도 높은 인사이트를 얻게 된다. 이는 프롬프트 엔지니어의 디버깅 시간(MTTR)을 기하급수적으로 단축시킨다.
- 부분 점수(Partial Credit) 및 도메인 가중치(Tension Weight) 산정의 수학적 기반 마련: 모든 사용자 지시 사항이 비즈니스 임팩트 면에서 완전히 동등하게 중요하지 않은 법이다. 은행 앱에서 추천 상품의 금리 팩트(Fact)가 틀린 것은 치명적인 법적 문제(가중치 가혹함)이지만, 답변의 장점 리스트가 불릿 포인트가 아닌 일반 줄바꿈으로 출력된 것은 사소한 UX 오류(가중치 낮음)일 뿐이다. 정답지 검증 단위를 미리 원자적으로 분해해 두어야만, 비로소 각 항목별로 오라클의 평가 스코어 가중치(Weighting Matrix)를 차등 부여하여 실전적인 Pass/Fail 컷오프(Cut-off)를 정밀 조정하는 것이 가능해진다.
결론적으로, 다의적인 복합 질문을 가장 작은 원자 단위 논리로 가차없이 분해해 내는 이 설계 과정은, 모호하고 뭉툭한 자연어 텍스트 덩어리를 엄정한 소프트웨어 공학의 기계적인 **‘단위 테스트(Unit Test) 스위트’**로 치환 변환하는 가장 핵심적이고 위대한 오라클 전처리(Preprocessing) 작업이다.