Show HN: CLI tool for detecting non-exact code duplication with embedding models
TL;DR Highlight
복사-붙여넣기가 아닌 '의미적으로 유사한' 코드 중복을 임베딩 기반으로 찾아주는 CLI 도구로, AI 코딩 에이전트와 연계해 대규모 코드베이스의 숨겨진 중복을 제거하는 데 활용할 수 있다.
Who Should Read
레거시 코드베이스나 대형 모노레포에서 리팩토링 전 중복 코드를 정리하고 싶은 백엔드/풀스택 개발자, 또는 코드 리뷰 자동화 파이프라인을 구축하려는 DevOps 엔지니어.
Core Mechanics
- Slopo는 단순 복사-붙여넣기(exact clone)가 아니라, 코드베이스 내 서로 멀리 떨어진 위치에 있는 '유사하게 작성된' 코드 조각을 탐지하는 데 특화되어 있다. 기존 도구나 사람이 발견하기 어려운 이 유형의 중복이 가장 해롭다고 저자는 설명한다.
- 작동 방식은 코드 단위(함수, 클래스 등)별로 임베딩(벡터 표현)을 계산한 뒤, 벡터 거리가 가까운 쌍을 찾는 방식이다. 완전히 다른 방식으로 구현된 동일 로직은 벡터가 멀어서 탐지되지 않으므로, 구조적으로 유사한 코드에 집중한다.
- 탐지 결과는 유사도와 코드베이스 내 '거리'로 순위가 매겨진 클러스터로 제공된다. 코드베이스에서 멀리 떨어진 유사 코드일수록 더 높은 순위를 부여해 덜 명확한 중복에 집중할 수 있게 한다.
- 탐지된 클러스터는 AI 코딩 에이전트에 입력으로 넘겨 실제 중복 여부를 검증하도록 설계됐다. 유사 코드가 반드시 리팩토링 대상 클론은 아니기 때문에 초기 결과에는 false positive가 포함될 수 있고, 이를 에이전트가 빠르게 걸러준다.
- 저자 직접 테스트 결과, 자신의 코드베이스(slopo 자체 코드)에 적용했더니 각 언어별 파서 코드에 상당한 중복이 발견됐다. 일부는 정확한 복사본, 일부는 유사 변형이었으며 리팩토링이 필요하다고 확인됐다.
- Python, TypeScript, JavaScript, Java, Kotlin, C#, Go, Rust 총 8개 언어를 지원하며, 임베딩은 외부 프로바이더를 통해 계산한다. `uv tool install slopo` 한 줄로 설치할 수 있고, Python 별도 설치 없이 uv가 격리된 가상환경에서 실행한다.
- 저자에 따르면 결과는 코드베이스마다 편차가 크다. 어떤 경우엔 탐지된 중복 대부분이 false positive지만 나머지는 강력한 리팩토링 후보이거나 버그인 경우도 있고, 어떤 경우엔 실제 중복이 훨씬 많이 드러나기도 한다.
- 검토가 끝난 클러스터는 'ignored(무시)' 또는 리팩토링 대상으로 표시할 수 있어, 반복 실행 시 이미 검토한 항목을 건너뛰는 워크플로를 지원한다.
Evidence
- 한 댓글 작성자는 대형 모노레포에서 작년에 유사한 시스템을 직접 구현해 코드 리뷰 과정에서 자동으로 실행되도록 했다고 밝혔다. 리뷰 중인 코드와 유사한 스니펫을 저장소 전체에서 실시간으로 보여주는 방식이었으며, 오픈소스 프로젝트에서 복사된 코드를 추적하는 데도 유용했다고 경험을 공유했다.
- 청킹 방식에 대한 질문이 있었다. 함수 `a()`가 내부적으로 `b()`, `c()`, `d()`를 호출할 때, 의존 함수들의 임베딩도 합산해 `a()`의 임베딩에 반영하는지 묻는 내용이었다. 현재 README 수준에서는 각 코드 단위를 독립적으로 임베딩하는 것으로 보인다.
- BM25(키워드 기반 문서 유사도 알고리즘)와 성능 비교를 했는지 묻는 댓글이 있었고, 임베딩 패스 전에 결정론적(deterministic) 1차 필터링 단계를 추가하면 효율을 높일 수 있지 않냐는 제안도 나왔다. 이는 임베딩 계산 비용을 줄이기 위한 최적화 아이디어다.
- 강타입 언어(Java, Kotlin 등)와 약타입 언어(Python, JavaScript 등) 간에 중복 탐지 품질 차이가 있는지 묻는 댓글이 있었다. 타입 정보가 임베딩에 영향을 줄 수 있기 때문에 실무적으로 중요한 질문이지만, 저자의 공개 답변은 확인되지 않았다.
- pre-push git hook으로 연결해 코드베이스를 깔끔하게 유지하는 데 쓰면 좋겠다는 제안이 있었고, 리팩토링 전 사전 스캔 용도로 특히 의미론적 중복(copy-paste가 아닌 유사 구현)에 유용할 것 같다는 긍정적 반응이 많았다.
How to Apply
- 대규모 리팩토링을 앞두고 있다면, `uv tool install slopo`로 설치 후 `slopo init`으로 설정 파일을 만들고 대상 디렉토리와 임베딩 모델 프로바이더를 지정해 전체 코드베이스를 스캔하면 된다. 결과 클러스터를 AI 코딩 에이전트(예: GitHub Copilot, Cursor)에 넘겨 실제 중복 여부를 검증하고 리팩토링 우선순위를 잡을 수 있다.
- 모노레포에서 코드 리뷰 자동화를 구축 중이라면, CI 파이프라인에 Slopo를 추가해 PR 단위로 변경된 파일과 기존 코드베이스 간 유사 스니펫을 자동으로 리포트하는 단계를 넣을 수 있다. 리뷰어가 놓치기 쉬운 의미적 중복을 사전에 파악할 수 있다.
- git pre-push hook에 Slopo 스캔을 연결하면, 코드 푸시 전마다 새로 생긴 유사 코드를 감지해 팀 전체의 코드베이스 품질을 지속적으로 유지할 수 있다. 초기 전체 스캔으로 기준을 잡고 이후 증분 방식으로 운용하면 비용을 줄일 수 있다.
- 이미 탐지된 클러스터 중 실제 중복이 아닌 항목은 'ignored'로 표시해두면 다음 실행 시 노이즈를 줄일 수 있다. slopo.dev에 제공된 예시 프롬프트를 활용해 AI 에이전트가 클러스터를 자동으로 검토하고 분류하게 하면 초기 false positive 정리 시간을 크게 단축할 수 있다.
Code Example
# 설치
uv tool install slopo
# 설정 파일 초기화 (분석할 디렉토리와 임베딩 모델 설정 포함)
slopo init
# 코드 중복 분석 실행
slopo runTerminology
Related Papers
Show HN: Bible as RAG Database
성경 전체를 RAG(검색 증강 생성) 데이터베이스로 인덱싱해 주제나 키워드로 관련 성경 구절을 의미론적으로 검색할 수 있는 웹 서비스다. 종교 텍스트에 RAG를 적용한 실용적 예시로, 유사한 프로젝트를 만들려는 개발자에게 참고가 된다.
Haystack: Open-Source AI Framework for Production Ready Agents, RAG
deepset이 만든 오픈소스 AI 오케스트레이션 프레임워크로, LangChain의 대안으로 주목받고 있으며 모듈형 파이프라인 방식으로 RAG·Agent·멀티모달 앱을 프로덕션까지 구축할 수 있다.
We built a persistent agent memory layer on Elasticsearch with 0.89 recall
AI 에이전트가 세션이 끝나도 사용자 정보를 기억할 수 있도록 Elasticsearch 위에 구축한 멀티테넌트 장기 메모리 시스템 아키텍처 공개. 168개 질문 기준 R@10 0.89, 테넌트 간 데이터 누출 0건을 달성한 구체적인 구현 방법을 담았다.
TAHOE: Text-to-SQL with Automated Hint Optimization from Experience
LLM이 SQL 생성 실패에서 배운 힌트를 재사용 가능한 Hint Bank로 쌓아, 모델 재학습 없이 Snowflake 방언 SQL 정확도를 대폭 끌어올리는 시스템.
Inside FAISS: Billion-Scale Similarity Search
FAISS가 수십억 개 벡터를 빠르게 검색하는 핵심 알고리즘인 IVF(파티셔닝)와 Product Quantization(압축)을 시각적으로 설명한 글로, RAG나 벡터 검색 시스템을 구축하는 개발자에게 내부 동작 원리를 이해시켜 준다.
Show HN: Airbyte Agents – context for agents across multiple data sources
Airbyte가 Slack, Salesforce, Linear 등 여러 SaaS 시스템의 데이터를 미리 인덱싱해서 Agent가 API를 일일이 뒤지지 않아도 되는 Context Store를 출시했다. 기존 MCP 방식보다 토큰을 최대 90%까지 줄이는 효과를 확인했다.