An LLM-based Technique for Detection of Code Clones Across Open Source Microservice Repository Forks
본 연구는 Codestral-22B LLM을 활용한 퓨샷 연속 프롬프팅 기반의 RAG 파이프라인이 현재의 재현율 한계에도 불구하고, 기존의 구문 기반 도구들을 능가하며 오픈 소스 마이크로서비스 포크 내의 의미론적 코드 클론과 재사용 패턴을 효과적으로 식별한다는 것을 입증한다.
원본 논문은 CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
소프트웨어 개발의 광활하고 협력적인 세계에서, 프로그래머들은 종종 기존의 코드를 가져와 다른 목적으로 적응시킴으로써 새로운 애플리케이션을 구축합니다. '포킹(forking)'이라고 알려진 이 관행은 오픈 소스 혁신의 엔진이며, 팀들이 처음부터 다시 시작하는 대신 거인들의 어깨 위에 올라설 수 있게 해줍니다. 그러나 이러한 프로젝트가 성장하고 분기됨에 따라 숨겨진 복잡성이 발생합니다. 그 안의 코드가 중복된 것들의 뒤엉킨 그물이 될 수 있다는 점입니다. 어떤 복사본은 줄 단위로 일치하는 정확한 복제본인 반면, 다른 것들은 겉모습은 완전히 달라 보이지만 동일한 기능을 수행하도록 교묘하게 재작성된 버전들입니다. 이것들은 '코드 클론(code clones)'이라 불립니다. 대규모 소프트웨어 시스템, 특히 작고 독립적인 서비스들의 집합체로 구축된 시스템의 유지 관리자들에게 이러한 중복을 찾아내는 것은 엄청난 과업입니다. 전통적인 도구들은 정확한 복사본을 찾아내는 데는 탁월하지만, 두 코드 조각이 완전히 다른 방식으로 구현되었음에도 동일한 기능을 수행하도록 리팩터링되었을 때 이를 인식하는 데는 자주 실패합니다. 이러한 중복이 어디에 어떻게 존재하는지 이해하는 것은 매우 중요합니다. 이는 소프트웨어가 어떻게 진화하는지, 어디에 불일치의 위험이 있는지, 그리고 시스템을 원활하게 운영하기 위해 실제로 얼마나 많은 노력이 필요한지를 밝혀주기 때문입니다.
최근 한 연구팀은 새로운 종류의 디지털 도구인 대규모 언어 모델(LLM)을 테스트함으로써 이 문제를 해결하고자 했습니다. 이들은 이야기를 쓰거나 질문에 답할 수 있는 것과 동일한 강력한 인공지능 시스템이지만, 여기서는 컴퓨터 코드의 논리를 이해하도록 훈련되었습니다. 연구진은 이 모델들이 단순한 동일 코드를 넘어, 전통적인 도구들이 놓치는 의미론적으로 유사한 코드까지 포착해낼 수 있는 정교한 현미경 역할을 할 수 있을지 확인하고 싶었습니다. 그들은 현대적인 소프트웨어 시스템인, 서로 교체 가능한 많은 작은 부품들로 구축된 오픈 소스 마이크로서비스 프로젝트에 초점을 맞추었습니다. 우선, 모델들에게 다양한 유형의 코드 클론을 인식하는 법을 가르쳐야 했습니다. 그들은 절반은 기능적으로는 동일하지만 구문적으로는 다른 것으로 알려져 있고, 나머지 절반은 서로 관련이 없는 1만 개의 C++ 코드 스니펫 쌍으로 구성된 방대한 데이터셋을 수집했습니다. 그들은 일반 목적의 시스템부터 코딩 작업에 특화된 두 개의 모델에 이르기까지 세 가지 서로 다른 인공지능 모델을 테스트했습니다. 또한, 단순한 지시부터 예시를 제공하고 신뢰도 점수를 요구하는 복잡한 프롬프트에 이르기까지, 모델이 과업을 수행하도록 요청하는 다양한 방식들을 실험했습니다.
초기 테스트 결과는 시사하는 바가 컸습니다. 연구진은 특화된 코딩 모델들이 일반 목적의 모델보다 훨씬 우수하다는 것을 발견했습니다. 그중에서도 '코드스트랄(Codestral)'이라는 이름의 모델이 가장 높은 전체 정확도인 65.5%를 달성하며 다른 특화 모델 및 일반 모델을 능가하는 가장 뛰어난 성능을 보였습니다. 그러나 이 연구는 중요한 한계점도 밝혀냈습니다. 가장 우수한 모델조차 실수를 저질렀다는 점입니다. 이 모델은 찾아내야 할 중복 코드를 자주 놓쳤으며, 약 40%의 확률로 이를 인식하지 못했습니다. 확실히 다른 코드를 식별하는 데는 능숙했지만, 미묘한 유사성을 포착하는 데는 너무 신중했습니다. 이러한 높은 미검출률은 현재로서는 이 강력한 도구들이 전문적인 자동화 환경에서 관리의 유일한 방법으로 사용될 만큼 충분히 신뢰할 만한 수준이 아님을 의미합니다. 이들은 유용한 조수일 뿐, 아직 인간의 판단이나 기존의 탐지 방법을 대체할 수는 없습니다.
가장 성능이 좋은 모델과 가장 효과적인 프롬프트 방식을 갖춘 연구진은 그다음으로 실제 세계로 눈을 돌렸습니다. 그들은 하나의 프로젝트가 원본이고 다른 하나는 다른 개발자 그룹에 의해 수정된 포크(fork)인 22개의 오픈 소스 마이크로서비스 저장소 쌍을 선택했습니다. 그들은 이 코드베이스들을 시스템에 입력하여 원본과 포크 사이에 어떤 종류의 중복이 존재하는지 정확히 지도화했습니다. 연구 결과는 이러한 프로젝트들이 어떻게 진화하는지에 대한 명확한 그림을 그려주었습니다. 그들이 발견한 가장 흔한 유형의 중복은 코드가 변경되지 않은 상태인 '정확한 복사본'이었습니다. 두 번째로 흔한 것은 코드가 추가되거나 삭제되었지만 원래의 기능은 유지되는 'Type-3 클론'이었습니다. 놀랍게도, 완전히 다른 방식으로 동일한 기능을 수행하는 '재작성된 코드'는 이 특정 프로젝트들에서 다른 유형들보다 덜 흔했습니다. 이는 개발자들이 마이크로서비스를 포킹할 때, 바퀴를 완전히 새로 만들기보다는 핵심 구조를 그대로 유지하는 경향이 있음을 시사합니다.
자동화된 결과의 신뢰성을 확보하기 위해, 연구진은 세 개의 프로젝트에 대해 인간 전문가가 수행한 수동 검토 결과와 모델의 출력을 비교했습니다. 인간 검토자들은 모델이 가장 흔한 유형의 중복을 식별하는 데 대체로 정확하다고 확인해주었으나, 모델이 코드를 읽는 데 사용한 기반 기술에 따라 구체적인 수치는 차이가 있었습니다. 연구는 인공지능이 코드 조각들 사이의 깊은 의미론적 관계를 이해하는 유망한 새로운 방법을 제시하지만, 아직 완벽한 해결책은 아니라고 결론지었습니다. 이 기술은 인간과 오래된 도구들이 놓칠 수 있는 패턴을 볼 수 있을 만큼 강력하지만, 중복을 통째로 놓쳐버리는 높은 위험성 문제에는 여전히 어려움을 겪고 있습니다. 당분간 이 모델들은 최종적인 권위자가 되기보다는, 개발자들이 자신의 코드의 복잡한 역사를 탐색하는 데 도움을 주는 가이드로서 가장 적합합니다. 앞으로의 과제는 오류를 줄이기 위해 이러한 도구들을 정교화하고, 이들의 의미론적 이해를 전통적인 방법과 결합하여 소프트웨어 진화에 대한 더 완전한 그림을 그려내는 것입니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.