소스 포레저: 코드 구조·시멘틱을 활용한 고성능 유사 코드 검색 엔진

소스 포레저: 코드 구조·시멘틱을 활용한 고성능 유사 코드 검색 엔진
안내: 본 포스트의 한글 요약 및 분석 리포트는 AI 기술을 통해 자동 생성되었습니다. 정보의 정확성을 위해 하단의 [원본 논문 뷰어] 또는 ArXiv 원문을 반드시 참조하시기 바랍니다.

초록

소스 포레저는 C/C++ 함수 단위의 질의를 받아, 사전 구축된 코드 데이터베이스에서 구조·시멘틱 특징을 기반으로 가장 유사한 k개의 함수를 반환하는 검색 엔진이다. 다양한 피처 클래스를 추출하고, 피처별 유사도 함수를 결합해 가중 평균을 사용함으로써 텍스트 기반 검색의 한계를 극복한다. 동적 피처 선택과 도메인‑특화 SVM 가중치 학습을 통해 검색 정확도를 향상시켰으며, 대규모 데이터베이스에서도 실시간 수준의 응답 속도를 달성한다.

상세 분석

소스 포레저는 기존 텍스트 기반 코드 검색이 코드의 구조적·시멘틱 정보를 무시한다는 근본적인 문제를 해결하고자 설계되었다. 핵심 아이디어는 “피처‑클래스”라는 추상화 레이어를 도입해 함수마다 여러 차원의 특징을 동시에 추출하고, 각 피처에 맞는 유사도 함수를 정의한 뒤 가중 평균으로 종합 유사도를 산출하는 것이다. 현재 구현된 피처‑클래스는 타입‑연산 결합, 스켈레톤 트리, 데코레이트드 스켈레톤 트리, 자연어 주석, 문자열·수치 리터럴, 라이브러리 호출(모델링·비모델링·사용자 정의), 타입 시그니처, 로컬 타입 등 총 15여 종류이며, 대부분은 Jaccard 지수를 사용해 집합 기반 유사도를 측정한다.

오프라인 단계에서는 전체 코드베이스를 파싱해 각 함수에 대해 피처‑벡터를 생성하고, 이를 고성능 인메모리 객체 저장소인 Pliny‑DB에 직렬화한다. 온라인 단계에서는 질의 함수도 동일한 파이프라인을 거쳐 피처‑벡터를 만든 뒤, 사전 정의된 피처 가중치와 결합된 종합 유사도 함수를 이용해 데이터베이스 전체를 스캔한다. k‑최근접 검색은 우선순위 큐를 활용해 O(N·log k) 시간에 수행되며, 500 k 함수 규모의 데이터베이스에서도 2초 이내에 상위 10개 결과를 반환한다.

가중치 결정 메커니즘은 두 가지 모드로 제공된다. 첫 번째인 “dyn‑select”는 질의에 포함된 피처 존재 여부를 기반으로 자동으로 사용할 피처‑클래스를 선택한다. 이는 도메인 정보가 전혀 없을 때도 적절한 피처 집합을 구성해 검색 품질을 유지한다. 두 번째인 “svm‑weights”는 특정 도메인(예: 알고리즘 구현, 시스템 콜 등)에 대해 사전에 라벨링된 학습 데이터를 이용해 SVM 기반 회귀 모델을 학습시켜 피처 가중치를 미리 계산한다. 실험 결과, 도메인‑특화 가중치를 적용했을 때 평균 정밀도와 재현율이 유의미하게 상승했으며, 특히 대규모 데이터베이스에서 희소한 질의와 매칭되는 함수가 극히 적은 경우에도 높은 검색 성공률을 보였다.

아키텍처 측면에서 소스 포레저는 피처‑클래스 추가가 매우 용이하도록 설계되었다. 새로운 피처를 도입하려면 (1) 해당 피처를 추출하는 전처리 모듈을 구현하고, (2) 피처‑특성에 맞는 유사도 함수를 정의하면 된다. 현재 구현은 CodeSonar를 활용하지만, 다른 C/C++ 파싱 툴이나 다른 언어 파서로도 손쉽게 교체 가능하도록 인터페이스가 추상화돼 있다. 또한 함수 외에도 클래스, 메서드, 모듈 단위로 확장할 수 있는 구조적 유연성을 제공한다.

성능 평가에서는 두 개의 실사용 도메인(알고리즘 문제 풀이와 시스템 라이브러리 사용)에서 100여 개의 질의 집합을 이용해 기존 텍스트 검색 엔진과 비교하였다. 소스 포레저는 Top‑5 정확도 78 %를 기록했으며, 텍스트 기반 베이스라인은 42 %에 머물렀다. 또한, 질의당 평균 응답 시간은 1.8 초로 실시간 인터랙티브 사용에 충분한 수준이었다.

한계점으로는 피처‑클래스가 여전히 “단순 집합” 수준에 머물러 있어, 복잡한 데이터 흐름이나 제어 의존성을 완전히 포착하지 못한다는 점이다. 또한 현재는 C/C++에 특화된 파싱·피처 추출 로직을 사용하므로, 다른 언어에 적용하려면 별도의 파서와 피처 정의가 필요하다. 향후 연구에서는 그래프 기반 흐름 분석, 딥러닝 기반 임베딩 결합, 그리고 분산 Pliny‑DB 구현을 통해 대규모 클라우드 환경에서도 확장성을 확보하고자 한다.


댓글 및 학술 토론

Loading comments...

의견 남기기