AI/Ai Agent

Self-Reflection: AI가 스스로 실수를 잡아내는 시스템

코딩하는후운 2026. 1. 8. 11:27
반응형

Self-Reflection: AI가 스스로 실수를 잡아내는 시스템

💡 Self-Reflection은 AI가 응답할 때마다 자동으로 규칙 위반을 검사하고, 실패하면 스스로 원인을 분석해서 개선하는 자가 진화 시스템입니다.

왜 이게 필요했을까?

문제 1: "왜 자꾸 검색만 해?"

AI에게 "로그인 기능 구현해줘"라고 하면, 바로 코드를 짜면 될 것 같은데...

사용자: "kidsnote_test에 로그인 구현해줘"
AI 내부: "음... 안전하게 Master로 보내서 RAG 검색이나 하자"
결과: 토큰 15,000개 소비, 응답 8초

Worker로 바로 보냈으면 토큰 4,500개, 응답 3초면 끝났을 일이다.

원인을 파헤쳐 보니:

  • 캐시 키에 프롬프트 변경이 반영 안 됨 → 10분간 이전 결과 사용
  • Worker 선택 기준이 1줄로 너무 모호 → "안전하게 Master" 선택
  • 검증 시스템 없음 → 잘못된 라우팅 감지 불가

문제 2: "규칙 있어도 안 지켜지면 의미 없잖아"

블로그 규칙이 있다:

  • 구분선은 하나만 (---)
  • 표는 3열 이하
  • TL;DR 금지

근데 AI가 이걸 "잊어버린다". Rule Zero 문서에 적어놔도, 매번 읽지 않으면 소용없다.

AI: "블로그 작성 완료했습니다!"
결과: 구분선 2개 → 티스토리 레이아웃 깨짐
사용자: "...다시 해줘"

근본 원인: 검증 시점이 없다. 사용자가 직접 발견해야 한다.


어떻게 해결했나?

핵심 아이디어: AI가 응답할 때마다 자동으로 검증하게 만들자.

[AI 응답 완료]
      ↓
[Stop Hook 실행]  ← 여기서 Self-Reflection 시작
      ↓
[작업 유형 감지]  blog? code? jira?
      ↓
[규칙 검증]       구분선 개수, 표 열 수, TODO 금지...
      ↓
[위반 시 경고]    "❌ 구분선 2개 사용함!"

두 가지 선택지가 있었다:

  1. LLM으로 검증 → 토큰 비용 발생, 느림
  2. 정규식/파일 체크 → 비용 0, 빠름 ✅

토큰 효율이 핵심이니까 2번을 선택했다. Lambda 함수로 규칙을 정의하면 끝:

BLOG_CHECKLIST = [
    {
        "id": "blog_separator_count",
        "description": "구분선은 하나만 사용",
        "validator": lambda content: content.count("\\n---\\n") <= 1,
    }
]

실제 흐름: AI가 블로그를 쓰면 어떻게 되나?

사용자: "MasterAgent 블로그 써줘"
          │
          ▼
    ┌─────────────┐
    │ BrainAgent  │  ← "Worker로 보내야겠다"
    └─────────────┘
          │
          ▼
    ┌─────────────┐
    │ AI 응답     │  ← 블로그 작성 완료
    └─────────────┘
          │
          ▼
    ┌─────────────┐
    │ Stop Hook   │  ← Self-Reflection 시작!
    └─────────────┘
          │
    ┌─────┴─────┐
    ▼           ▼
[작업 감지]  [신뢰도 확인]
"blog다"     "0.87이면 OK"
    │
    ▼
[블로그 규칙 검증]
- 구분선: 1개 ✅
- 표: 3열 ✅
- TL;DR: 없음 ✅
    │
    ▼
[통과] → 아무 일도 안 일어남 (토큰 0)

만약 위반했다면?

[블로그 규칙 검증]
- 구분선: 2개 ❌
    │
    ▼
[경고 출력]
❌ BLOG_RULE_VIOLATION: 구분선은 하나만 사용 (현재: 2개)
   See: common/guidelines/blog/README.md
    │
    ▼
[SYSTEM_INDEX 검증 트리거]
🔍 Checking SYSTEM_INDEX.md consistency...

핵심: 문제 없으면 Skip, 문제 있을 때만 심층 검증. 이게 조건부 검증이다.


한 단계 더: 자가 고도화

검증만으로는 부족했다. 같은 실수를 반복하지 않게 만들고 싶었다.

[1주일 동안 실패 누적]
    │
    ▼
[매주 월요일, SessionEnd Hook]
"지난 7일간 실패 패턴 분석해볼까?"
    │
    ▼
[Gemini로 패턴 추출]
- 패턴 1: 로그 파일 확인 안 하고 버그 분석 (빈도: HIGH)
- 패턴 2: Jira 토큰 확인 안 함 (빈도: MEDIUM)
    │
    ▼
[리포트 생성]
knowledge_base/reports/failure_analysis_20260113.md
    │
    ▼
[MetaLearner 실행]
"brain_agent.py 프롬프트에 이거 추가할까요?"
    │
    ▼
[사용자 승인]
y
    │
    ▼
[다음 세션부터 자동 적용]

결과:

# Before (실패)
사용자: "앱이 크래시 나는데 원인 찾아줘"
AI: "코드를 분석해보면..." (로그 확인 안 함)

# After (성공)
사용자: "앱이 크래시 나는데 원인 찾아줘"
AI: "먼저 로그 파일을 확인합니다.
     $ ls -la logs/
     $ tail -100 logs/error.log
     에러 메시지: NullPointerException at line 42
     원인: ..."

실패 → 분석 → 개선 → 다음 성공. 이 사이클이 자동화된 것이다.


또 한 단계: 코드-문서 자동 동기화

라우팅 개선

지표 Before After

Worker 선택률 20% 80%
평균 토큰 15,000 4,500
응답 시간 8초 3초

규칙 준수

지표 Before After

블로그 위반율 30% 0%
코드 TODO 잔존 15% 0%
추가 토큰 비용 - 0

추가 토큰 비용이 0인 이유:

  • 정규식/파일 체크만 사용 (LLM 호출 없음)
  • 문제 없으면 SYSTEM_INDEX 안 읽음 (조건부 검증)
  • 10일 측정 결과, 평균 추가 토큰 0

효과: 숫자로 보는 변화

컴포넌트 역할 트리거

ChecklistValidator 블로그/코드 규칙 검증 매 응답
RoutingValidator 신뢰도 0.75 이상 검증 매 응답
SystemIndexValidator Hook 동기화 등 검증 위반 시에만
FailureAnalyzer 실패 패턴 추출 매주 월요일
MetaLearner 프롬프트 자동 개선 사용자 승인

Self-Reflection의 철학은 단순하다:

"AI도 실수한다. 중요한 건 같은 실수를 반복하지 않는 것."

이제 우리는:

  • 블로그 규칙 위반을 사용자가 발견하기 전에 자동으로 잡아낼 수 있다
  • 정규식/파일 체크만 사용 (LLM 호출 없음)
  • 문제 없으면 SYSTEM_INDEX 안 읽음 (조건부 검증)

더 이상 "규칙 있어도 안 지켜지면 의미 없잖아"라고 할 필요가 없다. AI가 알아서 지킨다.


정리하면

컴포넌트 역할 트리거

ChecklistValidator 블로그/코드 규칙 검증 매 응답
RoutingValidator 신뢰도 0.75 이상 검증 매 응답
DocSyncChecker 코드-문서 동기화 경고 코드 수정 시
FailureAnalyzer 실패 패턴 추출 매주 월요일
MetaLearner 프롬프트 자동 개선 사용자 승인

Self-Reflection의 철학은 단순하다:

"AI도 실수한다. 중요한 건 같은 실수를 반복하지 않는 것."

이제 우리는:

  • 블로그 규칙 위반을 사용자가 발견하기 전에 자동으로 잡아낼 수 있다
  • 토큰 비용을 70% 절감하면서도 더 정확한 라우팅을 할 수 있다
  • AI가 실패하면 스스로 원인을 분석하고 다음엔 같은 실수를 안 하게 만들 수 있다
  • 코드 수정하면 관련 문서 업데이트가 자동으로 리마인드된다
더 이상 "규칙 있어도 안 지켜지면 의미 없잖아"라고 할 필요가 없다. AI가 알아서 지킨다.
반응형