
코드를 위한 거짓말 탐지기를 만들었습니다. 그런데 그것이 스스로 거짓말하는 것을 잡아냈습니다.
요약
AI 코드 리뷰어의 '자신만만한 거짓말(confident-liar)' 문제를 해결하기 위해, 모델의 추측이 아닌 실제 테스트 실행 결과에 기반하여 검증하는 edgeverdict 도구를 소개합니다. 실행(fact)과 판단(judgment)을 분리하여 AI의 오류를 효과적으로 잡아내는 메커니즘을 설명합니다.
핵심 포인트
- AI의 자신감 있는 오답 문제를 해결하기 위해 결정론적 게이트를 통한 테스트 실행 규칙 도입
- 실행 결과(Fact)와 인간의 판단(Judgment)을 분리하여 신뢰성 확보
- 단순 문자열 매칭 방식의 위험성을 지적하며 실행 기반 검증의 중요성 강조
이 게시물은 Sentry가 지원하는 DEV's Summer Bug Smash: Smash Stories에 제출된 글입니다.
모든 AI 코드 리뷰어(AI code reviewer)는 동일한 특징을 가지고 있습니다. 바로 옳은 결과를 말할 때와 똑같이 자신만만한 어조로 틀린 결과를 말한다는 점입니다. 전달 방식만으로는 어느 것이 맞고 틀린지 알 수 없습니다. 자신감은 증거가 아닙니다.
그래서 저는 단 하나의 규칙을 바탕으로 edgeverdict를 구축했습니다: 모델은 결코 스스로 결정하지 않습니다. 모델은 테스트를 제안하고, 결정론적 게이트(deterministic gate)가 이를 실행하며, 테스트가 실제로 실행되어 실패했을 때만 발견 사항으로 인정됩니다. 모델은 추측하고, 실행(Execution)이 규칙을 정합니다.
이러한 규칙은 자기 자신을 향했을 때도 살아남을 수 있어야만 가치가 있습니다. 그래서 대규모 리팩터링(refactor)을 병합하기 전에, 도구가 자신의 디프(diff)를 직접 리뷰하도록 했습니다. 제 PR(Pull Request)에 도구가 게시한 내용은 다음과 같습니다:

제 PR에 실제로 게시된 코멘트 (당시 도구의 이름은 agentboard였으며, 현재는 edgeverdict입니다).
마지막 부분을 주의 깊게 읽어보세요. 도구는 실제 실패하는 테스트를 찾아냈고, 동시에 자신의 발견 사항이 아마도 실제 버그가 아닐 것이라고 스스로 표시했습니다.
이러한 분리가 바로 핵심입니다. 실행(execution) 측면은 _"이 테스트는 실패하며, 여기 그 증거가 있습니다."_라고 말했습니다. 조언(advisory) 측면은 _"하지만 이것이 실제로 틀린 것인지 여부는 인간이 결정해야 합니다."_라고 말했습니다. 하나는 사실(fact)이고, 다른 하나는 판단(judgment)입니다. 이 둘이 서로 뒤섞이게 두지 않는데, 왜냐하면 그 둘을 뒤섞는 것이 바로 제가 이 도구를 만든 목적인 '자신만만한 거짓말쟁이(confident-liar)' 문제이기 때문입니다.
하지만 가장 날카로운 포착은 나중에 일어났으며, 무언가를 가르쳐준다는 점에서 훨씬 더 심각한 문제였습니다.
이 도구에는 테스트가 실패한 이유가 실제 단언 실패(assertion failure)인지, 아니면 단순한 충돌(crash)인지 결정하는 것이 전체 임무인 함수가 있습니다. 이 호출은 매우 중요한 지지대(load-bearing) 역할을 합니다. 하위의 모든 프로세스가 이를 신뢰하기 때문입니다. 제가 작성했던 방식은 이랬습니다. 실패 보고서의 '어디에서든' AssertionError라는 문자열이 나타나는지 확인하는 방식이었습니다.
어디에서든 말이죠.
따라서 전혀 관련 없는 이유로 충돌이 발생하여, 출력 내용 중 노이즈 속에 그 단어가 단순히 '언급'만 된 테스트라도 여러분의 코드에 있는 실제 버그로 분류될 것이었습니다. 텍스트의 우연한 일치로 만들어진 잘못된 결과(false finding)였던 셈입니다.
이것이 어디에 위치했는지를 생각해보십시오. 저는 '단순히 참처럼 보이는 것을 믿지 말고, 스스로 증명하게 하라'는 것이 전체 논지인 도구를 만들었는데, 그 논지가 온전히 의존하는 판결 경로(verdict path) 안에, 단순히 참처럼 보이는 것을 신뢰하는 코드 한 줄을 묻어두었던 것입니다. 저의 거짓말 탐지기(lie detector)에는 우연을 믿어버리는 지점이 있었습니다.
리뷰에서도 잡아내지 못했습니다. 테스트에서도 잡아내지 못했습니다. 도구가 자신의 코드를 깨뜨리려고 시도하는 과정에서 스스로 잡아냈습니다. 수정된 버전은 무서운 단어를 검색(grepping)하는 대신 실제로 발생한 예외(exception)를 기준으로 분류하며, 교체된 코드에는 소스 코드 내에 바로 그 버그가 해결되었음을 문서화해 두었습니다.
자신을 스스로 리뷰하는 몇 차례의 과정을 거치며, 도구는 **자신의 코드베이스에서 31개의 실제 결함(real defects)**을 찾아냈습니다. 이는 의견이 아니라 각각 실행되어 실패한 테스트 결과였습니다. 그중 7개는 잘못된 판결을 내릴 수 있는 심각한 종류였습니다. 저는 누구도 제 말을 그냥 믿을 필요가 없도록, 실행 지문(run fingerprints)과 함께 이 모든 것을 공개했습니다.
그것이 핵심입니다. 이 도구는 여러분이 개발자의 확신을 믿는 대신, 오직 실행 결과만을 믿을 수 있도록 존재합니다. 그러니 제 확신을 믿어달라는 말로 끝맺지는 않겠습니다.
pip install edgeverdict
edgeverdict demo
API 키 없이 약 15초면 충분합니다. 그런 다음 여러분의 코드에 적용해보고, 어디에서 거짓말을 하는지 저에게 알려주세요.
👉 github.com/anp0429/edgeverdict
공개 사항: edgeverdict는 저의 프로젝트이며, 초안을 다듬는 데 AI 어시스턴트의 도움을 받아 제가 직접 작성했습니다. 여기에 언급된 모든 숫자, 지문, 테스트는 실제이며 리포지토리(repo)에 포함되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기