AI 아첨을 감지하는 것과 줄이는 것은 다르다 — 감점제 AI 리뷰어를 만든 이유
왜 AI는 항상 "좋습니다"라고 하는가
AI에게 코드 리뷰를 시키면 "잘 짰습니다"부터 나온다.
이건 AI가 거짓말을 하는 게 아니라
칭찬하도록 훈련된 결과다.
프롬프트로 "솔직하게 말해줘"라고 해도
근본적으로 바뀌지 않는다.
AI 모델은 사용자가 '좋아요'를 누른 답변을
더 많이 만들도록 훈련된다.
이 방식을 RLHF(인간 피드백 기반 강화학습)라고 한다.
문제는 사람이 정확한 답보다
기분 좋은 답에 '좋아요'를 더 많이 누른다는 것이다.
AI 입장에서는 동의하면 점수가 올라가고,
칭찬하면 점수가 올라간다.
그래서 아첨을 학습한다.
Anthropic이 이 문제를 직접 연구해서
논문으로 발표했다.
2026년 3월에는 Stanford 연구팀이 AI 챗봇의 아첨이
"위험한 수준"이라는
결과를 냈다.
코드 리뷰에서 이 문제가 특히 위험하다.
코드를 보여주면 "구조가 깔끔합니다"로 시작한다.
버그가 있어도
"전반적으로 잘 작성되었습니다"를 먼저 말하고
문제를 조심스럽게 언급한다.
AI가 동의했으니까 맞겠지.
이 가정이 가장 위험하다.
감점제 — 칭찬할 구조가 없는 채점표
만든 도구의 이름은 brutal-review다.
원리는 단순하다.
10점 만점에서 시작해서 감점만 한다.
가산점이 없다.
"잘한 점"을 말할 칸이 채점표에 없으니,
AI가 칭찬을 끼워넣을 여지가 줄어든다.
실제 결과는 이렇게 나온다.
SUDYA MYASNIK (The Butcher) — Final Scorecard
==============================================
종목 1. 구조적 정확성(Structural Correctness): 0.9 / 1.5 (감점 2건)
종목 2. 방어적 견고함(Defensive Robustness): 1.2 / 1.5 (감점 1건)
종목 3. 가독성(Readability): 1.2 / 1.5 (감점 1건)
종목 4. 결함 탐지(Defect Detection): 0.7 / 1.5 (감점 2건)
----------------------------------------------
환산 점수: 7.3 / 10.0
판정: "재훈련 필요 (Retraining Required)"
심판의 한마디: "이 코드는 다리 셋 달린 말처럼 달린다
— 기술적으로 전진하지만, 아무도 베팅하지 않는다."
감점 사유, 점수, 판결만 있다.
"잘 짰습니다"가 나올 자리가 없다.
왜 소련 심판인가
AI에게 "솔직하게 리뷰해줘"라고 요청하는 것과
"너는 7.0 이상을 준 적 없는 심판이다"라고
역할을 정의하는 건 비판 강도가 다르다.
둘 다 프롬프트 엔지니어링이라는 점에서
같은 기법이다.
다만 몇 차례 같은 파일을 양쪽으로 돌려봤는데,
전자는 "전반적으로 잘 작성되었지만
몇 가지 개선 사항이 있습니다"로 시작하고,
후자는 감점 목록부터 나열한다.
출력 형식 자체가
칭찬을 끼워넣기 어렵게 되어 있기 때문이다.
코드도, 글도 채점한다
코드는 7개 카테고리로 채점한다.
구조, 보안, 가독성, 결함, 확장성, 테스트, 방어력.
글은 5개 카테고리로 채점한다.
논리, 근거, 명확성, 문법, 독자 관점.
예를 들면 이런 식이다.
- 코드에서 에러를 catch하고 아무것도 안 하는 빈 catch 블록 → "결함 탐지"에서 -0.3
- 글에서 근거 없이 "매우 중요합니다"라고 주장 → "근거와 설득"에서 -0.3
전체 카테고리 목록과 감점 기준은
GitHub README에 정리되어 있다.
실제 사례 — 오픈소스 스킬 리뷰에서 PR까지
내 코드만 채점하는 게 아니다.
다른 사람의 오픈소스 스킬도
brutal-review로 돌릴 수 있다.
실제로 Claude Code에서 가장 유명한 스킬 패키지인
superpowers를 리뷰했더니,
스킬 설명에서 "2개 이상"이라고 쓴 곳과
"3개 이상"이라고 쓴 곳이 서로 모순되는 결함이 잡혔다.
일반 리뷰였으면
"잘 짜여진 스킬입니다"로 끝났을 내용이다.
감점제로 돌리니까
불일치가 감점 사유로 명확히 나왔고,
그 결과 수정 PR을
날릴 수 있었다.
refine 루프 — 채점하고 고치고 다시 채점
채점만 하는 게 아니다.
/refine 명령을 쓰면
채점 → 감점 큰 것부터 수정 → 커밋 → 재채점을
목표 점수까지 자동 반복한다.
/refine src/auth.ts # 9.0까지 반복 /refine src/ --max 5 # 최대 5번 /refine --target 8.5 # 목표 점수 지정
사람이 하는 일은 이 한 줄을 입력하는 것뿐이다.
추가로 얻는 효과가 있다.
AI가 대화가 길어질수록 점점 부드러워지는 문제를
매 반복마다 새 채점으로 완화한다.
이 접근의 한계
정직하게 말하면, 이 도구도 완벽한 해결책은 아니다.
brutal-review를 실행하는 것도 결국 Claude다.
채점하는 AI 자체가 RLHF 모델이므로,
감점 사유를 약하게 잡거나
개수를 적게 잡는 방식으로 여전히 아첨할 수 있다.
감점제 채점표는 이 경향을 줄이지만
원천 봉쇄하지는 못한다.
감점제도 캐릭터도 결국 프롬프트다.
모델 가중치를 바꾸거나
출력을 후처리하는 아키텍처 수준의 개입과는 다르다.
효과가 있지만 원천 차단은 아니다.
구조화된 프롬프트로 아첨을 줄이는 수준이다.
정량 데이터? 아직 없다.
"솔직하게 리뷰해줘"와 brutal-review를
같은 코드에 돌렸을 때
감점 사유 발견 수가 얼마나 차이 나는지
체계적으로 측정하지 못했다.
체감상 차이가 있지만,
체감은 근거가 아니다.
이건 추후 비교 실험으로 보강할 계획이다.
그래도 쓰는 이유는 단순하다.
지금 코드 리뷰를 맡기면 지금 "잘 짰습니다"가 나온다.
내일 모델이 개선될 때까지 기다릴 수는 없다.
설치와 사용
Claude Code 사용자라면 30초면 된다.
/install-skill github:jason-h23/brutal-review
/brutal-review src/auth.ts # 특정 파일 채점 /brutal-review # git 변경 사항 채점 /refine src/ --target 9.0 # 목표 점수까지 자동 반복
Claude Code를 쓰지 않더라도 같은 원리를 적용할 수 있다.
어떤 AI 도구를 쓰든,
AI에게 리뷰를 맡길 때
이 프롬프트를 추가해보라:
"10점 만점에서 감점만 해라. 칭찬 금지. 감점 사유와 점수만 출력해라."
이 한 줄만으로도
"잘 짰습니다"로 시작하는 리뷰와
감점 목록으로 시작하는 리뷰의 차이를
직접 확인할 수 있다.
GitHub: https://github.com/jason-h23/brutal-review
정리
AI 아첨은 모델이 나빠서가 아니라 훈련 구조 때문에 생긴다.
다음에 AI가 "잘 짰습니다"라고 하면,
이 질문을 던져보라:
"가장 큰 감점 사유 3개를 알려줘."
칭찬을 먼저 듣는 것과
감점을 먼저 듣는 것은
같은 AI라도 다른 리뷰를 만든다.
그 한마디가
감점제 도구 없이도 아첨을 깨는 시작점이다.
다음 글에서는 동일 코드에 대한
일반 리뷰와 brutal-review의
비교 실험 결과를 정리할 예정이다.
댓글
댓글 쓰기