Diversifying to Verify: When Task-Equivalent Programs Differ in Verifiability
이 논문은 다양하게 생성된 작업 동등 프로그램 구현체가 어떻게 형식 검증에 더 용이한 변체들을 식별함으로써 자동 검증 성공률을 유의미하게 향상시키는지 보여주는 LLM 기반 파이프라인인 Diversify2Verify를 소개한다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
당신은 수학 퍼즐을 풀 수 있는 로봇을 만들려고 한다고 상상해 보세요. 당신에게는 코드를 아주 잘 쓰는 똑똑한 AI 비서(대규모 언어 모델)가 있습니다. 보통 우리는 AI에게 "이 퍼즐을 푸는 코드를 작성해 줘"라고 요청하고, 로봇이 몇 번의 테스트 실행을 통과하는지 확인합니다. 만약 통과한다면, 우리는 "잘했어!"라고 말합니다.
하지만 **형식 검증(formal verification)**의 세계에서는 몇 번의 테스트를 통과하는 것만으로는 충분하지 않습니다. 그것은 마치 다리를 건설하고 나서 장난감 자동차를 한두 번 굴려보는 것과 같습니다. 진정으로 안전하려면, 어떤 차든, 언제든, 어떤 조건에서도 그 다리가 버틸 것이라는 수학적 증명이 필요합니다. 이것이 논문에서 말하는 "연역적 검증(deductive verification)"입니다.
문제는 무엇일까요? AI가 단순히 정답인 코드뿐만 아니라, 증명하기 쉬운 코드까지 작성하도록 만드는 것은 매우 어렵다는 점입니다. 때때로 AI는 완벽하게 작동하는 솔루션을 작성하지만, 그 구조가 너무 복잡하거나 기이해서 "증명 검사기(proof checker)"(Why3라고 불리는 도구)가 혼란에 빠져 검증에 실패하곤 합니다.
핵심 아이디어: 단 하나의 방법만 시도하지 마라
저자들인 셜리 유(Shirley Yu)와 루벤 마틴스(Ruben Martins)는 간단한 질문을 던졌습니다. "만약 우리가 단 하나의 솔루션만 요구하는 대신, 동일한 솔루션의 여러 가지 버전을 요구한다면 어떻게 될까?"
이것은 꽉 막힌 병뚜껑을 여는 것을 상상해 보세요.
- 버전 A: 오른손으로 뚜껑을 돌려보는 시도.
- 버전 B: 왼손으로 뚜껑을 돌려보는 시도.
- 버전 C: 숟가락으로 뚜껑을 두드려 보는 시도.
- 버전 D: 뜨거운 물에 뚜껑을 담가 보는 시도.
아마도 "오른손으로 돌리기"(AI가 작성한 첫 번째 코드)는 증명 검사기가 붙잡기에 너무 미끄러울 수 있습니다. 하지만 "왼손으로 돌리기"는 그 형태가 증명 검사기의 논리에 딱 들어맞을 수도 있습니다. 이 논문의 방식은 Diversify2Verify라고 불립니다. 단 하나의 완벽한 코드를 기대하는 대신, 그들은 동일한 작업에 대해 네 가지 다른 "풍미(flavor)"를 생성합니다:
- 배열 + 명령형(Array + Imperative): 줄 서 있는 사람들을 한 명씩 확인하며 지나가는 것과 같습니다.
- 배열 + 재귀형(Array + Recursive): 조력자들에게 일을 전달하는 "전화기 게임"과 같습니다.
- 리스트 + 명령형(List + Imperative): 인덱스 카드를 한 장씩 넘겨보는 것과 같습니다.
- 리스트 + 재귀형(List + Recursive): 각 인형 안에 다음 인형이 들어있는 러시아 인형(마트료시카)과 같습니다.
실험: 73개의 퍼즐, 292번의 시도
연구팀은 73개의 서로 다른 프로그래밍 퍼즐(주로 숫자, 리스트, 배열 관련)이 포함된 특별한 놀이터를 구축했습니다. 각 퍼즐에 대해, 그들은 AI에게 위 네 가지 "풍미"를 모두 생성하도록 요청했습니다. 이를 통해 292개의 서로 다른 코드 시도를 테스트할 수 있었습니다.
그들은 단순히 AI가 코드를 쓰게 내버려 둔 것이 아니라, 엄격한 3단계 프로세스를 설정했습니다:
- 1단계 (계약/Contract): 먼저, AI에게 코드가 '어떻게' 수행하는지는 신경 쓰지 않고, 코드가 '무엇을' 해야 하는지를 설명하는 "계약(formal rulebook)"을 작성하게 했습니다. 그들은 이 규칙서가 타당한지 예시들을 통해 검증했습니다. 일단 규칙서가 수용되면, 그것은 **고정(frozen)**되었습니다! 더 이상 규칙을 변경할 수 없습니다!
- 2단계 (코드/Code): 다음으로, AI에게 네 가지 풍미 각각에 대한 실제 코드를 작성하게 했으며, 이 코드가 기본적인 테스트 실행을 통과하는지 확인했습니다.
- 3단계 (증명/Proof): 마지막으로, 각 코드 버전이 고정된 규칙서를 만족하는지 증명하려고 시도했습니다. 만약 증명에 실패하면, AI에게 힌트("수정/repair")를 주어 증명을 고치도록 했지만, 이는 오직 증명만을 위한 것이었으며 코드나 규칙을 수정하는 것은 아니었습니다.
결과: 다양성이 승리한다
실험 결과는 다음과 같습니다:
- "원샷(One-Shot)"의 실패: 만약 AI가 작성한 첫 번째 코드를 그대로 가져와 증명을 시도했다면, 292개 중 96개(약 32.9%)만이 성공했습니다. 이는 세 번 중 한 번도 채 되지 않는 수치입니다!
- 수정의 힘: AI가 증명을 두 번 수정할 기회를 주었을 때, 성공 횟수는 292개 중 154개(약 52.7%)로 급증했습니다.
- 다양성의 힘 (진정한 승자): 73개의 퍼즐 전체를 놓고 보았을 때, 49개의 퍼즐(성공률 67.1%)에서 최소 하나의 버전은 올바르게 증명될 수 있음을 발견했습니다.
이것이 주요 발견입니다: 작업적으로 동등한 구현체(Task-equivalent implementations)는 검증 가능성 측면에서 크게 다를 수 있습니다. 즉, 똑같은 일을 수행하는 두 코드는 그것을 증명하는 난이도 면에서 천지 차이일 수 있다는 것입니다.
이 연구가 주장하지 않는 것 (한계점)
이 논문은 자신들이 주장하지 않는 부분에 대해서도 매우 신중합니다:
- 더 나은 코드에 관한 것이 아님: 그들은 "배열이 리스트보다 낫다"거나 "재귀가 루프보다 낫다"는 식의 결론을 내리지 않았습니다. 실제로 결과는 섞여 있었습니다. 재귀 코드가 일반적으로 명령형(루프 기반) 코드보다 증명하기 쉬웠지만, 배열과 리스트의 성과는 전반적으로 비슷했습니다. 핵심은 가장 좋은 스타일을 고르는 것이 아니라, **선택지(options)**를 갖는 것이었습니다.
- 규칙을 바꾸는 것에 관한 것이 아님: 그들은 수정 단계에서 AI가 "계약(목표)"을 변경하는 것을 엄격히 금지했습니다. 만약 AI가 증명을 쉽게 만들기 위해 목표를 변경하려 했다면, 그것은 실패로 간주되었습니다. 그들은 약화된 목표가 아닌, 원래의 목표를 증명하고자 했습니다.
- 모든 것에 적용되는 마법의 탄환이 아님: 이 연구는 정수, 배열, 리스트를 포함하는 퍼즐만을 대상으로 했습니다. 이 방식이 부동 소수점 숫자, 복잡한 3D 그래픽, 또는 인터넷과 통신하는 프로그램에도 작동한다고 주장하지 않습니다.
얼마나 확신하는가?
저자들은 측정값에 대해서는 확신하지만, 전체적인 그림에 대해서는 신중합니다.
- 측정된 것: 그들은 명확한 수치를 가지고 있습니다. 도구를 실행했고, 성공 횟수를 셌으며, 다양성이 개별 산출물의 성공률을 32.9%에서 52.7%로, 작업(task)의 성공률을 67.1%로 높였다는 것을 확인했습니다.
- 제안된 것: 그들은 명령형 코드(루프)가 증명하기 더 어려웠던 이유가, 루프 내부에서 일어나는 일에 대한 규칙인 "루프 불변량(loop invariants)"을 AI가 자동으로 만들어내기 어렵기 때문이라고 추측합니다. 만약 AI에게 이러한 규칙을 추측할 수 있는 더 나은 도구를 제공한다면, 그 격차가 줄어들 수 있다고 보고 있습니다.
- 아직 증명되지 않은 것: 그들은 "배열 계약"과 "리스트 계약"이 수학적으로 동일하다는 것을 증명하지 않았습니다. 단지 작업 설명에 근거하여 두 계약이 같은 의미라고 가정했을 뿐입니다. 또한, 규칙이 퍼즐과 일치하는지 확인하는 그들의 "판사(AI)"가 완벽한 인간 전문가가 아니므로, 미세한 오류가 일부 포함되었을 수 있음을 인정합니다.
요점
이 논문은 우리가 AI에게 "검증된" 소프트웨어를 작성하라고 요청할 때, 단 하나의 답만을 구하고 운에 맡겨서는 안 된다는 점을 시사합니다. 대신, 선택 가능한 메뉴를 요청해야 합니다. 동일한 문제를 해결하는 다양한 방법들을 생성함으로써, 우리는 증명 검사기가 실제로 이해할 수 있는 버전을 찾아낼 확률을 높일 수 있습니다.
이것은 자물쇠에 맞는 열쇠를 찾는 것과 같습니다. 열쇠가 하나뿐이라면 꼼짝 못 할 수도 있습니다. 하지만 열쇠가 여러 개 달려 있다면, 설령 그 열쇠들이 모두 같은 문을 연다 하더라도, 그중 하나는 반드시 자물쇠에 완벽하게 맞을 것입니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.