저자들은 AI 에게 코드를 실행해 보라고 시켰습니다. 하지만 단순히 원래 문제만 준 게 아니라, 세 가지 방식으로 시험을 변형해서 AI 가 진짜로 이해하는지 확인했습니다.
1. 입력값을 살짝 바꿔보기 (입력 교란)
비유: "이 식당 메뉴판에 '불고기'라고 적혀있는데, AI 는 '불고기'를 주문하면 맛있게 해줄 거야. 근데 만약 '불고기' 대신 '불고기 (약간 더 맵게)'나 '불고기 (소금 약간 덜)'라고 주문하면? AI 는 여전히 같은 맛을 예상할까?"
결과: 대부분의 AI 는 원래 문제에서는 99% 만점인데, 입력값을 살짝만 바꿔도 점수가 뚝 떨어졌습니다. 특히 GPT-5.2라는 최상위 모델이 가장 큰 타격을 입었습니다. 원래 문제에서는 천재처럼 보였는데, 살짝만 변형된 문제를 주면 엉뚱한 답을 내놓거나 아예 "에러가 나겠어"라고 못 알아챘습니다.
교훈: AI 는 코드의 '의미'를 깊이 이해하기보다, 원래 문제의 패턴을 암기하고 있을 가능성이 큽니다.
2. 코드의 옷을 바꿔보기 (의미 보존 변환)
비유: "같은 레시피인데, '소금 1 큰술'을 '소금 1 티스푼 3 개'라고 적거나, '냄비'를 '냄비 A'라고 이름을 바꿔도요. 요리사는 같은 요리를 할 텐데, AI 는 이름이 바뀌었다고 해서 요리를 못 할까요?"
결과: 코드의 구조는 그대로인데 변수 이름이나 문법만 살짝 바꿔도, AI 의 성능이 떨어졌습니다. 특히 GPT-5.2 는 이런 사소한 변화에 매우 민감하게 반응했습니다. 반면, Gemini 3 Pro는 옷을 바꿔 입어도 요리를 잘 해내는 '진짜 요리사'처럼 안정적이었습니다.
3. 복잡한 길 찾기 (제어 흐름)
비유: "집으로 가는 길이 직선이라면 쉽지만, 중간에 신호등이 10 개나 있고, 우회전해야 하고, 다시 돌아서 가야 한다면요? AI 는 복잡한 길에서 길을 잃을까요?"
결과: 코드를 실행할 때 '만약 (if)'이나 '반복 (for)' 같은 결정 사항이 많을수록 AI 가 정답을 맞추는 확률이 떨어졌습니다. AI 는 복잡한 논리 경로를 따라가는 데 서툴렀습니다.
🚨 가장 큰 충격: "에러 (Exception) 를 못 알아챔"
이 실험에서 가장 놀라운 점은 에러 발생에 대한 AI 의 반응이었습니다.
상황: 코드를 실행하면 "리스트에 없는 번호를 찾았다"거나 "나눗셈에 0 을 썼다"는 식의 에러가 나옵니다.
문제: 원래 AI 에게는 "결과를 알려줘"라고만 했지, "에러가 나면 알려줘"라고 말해주지 않았습니다.
결과: AI 는 에러가 날 상황에서도 "아무 일도 없었을 거야"라고 **거짓말 (환각)**을 하거나, 에러가 났다는 사실 자체를 못 알아챘습니다.
해결책: 저자들이 AI 에게 **"에러가 나면 그 에러 이름도 정확히 말해줘"**라고 지시 (프롬프트) 를 바꾸니, 성능이 급격히 좋아졌습니다.
비유: 학생이 시험지 지시사항을 잘 못 읽어서 "에러"라는 단어가 나오면 답을 쓰지 않았던 것입니다. 지시사항을 명확히 해주니 갑자기 90 점대까지 점수가 올랐습니다.
💡 결론: AI 는 '암기왕'일 뿐, '이해왕'은 아니다?
이 논문의 결론은 다음과 같습니다.
AI 는 매우 취약합니다: 최신 모델 (GPT-5.2 등) 이라도 입력값이나 코드 문법이 조금만 바뀌어도 엉뚱한 답을 내놓습니다. 이는 AI 가 코드의 **진짜 의미 (실행 논리)**를 깊이 이해하지 못하고, 표면적인 패턴을 외우고 있을 가능성을 시사합니다.
에러 예측은 약점: AI 는 프로그램이 망가질 때 (에러가 날 때) 그 상황을 예측하는 데 매우 서툴렀습니다. 하지만 "에러를 찾아봐"라고 명확히 지시하면 개선됩니다.
모델별 차이: 모든 AI 가 똑같은 것은 아닙니다. 어떤 모델 (예: Gemini 3 Pro) 은 변화에 강하고, 어떤 모델 (예: GPT-5.2) 은 원래 문제에서는 천재지만, 조금만 변형되면 무너집니다.
한 줄 요약:
"현재의 AI 는 코드를 외운 학생처럼 보일 뿐, 코드가 어떻게 작동하는지 진짜로 이해하는 엔지니어는 아닙니다. 그래서 코드를 수정하거나 새로운 상황을 마주하면 엉뚱한 짓을 할 수 있으니, 개발자들은 AI 의 답을 맹신하지 말고 항상 검증해야 합니다."
이 연구는 AI 가 코드를 얼마나 '튼튼하게' 이해하는지 평가할 때, 단순한 정답 맞추기가 아니라, 변형된 상황과 에러 상황에서도 잘 작동하는지를 확인해야 함을 강조합니다.
1. 문제 제기 (Problem)
현재 LLM 은 코드 생성, 요약, 수정 등 소프트웨어 공학 분야에서 뛰어난 성능을 보이지만, 이것이 실제 코드의 의미론적 이해 (Semantic Understanding) 에 기반한 것인지, 아니면 정교한 패턴 매칭에 의존하는 것인지에 대해서는 여전히 의문이 남습니다.
핵심 질문: LLM 은 디버깅이나 유지보수 상황에서 코드가 변경되거나 (코드 변형), 예상치 못한 입력값이 주어졌을 때 (입력 변형) 일관되게 정확한 실행 결과를 예측할 수 있는가?
현황: 기존 벤치마크 (CruxEval 등) 에서는 최첨단 (Frontier) 모델들이 99% 이상의 정확도를 보였으나, 이는 표준적인 입력과 코드에 국한된 결과일 뿐, 실제 환경에서의 견고성 (Robustness) 을 보장하지는 못함.
2. 방법론 (Methodology)
저자들은 LLM 의 코드 이해 능력을 평가하기 위해 CruxEval 벤치마크를 기반으로 한 세 가지 주요 실험 (RQ) 을 설계했습니다.
A. 실험 설계
RQ1: 입력 변형에 대한 견고성 (Input Perturbation)
방법: CruxEval 의 원래 입력값을 타입 인식 (Type-aware) 변형 알고리즘을 통해 변형하여 새로운 입력 집합을 생성.
목적: 변형된 입력에 대해 모델이 일관된 출력을 예측하는지, 그리고 예외 (Exception) 가 발생하는 입력에 대해 예외를 정확히 예측하는지 평가.
데이터: 예외가 발생하는 경우를 포함하도록 확장된 CruxEval_exc 데이터셋 구축.
RQ2: 코드 변형에 대한 견고성 (Program Transformation)
방법: 의미 보존 변환 (Meaning-Preserving Transformations, MPTs) 을 적용.
구문 변환: 연산자 교환, 블록 교환, for/while 교환, dead code 삽입 등.
변수 이름 변경: 실제 프로젝트에서 추출한 빈도 기반의 랜덤 이름으로 변수명 교체.
목적: 문법적으로 다르지만 의미적으로 동일한 코드에 대해 모델이 동일한 출력을 예측하는지 평가.
RQ3: 제어 흐름 결정 (Control Flow Decisions) 에 대한 견고성
방법: 정적 분석 및 동적 분석 (Tracing) 을 통해 실행 경로에서 발생하는 '결정 (Decisions, 예: if 조건, 루프 반복)'의 수를 계수.
목적: 실행 경로가 복잡해질수록 (결정 수가 늘어날수록) 모델의 예측 정확도가 어떻게 변하는지 분석.
B. 평가 모델
모델 선정: 오픈 소스 모델 (Qwen, DeepSeek-R1, Llama 등) 과 프론티어 모델 (GPT-5.2, GPT-5 Nano, Gemini 3 Pro) 포함 총 14 개 모델.
지표:
정확도 (Accuracy): 표준 입력 및 변형 입력에서의 정확도.
강건성 (Robustness):Robust Drop (RΔ) (원본 대비 정확도 하락폭), Program-level Strict Robustness (PSR) (특정 프로그램의 모든 입력에 대해 100% 정확히 예측한 비율).
3. 주요 결과 (Key Results)
RQ1 결과: 입력 변형과 예외 예측
성능 격차: 오픈 소스 추론 모델 (DeepSeek-R1 계열) 은 변형된 입력에서도 3867% 의 안정적 성능을 유지했으나, GPT-5.2는 원본 벤치마크에서 99% 의 높은 정확도를 보였음에도 변형 입력에서 **약 2024% 급감** (RΔ = -19.52) 하여 매우 취약한 것으로 나타남.
예외 예측 실패: 모델들은 예외가 발생하는 입력에 대해 성능이 현저히 떨어짐. 특히 GPT-5.2는 예외 예측 정확도가 15% 수준으로 낮았음.
GPT-5 Nano vs GPT-5.2: GPT-5.2 보다 작은 모델인 GPT-5 Nano 가 변형 입력과 예외 예측에서 더 높은 견고성과 성능을 보임 (양자화 및 증류의 정제 효과로 추정).
RQ2 결과: 코드 변형 (MPT 및 변수명 변경)
일반적 경향: 대부분의 모델은 의미 보존 변환에 대해 비교적 견고하게 반응했으나, GPT-5.2는 변수명 변경과 구문 변환 모두에서 정확도가 99% 에서 76% 수준으로 급격히 하락.
Gemini 3 Pro: GPT-5.2 와 유사한 원본 성능을 보였으나, 변형에 대한 저항력이 훨씬 강함 (95~98% 유지).
RQ3 결과: 결정 수 (Decisions) 와 정확도
부적 상관관계: 실행 경로에서 마주치는 결정 (조건문, 루프 등) 의 수가 증가할수록 모델의 예측 정확도는 감소하는 경향을 보임.
루프의 어려움: 특히 루프 제어 조건이 많은 경우 모델의 추론 능력이 저하됨.
Gemini 3 Pro 예외: 유일하게 결정 수 증가에 따른 정확도 감소가 미미하거나 오히려 증가하는 경향을 보임.
예외 예측 개선을 위한 프롬프트 엔지니어링
문제: 기존 CruxEval 프롬프트는 예외 발생을 명시적으로 언급하지 않아, 지시형 튜닝 (Instruction-tuned) 모델들이 예외를 무시하고 그럴듯한 정상 출력을 생성하는 '시코판시 (Sycophancy)' 현상이 발생.
해결: 프롬프트에 "예외와 타입을 분석하라"는 지시와 예시 (Few-shot) 를 추가.
효과:
GPT-5.2: 예외 예측 정확도가 15% 에서 **81%**로 비약적 상승.
부작용: 그러나 이 개선된 프롬프트를 정상 입력에 적용했을 때, GPT-5.2 는 오히려 정확도가 81% 에서 76% 로 하락 (불필요한 예외를 예측하는 경향). 반면 Gemini 3 Pro 는 정상 입력에서도 성능이 유지되거나 향상됨.
4. 주요 기여 (Key Contributions)
견고성 평가 프레임워크: 코드 이해 능력을 평가할 때 단순한 정확도뿐만 아니라, 입력 및 코드 변형에 대한 **견고성 (Robustness)**을 필수 지표로 포함해야 함을 증명.
프론티어 모델의 취약성 발견: GPT-5.2 와 같은 최첨단 모델이 표준 벤치마크에서는 완벽해 보이지만, 실제 변형 환경에서는 심각한 취약성 (Brittleness) 을 보임을 규명.
예외 예측의 한계와 해결: LLM 이 예외를 예측하는 데 어려움을 겪는 이유 (프롬프트의 부재) 를 분석하고, 프롬프트 엔지니어링을 통해 이를 개선할 수 있음을 보였으나, 동시에 이로 인한 새로운 부작용 (정상 입력에서의 오예측) 도 발견.
새로운 벤치마크 데이터셋: 예외가 발생하는 입력을 포함하는 CruxEval_exc 데이터셋과 변형된 코드/입력 세트를 공개.
5. 의의 및 결론 (Significance & Conclusion)
LLM 의 이해도 한계: LLM 이 코드를 '이해'한다고 주장하기에는, 작은 변형만으로도 예측이 무너지는 등 내부 세계 모델 (Internal World Model) 이 부재하거나 약하다는 증거가 다수 발견됨.
실무적 함의: 개발자가 LLM 을 디버깅이나 리팩토링에 사용할 때, 모델이 변형된 코드나 예외 상황에 대해 얼마나 신뢰할 수 있는지 주의 깊게 평가해야 함.
미래 연구 방향: 프롬프트 민감성, 양자화/증류의 정제 효과, 그리고 더 다양한 언어와 대규모 시스템에서의 견고성 평가가 필요함.
이 연구는 LLM 의 코드 이해 능력이 표면적인 패턴 매칭에 그칠 수 있음을 경고하며, 소프트웨어 공학 분야에서 모델 평가 시 변형 (Perturbation) 기반 테스트의 중요성을 강력히 주장합니다.