CRITIC: 외부 도구를 통한 검증
모델 자체 판단이 아닌, 외부 도구(검색, 코드 실행, 계산기)를 사용해 답변을 검증하고 개선합니다
2026년 2월 1일·5 min read·
ai
ai-agent
llm
critic
verification
fact-checking
외부 도구를 통한 검증
개념
CRITIC은 모델 스스로의 판단이 아닌, 외부 도구(코드 실행, 검색, 계산기 등)를 사용해 답변을 검증하고 개선하는 기법입니다.
동작 구조
초기 답변 생성
↓
외부 도구로 검증
↓
맞는가?
├─ 예 → 최종 답변
└─ 아니오 → 오류 분석 → 개선
예시
[질문] "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 쿼리 결과 확인 |
코드 검증 예시
# [질문] "팩토리얼 함수를 작성해주세요"
# [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% 정확도 향상
- 특히 팩트 기반 질문에서 효과적
- 수학/코드 문제에서 높은 개선율
동작 알고리즘
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: 도구 사용 프레임워크