Chain-of-Thought: 루프의 내부 추론 스텝
흔한 오해: CoT는 루프가 아니다
섹션 제목: “흔한 오해: CoT는 루프가 아니다”“에이전트가 생각하는 과정”이라는 표현 때문에 Chain-of-Thought(CoT)를 에이전틱 루프의 일종으로 오해하기 쉽다. 하지만 둘은 작동 수준이 근본적으로 다르다.
루프는 여러 번의 모델 호출, 도구 실행, 외부 관찰을 반복하는 외부 제어 구조다. 루프의 각 이터레이션은 서로 다른 시점에 일어나는 독립적인 모델 호출이다.
Chain-of-Thought는 단 하나의 forward pass 안에서, 모델이 최종 답을 내놓기 전에 중간 추론 단계를 텍스트로 생성하게 만드는 기법이다. “A이므로 B이고, 따라서 C”처럼 이어지는 중간 추론 토큰들이 최종 토큰의 품질을 높인다.
단일 forward pass 안에서의 CoT───────────────────────────────────────────────────────입력: "다음 수학 문제를 풀어라: ..."
모델 내부 (한 번의 forward pass): [토큰 생성 1] "문제를 단계별로 생각해보자." [토큰 생성 2] "먼저 A를 구하면..." [토큰 생성 3] "다음으로 B를 계산하면..." [토큰 생성 N] "따라서 최종 답은 42이다."
출력: 중간 추론 + 최종 답 (하나의 응답)───────────────────────────────────────────────────────외부 도구 호출 없음. 루프 없음. 순수하게 한 번의 생성.Wei et al.의 발견
섹션 제목: “Wei et al.의 발견”Jason Wei 등이 2022년 발표한 CoT 논문(arXiv:2201.11903)은 간단한 관찰에서 시작했다. 퓨샷 예제에서 “단계별 풀이”를 보여주면, 모델이 동일한 방식으로 단계별로 추론하게 된다. 이 단순한 변화가 수학 추론, 상식 추론, 기호 추론에서 성능을 크게 향상시켰다.
두 가지 CoT 방식이 있다.
- Few-shot CoT: 프롬프트에 단계별 풀이를 포함한 예제를 여러 개 넣어, 모델이 그 패턴을 따르게 한다.
- Zero-shot CoT: 예제 없이 “단계별로 생각해라(Let’s think step by step)“라는 지시만 추가한다. 놀랍게도 이 한 문장이 많은 경우에 효과적이다.
루프 안에서 CoT의 역할
섹션 제목: “루프 안에서 CoT의 역할”에이전틱 루프의 Reason 단계에서 모델이 추론하는 방식이 바로 CoT다. 각 이터레이션에서 모델은 지금까지의 컨텍스트를 처리하고, 중간 추론을 거쳐 다음 행동(도구 호출 또는 완료)을 결정한다.
루프 + CoT의 관계───────────────────────────────────────────────────────이터레이션 1: [OBSERVE] 사용자: "파일 foo.py를 읽고 버그를 찾아라" [REASON/CoT] "먼저 파일 내용을 확인해야 한다. read_file('foo.py')를 호출할 것이다." [ACT] read_file('foo.py') 실행 [EVALUATE] 파일 내용 → 컨텍스트에 추가
이터레이션 2: [OBSERVE] 파일 내용이 컨텍스트에 있음 [REASON/CoT] "5번째 줄에서 인덱스 오류가 보인다. 수정 방법을 생각해보면..." [ACT] write_file('foo.py', 수정된_내용) 실행 [EVALUATE] 완료 선언 (end_turn)───────────────────────────────────────────────────────각 이터레이션 내부에서 CoT가 작동. 루프는 이터레이션 간.루프는 이터레이션 사이의 외부 구조다. CoT는 각 이터레이션 내부의 추론 메커니즘이다. 둘은 다른 수준에서 작동한다.
Self-Consistency: CoT의 팬아웃 변형
섹션 제목: “Self-Consistency: CoT의 팬아웃 변형”Wang et al.(arXiv:2203.11171)의 Self-Consistency는 CoT를 여러 번 실행해 다수결로 답을 결정하는 기법이다. 단일 CoT가 잘못된 추론 경로에 고착될 수 있다는 점을 다양한 추론 경로 샘플링으로 극복한다.
이 기법은 GSM8K에서 +17.9%, SVAMP에서 +11.0%, AQuA에서 +12.2%의 성능 향상을 보였다. 에이전틱 루프의 맥락에서는 단일 추론 단계 대신 여러 가설을 생성하고 그 중 최선을 선택하는 패턴으로 활용된다.
| 방식 | 추론 경로 수 | 비용 | 적합 상황 |
|---|---|---|---|
| 단일 CoT | 1 | 낮음 | 빠른 응답이 필요할 때 |
| Self-Consistency | K (예: 5~20) | 높음 | 높은 정확도가 중요할 때 |
| Zero-shot CoT | 1 | 낮음 | 복잡한 예제 준비 시간이 없을 때 |
프로덕션에서의 CoT 고려 사항
섹션 제목: “프로덕션에서의 CoT 고려 사항”개념 이해용 의사 코드이며 실제 API와 다를 수 있습니다.
# Zero-shot CoT 프롬프트 예시def build_reasoning_prompt(task: str) -> str: return f"""다음 작업을 수행하기 전에, 단계별로 생각을 정리하세요.
작업: {task}
추론:1. 먼저 무엇을 파악해야 하는지 생각합니다.2. 필요한 도구와 순서를 계획합니다.3. 각 단계의 잠재적 문제를 고려합니다.
행동:"""CoT가 생성하는 중간 추론 토큰은 비용을 증가시킨다. 하지만 추론의 정확성을 높이고, 실패했을 때 어디서 잘못됐는지 추적하기 쉽게 만들어 주는 장점이 있다. 특히 에이전틱 루프에서 행동 전 추론을 컨텍스트에 남겨두면, 이후 이터레이션에서 모델이 이전 결정의 맥락을 이해하는 데 도움이 된다.
다음 챕터에서는 루프가 외부 세계와 어떻게 상호작용하는지, 도구 사용(Tool Use)의 프로토콜과 에이전트-컴퓨터 인터페이스(ACI) 설계 원칙을 살펴본다.