본문으로 건너뛰기

nose

  • 2026-06-04 (modified: 2026-06-18)

형식이 동일한 코드 뿐 아니라 동작이 동일한 코드(type-4 clones)도 제법 찾아주는 코드 중복 검사기.

github.com/corca-ai/nose

보고서 읽기 vs. 능동적 탐색

널리 쓰이는 중복 검사기인 jscpd는 비유하자면 RAG와 유사하다. 문제가 될만한 중복을 잘 선별하고 토큰 효율적으로 제시하는 게 중요하다. 정밀도(쓸만한 결과의 비중이 얼마나 높은가)나 랭킹(중요한 중복이 얼마나 상위로 올라오나)이 중요한 지표다.

반면 nose는 Agentic search와 유사하다. 한 번에 좋은 보고서를 만들어주는 대신, 에이전트가 능동적으로 중복의 냄새를 탐색하게 도와준다. HATEOAS 방식으로 내비게이션할 수 있는 형태의 CLI, 에이전트의 Information foraging 행위를 효과적으로 돕는 힌트를 제공하는 게 중요하다.

역할

중복이 있다고 해서 무조건 지워야하는 건 아니다. 어떤 중복은 놔둬야 한다(예: parallel-by-design). 하지만 LLM 없이 좋은 중복과 나쁜 중복을 가리는 건 쉬운 일이 아니다. 따라서 nose는 어디에 어떤 형태의 중복이 있는지를 빠르게 알려주고, LLM은 그 중복이 나쁜 중복인지 좋은 중복인지를 판단하는 식으로 분업을 한다.

중복의 종류

코드 중복은 보통 다음 다음 네 가지로 분류한다:

  • Type-1: 공백이나 코멘트를 빼면 똑같이 생긴 코드 중복
  • Type-2: 식별자나 리터럴 등만 다른 코드 중복 (α\alpha-renaming 같은 걸 잡아준다.)
  • Type-3: 거의 비슷한데 중간에 문장이 추가되거나 삭제되거나 변형된 형태
  • Type-4: 동일한 계산을 수행하지만 문법적으로는 다르게 생긴 형태

jscpd는 Type-1과 Type-2를 일부 잡아준다. nose는 추가로 Type-3와 Type-4를 일부 잡아줄 수 있다.

코딩 에이전트 실험들

코딩 에이전트 덕에 다양한 시도를 해볼 수 있었다.

  • LLMs as labelers: 서로 다른 언어, 서로 다른 분야의 저장소 약 100개를 클론하고, 이걸 여러 LLM이 독립적으로 레이블링하도록 하여 평가를 위한 데이터셋을 만들었다.
  • Dyanmic workflow: 레이블링 과정에서 Claude Code의 “dynamic workflow” 기능을 쓰니 대규모 병렬 평가, 평가자 간 신뢰도 검사 등을 쉽게 할 수 있었다. 물론 토큰은 어마어마하게 녹았다.
  • 적대적 공진화: 한쪽에서는 점점 더 어려운 문제를 내고(동일한 행동을 하는 코드이지만 겉보기엔 다르게 생긴 코드 생성), 한쪽에선 이걸 점점 더 잘 찾아내게 하는 루프를 돌려봤다. 잘 작동함.