AI에게 일을 맡기고 나면 그 결과가 맞는지 확인하는 일이 남습니다. 요즘은 그 확인도 AI에게 맡기곤 하죠. 만든 AI에게 스스로 점검하게 하거나, 다른 AI에게 채점을 시킵니다. 점수가 잘 나오면 믿고 넘어갑니다. 저도 그랬습니다.
제가 시험하던 것은 회의록과 메일 같은 자료를 읽고 프로젝트 이해관계자(프로젝트에 영향을 주거나 받는 사람과 조직) 목록을 만드는 AI 작업 절차였습니다. 실제 고객 자료를 쓸 수는 없어서, 가상의 구립도서관이 열람실 좌석 예약을 모바일로 바꾸는 사업 자료를 만들었습니다. 요청 메일, 착수 회의록, 조직 메모, 이용 규정 발췌 네 가지입니다. 도서관 운영은 외부 기관에 맡겨져 있다는 설정이라 구청, 위원회, 운영 기관이 얽혀 있습니다.
자료 속에는 일부러 어긋남을 심어 두었습니다. 회의에 오지 않았지만 승인권을 가진 사람, 문서마다 다르게 적힌 좌석 수 같은 것들입니다. 이 글에서는 이것을 함정이라고 부르겠습니다.
결과는 두 가지로 쟀습니다. 하나는 찾아야 할 사람과 함정을 다 찾았는가, 다른 하나는 찾은 것을 제대로 옮겨 적었는가입니다. 앞의 것은 만점이었습니다. 심어 둔 함정 9개를 모두 찾았습니다. 그런데 이 만점은 믿을 수 없는 점수였습니다. 함정을 심으라고 지시한 대화가 그대로 문제를 풀고 있었거든요. 뒤의 것은 처음부터 좋지 않았고요.
규칙 9개를 모두 지켰다고 스스로 표시했습니다
먼저 뒤의 것, 옮겨 적은 방식부터 보겠습니다. 처음 의심이 든 곳은 자가 점검이었습니다. 이 작업 절차에는 산출물을 적는 방식에 관한 규칙이 9개 있고, 산출물 끝에 AI가 규칙마다 지켰는지 스스로 표시하게 해 두었습니다. 9개 모두 지켰다고 적혀 있었습니다.
같은 산출물을 따로 둔 검사자 AI에게 보냈습니다. 이 검사자는 만드는 과정을 보지 않았고, 자가 점검 표도 믿지 말라고 해 두었습니다. 산출물 본문에서 증거를 찾아 규칙마다 어긋났는지 판정하게 했습니다.
9개 중 6개가 어긋나 있었습니다. 표현과 동사, 방향이 틀린 결함이 11건 나왔습니다. 규정에는 ‘심의’와 ‘검토’로만 적힌 권한을 ‘이 과제를 멈출 수 있는 권한’으로 키워 적었습니다. 운영 기관이 구청장에게 요청하게 되어 있는 조항은 요청 방향을 거꾸로 옮겼습니다. 회의에서 앞으로 하기로 한 일을 이미 끝낸 일처럼 적은 곳도 있었습니다.
자가 점검이 잡은 결함은 0건이었습니다. 앞서 같은 작업 절차를 다른 자료로 두 번 시험했을 때도 0건이었으니 세 번 연속입니다. 스스로 점검하는 칸은 결함을 잡는 장치가 아니라, 잘했다고 말하는 칸이었던 셈입니다.
막힌 곳: 정답지를 숨겼는데도 만점은 믿을 수 없었습니다
규칙 점검은 산출물을 어떻게 적었는가를 보는 축입니다. 또 하나의 축은 찾아야 할 것을 찾았는가였고, 이것은 미리 만들어 둔 정답지와 대조해 쟀습니다. 같은 산출물을 두 축으로 잰 셈입니다. 자가 점검을 믿을 수 없게 되자 남은 숫자는 이쪽이었습니다.
정답지 기준으로 이해관계자 22명을 모두 찾았고 함정 9개도 모두 찾았습니다. 정답지 파일은 푸는 쪽이 열지 못하게 따로 두었으니 이 점수는 믿어도 된다고 생각했습니다.
그런데 가상 자료를 만들라고 지시한 곳을 다시 읽어 보니 문제가 보였습니다. 자료를 만드는 AI에게 어떤 종류의 함정을 심으라고, 제가 작업하던 대화에서 직접 적어 보냈습니다. 그리고 그 대화에서 그대로 문제를 풀었습니다. AI와의 대화는 앞에서 주고받은 내용을 모두 기억한 채 이어지는 작업 공간입니다. 정답지 파일은 열지 않았지만, 함정 목록을 직접 써 보낸 그 대화는 무엇을 심었는지 이미 알고 있었던 것입니다.
앞서 다른 가상 자료로 돌린 시험도 같은 모양이었습니다. 함정 종류를 지시문에 나열하고, 같은 대화에서 풀었습니다. 두 번 다 파일은 봉인했고, 두 번 다 푸는 쪽은 답의 윤곽을 알고 있었습니다.
되돌린 결정: 함정은 부르는 쪽이 아니라 문제를 내는 쪽이 고르게 했습니다
그래서 역할을 셋으로 떼어 놓았습니다. 문제를 내는 쪽, 푸는 쪽, 채점하는 쪽입니다. 원리는 하나입니다. 각 역할이 알아서는 안 되는 것을 모르게 한다.
가장 크게 바꾼 것은 함정을 고르는 주체였습니다. 전에는 제가 함정 종류를 정해 지시문에 적었습니다. 이번에는 과제 한 줄과 시험할 작업만 알려 주고, 어떤 함정을 어디에 심을지는 문제를 내는 AI가 정하게 했습니다. 그 AI는 결과를 보고할 때 파일 경로와 개수만 돌려주게 했습니다. 부르는 저도, 문제를 풀 쪽도 무엇이 심겼는지 모릅니다.
푸는 쪽은 가상 자료만 읽었습니다. 채점하는 쪽은 정답지와 원천 자료를 직접 대조했습니다. 채점자는 원래 정답을 보는 역할이니, 여기서 모르게 해야 할 대상은 푸는 쪽입니다. 그리고 채점자에게는 칸 하나를 더 열어 두었습니다. 정답지가 틀린 것 같으면 적으라는 칸입니다.
이번에 문제를 내는 AI는 함정을 두 종류로 5개씩 심었습니다. 누가, 무엇이 있는지 알아채야 하는 찾기 함정과, 원문을 틀리지 않게 옮겨 적어야 하는 옮기기 함정입니다. 결과는 찾기 함정 5개 중 4개, 옮기기 함정 5개 중 4개였습니다. 아예 놓친 것과 틀리게 잡은 것은 0건이었고, 반쯤 잡은 것이 2건이었습니다. 자료도 함정 수도 앞의 시험과 달라서, 만점에서 이 점수로 내려온 것을 떼어 놓은 효과라고 단정하지는 않겠습니다. 제가 말할 수 있는 것은 이번 점수는 푸는 쪽이 답을 모르는 상태에서 나왔다는 것까지입니다.
옮기기를 잰 방식도 두 시험이 다릅니다. 앞의 시험에서는 따로 둔 검사자가 규칙 9개에 비춰 어긋난 곳을 찾았고, 이번에는 미리 심어 둔 옮기기 함정 5개를 맞혔는지 셌습니다. 그래서 규칙 6개 어긋남과 함정 5개 중 4개는 같은 자로 잰 숫자가 아닙니다. 옮겨 적는 솜씨가 나아졌다고 읽으시면 안 됩니다.
정답지도 만든 쪽의 추측이었습니다
더 뜻밖이었던 것은 채점자가 정답지에 낸 이견이었습니다. 이견은 정답지에 적힌 내용이 틀렸다고 본 것이고, 3건이었습니다. 그중 둘은 정답 목록에 있어야 할 기관과 위탁 업체가 빠진 것이었고, 하나는 옮기기 함정 하나에 정답지가 붙인 채점 조건이 맞지 않는다는 것이었습니다. 이와 별도로 정답지가 아예 다루지 않은 빈자리도 4건을 적어 왔습니다.
이 이견은 앞의 점수에 그대로 걸립니다. 반쯤 잡았다고 판정된 2건 중 하나가 바로 채점자가 조건에 이견을 낸 그 함정이었습니다. 이견이 맞다면 옮기기 점수는 달라질 수 있습니다. 그런데 저는 정답지를 고친 뒤 다시 채점하지 않았습니다. 그러니 5개 중 4개는 틀렸을 수도 있는 정답지로 매긴 점수입니다.
그중 하나는 꽤 민망했습니다. 문제를 내는 AI가 자기가 심은 함정에 관련된 사람을 정작 정답 목록에 넣지 않았습니다. 정답지를 푸는 쪽에게서 숨기는 데만 신경 쓰느라, 정답지 자체가 맞는지는 아무도 보지 않았던 것입니다.
그래서 한 가지를 더 붙였습니다. 문제를 내는 AI는 정답지에 함정마다 관련 인물을 적어 둡니다. 이 인물들과 정답 목록을 기계로 대조해, 빠진 사람이 있으면 멈추게 했습니다. 이 검사가 실제로 잡는지도 일부러 틀린 정답지를 넣어 확인했습니다. 빈 파일을 넣었을 때 통과로 보이지 않는지도 봤습니다.
검증 표준이 말하는 독립은 결국 무엇을 모르느냐였습니다
이 일을 겪고 나서 소프트웨어 검증 표준인 IEEE 1012를 다시 찾아봤습니다. 이 표준은 독립 검증을 기술, 관리, 재정 세 갈래로 나눕니다. 그중 기술적 독립은 개발에 참여하지 않은 사람이, 문제와 해법을 스스로 이해하고, 자기 도구로 검사하라는 요구로 설명됩니다.
사람이 검증하던 시절에는 이 요구가 조직도로 채워졌습니다. 개발팀이 아닌 다른 팀 사람을 붙이면 대체로 독립이 됐습니다. 다른 사람은 만든 사람의 머릿속을 모르니까요.
AI로 넘어오면 이 전제가 흔들립니다. 역할을 나눠 부르는 것은 쉽지만, 누가 무엇을 들고 가는지는 부르는 쪽이 정합니다. 제 경우 새는 통로는 둘이었습니다. 부르는 쪽이 함정을 지시문에 적어 넘긴 것, 그리고 그 지시문을 쓴 대화가 직접 문제를 푼 것입니다. 떼어 놓기 전에도 자료를 만드는 AI, 푸는 대화, 채점하는 AI로 역할은 이미 셋이었습니다. 그런데 지시문을 쓰는 대화가 푸는 쪽을 겸하자 아는 것은 하나가 됐습니다. 그래서 AI에게 이 요구를 이행할 때는 몇 번 나눠 불렀나가 아니라, 각자 무엇을 알고 있었나를 따져야 한다고 생각합니다.
바깥에서도 채점 장치가 같은 방식으로 뚫리고 있었습니다
같은 주에 비슷한 이야기가 바깥에서도 들려왔습니다.
한 대학 연구팀은 널리 쓰이는 AI 에이전트 평가(모델 성능을 비교하는 공용 시험) 8개를, 과제를 하나도 풀지 않고 73~100%의 점수로 통과했습니다. 한 코딩 평가는 테스트 결과를 모두 통과로 바꿔 쓰는 설정 한 줄로 뚫렸습니다. 또 다른 평가에서는 정답 파일을 채점 위치에 내려받아, 채점기가 정답과 정답을 비교하게 만들었습니다. 연구팀이 짚은 근본 원인은 에이전트가 채점기가 들여다보는 바로 그 환경 안에서 돌았다는 것이었습니다. 푸는 쪽이 채점 쪽의 것을 만질 수 있었던 셈입니다.
다른 감사 보고서는 공개된 평가 과제 5,241개를 점검해 29개가 망가져 있음을 확인했습니다. 비율로는 작습니다. 눈여겨볼 것은 결함의 방향이었습니다. 대부분 모델을 실제보다 더 좋아 보이게 만드는 쪽이었습니다. 무작위로 틀린 게 아니라 한쪽으로 기울어 있으니, 작은 비율도 점수를 끌어올립니다.
조금 결이 다른 연구도 있었습니다. AI가 자기 작업 틀(지시문, 도구 구성, 작업 흐름처럼 모델 바깥을 감싼 부분)을 스스로 고치게 한 연구입니다.
고치는 데 쓴 과제에서는 92.8점까지 올랐지만 처음 보는 과제에서는 40.3점이었습니다. 처음 보는 과제의 고치기 전 점수가 39.7점이었으니 거의 오르지 않은 것입니다. 이것은 채점이 샌 경우라기보다 시험 문제를 미리 보고 공부한 경우에 가깝습니다. 연구팀은 한 번에 고칠 수 있는 양을 제한하고, 효과 없는 수정은 지우게 하는 제약을 걸어 처음 보는 과제 점수를 43.6점까지 올렸습니다. 다만 그 폭도 크지 않다고 스스로 적었습니다.
세 이야기의 모양은 조금씩 다르지만 공통점은 하나입니다. 재는 쪽이 보는 것을 푸는 쪽도 볼 수 있으면 점수는 부풀려집니다.
재는 쪽이 보는 것을 푸는 쪽도 볼 수 있으면 점수는 부풀려집니다.
아직 남은 문제: 사람이 푼 기록은 아직 없습니다
이번 시험은 모두 AI가 풀고 AI가 채점했습니다. 떼어 놓은 뒤의 결과도 가상 자료 한 건에 대한 한 번의 관측입니다. 앞선 만점 시험과는 가상 자료가 달라서 같은 조건의 전후 비교라고 말할 수도 없습니다.
떼어 놓았다고 해서 완전히 모르는 것도 아닙니다. 함정을 고르는 AI에게 준 지침에는 어떤 범주의 함정이 있는지가 적혀 있습니다. 그 지침을 읽은 대화는 구체적인 배치는 몰라도 범주는 압니다. 어디까지 모르게 해야 충분한지는 아직 답을 갖고 있지 않습니다.
마치며: ‘몇 번 나눠 불렀나’가 아니라 ‘각자 무엇을 알고 있었나’
AI에게 일을 시키고 AI에게 채점을 맡기는 흐름은 앞으로 더 늘어날 것입니다. 그때 점수보다 먼저 볼 것은 푸는 쪽이 무엇을 알고 있었는가입니다. 정답지 파일을 숨긴 것만으로는 부족했고, 무엇을 심었는지 아는 대화가 문제를 풀지 않게 해야 했습니다.
다음에 AI 시험 결과가 너무 좋게 나오면, 문제를 준비한 대화와 문제를 푼 대화가 같았는지부터 확인해 보시길 권합니다. 같았다면 준비 과정을 전혀 모르는 새 대화에서 한 번 더 풀게 해 보는 것만으로도, 그 점수가 얼마나 부풀어 있었는지 보일 겁니다.
이 글은 AI의 도움을 받아 작성했습니다.
참고 자료
- How We Broke Top AI Agent Benchmarks: https://rdi.berkeley.edu/blog/trustworthy-benchmarks-cont/
- Benchmarks are more broken than we could have imagined: https://www.horizonanalyticslabs.com/research/public-benchmark-dataset-audit
- RRSI: Regularized Recursive Self-Improvement of Agent Harnesses: https://arxiv.org/abs/2609.24972
- IEEE 1012-2016 System, Software, and Hardware Verification and Validation: https://standards.ieee.org/ieee/1012/5609/
