RAG 시스템에 사고 방식 가르치기: Chain of Thought Retrieval 가이드
요약
단순 검색 방식인 Vanilla RAG의 한계를 극복하기 위해 Chain of Thought(CoT)를 적용한 RAG 고도화 방법을 소개합니다. 질문을 분해하고 단계별로 추론하며 검색하는 과정을 통해 복잡한 질문에 대한 답변 정확도를 높이는 다양한 아키텍처를 다룹니다.
핵심 포인트
- Vanilla RAG의 단일 단계 검색 한계 지적
- CoT를 통한 멀티홉 추론 및 자기 수정 기능 강화
- 질의 분해, ReAct 등 7가지 단계별 접근 방식 제시
- 사고-검색-관찰의 반복을 통한 종합적 답변 생성
Chain of Thought (CoT) retrieval이 복잡한 질의를 위해 어떻게 RAG를 업그레이드하는지 알아보세요. ReAct부터 Tree of Thoughts까지 7가지 기술과 팁, 아키텍처, 그리고 평가 방법을 탐구합니다.
Vanilla RAG의 문제점
당신은 RAG 시스템을 구축했습니다. 단순한 질문에는 잘 작동하지만, 누군가 다음과 같이 질문합니다: "Anthropic의 AI 안전(AI safety) 접근 방식은 OpenAI의 방식과 어떻게 다른가요? 이것이 산업에 미치는 영향은 무엇인가요?"
이런 경우, 당신의 시스템은 몇 개의 청크(chunks)를 검색하고 응답을 생성하지만... 그 내용은 피상적입니다. 질문의 절반을 놓쳤습니다. 점들을 연결하지 못했습니다.
이것이 단일 단계 검색(single-shot retrieval)의 근본적인 한계입니다. 복잡한 질문은 추론(reasoning)—문제를 분해하고, 반복적으로 검색하며, 여러 소스에 걸쳐 종합하는 과정—을 필요로 합니다. 즉, 당신의 RAG 시스템이 **생각(think)**해야 합니다.
여기 RAG를 위한 Chain of Thought (CoT)가 등장합니다.
Chain of Thought Retrieval이란 무엇인가?
2022년 Google 연구진이 소개한 Chain of Thought 프롬프팅은 언어 모델이 정답으로 바로 건너뛰는 대신 단계별로 추론하며 "풀이 과정을 보여줄" 때 복잡한 작업에서 훨씬 더 나은 성능을 발휘한다는 것을 보여주었습니다.
RAG 시스템을 위한 통찰은 다음과 같습니다: 단순히 한 번 검색하고 생성하는 것이 아니라, 무엇이 필요한지 추론하고, 그것을 검색하고, 여전히 무엇이 부족한지 추론하고, 다시 검색한 뒤, 종합하는 것입니다.
기존 방식:
질의 (Query) → 검색 (Retrieve) → 생성 (Generate)
우리가 얻게 되는 방식:
질의 (Query) → 사고 (Think) → 검색 (Retrieve) → 사고 (Think) → 검색 (Retrieve) → ... → 종합 (Synthesize)
이 단순한 변화는 멀티홉 추론 (multi-hop reasoning), 자기 수정 (self-correction), 그리고 복잡한 질문에 대한 훨씬 더 나은 답변을 가능하게 합니다.
CoT-RAG를 위한 7가지 접근 방식
아래 나열된 접근 방식은 가장 단순한 것부터 가장 복잡한 순서로 매핑되었습니다.
1. 질의 분해 (Query Decomposition): 먼저 계획하고, 병렬로 실행하기
가장 단순한 접근 방식입니다: 질문을 사전에 하위 질문(sub-questions)으로 나누고, 각각에 대해 (병렬로) 검색한 다음, 이를 종합합니다.
실행 예시:
사용자: "Tesla와 Ford의 EV 전략을 비교해줘"
분해된 질문:
...
사용 시점: 하위 질문(sub-questions)을 예측할 수 있는 예측 가능한 쿼리에 적합합니다. 비교 질문, 다중 부분 요청(multi-part requests), 그리고 조사 작업(research tasks)에 매우 유용합니다.
트레이드오프 (Trade-offs): 빠르지만 (병렬 검색) 유연성이 부족합니다. 질문 분해(decomposition)가 잘못될 경우, 실행 도중에 이를 수정할 수 없습니다.
2. ReAct: 루프 내에서의 추론과 행동 (Reasoning and Acting in a Loop)
ReAct (Reasoning + Acting)는 사고(thinking)와 행동(action)을 교차시킵니다. 모델은 무엇을 할지 추론하고, 행동(검색 등)을 취하며, 그 결과를 관찰(observe)한 뒤 이 과정을 반복합니다.
패턴:
Thought (사고) → Action (행동) → Observation (관찰) → Thought (사고) → Action (행동) → Observation (관찰) → ... → Answer (답변)
실행 추적 예시:
Thought: 이것은 비교 질문입니다. 먼저 Anthropic의 안전 접근 방식에 대한 정보가 필요합니다.
Action: search[Anthropic AI safety techniques]
...
사용 시점: 어떤 정보가 필요할지 예측할 수 없는 복잡한 멀티홉(multi-hop) 질문에 적합합니다. 속도보다 적응성(adaptability)이 더 중요할 때 매우 유용합니다.
트레이드오프 (Trade-offs): 적응성이 매우 높고 해석 가능(interpretable)하지만, 순차적인 LLM 호출로 인해 지연 시간(latency)이 높습니다. 또한 주의 깊게 제약하지 않으면
사용 시점: 속도보다 정확성이 더 중요한 고위험(High-stakes) 애플리케이션—법률 조사, 의료 정보, 금융 분석 등.
트레이드오프 (Trade-offs): 가장 높은 정확도를 제공하지만, 지연 시간(latency) 또한 가장 높습니다. 여러 번의 검색(retrieval) 및 생성(generation) 단계가 필요합니다.
5. FLARE: 불확실할 때만 검색하기
Forward-Looking Active Retrieval (FLARE)는 우아한 방식입니다. 답변을 점진적으로 생성하되, 모델의 신뢰도(confidence)가 떨어질 때만 검색을 수행합니다.
핵심 통찰: 대부분의 문장은 검색이 필요하지 않습니다. 모델이 불확실할 때만 정보를 가져오십시오.
사용 시점: 대부분의 콘텐츠는 명확하지만 일부 주장(claims)에 근거(grounding)가 필요한 긴 형식의 생성(long-form generation) 작업.
트레이드오프 (Trade-offs): 효율적이지만(검색 횟수 감소), 신뢰도 추정(confidence estimation)이 필요하며 이는 구현 복잡성을 증가시킵니다.
6. Tree of Thoughts: 여러 경로 탐색하기
진정으로 모호한 질문의 경우, 단일한 추론 경로만으로는 충분하지 않을 수 있습니다. Tree of Thoughts는 여러 접근 방식을 탐색하고 최적의 방식을 선택합니다.
패턴:
3가지 접근 방식 생성 → 검색을 통해 각 방식 추진 → 평가 → 최적의 방식 선택
예시:
질문: "왜 그 스타트업은 실패했는가?"
분기 1: 시장 분석 관점
...
사용 시점: 여러 해석이 유효할 수 있는 모호하거나 개방형인 질문.
트레이드오프 (Trade-offs): 복잡한 질문에 대해 가장 높은 품질을 제공하지만, 비용이 많이 듭니다 (연산량 3배 이상).
7. Step-Back Prompting: 먼저 멀리서 바라보기
때로는 구체적인 내용에 앞서 맥락(context)이 필요할 때가 있습니다. Step-back prompting은 먼저 더 일반적인 질문을 던집니다.
패턴:
원래 질문 → 일반적인 질문으로 추상화 → 일반적 맥락 검색 → 구체적 내용 검색 → 결합
예시:
원래 질문: "왜 2008년 금융 위기가 아이슬란드에 그토록 큰 타격을 주었는가?"
한 단계 물러나기(Step back): "무엇이 소규모 경제를 글로벌..."
사용 시점: 더 넓은 맥락으로부터 이득을 얻을 수 있는 개념적인 질문. "왜(Why)"로 시작하는 질문들이 이 방식과 잘 맞습니다.
적절한 접근 방식 선택하기
| 질문이... | 사용 방식... | |
| --- | --- | |
| 예측 가능하고 병렬 처리가 가능한 경우 | Query Decomposition (질문 분해) |
| ... | |
실제로는 여러 방식을 조합하여 사용하게 될 것입니다. 간단한 방식(분해)으로 시작하여, 복잡한 질문에는 ReAct를 추가하고, 중요한 애플리케이션에는 검증(verification) 단계를 계층적으로 추가하십시오.
구현 팁 (Implementation Tips)
1. 반복 제한(iteration limits)을 설정하십시오. ReAct 및 유사한 패턴은 무한 루프에 빠질 수 있습니다. 5~7회 반복으로 제한하십시오.
2. 액션 공간(action space)을 신중하게 설계하십시오. 최소한으로 유지하십시오:
search[query]— 의미론적 검색 (semantic search)lookup[term]— 정확한 일치 (exact match)answer[response]— 종료 (terminate)
3. 관찰(observations) 형식을 잘 구성하십시오. 모델이 출처의 품질에 대해 추론할 수 있도록 출처 속성(source attribution)을 포함하십시오:
def format_results(results):
return "\n".join([
f"[Source {i+1} - {r.metadata['source']}]: {r.text[:500]}"
...
4. 모든 것을 기록(log)하십시오. 추론 과정(reasoning trace)은 디버깅에 매우 귀중한 자산입니다. 사고(thoughts), 행동(actions), 관찰(observations)을 모두 저장하십시오.
5. 실패를 우아하게 처리하십시오. 검색 결과가 없을 때:
if not results:
observation = "No results found. Try a different search angle."
이는 모델이 환각(hallucination)을 일으키는 대신 적응하도록 유도합니다.
아키텍처 (The Architecture)
프로덕션 환경의 CoT-RAG 시스템은 다음과 같은 뚜렷한 계층을 가집니다:
| 계층 | 설명 | |
| --- | --- | |
| Orchestration Layer (오케스트레이션 계층) | 흐름 제어, 상태 관리 | |
| ... | |
오케스트레이션 계층이 핵심입니다. 이 계층은 LLM의 출력을 파싱하고, 액션으로 라우팅하며, 대화 상태를 관리하고, 종료 조건을 강제합니다.
평가의 중요성 (Evaluation Matters)
CoT-RAG 시스템이 제대로 작동하는지 어떻게 알 수 있을까요? 다음 지표들을 추적하십시오:
검색 품질 (Retrieval quality):
- 검색이 관련 문서를 반환하고 있는가?
- 좋은 답변에 도달하기 위해 몇 번의 검색이 필요한가?
추론 품질 (Reasoning quality):
- 사고(thoughts)가 논리적으로 연결되는가?
- 모델이 실제로 검색된 정보를 사용하고 있는가?
답변 품질 (Answer quality):
- 최종 답변이 관찰(observations)에 근거하고 있는가?
- 질문의 모든 부분을 다루고 있는가?
복잡한 다중 홉 (multi-hop) 질문을 사용하여 평가 세트 (evaluation sets)를 구축하세요. 단일 샷 (single-shot) RAG와 귀하의 CoT 접근 방식을 비교해 보십시오. 그 차이는 극명할 것입니다.
결론
표준 RAG는 강력하지만 취약합니다. 표준 RAG는 한 번의 검색으로 충분하며, 무엇을 검색할지 미리 알고 있고, 정답이 단일 청크 (chunk) 내에 존재한다고 가정합니다.
Chain of Thought retrieval은 이러한 가정들을 깨뜨립니다. 이 방식은 시스템이 무엇이 필요한지 추론하고, 초기 검색 결과가 부족할 때 적응하며, 여러 소스에 걸쳐 정보를 합성할 수 있게 해줍니다.
기술의 범위는 단순한 방식 (쿼리 분해 (query decomposition))부터 정교한 방식 (Tree of Thoughts)까지 다양합니다. 단순하게 시작하여, 무엇이 실패하는지 측정하고, 필요한 곳에 복잡성을 추가하십시오.
목표는 모든 기술을 구현하는 것이 아닙니다. 숙련된 연구자가 하는 방식처럼 문제를 체계적이고, 적응적이며, 철저하게 생각하며 해결하는 시스템을 구축하는 것입니다.
귀하의 RAG 시스템은 단순히 검색만 해서는 안 됩니다. 추론을 해야 합니다.
추가 읽을거리
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models — Wei et al., 2022
- ReAct: Synergizing Reasoning and Acting in Language Models — Yao et al., 2023
- Self-Ask: Measuring and Improving the Compositional Reasoning of Large Language Models — Press et al., 2022
- Chain-of-Verification Reduces Hallucination in Large Language Models — Dhuliawala et al., 2023
원문 게시지: GeekyAnts Blog
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기