본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 09. 11:07

내 코드베이스 중 AI가 작성한 비중을 측정하는 도구를 만들었습니다 — 작동 방식 소개

요약

코드베이스 내 AI 생성 코드의 비중을 측정하는 도구인 'aigit'를 소개합니다. Claude Code의 세션 데이터를 수집하고 TLSH 기반의 퍼지 매칭을 통해 AI가 작성한 코드의 출처를 추적합니다.

핵심 포인트

  • AI 생성 코드의 품질 및 지속 가능성 가시화
  • Claude Code 세션 데이터를 활용한 코드 추출
  • TLSH 알고리즘을 이용한 계층적 퍼지 매칭 구현
  • git blame을 활용한 코드 출처(Provenance) 오버레이

지난 분기에 여러분의 프로덕션 코드베이스 중 몇 퍼센트가 AI에 의해 작성되었는지 팀원들에게 물어보세요. 여러분은 침묵을 마주하게 될 것입니다. 아무도 관심이 없어서가 아니라, 이를 측정할 방법이 없기 때문입니다.

우리는 배포(Deployments), 지연 시간(Latency), 에러율(Error rates), 테스트 커버리지(Test coverage) 등 다른 모든 것을 계측합니다. 하지만 코드의 출처(Code provenance)는 어떨까요? 아무것도 없습니다. Git blame은 여전히 모든 줄을 사람이 작성했다고 가정합니다.

저는 이 문제를 해결하기 위해 aigit를 만들었습니다.

문제점

AI 코딩 도구들이 제 워크플로의 일부가 되면서, 저는 불편한 점을 하나 발견했습니다. 직접 작성한 코드와 비교했을 때 AI가 생성한 코드의 품질이나 지속 가능성을 가시화할 방법이 없다는 것이었습니다. AI 코드가 더 빠르게 생성되고 있었을까요? 그것이 버그 수정과 상관관계가 있었을까요? 어떤 파일들이 실질적으로 AI에 의해 작성되었을까요?

이것들은 철학적인 질문이 아닙니다. 모든 팀이 추적해야 하는 엔지니어링 지표(Engineering metrics)입니다.

작동 방식

1단계: 세션 수집 (Session ingestion)

Claude Code는 모든 세션을 ~/.claude/projects// 아래에 JSONL 형식으로 저장합니다. 각 어시스턴트 메시지에는 마크다운 코드 블록(Markdown fenced code blocks)이 포함되어 있거나, 더 중요한 것은 Write 및 Edit 호출로부터 생성된 도구 사용(tool_use) 블록이 포함되어 있습니다. 실제 디스크에 작성된 코드는 바로 그곳에 존재합니다.

텍스트 응답과 Write/Edit 도구 호출 모두에서 추출

if block.get("type") == "tool_use" and block.get("name") in ("Write", "Edit"):
    code_text = inp.get("content") or inp.get("new_string", "")

2단계: 계층적 퍼지 매칭 (Tiered fuzzy matching)

해싱(Hashing)을 하기 전에 코드는 정규화(Normalized)됩니다. 주석은 제거되고, 공백은 압축되며, 소문자로 변환됩니다. 그 다음 세 가지 계층에서 git diff 덩어리(hunks)와 매칭됩니다.

  • 정확한 SHA-256 일치 → 신뢰도 1.0 (문자 그대로 복사-붙여넣기)
  • TLSH 거리 < 30 → 신뢰도 0.9 (가볍게 재구성됨)
  • TLSH 거리 < 100 → 신뢰도 0.7 (상당 부분 수정됨)

TLSH (Trend Micro Locality Sensitive Hash)는 퍼지 파일 매칭(Fuzzy file matching)을 위해 설계되었습니다. 이는 정확한 내용보다는 구조적 유사성을 측정하며, 이는 AI 코드가 커밋되기 전에 약간 수정되는 경우에 정확히 필요한 기능입니다.

3단계: 속성 오버레이 (Attribution overlay)

라인의 출처(provenance)를 처음부터 다시 구축하는 대신, aigit는 git blame --porcelain에 편승합니다. 이 명령은 이미 이름 변경(renames), 리베이스(rebases), 체리픽(cherry-picks)을 거친 라인들을 추적하고 있습니다. 우리는 그 출력값에 주석을 달 뿐입니다:

$ aigit blame src/api/routes.py

4 a1b2c3d [claude 100%] def get_user(user_id: int):
5 a1b2c3d [claude 100%] return db.query(User).get(user_id)
6 f9e8d7c
7 f9e8d7c def delete_user(user_id: int):
8 f9e8d7c db.query(User).filter_by(id=user_id).delete()

$ aigit stats

src/api/routes.py 73% AI ████████████░░░░
src/core/engine.py 51% AI ████████░░░░░░░░

Repo-wide: 61% AI-attributed

직접 사용하며(dogfooding) 발견한 점

저는 aigit를 자기 자신에게 실행해 보았습니다. 전체 코드베이스가 단 한 번의 Claude Code 세션으로 구축되었습니다. 결과는 2,171개 라인 중 89.8%가 AI 기여(AI-attributed)로 나타났습니다. AI 기여로 분류되지 않은 10.2%는 AI가 발생시킨 버그를 수정하기 위해 제가 수동으로 추가한 라인들이었습니다. 이 자체로도 흥미로운 지표입니다.

**
현재의 한계점

  • Claude Code 전용 — 프로바이더(provider) 아키텍처는 플러그인 방식으로 교체 가능하지만, Cursor 및 Copilot 지원은 아직 구축되지 않았습니다.
  • 로컬 세션 로그 필요 — 세션을 로컬에 저장하지 않는 도구(Devin, 클라우드 기반 에이전트)는 API 없이는 지원할 수 없습니다.
  • 콜드 스타트 (Cold start) — aigit를 사용하기 시작하기 전의 기존 커밋들은 기여도가 할당되지 않습니다.

설치 및 사용해 보기

pip install getaigit
cd your-repo
aigit index
aigit blame src/yourfile.py
aigit stats

기여도 데이터베이스는 .aigit/attribution.db에 저장됩니다. 팀원들과 기여도 데이터를 공유하려면 이 파일을 커밋하세요.

GitHub:
AI% 및 이탈률(churn rate) 외에 어떤 지표를 보고 싶은지, 그리고 여러분의 팀에서도 동일한 격차를 경험하고 있는지 궁금합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0