코드 이슈 위치 찾기의 새로운 패러다임 SpIDER
초록
SpIDER는 함수‑레벨 코드 검색에서 기존 밀집 임베딩만으로는 놓치기 쉬운 구조적 근접성을 활용한다. 이 방법은 먼저 BM25와 같은 희소 검색이 아닌 밀집 임베딩으로 상위 K개의 후보를 선정하고, 그 중 상위 C개를 ‘시드’로 삼아 코드 그래프의 contains 관계를 따라 d‑hop 이내의 이웃 함수를 탐색한다. 탐색된 후보는 LLM에게 재검토를 받아 재정렬되며, 최종적으로 초기 K 리스트를 구조적으로 보강한다. 실험은 Python, Java, JavaScript, TypeScript 네 언어에 걸친 SpIDER‑Bench 벤치마크에서 기존 밀집 검색 대비 평균 13 % 이상의 정확도 향상을 입증한다.
상세 분석
SpIDER는 기존 밀집 임베딩 기반 검색이 갖는 “시맨틱 유사도만을 기준으로 후보를 선정한다는” 한계를 그래프 구조 정보를 통해 보완한다는 점에서 의미가 크다. 논문은 먼저 코드베이스를 함수·클래스·파일·디렉터리 노드와 contains, invokes, imports, inherits와 같은 관계를 갖는 이종 그래프로 변환한다. 이때 Python은 ast 모듈, Java·JavaScript·TypeScript는 Tree‑sitter 파서를 이용해 정확한 AST를 추출한다. 그래프 구축 단계에서 다중 언어 파일을 배제하고, 주요 언어 파일만을 대상으로 함으로써 그래프의 일관성을 유지한다.
검색 파이프라인은 크게 네 단계로 나뉜다. ① 시맨틱 검색: 사전 학습된 바이모달 인코더(F)를 사용해 이슈 설명 Q와 모든 함수 v의 임베딩을 매핑하고, 코사인 유사도로 상위 K개를 추출한다. ② 시드 선택: 상위 K 중 상위 C개를 시드 노드(C_Q)로 선정한다. ③ 공간 탐색: 각 시드에서 ‘contains’ 에지를 따라 d‑hop 이내의 이웃 함수 집합 Γ_d(C_Q)를 BFS로 수집한다. 여기서 d는 2~4 정도로 설정해 클래스·파일 간 계층적 거리를 반영한다. ④ LLM 재검토: 수집된 후보는 LLM에게 “이 이슈와 관련성이 높은가?”를 물어 필터링한다. LLM은 시맨틱 유사도만으로는 낮게 평가된, 그러나 구조적으로 인접한 함수를 재발견한다. 최종 후보 리스트는 초기 K 리스트에서 하위 후보를 동일 수만큼 교체해 크기 K를 유지한다.
이 설계는 정확도와 효율성를 동시에 잡는다. 구조적 탐색은 그래프가 비교적 희소하므로 BFS 비용이 낮고, LLM 호출은 후보 수가 제한적이기 때문에 전체 추론 비용이 크게 증가하지 않는다. 실험에서는 SpIDER‑Bench에 포함된 4개 언어·3개 데이터셋(SWE‑PolyBench, Multi‑SWEBench, SWEBench‑Verified)에서 기존 밀집 검색(Fehr‑2025, Reddy‑2025)과 BM25를 모두 앞선다. 특히 함수‑레벨에서 평균 13 % 이상의 Recall@K 향상을 보였으며, 언어별 편차가 적어 다중 언어 환경에서도 견고함을 입증한다.
한계점으로는 (1) 그래프 구축 시 다중 언어 파일을 무시함으로써 일부 교차 언어 의존성을 놓칠 수 있다, (2) ‘contains’ 관계에만 초점을 맞춘 탐색이 호출 관계나 상속 관계 등 다른 중요한 연결을 충분히 활용하지 못한다는 점, (3) LLM 필터링 단계가 프롬프트 설계와 모델 크기에 민감해 실제 서비스 적용 시 비용·지연을 고려해야 한다는 점을 들 수 있다. 향후 연구에서는 다중 관계(contains, invokes, imports 등)를 가중치 기반으로 통합하고, 시드 선택을 동적으로 최적화하며, 경량 LLM을 캐시하는 방법을 탐색할 여지가 있다.
댓글 및 학술 토론
Loading comments...
의견 남기기