AI가 코드에 대해 환각을 일으키거나 거짓말을 할 때, 다른 AI에게 묻지 않고도 이를 알아내는 방법을 찾았습니다.
I found a way to know when AI is hallucinating—or lying—about code, without asking another AI.
핵심 요약
AI가 생성한 코드의 환각을 외부 환경 검증을 통해 기술적으로 잡아내는 도구 'Hedgemony'를 소개합니다.
- 기술적 검증 — AI가 생성한 코드의 패키지 존재 여부나 속성 호출 가능성을 외부 환경에서 즉시 확인함
- 환각 분류 — 거짓 정보를 '발명', '오귀속', '기형' 등으로 세분화하여 정확한 오류 지점을 식별함
- 자동화 게이트 — 에이전트 워크플로우에 통합하여 생성 직후나 배포 직전에 검증 단계를 배치 가능함
- 확정적 결과 — 확률적 생성물인 AI 코드를 결정론적 질문으로 변환하여 사실 여부를 판별함
제목은 "환각(hallucinating)"과 "거짓말(lying)"이라는 흔한 단어를 썼지만, Hedgemony는 이 개념들을 아주 정밀하게 다뤄.
이 도구는 모델 내부의 숨겨진 생각을 읽어내거나 모델이 누군가를 속이려 했는지 판단한다고 주장하지 않아. 그저 확률적인 추측이 외부에서 검증 가능한 코드로 튀어나오는 바로 그 순간을 포착할 뿐이야.
모델이 코드를 생성하기 전까지, 다음 토큰은 그저 확률일 뿐이지. 하지만 import ghostlib, json.serialise(...), 혹은 math.sqrt(2, 3)을 작성하는 순간, 모델은 세상에 대해 어떤 명제를 던진 거야. 이 패키지가 존재한다거나, 이 속성이 이 객체에 속한다거나, 혹은 이 호출이 가능하다는 식으로 말이지. 그 명제들은 코드가 실행될 환경에서 참인지 거짓인지가 판가름 나.
그게 바로 Hedgemony가 측정하는 경계야. 생성된 코드가 내뱉은 주장을 가져와서 독립적인 권한을 가진 환경에 던져보고 결과를 기록하는 거지. 모델이 스스로를 검사하는 것도 아니고, 다른 모델이 투표하는 것도 아니야. 자신감은 증거가 될 수 없거든. 인터프리터와 패키지 레지스트리가 무엇이 존재하는지 결정하고, 실행 가능한 예제들이 명시된 동작이 실제로 작동하는지 결정하는 거야.
이 지점에서 "환각"은 모델의 행동을 뭉뚱그려 설명하는 모호한 단어에서 벗어나, 재현 가능한 기술적 이벤트가 돼. 생성된 코드가 검증 가능한 무언가를 주장했고, 현실이 그걸 부정해버린 거지.
Hedgemony는 그런 이벤트의 형태를 정확하게 이름 붙여. '날조(fabrication)'는 세상에 대한 거짓 주장을 통칭하는 말이야. '발명(invention)'은 import ghostlib처럼 세상 어디에도 없는 이름을 쓰는 거고. '오귀속(misattribution)'은 json.serialise처럼 실제 존재하는 이름을 엉뚱한 주인에게 갖다 붙이는 거야. '기형(malformation)'은 대상은 존재하는데 math.sqrt에 인자 두 개를 넣는 것처럼 호출 자체가 불가능한 경우를 말해. '모순(contradiction)'은 구현 내용이 스스로 명시한 동작과 일치하지 않는 걸 뜻하지. 그러니까 "거짓말"은 의도에 대한 주장이 아니라 그냥 줄임말일 뿐이야. Hedgemony는 왜 거짓말이 나왔는지 따지지 않아. 오직 확정 가능한 부분만 다루지. 코드가 이게 존재한다거나 이렇게 작동한다고 말했는데, 선택된 환경이 아니라고 증명하는 것뿐이야.
기본적인 접근 방식은 단순하지만 강력해. 언어 모델은 확률적인 결과물을 내놓지. Hedgemony는 그 결과물 중 지원되는 부분들을 결정론적인 질문으로 바꿔버려.
이 패키지가 존재하는가?
이 모듈 경로는 해결되는가?
이 이름을 임포트할 수 있는가?
이 객체가 이 속성을 가지고 있는가?
이 함수가 이런 형태의 호출을 받아들일 수 있는가?
구현 내용이 명시적으로 말한 결과를 실제로 만들어내는가?
지원되는 각 질문에 대해 Hedgemony는 외부 증거를 요구해. 유창한 설명 따위로 답을 바꿀 순 없어. 다른 모델이 끼어들어서 판결을 뒤집을 수도 없지. 똑같은 자신감 넘치는 주장을 반복한다고 해서 진실성이 높아지는 것도 아니야.
console.table(...)을 생성하는 에이전트를 생각해 봐. 그럴듯해 보이고, 곁들인 설명도 권위 있어 보이고, 다른 모델이 맞다고 해줄지도 몰라. 하지만 설치된 인터프리터는 설득할 수 없어. 선택된 환경에서 해당 객체에 table이 있거나, 없거나 둘 중 하나니까. Hedgemony는 정확히 몇 번째 줄인지, 어떤 잘못된 소유권 주장이 있었는지 보고하고 그걸 오귀속으로 분류해.
하지만 이름이 존재한다고 해서 로직이 맞는 건 아니야. 모델은 실제 패키지, 유효한 메서드, 적법한 인자를 쓰면서도 엉뚱한 결과를 계산할 수 있거든. 그래서 Hedgemony는 파일에 명시된 >>> 예제들을 제한된 서브프로세스 안에서 한 번 더 실행해 봐. 구현 내용이 예제와 다르면, 모델의 그럴듯한 로직은 측정 가능한 모순이 되는 거지.
