
AI 에이전트의 지능을 뒷받침하는 RAG 전략: 계획과 실행의 메커니즘
요약
기존 RAG의 고정된 파이프라인 한계를 극복하기 위한 Agentic RAG의 메커니즘을 분석합니다. LLM이 계획(Planning)과 실행(Acting) 단계를 통해 자율적으로 추론하고 검색 전략을 결정하는 과정을 상세히 다룹니다.
핵심 포인트
- 기존 RAG의 고정된 파이프라인과 단일 단계 추론 한계 지적
- Agentic RAG의 핵심인 PRAR(Planning, Reasoning, Acting, Reflecting) 구조 설명
- LangChain과 LangGraph를 활용한 구체적인 구현 사례 제시
- 태스크 분해 및 동적 검색 쿼리 수정을 통한 에이전트 지능 강화
「AI 에이전트가 왜 이렇게 똑똑하고 복잡한 태스크를 수행할 수 있는 걸까?」라는 의문을 가져본 적이 없으신가요? 기존의 RAG (Retrieval Augmented Generation)는 「검색 → 생성」의 고정된 파이프라인이었지만, 이것만으로는 AI 에이전트의 유연한 의사결정이나 다단계 추론을 실현할 수 없습니다.
본 기사에서는 AI 에이전트가 복잡한 태스크를 효율적으로 수행하기 위해, RAG (Retrieval Augmented Generation) 가 어떻게 기능하며, 계획 (Planning) 페이즈와 실행 (Acting) 페이즈에서 각각 어떤 정보를 취득하고 활용하는지, 그 내부 동작과 설계 패턴을 상세히 해설합니다. 특히, LangChain과 LangGraph 를 이용한 구체적인 구현 사례를 곁들여, 에이전트의 정밀도와 강건성 (Robustness) 을 높이기 위한 RAG 활용 기술을 심층 분석합니다. 이 기사를 읽고 나면 여러분의 AI 에이전트는 더욱 똑똑하고 실용적인 존재가 될 것입니다.
이 섹션에서는 기존 RAG가 가진 한계와, 이를 극복하기 위해 Agentic RAG가 어떻게 진화해 왔는지를 해설합니다.
기존의 RAG는 「사용자의 질문에 대해 사전에 준비된 문서에서 관련 정보를 검색하고, 그 정보를 바탕으로 LLM이 답변을 생성한다」라는 강력한 패러다임을 확립했습니다. 이를 통해 LLM의 할루시네이션 (Hallucination) 을 억제하고, 최신 정보나 사내 데이터에 기반한 답변이 가능해졌습니다. 하지만 그 프로세스는 비교적 단순하고 고정되어 있습니다.
기존 RAG의 한계:
고정된 파이프라인: 질문의 종류와 관계없이 항상 「검색 → 생성」이라는 일련의 흐름으로 처리됩니다. 예를 들어, 간단한 질문이라도 반드시 검색이 실행되기 때문에 비효율적인 경우가 있습니다. -
단일 단계 추론: 복잡한 질문이나 다단계 사고를 요하는 태스크 (예: 「A와 B를 비교하고, C의 관점에서 최적의 것을 제안해줘」)에는 대응하기 어려운 구조입니다. 검색 결과가 그대로 답변의 근거가 되기 때문에, 깊은 분석이나 고찰에는 취약합니다. -
검색 전략의 유연성 부족: 사용자의 질문이나 태스크의 목표에 따라 검색할 정보원을 바꾸거나, 검색 쿼리 (Query) 를 동적으로 수정하는 능력이 없습니다.
이러한 한계를 타파하고 AI 에이전트에게 인간과 같은 「생각하는 힘」을 부여하는 것이 바로 Agentic RAG 의 접근 방식입니다. Agentic RAG에서는 LLM이 단순한 텍스트 생성기가 아니라, 태스크의 분해, 검색 전략 결정, 취득 정보의 평가, 자기 수정과 같은 「추론 (Reasoning)」을 중심으로 한 역할을 담당합니다. 이는 LangChain 블로그에서 「Agentic RAG: The Next Evolution of RAG」로 소개된 바 있습니다.
이 섹션에서는 Agentic RAG가 어떻게 현명한 판단을 내리고 복잡한 태스크를 수행하는지, 그 내부 메커니즘을 「계획 (Planning)」과 「실행 (Acting)」 페이즈로 나누어 자세히 살펴보겠습니다.
Agentic RAG의 핵심은 LLM이 자율적으로 사고하고 행동을 결정하는 능력입니다. 이는 Planning, Reasoning, Acting, Reflecting (PRAR)의 4가지 사고 단계로 집약됩니다.
계획 페이즈에서는 AI 에이전트가 주어진 태스크를 이해하고, 어떻게 해결해야 할지에 대한 전략을 세웁니다. 이 단계에서 RAG가 수행하는 역할은 태스크의 적절한 분해와 최적의 행동 계획 수립을 지원하는 것입니다.
태스크 이해와 분해:
RAG의 역할: 에이전트는 먼저 사용자의 질문이나 태스크를 깊이 이해하려고 시도합니다. 이때 유사한 과거의 태스크 해결 이력, 도메인 특화 지식, 또는 태스크 분해에 관한 베스트 프랙티스 (Best Practice) 가 기재된 문서를 RAG로 검색 및 참조할 수 있습니다. -
예시: 「신제품 시장 조사 보고서를 작성해줘」라는 태스크에 대해, 에이전트는 「시장 조사 보고서 템플릿」, 「경쟁사 분석 기법」, 「데이터 수집원」과 같은 정보를 검색하고, 이를 바탕으로 「먼저 경쟁 제품의 정보를 수집한다」, 「다음으로 고객 설문 조사를 실시한다」와 같은 구체적인 단계를 계획합니다.
도구 선택 및 전략 수립:
-
RAG의 역할: 에이전트는 태스크를 해결하기 위해 사용 가능한 도구(Web 검색, 데이터베이스 쿼리, API 호출 등) 중에서 최적의 것을 선택해야 합니다. 이 선택 과정에서 각 도구의 기능, 이용 조건, 과거 성공 사례 등이 기재된 문서를 RAG로 검색하여 참조합니다.
-
예시: "최신 주가 정보를 조사해줘"라는 질문에 대해, 에이전트는 "주가 검색 API 이용 방법"이라는 문서를 검색하고, 해당 API를 호출할 계획을 세웁니다. 만약 "LangChain Expression Language (LCEL)의 최신 정보"라면, LangChain의 공식 문서를 검색하는 계획을 세웁니다.
-
LangChain에서의 구현: LangChain 에이전트는
tools를 부여받으며, 프롬프트를 통해 어떤 도구를 사용할지 추론합니다. 이 "어떤 도구가 무엇을 하는가"에 대한 정보 또한 RAG의 연장선상에서 LLM에 제공되는 지식이라고 볼 수 있습니다.
이 단계에서 RAG는 에이전트가 "무엇을 해야 하는지", "어떻게 해야 하는지"를 판단하기 위한 "메타 지식 (Meta-knowledge)"이나 "노하우"를 제공합니다.
실행 단계에서는 계획에 기반하여 구체적인 행동을 취하고 태스크를 수행합니다. 이 단계에서의 RAG는 행동의 성공에 필요한 "구체적인 정보"를 제공합니다.
정보 검색 및 취득:
-
RAG의 역할: 에이전트가 Web 검색 도구나 벡터 스토어 (Vector Store) 검색 도구 등을 이용하여 태스크에 필요한 정보를 취득할 때, RAG는 중심적인 역할을 수행합니다. 에이전트는 동적으로 검색 쿼리 (Search Query)를 생성하여 관련성이 높은 정보를 취득합니다.
-
예시: 계획 단계에서 "경쟁 제품의 정보를 수집한다"라고 결정한 경우, 실행 단계에서는 Web 검색 도구 (Tavily 등)를 사용하여 구체적인 경쟁 제품명이나 스펙, 가격 등을 검색합니다. 이 검색 결과가 RAG를 통해 LLM에 제시되며, 다음 단계의 입력값이 됩니다.
-
LangChain에서의 구현:
retriever.invoke(query)와 같은 형태로, LLM이 생성한 쿼리를 사용하여 벡터 스토어에서 정보를 취득합니다.
정보의 평가 및 성찰 (Reflecting):
-
RAG의 역할: 취득한 정보가 태스크의 목표에 적절한지, 신뢰할 수 있는지 평가할 때도 RAG가 활용됩니다. 에이전트는 평가 기준이나 팩트 체크 (Fact-check) 기법에 관한 문서를 검색하고, 이를 바탕으로 취득한 정보의 품질을 판단합니다. 정보가 불충분할 경우, 추가 정보를 검색하거나 다른 전략을 시도하는 "자기 수정 (Self-Correction)" 프로세스로 진입합니다.
-
예시: Web 검색으로 얻은 정보가 오래되었거나 신뢰성이 떨어진다고 판단할 경우, 에이전트는 "정보 신뢰성 평가 가이드라인"과 같은 문서를 RAG로 참조하여 다른 정보원을 찾는 등의 행동을 수정합니다.
이와 같이 Agentic RAG는 단순히 검색 결과를 생성에 사용하는 것에 그치지 않고, 에이전트의 사고 프로세스 전반에 걸쳐 정보 검색과 활용을 통합함으로써 더욱 고도화된 문제 해결 능력을 실현합니다.
이 섹션에서는 LangChain과 LangGraph를 사용하여 Agentic RAG를 구체적으로 구현하는 방법을 해설합니다. 특히 LangGraph를 통한 상태 관리 (State Management)와 조건 분기 (Conditional Branching)가 에이전트의 유연한 동작을 어떻게 뒷받침하는지에 초점을 맞춥니다.
먼저, 필요한 라이브러리를 설치하고 API 키를 설정합니다.
pip install -U langgraph langchain langchain-openai langchain-text-splitters beautifulsoup4 requests langchain_community
API 키는 환경 변수로 설정합니다.
import os
import getpass
def _set_env(key: str) -> None:
...
Agentic RAG의 기반이 되는 RAG 시스템을 구축합니다. 여기서는 LangChain의 공식 문서를 예로 들어, URL로부터 문서를 로드하고 텍스트 분할 (Text Splitting), 임베딩 (Embedding), 벡터 스토어 저장을 수행합니다.
from bs4 import BeautifulSoup as Soup
from langchain_community.document_loaders.recursive_url_loader import RecursiveUrlLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
...
여기서부터가 Agentic RAG의 핵심입니다. LangGraph를 사용하여 에이전트의 사고와 행동의 흐름을 그래프 (Graph)로 정의합니다. 사용자의 질문 내용에 따라 검색을 수행할지, 아니면 직접 답변을 생성할지를 에이전트 스스로 판단하는 심플한 Agentic RAG 흐름을 구축합니다.
LangGraph에서는 그래프 전체의 상태를 TypedDict로 정의합니다. 이 상태가 노드 (Node) 간에 전파되며, 에이전트의 기억이 됩니다.
from typing import TypedDict, Annotated, List, Union
import operator
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, ToolMessage
...
에이전트의 추론과 생성을 담당할 LLM을 초기화합니다. 여기서는 OpenAI의 gpt-4o를 사용합니다.
llm = ChatOpenAI(model="gpt-4o", temperature=0)
그래프의 각 단계를 노드로 정의합니다. 여기서는 "질문 라우팅 (Routing)", "정보 검색 (Retrieval)", "답변 생성 (Generation)"의 세 가지 노드를 생성합니다.
# 노드 정의
def route_question(state: AgentState) -> str:
"""
...
정의한 노드와 상태를 사용하여 LangGraph로 워크플로우 (Workflow)를 구축합니다. 조건 분기를 통해 에이전트의 행동이 동적으로 변화합니다.
# 그래프 구축
workflow = StateGraph(AgentState)
# 노드 추가
...
이 구현 예시에서는 route_question 노드가 LLM의 추론을 통해 다음에 진행할 경로 (retrieve 또는 generate)를 결정합니다. 이것이 Agentic RAG 계획 단계 (Planning Phase)의 일환을 담당합니다. retrieve 노드는 RAG를 실행하고, generate 노드는 얻은 정보(또는 일반적인 지식)를 바탕으로 답변을 생성합니다. LangGraph는 이러한 복잡한 상태 전이 (State Transition)를 직관적으로 기술할 수 있게 해줍니다.
Agentic RAG는 강력하지만, 구현과 운영에는 특유의 과제가 따릅니다. 여기서는 자주 발생하는 오류나 주의해야 할 점과 그 회피책을 설명합니다.
LLM이 사실에 기반하지 않은 정보를 생성하는 할루시네이션 (Hallucination)은 RAG 시스템 전체에 있어 항상 큰 리스크입니다. Agentic RAG에서는 다단계 추론이 개입하기 때문에, 할루시네이션의 리스크가 복잡해질 가능성이 있습니다.
회피책:-
자기 검증 기능 (Self-Correction/Self-Reflection): 에이전트가 생성한 답변의 신뢰성을 평가하고, 필요에 따라 추가 검색이나 재생성을 수행하는 단계를 LangGraph에 포함합니다. 예를 들어, 생성된 답변과 참조 문서의 정합성을 LLM이 평가하도록 하는 노드를 추가할 수 있습니다. -
RAGAS 등의 평가 프레임워크 활용: RAGAS는 RAG 파이프라인의 품질을 레퍼런스 프리 (Reference-free) 방식으로 자동 평가하는 데팩토 스탠다드 (De facto standard)입니다. 답변의 정확성, 문맥의 관련성, 오정보 탐지 등을 정량적으로 평가하여 지속적으로 개선합니다. CI/CD에 통합하여 모델 변경이나 청킹 (Chunking) 변경 시마다 자동으로 실행함으로써 품질을 유지합니다. -
청킹 전략의 최적화: LLM에 제공하는 컨텍스트 (Context)의 질을 높이기 위해 문서를 적절한 입도 (Granularity)로 분할하는 것이 필수적입니다. 청크 크기 (Chunk size), 오버랩 (Overlap), 메타데이터 부여, 시맨틱 청킹 (Semantic Chunking) 등을 시행착오를 통해 시도하며 최적의 전략을 찾아야 합니다. -
쿼리 (Query) 최적화: LLM으로 검색 쿼리를 재작성 (Rewrite)하거나 여러 개의 쿼리를 생성하여 검색 정밀도를 향상시킴으로써 할루시네이션의 근원을 차단합니다.
사용자의 질문에 대해 관련성이 낮은 문서가 검색되면 Agentic RAG의 정밀도도 저하됩니다.
회피책:
-
하이브리드 검색 (Hybrid Search): 벡터 검색 (Vector Search)뿐만 아니라 키워드 검색 (BM25 등)을 결합함으로써, 의미론적 관련성 (Semantic Relevance)과 키워드 일치도를 모두 고려하여 검색 누락이나 관련성이 낮은 결과를 줄입니다. -
-
리랭킹 (Reranking): 검색 결과를 LLM 등으로 다시 평가하여 관련성이 높은 순으로 재정렬함으로써, LLM에 제공하는 컨텍스트 (Context)의 품질을 향상시킵니다. Cohere Rerank나 BGE Reranker 등을 사용할 수 있습니다. -
-
임베딩 모델 (Embedding Model) 선정: 도메인에 특화된 임베딩 모델이나 더 고성능인 모델 (예:
text-embedding-3-small)을 사용하여 의미론적 검색 (Semantic Search)의 정밀도를 높입니다. - -
문서 커버리지 (Coverage, 망라도) 개선: RAG는 "기존 문서에서 답을 찾는" 기술이기 때문에, 애초에 정보원에 없는 지식은 생성할 수 없습니다. 정보원을 확충하는 것을 검토하는 것이 가장 근본적인 해결책 중 하나입니다.
그래프가 복잡해짐에 따라 상태 (State)의 정의나 노드 (Node) 간의 데이터 흐름 (Data Flow) 관리가 어려워질 수 있습니다. 특히 상태가 직렬화 (Serialization)된다는 점을 고려하지 않으면 예기치 않은 에러의 원인이 됩니다.
회피책:
-
단순한 데이터 타입 사용: LangGraph의 상태는 내부적으로 직렬화 (JSON화)될 수 있으므로, 커스텀 객체 대신 참조가 아닌 ID를 사용하는 등 단순한 데이터 타입을 사용하는 것이 안전합니다. 커스텀 객체를 상태에 포함할 경우에는 직렬화가 가능한지 확인하거나 커스텀 시리얼라이저 (Custom Serializer)를 구현해야 합니다. -
-
LangSmith 활용: LangSmith는 LangChain/LangGraph 애플리케이션의 트레이스 (Trace), 모니터링, 평가를 지원하는 강력한 도구입니다. 복잡한 에이전트의 내부 동작을 시각화하고 각 노드의 입력·출력, LLM 호출, 도구 실행 등을 상세히 확인할 수 있어 디버깅을 대폭 용이하게 합니다. 개발 단계부터 적극적으로 도입하십시오. -
-
모듈화와 추상화: 각 노드의 역할을 명확히 하고, 복잡한 로직은 별도의 함수나 클래스로 분리하여 그래프 전체의 가독성과 유지보수성을 높입니다. 상태의 변경은
Annotated[List[BaseMessage], operator.add]와 같이 상태를 파괴적으로 변경하지 않는operator.add를 사용하는 것이 LangGraph의 베스트 프랙티스 (Best Practice)입니다.
이 섹션에서는 Agentic RAG를 설계 및 도입할 때 고려해야 할 트레이드오프 (Trade-off)와 효과적인 시스템을 구축하기 위한 베스트 프랙티스를 정리합니다.
정확도 vs 레이턴시 (Latency) vs 비용:
-
Agentic RAG는 기존의 RAG보다 더 높은 정확도의 답변을 기대할 수 있지만, 여러 추론 단계나 도구 호출을 동반하기 때문에 레이턴시 (응답 시간)가 증가하고 LLM 이용 비용도 높아지는 경향이 있습니다.
-
즉각적인 효과나 저비용을 중시한다면, 청킹 (Chunking) 최적화나 하이브리드 검색과 같은 Basic/Advanced RAG부터 도입하고 점진적으로 Agentic RAG로 이행하는 것을 검토하십시오.
범용성 vs 특화성:
-
범용적인 AI 에이전트는 폭넓은 태스크 (Task)에 대응할 수 있지만, 특정 도메인이나 업무에 특화된 에이전트가 더 높은 정확도와 효율을 발휘하기 쉽습니다.
-
특정 유스케이스 (Use Case)에 특화할 경우, 도메인 지식을 반영한 프롬프트 (Prompt) 설계, 전용 도구 개발, 파인튜닝 (Fine-tuning) 등을 검토함으로써 더 높은 퍼포먼스를 얻을 수 있습니다.
자율성 vs 제어:
-
AI 에이전트의 자율성을 높일수록 예기치 않은 동작이나 할루시네이션 (Hallucination)의 리스크도 증가할 가능성이 있습니다.
-
중요한 업무에서는 Human-in-the-Loop (인간의 확인을 거치는 흐름)를 도입하여, 에이전트의 판단을 인간이 리뷰하고 승인하는 메커니즘을 구축하는 것이 중요합니다. LangGraph는 Human-in-the-Loop 구현을 지원합니다.
-
단계적인 도입: 우선 Basic RAG부터 시작하여, 청킹 (Chunking) 최적화, 하이브리드 검색 (Hybrid Search), 리랭킹 (Reranking) 등의 Advanced RAG 기법을 통해 정밀도를 향상시킵니다. 그 후, 복잡한 태스크나 다단계 추론 (Multi-step Reasoning)이 필요한 경우에 Agentic RAG를 검토하는 단계적인 접근 방식을 권장합니다. -
평가 파이프라인 구축: RAGAS와 같은 평가 프레임워크를 도입하여, 답변의 정확성, 관련성, 완전성, 오정보 (Hallucination) 탐지 등을 정량적으로 측정하고 개선하는 메커니즘을 구축합니다. 이를 CI/CD에 통합하여 모델 변경이나 청킹 변경이 있을 때마다 자동으로 실행함으로써 품질을 유지할 수 있습니다. -
데이터 거버넌스 철저: RAG의 답변 품질은 참조 데이터의 품질에 크게 의존하므로, 데이터의 수집, 전처리, 업데이트, 보안 대책을 적절히 수행하는 것이 필수적입니다. -
LangSmith의 적극적인 활용: 개발 단계부터 LangSmith를 도입하여 에이전트의 트레이스 (Trace), 디버깅, 성능 모니터링을 수행함으로써, 복잡한 에이전트의 동작을 이해하고 문제 식별 및 해결을 효율화할 수 있습니다. -
프롬프트 엔지니어링 (Prompt Engineering) 최적화: LLM의 추론 능력을 최대한 끌어올리기 위해, ReAct 패턴과 같이 사고와 언어 행동을 분리한 프롬프트 설계나 출력 포맷의 구조화를 의식하는 것이 중요합니다. -
도구와 외부 데이터 소스 활용: 벡터 데이터베이스뿐만 아니라 웹 검색 (Tavily 등), API 서비스, 사내 데이터베이스 등 다양한 정보원에 동적으로 접근할 수 있는 메커니즘을 구축함으로써 에이전트의 능력을 확장합니다. LangChain의 Tools는 이러한 통합을 용이하게 합니다. -
모듈화된 설계: LangGraph로 에이전트를 구축할 때는 각 노드 (Node)의 역할을 명확히 하고, 재사용 가능한 컴포넌트로 설계하여 유지보수성과 확장성을 높입니다.
본 기사에서는 AI 에이전트의 지능을 뒷받침하는 Agentic RAG 전략에 대해, 그 내부 동작부터 LangChain/LangGraph를 이용한 구현, 그리고 개발 및 운영상의 과제와 베스트 프랙티스(Best Practices)까지 상세히 해설했습니다.
중요한 포인트는 다음과 같습니다.
Agentic RAG는 LLM이 추론을 통해 동적으로 검색 전략을 결정하고, 다단계의 사고와 행동을 결합함으로써 기존 RAG의 한계를 넘어 더 복합적인 태스크에 대응합니다. -
계획 (Planning) 단계에서는 태스크 이해, 분해, 도구 선택에 있어 RAG가 메타 지식을 제공하며, 실행 (Execution) 단계에서는 구체적인 정보 검색과 자기 검증 (Self-verification)에 RAG가 활용됩니다. -
LangChain과 LangGraph는 Agentic RAG를 구축하기 위한 강력한 프레임워크이며, 특히 LangGraph는 복잡한 에이전트의 워크플로 (Workflow), 상태 관리 (State Management), 조건 분기를 직관적으로 기술하는 것을 가능하게 합니다. - 할루시네이션 (Hallucination) 억제, 검색 정밀도 향상, 상태 관리의 복잡성 등의 과제에 대해서는 자기 검증 기능, RAGAS를 통한 평가, LangSmith를 활용한 디버깅, 그리고 청킹 전략의 최적화가 유효한 회피책이 됩니다.
AI 에이전트의 진화는 이제 막 시작되었습니다. 본 기사에서 소개한 Agentic RAG의 개념과 구현 패턴이 여러분의 더욱 똑똑하고 실용적인 AI 에이전트 개발에 도움이 되기를 바랍니다. 더 깊이 배우고 싶다면 LangChain 및 LangGraph의 공식 문서를 참조하여 Agentic RAG의 추가적인 응용 사례와 발전 토픽을 탐구해 보시기 바랍니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기