임베딩 모델 기반 비정확 중복 코드 탐지 CLI 도구
Slopo는 임베딩 모델을 활용하여 다른 모듈이나 원격 위치에 흩어져 있는 발견하기 어려운 유사 코드를 찾아내는 가벼운 CLI 도구입니다. 코드를 임베딩 벡터로 변환하여 유사도와 물리적 거리를 기반으로 중복 가능성이 있는 코드 클러스터를 분류합니다. 개발자와 AI 코딩 에이전트가 이 결과를 바탕으로 실제 중복 여부를 확인하고 리팩토링을 수행할 수 있어 코드 품질 관리에 매우 유용합니다.
제목: Show HN: 임베딩 모델을 활용한 비정확 중복 코드 탐지 CLI 도구 소스: Hacker News
Slopo 임베딩 모델을 사용하여 비정확한(non-exact) 코드 중복을 탐지하는 가벼운 CLI 도구입니다. 이 도구는 탐지하기 가장 어렵고 가장 해로운 유사 코드, 즉 비슷한 방식으로 작성되었지만 코드베이스 내에서 물리적으로 멀리 떨어져 있거나, 종종 다른 모듈에 걸쳐 흩어져 있거나, 대용량 파일 내에서 분리되어 있는 코드 조각에 중점을 둡니다. 단순 복사 및 붙여넣기 기반의 완전한 중복은 다른 도구로도 쉽게 찾을 수 있으며, 서로 가까이 붙어있는 중복 코드는 사람이나 AI가 쉽게 발견할 수 있습니다. 이 문제에 대한 더 자세한 설명은 slopo.dev를 참조하세요.
지원 언어 Python, TypeScript, JavaScript, Java, Kotlin, C#, Go, Rust
작동 방식 일반적인 중복 탐지 도구와는 다른 접근 방식을 취합니다. 모든 코드 단위에 대해 임베딩을 계산한 다음, 임베딩 값이 가까운 쌍을 찾습니다. 유사한 코드가 반드시 중복은 아니기 때문에, 찾아낸 각 쌍은 확인이 필요한 잠재적 중복입니다. 즉, 동일한 기능을 수행하지만 완전히 다른 방식으로 구현된 코드는 거리가 먼 임베딩을 생성하므로 탐지되지 않습니다. 그 결과는 코드베이스 내 유사도와 물리적 거리를 기준으로 순위가 매겨진 유사 코드 단위의 클러스터입니다. 이러한 클러스터는 AI 코딩 에이전트(Coding Agent)의 입력 데이터로 사용되며, 에이전트는 해당 클러스터가 실제 중복인지 검증할 수 있습니다. 검토가 끝난 클러스터는 무시하도록 표시하거나 리팩토링을 위해 전달할 수 있습니다.
보고서 예시 Slopo 코드의 src 디렉토리(git tag v0.2.0)를 바탕으로 생성된 doc/example-report를 확인해 보세요. 이 예시는 각 언어에 대한 코드 파서가 많은 중복을 포함하고 있으며, 일부는 완전히 동일한 복사본이고 일부는 유사한 변형인 것을 확인해 주었습니다. 이 부분은 리팩토링이 필요합니다.
빠른 시작
설치: uv tool install slopo
이 명령은 Python 패키지 관리자인 uv(uv 설치)를 사용하여 PyPI에서 Slopo를 격리된 가상 환경에 설치합니다. Python을 별도로 설치할 필요가 없습니다.
설정
slopo init을 실행하여 추가 지침이 포함된 구성 파일 템플릿을 생성합니다. 분석할 코드가 있는 디렉터리와 임베딩 모델 구성만 있으면 충분합니다.
임베딩 모델 임베딩은 외부 제공자(provider)를 통해 계산됩니다. 최상의 결과를 원한다면 코드 전용 모델(예: Voyage AI, 512와 같은 저차원에서도 잘 작동함)을 사용해 보세요. LiteLLM과 호환되는 모든 모델 제공자를 사용할 수 있으며, 자세한 내용은 이곳에서 확인하세요. 보안을 위해 제공자의 API 키는 환경 변수로 설정할 수 있습니다.
분석
slopo show-config를 실행하여 구성의 유효성을 검사하고 설정 가능한 모든 매개변수를 확인하세요. 대부분은 합리적인 기본값이 설정되어 있어 선택 사항입니다. 이제 코드를 인덱싱하고, 임베딩을 계산하고, 보고서를 생성할 준비가 되었습니다:
slopo index
slopo embed
slopo analyze
실제 워크플로우
이 섹션은 Slopo를 실제 개발 워크플로우에서 어떻게 사용할 수 있는지 보여줍니다. 증분 재인덱싱(변경된 파일만으로 인덱스 업데이트)과 이미 검토한 클러스터를 버리는 slopo.ignore.txt 파일을 활용합니다.
첫 번째 분석을 생성하고 결과를 확인하세요. 모든 클러스터 목록과 파일별 클러스터 세부 정보가 포함된 index.md를 발견할 수 있을 것입니다. 일부 디렉터리나 파일 패턴을 제외하고 싶을 수도 있으며, 보통 테스트 파일을 제외하는 것이 좋습니다. 결과가 너무 많거나 적다면 임계점(threshold)을 조정할 수도 있습니다.
분석 결과에 만족하면, AI 코딩 에이전트에게 실제 중복이 아닌 클러스터를 필터링해 달라고 요청하세요. 모든 유사 코드가 반드시 처리해야 할 중복은 아니기 때문에 이는 매우 일반적인 과정입니다. AI 에이전트에게 버릴 클러스터 해시를 slopo.ignore.txt에 추가하도록 요청하세요. 검토된 클러스터가 제외된 보고서를 생성하기 위해 분석을 다시 실행합니다.
이것이 AI 에이전트가 수행할 수 있는 리팩토링의 기반입니다. 이 ignore 파일은 Git 리포지토리에 커밋하여 팀 간에 재사용할 수 있습니다. 새로 추가되거나 수정된 클러스터는 다시 보고서에 나타납니다. API 키가 없는 구성 파일 또한 커밋할 수 있습니다. 단, 로컬 데이터인 slopo.db는 커밋하지 마세요.
구성
언제든지 slopo --help 및 slopo show-config를 실행하여 직접 탐색해 보세요. 대부분의 구성은 구성 파일로 이루어지지만 두 가지 예외가 있습니다. 구성 파일의 위치는 --config 옵션으로 재정의할 수 있습니다. API 키는 SLOPO_EMBEDDING_API_KEY 환경 변수로 설정할 수 있으며, 이 변수는 자동으로 불러와집니다.