Writing · AI Engineering

AI가 한 일을 셀 수 있게 만들기

커밋 시그니처부터 LLM 판정까지 — AI 기여도 측정 인프라 구축기


TL;DR — 3줄 요약

  • AI 도입 효과를 감이 아닌 숫자로 답하기 위해, 모든 AI 산출물에 자동으로 시그니처를 남기고 LLM이 기여 수준을 판정하는 2층 측정 인프라를 만들었다.
  • 반년 실측 결과: AI 작성 머지 PR 수백 건 · AI 주도 업무 1,000건 이상 · 요청 처리 리드타임 약 1/5로 단축.
  • 핵심 원칙은 하나 — 사람의 기억에 의존하지 않는다. 훅과 CI가 강제하고, 확률적 판정에는 사람 검증 안전망을 붙인다.
AI 작성 머지 PR수백 건도입 후 반년
AI 주도 처리 업무1,000건+lv2 이상
요청 리드타임 (중앙값)1/5로 단축도입 전후 실측
리더 본인의 PR수백 건2026 상반기

1. 문제 — "AI가 한 일"은 기본적으로 셀 수 없다

"우리 팀 AI 도입했어요." 요즘 어느 개발 조직을 만나도 듣는 말이다. 그런데 바로 다음 질문에 숫자로 답하는 조직은 거의 없다. "그래서, 효과가 있었나요?"

측정을 시작하려고 보면 곧바로 벽에 부딪힌다. AI가 만든 커밋과 사람이 만든 커밋은 git 히스토리에서 구분되지 않는다. AI가 초안을 잡고 사람이 다듬은 PR은 누구의 것인가? 설문은 답이 아니다 — 한 번뿐이고, 기억은 부정확하며, 지속 가능하지 않다. 우리가 원한 건 대시보드에 매일 쌓이는 숫자였다.

요구사항 3가지

  1. 결정적(deterministic)일 것 — 사람의 기억·성실함에 의존하면 반드시 누락된다
  2. 수준을 구분할 것 — "썼다/안 썼다" 이진 구분은 정보량이 없다
  3. 워크플로우를 바꾸지 않을 것 — 측정 때문에 개발이 느려지면 본말전도

2. 설계 — 결정적 신호 + 확률적 판정의 2층 구조

1층 · 결정적 시그니처 (기계가 자동으로 남김) 커밋 trailer prepare-commit-msg 훅 자동 부착 PR 라벨 CI가 커밋 grep → 자동 라벨 문서 시그니처 라벨 + 기계 조회용 property 2층 · 판정 파이프라인 자동 전이 규칙 (결정적) 봇 분류 → lv1 · AI PR 연결 → lv2 승격 LLM 판정 (확률적) 해결된 이슈 재판정 → lv3 / 저확신 → unknown lv1 AI 초안 + 사람 완성 lv2 AI 실행 + 사람 결정 lv3 AI 자율 · 개입 0 unknown 사람 검증 큐
측정 인프라 전체 구조 — 아래층이 결정적 신호를 남기고, 위층이 기여 수준으로 해석한다

1층 — 모든 산출물에 지워지지 않는 시그니처

커밋에는 trailer를 남긴다:

Co-Authored-By: Claude <model> <noreply@anthropic.com>
AI-Run-ID: <세션 추적값>
AI-Skill: <어떤 자동화 스킬이 만들었는지>

핵심은 이걸 사람이 쓰지 않는다는 점이다. git의 prepare-commit-msg 훅이 AI 도구의 환경변수를 감지해 자동으로 붙인다. PR은 CI가 커밋 메시지를 grep해 라벨을 자동 부착하고, 문서(위키)에도 같은 신호(라벨·property·시그니처 박스)가 남는다. "기억"을 시스템으로 대체하는 것 — 이 원칙은 모든 설계에서 반복된다.

운영 교훈 — 신호는 canonical source에

처음에는 PR 본문에만 신호를 남겼는데 squash merge 시 신호가 유실됐다. 측정 신호는 git 히스토리 자체에 박아야 한다. 부가 메타데이터는 압축·요약 과정에서 언제든 사라진다.

2층 — 기여 "수준"의 분류

수준정의예시
lv1AI 초안 + 사람이 검토·완성AI가 이슈 분류·안내, 사람이 처리
lv2AI가 대부분 실행, 사람은 결정만AI가 PR 생성, 사람이 리뷰·머지
lv3AI 자율 수행, 사람 개입 0자동 분류→자동 답변→자동 종료

분류도 자동이다. 봇이 이슈를 분류하는 순간 lv1, AI 시그니처가 있는 PR이 연결되는 순간 lv2로 자동 승격, 해결된 이슈는 LLM 판정이 주기적으로 재판정해 lv3 여부를 가린다. 중요한 설계 결정 두 가지:

  • 라벨은 exclusive하게 — 정확히 하나만. 중복 라벨은 집계를 오염시킨다. 승격 시 기존 라벨을 원자적으로 제거.
  • 수준은 상승 방향으로만. 확률적 판정을 양방향으로 움직이면 측정값이 진동한다. 확신이 낮으면 강등 대신 unknown 라벨로 사람의 분기 검증 큐에 보낸다.

3. 운영에서 배운 것 3가지

  1. 자동화의 부작용은 자동화로 잡는다. PR 본문의 이슈 키를 자동 "해결" 처리하던 로직이 참조로만 적은 이슈를 잘못 닫는 사고를 냈다. 파서를 고치고 회귀 테스트를 박았다 — 측정 인프라도 프로덕션이다.
  2. 예외 케이스가 지표를 왜곡한다. 봇 PR·이슈 없는 릴리스 브랜치가 검증 게이트를 막았다. 예외를 명시적으로 정의해 통과시키되, 예외 발생량도 같이 집계했다. 침묵하는 예외가 가장 위험하다.
  3. 측정이 문화를 바꾼다 — 진짜 수확. "전후 실측"이 기본값이 되자 팀의 다른 업무로 번졌다. 봇 효과는 도입 전후 리드타임으로, 데이터 이관은 이론 vs 실측 처리량으로 말하게 됐다. 최종 산출물은 숫자가 아니라 "측정 없이는 주장하지 않는" 팀이다.

4. 반년의 숫자

맨 위 스탯 타일이 그 답이다 — AI 작성 머지 PR 수백 건, AI 주도 업무 1,000건 이상, 리드타임 약 1/5 단축, 그리고 18년차 조직장인 나 자신도 반년에 수백 건의 PR. 이 숫자들의 가치는 크기가 아니라 출처에 있다. 전부 시스템이 자동으로 남긴 신호에서 집계됐고, 언제든 같은 쿼리로 재현된다.

5. 시작하려는 팀을 위한 최소 구성 3가지

  1. 커밋 trailer 자동화 — prepare-commit-msg 훅 하나. 30분이면 만든다.
  2. PR 라벨 CI — 커밋 시그니처를 grep해 라벨을 붙이는 재사용 워크플로우. 저장소마다 3줄짜리 caller만 추가.
  3. 수준 정의 문서 — lv1/lv2/lv3의 팀 합의 한 페이지. 자동화는 그다음이다.

측정은 감시가 아니다. 우리 팀에서 이 숫자는 한 번도 개인 평가에 쓰인 적이 없다. 이 숫자가 답하는 질문은 하나다 — "우리가 도입한 이 변화는, 정말로 효과가 있는가?" 그 질문에 데이터로 답할 수 있게 되는 순간, AI 도입은 유행이 아니라 엔지니어링이 된다.