셀프 진화 기반 Rust 코드 자동 증명 생성
초록
SAFE 프레임워크는 인간이 만든 증명 데이터가 부족한 상황에서, GPT‑4o와 Verus 검증기를 활용해 Rust 프로그램과 사양을 자동으로 생성·검증하고, 자체 디버깅 루프를 통해 오픈소스 LLM을 단계적으로 fine‑tune함으로써 인간 수준의 증명 정확도 52.5%를 달성한다.
상세 분석
본 논문은 형식 검증을 위한 데이터 부족 문제를 “셀프‑에볼루션”이라는 두 단계의 순환 구조로 해결한다. 첫 번째 단계는 Verus‑호환 Rust 코드를 대규모로 확보하기 위해 GPT‑4o를 코드 변환기 역할로 사용한다. 기존 Python·Rust 데이터셋을 Verus가 지원하는 하위 집합으로 변환하고, 컴파일되지 못하는 코드는 즉시 배제한다. 이 과정에서 Verus 컴파일러 자체가 자동 필터 역할을 수행한다는 점이 핵심이다.
두 번째 단계는 사양(specification) 자동 생성이다. 초기 라운드에서는 GPT‑4o가 함수 구현과 doc‑string을 기반으로 전·후조건을 만든다. 이후 라운드에서는 앞선 라운드에서 얻은 고품질 사양만을 이용해 새로운 LLM을 fine‑tune하고, 이 모델이 다시 사양을 생성한다. 여기서 “품질”은 Lahiri(2024)의 정량적 메트릭을 이용해 자동 평가한다. 완벽한 사양이 아니라 “충분히 좋은” 사양이면 Verus가 증명을 시도할 수 있기 때문에, 완전성을 강요하지 않아도 된다.
증명 생성 단계에서는 동일한 셀프‑에볼루션 루프가 적용된다. 초기에는 GPT‑4o가 전체 프로그램 중 20% 미만만을 성공적으로 증명하지만, 이 작은 성공 집합을 “전문가” 데이터로 활용한다. Verus 검증기는 생성된 증명의 올바름을 즉시 판단하고, 올바른 증명(P✓)과 이전에 실패한 증명(P✗) 및 오류 메시지를 삼중항(triplet) 형태로 저장한다. 이 삼중항은 모델의 “디버깅” 능력을 학습시키는 데이터가 된다. 즉, 모델은 “잘못된 증명 → 오류 원인 → 올바른 증명”이라는 변환을 스스로 학습한다.
실험 결과는 두 가지 벤치마크에서 확인된다. 인간이 직접 작성한 사양과 검증 과정을 거친 V erusBench에서는 SAFE가 43.17%의 직접 생성 정확도를 보였으며, 자체 디버깅을 적용하면 79.14%까지 상승한다. 코드넷 기반 합성 테스트에서도 유사한 추세가 나타난다. 특히 GPT‑4o 대비 4배 이상(정확도 52.5% vs 14.4%)의 성능 향상을 기록한다.
핵심 인사이트는 다음과 같다. ① 검증 엔진 자체를 데이터 필터링 및 라벨링 도구로 활용함으로써 인간 라벨링 비용을 완전히 제거한다. ② “잘못된 증명”이라는 대량의 부정확 데이터를 오히려 디버깅 학습에 재활용함으로써 모델의 회복력과 일반화 능력을 크게 강화한다. ③ 사양 생성과 증명 생성이 서로 의존적인 두 개의 셀프‑에볼루션 루프를 병렬로 운영함으로써, 초기 데이터가 거의 없는 상황에서도 점진적인 성능 향상이 가능함을 입증한다.
이러한 접근은 Rust와 Verus에 국한되지 않고, 다른 코드‑검증 도구(예: Dafny, Why3)에도 확장 가능할 것으로 보인다. 다만 현재는 Verus가 지원하는 Rust 서브셋에 의존하므로, 도구의 언어 지원 범위가 넓어질수록 전체 파이프라인의 적용 가능성도 확대될 것이다.
댓글 및 학술 토론
Loading comments...
의견 남기기