RefactorAssist: Agentic Refinement for Reliable Code Refactoring
이 논문은 정적 수리와 에러 로그 및 컨텍스트 검색을 활용한 반복적인 테스트 기반 정교화 과정을 결합하여, LLM이 생성한 코드 리팩토링의 기능적 정확성과 신뢰성을 크게 향상시키는 에이전트 프레임워크인 RefactorAssist를 소개한다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
당신이 웅장하고 복잡한 성을 설계하며 수년간 공을 들인 숙련된 건축가라고 상상해 보십시오. 이제, 당신의 성을 개축하는 것을 도울 아주 똑똑하고 믿을 수 없을 정도로 빠른 로봇 조수를 고용했다고 상상해 보십시오. 당신의 목표는 성이 작동하는 방식 자체를 바꾸는 것이 아닙니다. 사람들이 바닥 아래로 떨어지지 않고 주방에서 침실까지 이동할 수 있어야 하는 것처럼 말입니다. 대신 복도를 더 넓게 만들고, 방을 더 밝게 하며, 구조를 유지보수하기 더 쉽게 만드는 것이 목표입니다. 이것이 바로 **코드 리팩토링(code refactoring)**의 세계입니다. 즉, 실행되는 소프트웨어를 망가뜨리지 않으면서 코드를 더 좋게 만들기 위해 코드를 정리하고 재구성하는 과정입니다.
오랫동안 우리는 코드의 서투른 포맷팅이나 명백한 실수를 지적해 주는 기본적인 맞춤법 검사기 같은 도구들을 가져왔습니다. 하지만 최근에 새로운 종류의 "로봇"이 등장했습니다. 바로 **대규모 언어 모델(LLM)**입니다. 이들은 거의 모든 책, 매뉴얼, 지침서를 읽은 AI 조수라고 생각하면 됩니다. 이들은 새로운 이야기를 쓰거나 깨진 문장을 고치는 데 매우 뛰어납니다. 하지만 당신이 그들에게 복잡한 성을 개축하라고 요청하면, 가끔 지나치게 창의적으로 변하곤 합니다. 지붕을 받치고 있는 벽을 옮겨버리거나, 문 이름을 바꿔서 사람들이 주방을 찾는 데 혼란을 주기도 합니다. 여기서 과학자와 엔지니어들의 큰 질문은 이것입니다. "우리는 이 AI 로봇들이 안전하게 개축 작업을 수행할 수 있다고 믿을 수 있는가, 아니면 인간 감독자가 그들의 작업을 재검토해야 하는가?"
이것이 바로 **"RefactorAssist: 신뢰할 수 있는 코드 리팩토링을 위한 에이전트 기반 정교화(RefactorAssist: Agentic Refinement for Reliable Code Refactoring)"**라는 논문이 조사하고자 하는 내용입니다. 연구진인 조나단 코르데이로(Jonathan Cordeiro), 샤얀 노이(Shayan Noei), 잉 조우(Ying Zou)는 이 AI 로봇들이 코드를 망가뜨리지 않고 개선할 수 있는지, 만약 코드를 망가뜨렸다면 스마트한 "수리 에이전트"가 그 실수를 고칠 수 있는지를 확인하고 싶었습니다.
로봇의 첫 번째 시도: 엇갈린 결과
연구팀은 여러 가지 서로 다른 AI 모델(StarCoder2와 같은 오픈 소스 모델과 GPT-4o와 같은 강력한 상용 모델 포함)에게 실제 Java 소프트웨어 프로젝트에 대한 개축을 수행하도록 요청했습니다. 그들은 소프트웨어를 **유닛 테스트(unit tests)**라는 내장된 "건강 검진" 시스템을 가진 살아있는 생명체처럼 다루었습니다. 이 테스트들은 일련의 체크포인트와 같습니다. 코드가 올바르게 변경되었다면 로봇은 테스트를 통과하지만, 로봇이 실수로 기능을 망가뜨렸다면 테스트는 실패합니다.
결과는 다소 충격적이었습니다. GPT-4o와 같은 최고의 AI 모델조차 개축을 올바르게 수행하는 데 약 **80.8%**의 성공률만을 보였습니다. 이는 AI가 코드를 개선하려고 시도했을 때 거의 5번 중 1번꼴로 무언가를 망가뜨려 소프트웨어가 건강 검진(테스트)에 실패했다는 것을 의미합니다. 연구진은 AI에게 개축하는 방법의 예시를 더 많이 제공하는 것(퓨샷 프롬프팅, few-shot prompting 기술)이 큰 도움이 되지 않는다는 것을 발견했습니다. 문제는 AI가 개축하는 방법을 모르는 것이 아니라, 미묘하고 위험한 실수를 피하기 위해 필요한 *맥락(context)*을 충분히 이해하지 못했다는 것이었습니다.
왜 로봇들은 실패했는가?
연구진은 무엇이 잘못되었는지 알아내기 위해 탐정처럼 "범죄 현장", 즉 실패한 코드들을 조사했습니다. 그들은 AI의 실수가 크게 8가지 범주로 나뉜다는 것을 발견했는데, 가장 흔한 것은 다음과 같았습니다:
- 환각 및 맥락 혼동 (24.3%): AI가 코드의 이야기를 오해하여 새로운 기능을 발명하거나 변경할 필요가 없는 것을 변경했습니다.
- 일관성 없는 이름 변경 (15.3%): AI가 한 곳에서는 변수 이름을 변경했지만(예: "door"를 "gate"로 변경), 다른 모든 곳에서는 이름을 업데이트하는 것을 잊어버려 코드를 혼란에 빠뜨렸습니다.
- 새로운 요소 추가 (13.7%): AI가 원래 있어서는 안 될 새로운 변수나 함수를 실수로 추가했습니다.
- 불완전한 코드 (11.3%): AI가 코드를 쓰다가 중간에 멈춰버려 누락된 부분을 남겼습니다.
- 구문 및 구조적 오류 (9.7%): 닫는 괄호나 세미콜론을 잊어버리는 것과 같은 기본적인 실수입니다.
- 예외 상황 (9%): 사용자가 숫자 대신 0을 입력하는 경우와 같은 드문 상황을 처리하는 것을 잊었습니다.
- 타입 처리 (8.7%): 텍_스트 메시지를 숫자 상자에 넣으려고 하는 것과 같이 서로 다른 종류의 데이터를 혼동했습니다.
- 스코프 문제 (8%): 변수가 존재하지 않는 곳에서 변수를 사용하려고 했습니다.
RefactorAssist의 등장: 슈퍼 검사관
연구진은 단순히 AI에게 다시 시도하라고 말하는 것만으로는 부족하다는 것을 깨달았습니다. 그들은 이러한 실수를 잡아내고 자동으로 수정할 수 있는 시스템이 필요했습니다. 그래서 그들은 2단계 품질 관리 검사관 역할을 하는 스마트한 "수리 에이전트"인 RefactorAssist를 구축했습니다.
1단계: 빠른 수정 (정적 수리 - Static Repair)
AI에게 다시 생각하라고 요청하기도 전에, RefactorAssist는 규칙 기반의 빠른 점검을 실행합니다. 이는 이야기의 내용을 이해할 필요 없이 문법만 확인하는 맞춤법 검사기와 같습니다. 이는 누락된 import, 불균형한 괄호, 단순한 타입 오류와 같은 명백한 것들을 수정합니다. 이 단계는 무거운 AI 두뇌를 사용하지 않기 때문에 저렴하고 빠릅니다. 놀랍게도, 이 간단한 단계가 문법을 정리함으로써 성공률을 **66.1%**에서 74.4%(최적의 설정에서는 80.3%)까지 끌어올렸습니다.
2단계: 탐정 작업 (에이전트 기반 수리 - Agentic Repair)
(정적 수리 후에도 여전히 망가져 있는 코드들에 대해) RefactorAssist는 "에이전트 모드"로 전환합니다. 이 시스템은 모든 증거를 수집합니다: 실패한 테스트의 에러 메시지, AI가 수행한 구체적인 변경 사항("diff"), 그리고 주변 코드의 맥락입니다. 그런 다음 강력한 AI(예: GPT-4o)에게 탐정 역할을 맡겨, 왜 코드가 실패했는지 설명하고 수정안을 제안하도록 합니다. 이 탐정은 단순히 추측하는 것이 아니라, 증거를 사용하여 수리를 유도합니다.
이 2단계 프로세스의 결과는 인상적이었습니다. 초기 AI 시도, 정적 수리, 그리고 반복적인 탐정 작업 과정을 거친 후, 성공률은 무려 **94.2%**까지 상승했습니다. 결정적으로, 이 시스템은 초기 정적 수리 단계 이후에도 남아있던 실패 사례의 **70.8%**를 해결할 수 있었습니다. 이는 AI가 실수하고 문법 검사가 고칠 수 없었던 개축 작업들 중에서, RefactorAssist 탐정 에이전트가 대다수를 성공적으로 복구하여 전체 성공률을 거의 완벽에 가깝게 끌어올렸음을 의미합니다.
무엇이 효과가 없었나?
연구진은 도움이 될 것이라고 생각했지만 효과가 적었던 아이디어들도 테스트했습니다. 예를 들어, AI에게 더 많은 배경 정보를 제공하기 위해 프로젝트 전체를 검색하는 "리트리벌(retrieval, 정보 검색)" 시스템을 시도했습니다. 이는 문제를 해결하는 데 있어 초기 몇 초 동안은 약간 도움이 되었지만, 장기적으로 어려운 문제를 해결하는 데는 실제로 도움이 되지 않았습니다. 논문은 무언가가 왜 고장 났는지에 대한 명확하고 정확한 설명(진단)을 갖는 것이 방대한 양의 추가 맥락을 갖는 것보다 훨씬 더 중요하다는 점을 시사합니다.
핵심 요약
이 논문은 AI가 아직 스스로 코드를 완벽하게 리팩토링할 수 있다고 주장하는 것이 아닙니다. 사실, 도움 없이는 AI가 약 **20%**의 확률로 실수를 한다는 것을 입증합니다. 그러나 간단하고 빠른 "문법 검사"와 스마트하고 증거 기반적인 "탐정 에이전트"를 결합함으로써 대부분의 실수를 고칠 수 있음을 보여줍니다.
주요 결론은 RefactorAssist가 엉망이고 망가진 AI 생성 개축 코드를 안전하고 작동하는 코드 업데이트로 바꾸어 성공률 **94.2%**를 달행할 수 있다는 것입니다. 이는 소프트웨어 공학의 미래가 단순히 더 똑똑한 AI를 갖는 것이 아니라, AI가 힘든 일을 수행하고 전문화된 수리 에이전트가 사용자에게 도달하기 전에 오류를 잡아내는 팀을 구축하는 것에 있다는 것을 시사합니다. 이는 아무리 똑똑한 로봇이라도 최선의 성과를 내기 위해서는 훌륭한 품질 관리 팀이 필요하다는 점을 상기시켜 줍니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.