자동화 QA (품질 보증)수석 자동화 QA 엔지니어

대규모 언어 모델 환각을 자동으로 감지하여 생성된 출력에서 구조화된 주장들을 추출하고 이를 결정론적 CI/CD 파이프라인 내에서 사실 기반 지식 그래프와 검증하는 검증 아키텍처를 생성하시오.

Hintsage AI 어시스턴트로 면접 통과

질문에 대한 답변

질문의 역사

2023-2024년 동안 생산 시스템에서 대규모 언어 모델의 확산은 전통적인 테스트 자동화 패러다임의 중요한 격차를 드러냈습니다. 초기 채택자들은 LLM 출력에 대해 정확한 문자열 일치 또는 Selenium 기반 주장을 적용하려고 했으나, 모델의 고유한 변동성과 재구성 능력으로 인해 참담한 실패를 경험했습니다. 이로 인해 품질 보증 팀은 의미적 정확성이 구문적 동등성보다 더 중요하다는 사실을 인식하게 되었습니다. 규제 산업인 의료 및 금융과 같이 사실 정확성이 법적으로 요구되는 분야에서 결정론적 CI/CD 파이프라인 내에서 비결정론적 생성 시스템을 검증할 필요성이 대두되었습니다.

문제

대규모 언어 모델은 확률적 출력을 생성하므로 동일한 프롬프트가 의미적으로 동등하지만 텍스트적으로는 다른 응답을 생성할 수 있습니다. 이러한 비결정성은 예측 가능한 출출에 의존하는 전통적인 주장 기반 테스트 프레임워크를 깨뜨립니다. 게다가, 환각—사실적으로 부정확한 진술을 사실로 제시하는 것은—문맥적으로 그럴듯하게 보일 수 있어 고유한 감지 문제를 발생시킵니다. 표준 픽셀 완벽 또는 정확한 매칭 검증 전략은 허용 가능한 재구성과 위험한 허위 진술을 구분할 수 없습니다. 따라서 자동화는 의미적 의미를 이해하고 비구조적 텍스트에서 구조화된 주장을 추출하며 이를 사실 기반 지식베이스와 비교하여 배포 게이트를 위한 반복 가능한 실행이 가능해야 합니다.

해결책

상징적 추출과 신경 평가를 결합한 하이브리드 검증 프레임워크를 설계하십시오. 첫째, 테스트 실행 간 결정론적 실행을 보장하기 위해 temperature=0 Enforcement 및 Redis를 통한 의미적 캐싱을 구현하십시오. 둘째, spaCy 또는 BERT 모델을 사용하여 LLM 출력에서 사실적 삼중항을 추출하는 명명된 개체 인식을 적용하십시오. 셋째, 사실 기반을 포함하는 구조화된 지식 그래프(예: Neo4j)에 대해 추출된 주장을 검증하고, 수치 값에 대해 허용 오차 기반 비교를 사용하고 범주형 데이터에 대해서는 정확한 일치를 사용하십시오. 넷째, 주관적 품질 평가를 위해 JSON 스키마 제약을 가진 LLM-as-a-Judge 폴백을 구현하십시오. 마지막으로, 모델 드리프트를 코드 회귀로부터 분리하기 위해 재시도 로직과 자세한 텔레메트리를 갖춘 pytest 픽스처에 이 파이프라인을 래핑하십시오.

import pytest import spacy from knowledge_graph import verify_claim # 가상의 KG 클라이언트 nlp = spacy.load("en_core_web_sm") def extract_claims(text): doc = nlp(text) claims = [] for ent in doc.ents: if ent.label_ in ["MONEY", "PERCENT"]: claims.append({"type": ent.label_, "value": ent.text, "context": ent.sent.text}) return claims def test_llm_hallucination(): prompt = "프리미엄 저축의 APY는 무엇인가요?" response = llm_client.generate(prompt, temperature=0.0) claims = extract_claims(response) for claim in claims: if claim["type"] == "PERCENT": is_valid = verify_claim( product="프리미엄 저축", attribute="APY", value=claim["value"], tolerance=0.1 ) assert is_valid, f"환각 발견됨: {claim['value']}"

생활 속 상황

중소형 핀테크 회사는 대출 상품 및 이자율에 대한 질문에 답변하는 RAG 기반 고객 지원 챗봇을 배포했습니다. 베타 테스트 중, LLM은 "골드 론의 APR은 무엇인가요?"라는 질문에 대해 "5.5%"로 정확히 응답했지만, 다른 경우에는 "신용 확인 없이 4.9%"라고 환각을 발생시켰고, 지식 기반에서는 700 이상의 신용 점수 요건을 명확히 명시하고 있었습니다. 전통적인 API 계약 테스트는 엔드포인트 가용성을 검증했지만, 생성된 재무 조언의 의미적 정확성을 검증하는 메커니즘이 없었습니다. 팀은 모델이 공식 제품 데이터베이스에 없는 이자율이나 조건을 생성할 경우 배포를 방지할 수 있는 자동화된 게이트가 필요했습니다.

솔루션 1: 키워드 기반 검증과 정규 표현식

팀은 처음에 달러 금액과 백분율을 추출하기 위해 Python 정규 표현식 패턴을 구현한 다음, 이러한 값이 제품 카탈로그의 어디에서든 존재하는지 확인했습니다.

장점: re 모듈을 사용하여 간단히 구현할 수 있고, 100ms 미만의 빠른 실행 및 결정론적 행동을 가집니다.

단점: 이 접근 방식은 높은 허위 긍정 비율의 문제로 고통받았습니다—표준 비율 표에 특정 문자열이 존재하지 않기 때문에 "0% 도입 APR"을 언급하는 유효한 응답을 플래그로 표시했습니다. 또한 승인된 숫자를 잘못된 컨텍스트에서 사용하는 환각을 잡아내지 못했습니다 (예: 신용 카드 제품의 주택 담보 대출 금리를 명시하는 경우).

솔루션 2: 승인된 문서에 대한 임베딩 유사성 검사

그들은 LLM 응답과 공식 제품 문서의 벡터화된 버전 간의 코사인 유사성을 계산했습니다. 유사성이 0.85를 초과하면 테스트가 통과했습니다.

장점: 재구성 및 동의어 사용에 강력하며, 유지 관리 오버헤드가 적고 문자열 일치보다 의미의 뉘앙스를 포착하는 데 더 좋습니다.

단점: "5.5% APR"과 "4.9% APR"이 실질적으로 다른 금융 용어를 나타내지만 거의 유사한 임베딩을 가지기 때문에 숫자 환각은 여전히 감지되지 않았습니다. 임베딩 계산의 비결정적 성격은 또한 CI/CD에서 반짝이는 테스트를 도입했습니다.

솔루션 3: 구조화된 주장 추출 및 지식 그래프 검증 (선택된)

팀은 실체와 관계를 추출하기 위해 spaCy 파이프라인을 구현한 다음, 각 주장을 사실 기반과 검증하기 위해 Neo4j 지식 그래프를 쿼리했습니다. 수치 주장은 허용 범위를 사용하고, 범주형 데이터는 정확한 일치를 요구했습니다.

장점: 필드 수준에서 사실 오류를 정확하게 감지할 수 있으며, 언어적 변이에 면역이며, 배포 게이트에 적합한 결정론적 실행이 가능합니다. 이 시스템은 "2.5% APY" (정확함)와 "2.4% APY" (환각)를 구별할 수 있었고, 임베딩 유사성에서는 이를 할 수 없었습니다.

단점: NER 모델 및 지식 그래프 스키마 유지에 대한 높은 초기 설정 비용과 지속적인 사실 기반 데이터의 관리가 필요했습니다.

팀은 금융 규정이 광고된 비율의 절대 정밀도를 요구했기 때문에 솔루션 3을 선택했습니다. 선택된 아키텍처는 온도를 0으로 설정하고 Redis 캐싱을 사용하여 불확실성을 제거했으며, 모호한 품질 평가를 위해 LLM-as-a-Judge를 유일하게 사용했습니다.

결과적으로 환각이 생산에 노출되는 비율이 94% 감소하였고, 사실 오류를 도입하는 배포를 자동으로 차단할 수 있는 CI/CD 파이프라인이 구축되었습니다. 키워드 일치의 경우 허위 긍정 비율이 35%에서 2%로 감소하였으며, 공격적인 지식 그래프 쿼리 캐싱을 통해 대화 전환당 테스트 실행 시간은 3초 이하로 유지되었습니다.

후보자들이 자주 놓치는 점

온도를 0으로 설정했을 때 LLM 출력의 비결정성을 어떻게 처리하며, 서로 다른 GPU 아키텍처 간의 하드웨어 수준 부동 소수점 변동이 발생하여 토큰 확률 분포가 어떻게 다를 수 있는가?

temperature=0으로 설정해도 CUDA 최적화 및 GPU 드라이버 차이로 인해 softmax 계산에서 미세한 변동이 발생할 수 있고, 때때로 낮은 확률 결정 경계에서 다른 토큰 선택이 발생하게 됩니다. 결정론적 CI/CD 실행을 보장하기 위해 Redis를 사용하여 프롬프트와 맥락의 SHA-256 해시로 키를 제공하는 의미적 캐싱을 구현하십시오. 첫 번째 실행은 모델을 호출하고 응답을 캐시합니다. 이후 같은 프롬프트가 호출되면 캐시된 값을 반환합니다. 대안적으로, 응답 정규화(response canonicalization)를 사용하여 출력을 표제어로 변환하고 비교 전에 개체를 정규 식별자로 대체하십시오. 중요한 테스트의 경우 자가 일관성 투표(self-consistency voting)를 사용하여 프롬프트를 다섯 번 실행하고 응답을 의미적 유사성에 따라 클러스터링하여 다수 클러스터를 해당 테스트 세션의 정통 진리로 간주하십시오.

자동화된 테스트에서 기본 LLM의 출력을 평가하는 데 두 번째 LLM을 사용하는 것(LLM-as-a-Judge)은 왜 문제가 되며, 평가자의 일관성 문제를 완화하는 방법은 무엇인가?

LLM을 평가자로 사용하면 제품 결함이 아닌 평가자 환각으로 인해 테스트가 실패하는 메타 플래키니스가 발생합니다. 평가자는 실행마다 기준을 불일치하게 적용하거나 평가 기준을 환각할 수 있어, 두 시스템이 동시에 환각을 발생시키는 순환 의존성이 생성될 수 있습니다. 위험을 완화하기 위해 평가자를 JSON 스키마 또는 함수 호출을 사용한 구조적 출력에 제한하여 개방형 추론이 아닌 부울 또는 범주형 응답을 강요하십시오. 명확한 버전 관리된 루브릭에 근거하여 평가를 진행하십시오. 제공자가 가중치를 업데이트할 때 드리프트를 방지하기 위해 평가자 모델을 버전 잠금하고, 평가자의 정확성을 지속적으로 모니터링하기 위해 인간 검증 평가의 "골든 데이터 세트"를 유지하십시오.

환각(LM이 사실을 창출하는 것)과 오래된 맥락(RAG 시스템이 구식 문서를 검색하는 것)을 어떻게 구분하며, 이 구분이 테스트 자동화에서 왜 중요한가?

후보자들은 종종 생성 검증과 검색 검증을 혼동합니다. RAG 파이프라인이 "APR은 5%"라고 언급한 2022년 문서를 검색하고 2024년 사실이 "6%"인 경우, LLM이 "5%"를 인용하는 것은 환각이 아닙니다—나쁜 데이터를 정확하게 사용하고 있는 것입니다. 자동화는 먼저 검색된 문서를 사실 기반과 검증한 다음 LLM이 제공된 맥락을 준수하는지를 검증하여 파이프라인 경계를 테스트해야 합니다. 각 주장에 대한 원본 문서 ID를 인용하도록 LLM에 요청하여 증거 테스트를 구현하고, 그러고 나서 해당 ID가 검색 세트에 존재하고 주장된 사실이 포함되어 있는지 확인하십시오. 이는 실패가 검색 노후화에서 비롯되었는지 생성 환각에서 비롯되었는지를 분리할 수 있게 하여 정밀한 수정을 가능하게 합니다.