Convince-X ConvinceX
← Stories

AI 할루시네이션을
0으로 만드는 3단계

AI에게 "이 이력서를 JD와 비교 분석해줘"라고 시키면, 놀라울 정도로 그럴듯한 결과를 줍니다. 문제는, 절반이 거짓말이라는 겁니다.

Candidate Analyzer를 만들면서 가장 먼저 부딪힌 벽이 이것이었습니다. AI가 분석 결과를 만들어내는데, 이력서에 없는 경력을 추가하거나, JD에 없는 요구사항을 만들어서 비교합니다. 겉보기에는 전문적이고 논리적인데, 팩트가 아닙니다.

채용 분석에서 팩트가 아닌 정보가 섞이면 어떻게 될까요? 리크루터가 잘못된 근거로 후보자를 추천하게 됩니다. 그건 프로덕트가 아니라 사고입니다.

• • •

한 번에 시키면 거짓말을 합니다

처음에는 단순했습니다. AI에게 이력서와 JD를 동시에 주고, "이 후보자가 이 포지션에 적합한지 분석해줘"라고 한 번에 요청했습니다.

결과는 인상적이었습니다. 강점, 약점, 매칭률, 추천 코멘트까지 깔끔하게 정리된 리포트가 나왔습니다. 리크루터 경력 12년인 제가 봐도 "오, 괜찮은데?"라고 느낄 정도였습니다.

그런데 이력서를 다시 꺼내서 대조해보니, 문제가 보이기 시작했습니다.

실제 발생한 할루시네이션 사례

사례 1: 이력서에 "Python 3년"이라고 되어 있는데, AI가 "Python 및 ML 파이프라인 5년 경험"으로 부풀려서 분석. ML 경험은 이력서에 한 줄도 없었습니다.

사례 2: JD에 "우대사항"으로 적힌 게 분석 결과에서는 "필수 요구사항"으로 둔갑. 후보자가 우대사항을 충족하지 못한 걸 "핵심 미스매치"로 판정.

사례 3: 이력서에 "팀 리드 경험"이 없는데, "팀 프로젝트 참여" 문구를 보고 "리더십 경험 보유"로 해석. 현장에서 이 차이는 결정적입니다.

왜 이런 일이 일어날까요? AI는 "그럴듯한 답"을 만들도록 학습되어 있기 때문입니다. 이력서와 JD를 동시에 처리하면, AI는 둘 사이의 간극을 메우려고 합니다. 그 과정에서 없는 정보를 생성합니다. AI 입장에서는 "이 후보자가 JD에 잘 맞는다"라는 결론을 뒷받침하기 위해 근거를 만들어내는 겁니다.

AI는 빈칸을 채우도록 만들어졌습니다. 문제는, 채용 분석에서 빈칸은 "없는 정보"이지 "채워야 할 정보"가 아니라는 겁니다.

• • •

3단계로 나눈 이유

해결책은 의외로 단순했습니다. 한 번에 시키지 않으면 됩니다.

AI에게 "분석해줘"라고 한 번에 시키면, AI는 추출/구조화/비교/판단을 한꺼번에 하려고 합니다. 이 과정에서 각 단계의 경계가 무너지고, 입력 데이터와 출력 데이터가 섞입니다. "이력서에서 읽은 것"과 "AI가 만들어낸 것"의 구분이 사라지는 겁니다.

그래서 파이프라인을 3단계로 분리했습니다. 각 단계는 독립적으로 실행되고, 이전 단계의 출력만 다음 단계의 입력으로 사용합니다.

1
팩트 추출
이력서 → 구조화된 데이터
극도로 보수적 설정
2
JD 구조화
JD → 요구사항 매트릭스
극도로 보수적 설정
3
매칭 분석
데이터 vs 매트릭스
분석 최적화 설정

핵심 원칙은 하나입니다. 각 단계에서 AI가 할 수 있는 일을 극단적으로 제한합니다. Stage 1에서는 "추출만" 합니다. 판단하지 않습니다. Stage 2에서도 "구조화만" 합니다. 해석하지 않습니다. 판단과 해석은 Stage 3에서만 허용하되, Stage 1과 2의 출력 데이터만 사용하도록 강제합니다.

• • •

Stage 1: 팩트만 추출하기

첫 번째 단계는 이력서에서 팩트만 추출하는 것입니다. 여기서 "팩트"란, 이력서에 명시적으로 적혀 있는 정보를 말합니다.

Stage 1의 규칙

하는 것: 이름, 경력, 기술 스택, 학력, 자격증 등 이력서에 적힌 정보를 구조화된 JSON으로 변환

하지 않는 것: 해석, 추론, 판단, 보완. "이 사람은 리더십이 있을 것 같다" 같은 추론 금지

Temperature: 극도로 보수적인 설정 (창의성 최소, 정확성 최대)

극도로 보수적인 Temperature 설정은 AI에게 "절대 창의적으로 생각하지 마"라고 말하는 것과 같습니다. 이력서에 "Python 3년"이라고 적혀 있으면, 출력에도 정확히 "Python 3년"이 나옵니다. "Python 및 관련 라이브러리 활용 경험"으로 부풀리지 않습니다.

이 단계에서 AI가 원본 이력서에 없는 정보를 추가하면, 이후 모든 분석이 오염됩니다. 그래서 프롬프트에 명시적으로 강제합니다. "이력서에 명시되지 않은 정보는 절대 추가하지 마시오." 보수적인 Temperature와 이 프롬프트 조합이 Stage 1의 핵심입니다.

• • •

Stage 2: JD를 구조화하기

두 번째 단계는 JD(Job Description)를 구조화합니다. JD라는 문서는 사실 꽤 비정형적입니다. 어떤 회사는 bullet point로 깔끔하게 쓰고, 어떤 회사는 장문의 산문으로 쓰고, 어떤 회사는 필수와 우대를 구분하지 않습니다.

Stage 2는 이 다양한 형태의 JD를 일관된 요구사항 매트릭스로 변환합니다.

Raw JD (비정형)
"Python 경험자 우대. ML 파이프라인 설계 가능하신 분. 3년 이상. 커뮤니케이션 잘 되시는 분 선호. AWS 경험 필수. K8s 쓸 줄 아시면 좋겠습니다."
Stage 2 출력 (구조화)
필수: AWS 경험, 3년 이상 경력
우대: Python, ML 파이프라인, K8s
소프트: 커뮤니케이션
명시되지 않음: 학력, 산업군, 직급

여기서 중요한 건 "명시되지 않음" 카테고리입니다. JD에 학력 요구가 없으면 "명시되지 않음"으로 분류합니다. Stage 1 방식의 AI라면 "보통 이 정도 포지션이면 학사 이상이겠지"라고 추론해서 넣었을 겁니다. 하지만 Stage 2는 추론하지 않습니다. 없으면 없는 겁니다.

이 단계도 극도로 보수적인 Temperature 설정입니다. JD 텍스트에 적힌 것만 추출하고, 해석하지 않습니다. "우대"라고 적힌 건 우대로, "필수"라고 적힌 건 필수로. 리크루터 관점에서 이 구분은 결정적입니다. 우대 미충족은 감점이 아닌데, 기존 도구들은 이걸 구분하지 못합니다.

• • •

Stage 3: 팩트 기반 매칭

세 번째 단계에서 드디어 AI가 "분석"을 합니다. 하지만 이 분석은 원본 이력서와 원본 JD를 보지 않습니다. Stage 1의 출력(구조화된 후보자 데이터)과 Stage 2의 출력(요구사항 매트릭스)만 입력으로 받습니다.

Stage 3이 원본을 보지 않는 이유

원본 이력서를 다시 보여주면, AI가 Stage 1에서 추출하지 않은 정보를 "재발견"해서 분석에 포함시킬 수 있습니다. Stage 1에서 의도적으로 걸러낸 추론 정보가 Stage 3에서 다시 살아나는 겁니다.

데이터 흐름을 물리적으로 차단해야 할루시네이션이 방지됩니다.

이 단계의 Temperature는 추출 단계보다 약간 높지만, 여전히 보수적인 수준입니다. 왜냐하면 매칭 분석에는 약간의 "해석"이 필요하기 때문입니다. "이 후보자의 AWS 3년 경험이 JD의 AWS 필수 요구사항을 충족하는가?"를 판단하려면, 단순 키워드 매칭을 넘어서는 이해가 필요합니다.

하지만 분석에 최적화된 이 설정은 여전히 보수적인 수준입니다. AI가 "창의적으로" 매칭을 해석하지 않으면서도, 맥락을 이해할 수 있는 정도. 이 미세한 밸런스가 중요합니다.

데이터 흐름 — 오염 차단 구조
Stage 1 (극보수적 설정)
이력서 원본 → 구조화된 팩트 데이터
추론/해석 금지. 이력서에 적힌 것만 추출.
Stage 2 (극보수적 설정)
JD 원본 → 요구사항 매트릭스
필수/우대/소프트 분류. 없으면 "없음".
Stage 3 (분석 최적화 설정)
팩트 데이터 + 매트릭스 → 매칭 리포트
원본 접근 차단. Stage 1, 2 출력만 사용.
• • •

Temperature라는 열쇠

Temperature는 AI의 "창의성 다이얼"입니다. 0에 가까우면 가장 확률이 높은 답만 내놓고, 1에 가까우면 다양한(때로는 엉뚱한) 답을 생성합니다.

설정 수준 특성 적합한 작업 CA에서의 용도
극보수적 정확성 극대화 데이터 추출, 분류 Stage 1 (이력서 추출), Stage 2 (JD 구조화)
분석 최적화 약간의 유연성 비교 분석, 맥락 판단 Stage 3 (매칭 분석)
창의적 자유로운 표현 아웃리치 메시지, 카피 이메일 시퀀스 AI 메시지 생성
매우 높음 매우 창의적 (불안정) 브레인스토밍 사용하지 않음

대부분의 AI 서비스는 기본 Temperature가 0.7~1.0입니다. 채팅, 글쓰기, 아이디어 생성에는 적합하지만, 팩트 기반 분석에는 재앙입니다.

CA에서는 분석 파이프라인의 2/3가 극도로 보수적인 Temperature로 동작합니다. "정확하지 않으면 안 만든다"는 원칙의 기술적 구현입니다.

극도로 보수적인 Temperature는 AI에게 "너의 생각을 말해달라"가 아니라 "눈에 보이는 것만 말해달라"고 요구하는 것입니다.

• • •

검증은 구조로 해야 합니다

"AI를 믿되, 검증하라"라는 말을 많이 합니다. 맞는 말이지만, 사람이 매번 결과를 검증하는 건 비현실적입니다. 특히 하루에 수십 건의 분석을 돌려야 하는 리크루터에게 "AI 결과를 매번 원본과 대조해보세요"는 도구가 아니라 숙제를 주는 겁니다.

그래서 검증 자체를 구조에 내장했습니다.

3단계
분리된 파이프라인
극보수적
추출 단계 Temperature
0%
팩트 기반 할루시네이션

이 구조가 완벽하다고 말하지는 않겠습니다. AI 기술이 발전하면 할루시네이션 자체가 줄어들 수도 있고, 더 나은 방법이 나올 수도 있습니다. 하지만 지금, 프로덕션 환경에서, 실제 채용 데이터를 다루면서 할루시네이션 0%를 유지하고 있다는 건 이 구조가 작동한다는 의미입니다.

기술적으로 대단한 건 아닙니다. "나눠서 시키고, 각 단계에서 할 수 있는 일을 제한한다." 그게 전부입니다. 하지만 이 단순한 원칙을 실제 프로덕트에서 일관되게 적용하는 건 생각보다 어렵습니다. "그냥 한 번에 시키면 더 빠르고 편한데"라는 유혹이 매 순간 있으니까요.

다음 편에서는 자기감시의 구조적 한계에 대해 이야기합니다. 8명의 AI 임원진에서 CHRO를 해고하게 된 이유. 그리고 "진짜 견제"란 무엇인지.