Slopo: 임베딩 모델을 활용한 비정확 코드 중복 탐지
Slopo: 임베딩 모델을 활용한 비정확 코드 중복 탐지
Slopo는 임베딩 모델을 사용해 비정확 코드 중복을 식별합니다
Slopo는 정확히 복사‑붙여넣기 된 것이 아닌 코드 중복을 탐지하도록 설계된 가벼운 CLI 도구입니다. 임베딩 모델을 활용해 코드베이스 내에서 멀리 떨어져 있거나 서로 다른 모듈에 있거나 큰 파일 안에 분산된, 형태는 비슷하지만 정확히 동일하지 않은 코드 조각들을 찾아냅니다. 이 접근 방식은 의미적으로는 유사하지만 동일하지 않은, 즉 "감지하기 가장 어려운" 중복을 목표로 하며, 이는 유지보수성에 가장 큰 해를 끼치는 경우가 많습니다.
임베딩 기반 탐지 방식
Slopo는 전통적인 중복 탐지와 달리 모든 코드 단위에 대해 임베딩을 계산합니다. 그런 다음 임베딩이 수학적으로 가깝게(코사인 유사도 사용) 위치한 코드 단위 쌍을 잠재적 중복으로 표시합니다.
탐지 파이프라인
유사한 코드 단위는 두 단계의 과정을 거쳐 필터링되어 잡음이 줄어듭니다:
- 유사도 임계값: 도구는 먼저 코사인 유사도가 최소값(‑1~1 범위)을 충족하지 못하는 쌍을 걸러냅니다.
- 재정렬 및 부스팅: 유사한 쌍을 클러스터로 묶고, 이 클러스터를 다시 정렬합니다. 코드베이스 내 거리(파일 간 혹은 파일 내) 기반으로 "부스팅"을 적용합니다:
- 크로스 파일: 다른 파일에 도달하기 위해 필요한 디렉터리 단계 수에 따라 부스팅을 적용합니다(최대 15%).
- 동일 파일: 코드 라인 거리(줄 수)에 따라 부스팅을 적용합니다(최대 10%).
이 순위 시스템은 코드베이스 내에서 멀리 떨어진 유사 코드를 우선시합니다. 이러한 경우가 인간 개발자에게 가장 눈에 띄지 않는 중복이기 때문입니다.
정확한 복사본 처리
Slopo는 비정확 중복에 초점을 맞추지만 정확한 복사본도 탐지합니다. 보고서를 깔끔하게 유지하기 위해 동일한 코드는 한 번만 표시하고, 해당 코드가 존재하는 모든 경로를 목록으로 보여줍니다. 동일 스니펫을 여러 번 반복하지 않습니다.
지원 언어 및 기술 요구 사항
Slopo는 다음과 같은 다양한 인기 프로그래밍 언어를 지원합니다:
- Python
- TypeScript
- JavaScript
- Java
- Kotlin
- C#
- Go
- Rust
임베딩 모델 설정
임베딩은 LiteLLM과 호환되는 외부 제공자를 통해 생성됩니다. 최적의 결과를 위해 저자는 Voyage AI와 같이 코드 전용으로 설계된 모델을 권장합니다. 도구는 임베딩 차원 및 배치 크기를 유연하게 설정할 수 있어 성능을 최적화할 수 있습니다.
개발 워크플로우와의 통합
Slopo는 종종 AI 코딩 에이전트와 함께 사용되는 보다 큰 리팩토링 워크플로우의 일부로 설계되었습니다.
권장 워크플로우
- 초기 분석:
slopo index,slopo embed,slopo analyze명령을 실행해 초기 보고서를 생성합니다. - 필터링: AI 코딩 에이전트를 사용해 유사 코드 클러스터를 검토하고, 실제로 리팩토링이 필요한 중복인지 판단합니다.
- 무시: 제외된 클러스터는
slopo.ignore.txt에 추가합니다. 이 파일은 Git 저장소에 커밋해 팀 전체가 동일한 검토 결과를 공유하도록 할 수 있습니다. - 리팩토링: 남은 검증된 중복을 기반으로 리팩토링을 진행합니다.
주요 설정 파라미터
사용자는 다음 파라미터를 통해 도구의 민감도를 조정할 수 있습니다:
similarity_threshold: 첫 번째 단계에서 최소 코사인 유사도를 조정합니다.rerank_threshold: 코드베이스 거리 부스팅이 적용된 후 최소 유사도를 조정합니다.body_node_count_threshold: 코드 단위 본문에 포함된 최소 AST 노드 수를 설정합니다. 이를 통해 일정 복잡도 이상의 코드만 분석되어, 사소하고 작은 스니펫으로 보고서가 어수선해지는 것을 방지합니다.
커뮤니티 인사이트 및 활용 사례
개발자들 사이의 논의에서는 Slopo 접근법의 높은 가치 활용 사례가 몇 가지 제시되었습니다:
- 프리‑푸시 훅: 초기 정리 후 코드베이스 청결을 유지하기 위해 프리‑푸시 훅에 도구를 통합합니다.
- 시맨틱 중복: 직접 복사‑붙여넣기가 아닌 의미적 중복을 식별합니다. 이는 대규모 리팩터링 전에 특히 유용합니다.
- 코드 리뷰 통합: 코드 리뷰 중 유사 스니펫 탐지를 활용해 레포에 이미 존재하는 동일 기능 구현을 개발자에게 알립니다.
"나는 Slopo를 특정 문제를 해결하기 위해 만들었습니다: 다른 도구, 코딩 AI 에이전트, 그리고 인간이 가장 감지하기 어려운 유사 코드를 찾아내는 것... 탐지된 중복 중 대부분은 오탐이지만, 남은 것들은 리팩터링이나 버그가 될 가능성이 높은 강력한 후보입니다."
— rkochanowski, Slopo 제작자
요약: Slopo는 임베딩 모델을 활용해 서로 다른 모듈과 파일에 걸친 비정확 코드 중복을 식별하는 CLI 도구이며, 전통적인 복사‑붙여넣기 탐지기에서 놓치기 쉬운 유사 코드를 우선적으로 찾아냅니다.
제목: Slopo: 임베딩 모델을 활용한 비정확 코드 중복 탐지