CRITIC: 외부 도구를 통한 검증
모델 자체 판단이 아닌, 외부 도구(검색, 코드 실행, 계산기)를 사용해 답변을 검증하고 개선하는 기법
2026년 2월 1일·6 min read·
agent
critic
tool-use
verification
외부 도구를 통한 검증
개념
CRITIC은 모델 스스로의 판단이 아닌, 외부 도구(코드 실행, 검색, 계산기 등)를 사용해 답변을 검증하고 개선하는 기법이다.
동작 구조
- 초기 답변 생성 -- 모델이 질문에 대한 1차 답변을 만듭니다
- 외부 도구로 검증 -- 검색, 계산기, 코드 실행 등으로 답변을 확인한다
- 맞으면 최종 답변으로 확정하고, 틀리면 오류를 분석하여 개선한다
예시
질문: "2023년 한국의 인구는?"
1차 시도 -- 모델: "약 5,200만 명이다."
CRITIC 검증 -- Action: [Search] "2023년 한국 인구 통계" / Result: 통계청 자료 5,145만 명
검증 결과: 틀림 (오차 55만 명)
개선 -- 모델: "정확한 통계청 자료에 따르면 약 5,145만 명이다."
수학 검증 예시
질문: "15의 제곱근의 소수점 둘째 자리까지 값은?"
1차 시도 -- 모델: "약 3.87이다."
CRITIC 검증 -- Action: [Calculate] sqrt(15) / Result: 3.872983...
검증 결과: 맞음 (반올림하면 3.87)
최종 답변: "15의 제곱근은 약 3.87이다. ✓"
Self-Refine과의 차이
| Self-Refine | CRITIC | |
|---|---|---|
| 피드백 소스 | 모델 자체 | 외부 도구 |
| 판단 기준 | 주관적 | 객관적 |
| 팩트 확인 | 어려움 | 가능 |
| 적용 분야 | 창작, 품질 | 팩트, 계산 |
사용 가능한 검증 도구
| 도구 | 용도 | 예시 |
|---|---|---|
| 검색 엔진 | 팩트 체크 | "한국 인구 통계" |
| 코드 실행기 | 코드 검증 | 함수 테스트 실행 |
| 계산기 | 수학 검증 | sqrt(144) = 12 |
| Wikipedia API | 정보 확인 | 역사적 사실 |
| 데이터베이스 | 데이터 검증 | SQL 쿼리 결과 확인 |
코드 검증 예시
python
# [질문] "팩토리얼 함수를 작성해주세요"
# [1차 시도]
def factorial(n):
if n == 0:
return 1
return n * factorial(n) # 버그: n-1이 아닌 n
# [CRITIC 검증]
# Action: [Execute] factorial(5)
# Result: RecursionError (무한 재귀)
# [검증 결과] 실패
# [개선]
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1) # 수정됨
# [재검증]
# Action: [Execute] factorial(5)
# Result: 120 ✓성능
- QA 작업에서 약 7-8% 정확도 향상
- 특히 팩트 기반 질문에서 효과적
- 수학/코드 문제에서 높은 개선율
동작 알고리즘
python
def critic_loop(question, max_iterations=3):
# 초기 답변 생성
answer = llm.generate(question)
for i in range(max_iterations):
# 검증 방법 결정
verification = llm.generate(
f"다음 답변을 검증하기 위해 어떤 도구를 사용해야 할까요?\n"
f"질문: {question}\n"
f"답변: {answer}"
)
# 도구 실행
if "[Search]" in verification:
result = search(verification.query)
elif "[Calculate]" in verification:
result = calculate(verification.expression)
elif "[Execute]" in verification:
result = execute_code(verification.code)
else:
break
# 검증 결과 분석
is_correct = llm.generate(
f"검증 결과가 답변과 일치합니까?\n"
f"답변: {answer}\n"
f"검증 결과: {result}"
)
if "일치" in is_correct:
break
# 개선
answer = llm.generate(
f"검증 결과를 바탕으로 답변을 수정해주세요.\n"
f"기존 답변: {answer}\n"
f"검증 결과: {result}"
)
return answer언제 CRITIC을 사용해야 하는가?
| 상황 | CRITIC 필요성 |
|---|---|
| 팩트 기반 질문 | 높음 |
| 수학/계산 문제 | 높음 |
| 코드 작성 | 높음 |
| 창작 글쓰기 | 낮음 (Self-Refine 권장) |
| 주관적 의견 | 낮음 |
한계
- 도구 의존성: 적절한 검증 도구가 없으면 사용 불가
- 검증 비용: 외부 API 호출 비용
- 검증 범위: 모든 주장을 검증하기 어려움
조합 사용
Self-Refine + CRITIC
- Self-Refine 단계에서 품질과 가독성을 개선한다
- CRITIC 단계에서 외부 도구로 팩트를 검증한다
- 최종 결과를 도출한다
Reflexion + CRITIC
- 시도 후 실패한다 (테스트 실패)
- CRITIC으로 어디서 실패했는지 분석한다
- Reflexion으로 왜 실패했는지 반성한다
- 재시도한다
관련 개념
- Reflexion: 실패 기반 학습
- Self-Refine: 자기 피드백 기반 개선
- ReAct: 도구 사용 프레임워크