Skip to content

Agentic RAG: AI 에이전트가 검색 증강 생성을 어떻게 변화시키고 있는가

Updated on

표준 RAG(Retrieval-Augmented Generation)에는 근본적인 한계가 있습니다: 한 번 검색하고 한 번 생성합니다. 시스템은 벡터 데이터베이스를 검색하고, Top-K 청크를 가져와 프롬프트에 넣은 다음, 답변이 그 청크에 포함되어 있기를 바랍니다. 관련 정보가 여러 문서에 분산되어 있거나, 다단계 추론이 필요하거나, 검색 전 명확화가 필요한 경우, 기본 RAG는 조용히 실패합니다 -- 불완전한 컨텍스트에 기반한 그럴듯하게 들리는 답변을 반환합니다.

Agentic RAG는 정적인 검색-생성 파이프라인을 계획, 반복 검색, 결과 평가, 충분한 정보가 모였는지 판단할 수 있는 자율 AI 에이전트로 대체하여 이 문제를 해결합니다. 에이전트는 단순히 문서를 가져오는 것이 아니라, 무엇을 검색해야 하는지 추론하고, 검색된 콘텐츠가 충분한지 판단하며, 부족할 때 추가 조치를 취합니다.

📚

기본 RAG vs Agentic RAG

기본 RAG 파이프라인

사용자 쿼리 → 쿼리 임베딩 → 벡터 검색 → Top-K 청크 → LLM → 답변

이 접근법의 문제점:

  • 단일 검색: 첫 번째 검색이 관련 문서를 놓치면 복구 방법이 없음
  • 무엇을 검색할지에 대한 추론 없음: 쿼리가 분해 없이 그대로 임베딩됨
  • 평가 없음: 검색된 청크가 실제로 질문에 답하는지 시스템이 판단할 수 없음
  • 다단계 검색 없음: 첫 번째 결과가 다음 쿼리에 정보를 제공하는 검색 체인 불가

Agentic RAG 파이프라인

사용자 쿼리 → 에이전트 계획 → 검색 도구 → 결과 평가 →
  → 더 많은 정보 필요? → 쿼리 개선 → 다시 검색 →
  → 충분한 컨텍스트? → 종합 → 답변

에이전트는 지능적인 오케스트레이터로서:

  1. 복잡한 쿼리를 하위 질문으로 분해 가능
  2. 도구 선택 가능: 벡터 검색, 웹 검색, SQL 쿼리, API 호출
  3. 검색된 컨텍스트가 충분한지 평가 가능
  4. 확신이 생길 때까지 개선된 쿼리로 반복 가능
  5. 여러 검색 라운드의 정보를 종합 가능

Agentic RAG 작동 방식

핵심 아키텍처

구성 요소기본 RAGAgentic RAG
쿼리 처리직접 임베딩쿼리 분해 및 계획
검색단일 벡터 검색다중 도구, 반복 검색
평가없음검색된 컨텍스트의 자기 평가
추론단일 LLM 호출도구 사용을 통한 다단계 추론
오류 복구없음개선된 쿼리로 재시도
데이터 소스보통 하나의 벡터 DB다중 소스 (DB, 웹, API)

에이전트 결정 흐름

Agentic RAG 시스템은 일반적으로 다음 결정 패턴을 따릅니다:

  1. 질문 분석: 단순한가 (단일 검색) 복잡한가 (분해 필요)?
  2. 검색 전략 계획: 어떤 소스를 쿼리할까? 어떤 순서로?
  3. 검색 실행: 첫 번째 소스 검색
  4. 결과 평가: 이 청크에 답변이 포함되어 있는가?
  5. 다음 행동 결정: 답변, 쿼리 개선, 또는 다른 소스 검색
  6. 종합: 모든 검색 단계의 정보를 결합
# 개념적 Agentic RAG 루프 (의사코드)
def agentic_rag(query, tools, max_iterations=5):
    context = []
    plan = agent.plan(query)  # 하위 질문으로 분해
 
    for step in plan:
        # 에이전트가 어떤 도구를 사용할지 결정
        tool = agent.select_tool(step, tools)
        results = tool.execute(step.query)
        context.extend(results)
 
        # 에이전트가 충분한 정보가 있는지 평가
        if agent.has_sufficient_context(query, context):
            break
 
        # 에이전트가 학습한 내용을 바탕으로 쿼리 개선
        step.query = agent.refine_query(step, results)
 
    return agent.synthesize(query, context)

Agentic RAG의 핵심 패턴

1. 쿼리 분해

복잡한 질문을 더 단순한 하위 쿼리로 분할:

원본: "Apple과 Microsoft의 2025년 3분기 매출 성장을 비교하고
       어느 회사의 영업이익률이 더 높았는지 설명하세요"

분해:
  1. "Apple 2025년 Q3 매출 성장"
  2. "Microsoft 2025년 Q3 매출 성장"
  3. "Apple 2025년 Q3 영업이익률"
  4. "Microsoft 2025년 Q3 영업이익률"

각 하위 쿼리는 단일 광범위 검색이 필요한 모든 정보를 반환하길 바라는 대신, 집중적이고 관련 있는 문서를 검색합니다.

2. 적응형 검색

에이전트는 쿼리 유형에 따라 검색 방법을 결정합니다:

쿼리 유형검색 전략
사실 조회단일 벡터 검색
비교각 엔티티에 대한 병렬 검색
다단계 추론이전 결과에 기반한 순차 검색
시간적날짜로 필터링 후 시맨틱 검색
집계SQL 쿼리 + 문서 검색

3. 자기 평가

각 검색 단계 후 에이전트는 다음을 평가합니다:

  • 관련성: 검색된 청크가 올바른 주제에 관한 것인가?
  • 완전성: 답변에 충분한 정보가 포함되어 있는가?
  • 일관성: 여러 소스가 일치하는가?
  • 최신성: 정보가 충분히 최신인가?

4. 도구 선택

Agentic RAG는 벡터 검색에 국한되지 않습니다:

도구사용 시기
벡터 검색시맨틱 유사도 쿼리
키워드 검색 (BM25)정확한 용어 매칭, 기술적 쿼리
웹 검색현재 이벤트, 최근 정보
SQL 쿼리구조화된 데이터, 집계
API 호출실시간 데이터 (가격, 날씨)
코드 실행계산, 데이터 변환

구현 접근법

LangChain 에이전트

from langchain.agents import create_react_agent
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
 
# 검색 도구 생성
vectorstore = FAISS.from_texts(documents, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
 
def search_docs(query: str) -> str:
    results = retriever.invoke(query)
    return "\n".join([doc.page_content for doc in results])
 
tools = [
    Tool(
        name="SearchDocuments",
        func=search_docs,
        description="Search the knowledge base for relevant information"
    ),
]
 
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = create_react_agent(llm, tools, prompt_template)

LlamaIndex 에이전트

from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool
from llama_index.core import VectorStoreIndex
 
# 쿼리 엔진 도구 생성
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=5)
 
tools = [
    QueryEngineTool.from_defaults(
        query_engine=query_engine,
        name="knowledge_base",
        description="Search the company knowledge base"
    ),
]
 
agent = ReActAgent.from_tools(tools, llm=llm, verbose=True)
response = agent.chat("What were our Q3 results?")

Agentic RAG를 사용해야 할 때

시나리오기본 RAGAgentic RAG
단일 소스 단순 Q&A최적과잉
다중 문서 추론어려움탁월
계산이 필요한 질문불가능코드 도구 사용
동적 데이터 (API, 데이터베이스)제한적자연스러운 적합
모호한 쿼리부실한 결과명확화 및 반복 가능
비용 민감저렴 (1회 LLM 호출)비쌈 (다중 호출)
지연 시간 요구빠름느림 (반복적)

트레이드오프

장점단점
높은 답변 품질높은 지연 시간 (다중 LLM 호출)
복잡한 쿼리 처리쿼리당 높은 비용
자기 수정 검색구축 및 디버깅이 복잡
다중 소스 통합에이전트가 루프에 빠질 수 있음
모호한 쿼리에 강함동작 예측이 어려움

Agentic RAG를 위한 데이터 파이프라인 구축

Agentic RAG의 데이터 파이프라인 설정 -- 문서 청킹, 임베딩 생성, 벡터 인덱스 구축 -- 은 반복적인 실험 작업입니다. RunCell (opens in a new tab)은 AI 지원으로 RAG 파이프라인을 프로토타입하고, 검색 품질을 대화형으로 디버깅하며, 청킹 전략을 반복 개선할 수 있는 AI 기반 Jupyter 환경을 제공합니다.

검색 평가 메트릭(관련성 점수, 지연 시간 분포, 답변 품질) 시각화를 위해, PyGWalker (opens in a new tab)를 사용하면 Jupyter에서 RAG 평가 데이터셋을 대화형으로 탐색할 수 있습니다.

FAQ

Agentic RAG란 무엇인가요?

Agentic RAG는 검색 증강 생성과 자율 AI 에이전트를 결합한 것입니다. 정적인 검색-생성 파이프라인 대신, AI 에이전트가 검색 전략을 계획하고, 여러 검색을 실행하고, 결과를 평가하며, 정확하게 답변하기에 충분한 컨텍스트가 모일 때까지 반복합니다.

Agentic RAG는 기본 RAG와 어떻게 다른가요?

기본 RAG는 한 번 검색하고 하나의 답변을 생성합니다. Agentic RAG는 쿼리를 분해하고, 다양한 도구(벡터 검색, 웹 검색, SQL)를 선택하고, 검색된 컨텍스트가 충분한지 평가하며, 개선된 쿼리로 반복할 수 있는 AI 에이전트를 사용합니다. 기본 RAG가 처리할 수 없는 복잡한 다단계 질문을 처리합니다.

Agentic RAG가 기본 RAG보다 비싼가요?

네, Agentic RAG는 여러 LLM 호출(계획, 평가, 종합)과 여러 검색 작업을 수행하므로 일반적으로 쿼리당 비용이 더 높습니다. 트레이드오프는 복잡한 쿼리에 대해 상당히 높은 답변 품질입니다. 단순한 사실 조회에는 기본 RAG가 더 비용 효율적입니다.

어떤 프레임워크가 Agentic RAG를 지원하나요?

LangChain, LlamaIndex, Haystack 모두 Agentic RAG 패턴을 지원합니다. LangChain은 도구 사용이 있는 ReAct 에이전트를, LlamaIndex는 쿼리 계획 에이전트를, Haystack은 파이프라인 기반 에이전트 아키텍처를 제공합니다. OpenAI 또는 Anthropic function calling API를 직접 사용하여 커스텀 에이전트를 구축할 수도 있습니다.

Agentic RAG와 기본 RAG 중 언제 어떤 것을 사용해야 하나요?

단일 지식 베이스에서의 단순한 사실 Q&A에는 기본 RAG를 사용하세요. 쿼리가 여러 문서에 걸친 추론이 필요하거나, 비교를 포함하거나, 실시간 데이터가 필요하거나, 기본 RAG가 지속적으로 불완전한 답변을 반환할 때는 Agentic RAG를 사용하세요.

결론

Agentic RAG는 정적 파이프라인을 계획, 반복 검색, 자체 결과 평가를 수행하는 지능적인 에이전트로 대체하여 기본 RAG의 핵심 한계를 해결합니다. 여러 문서에 걸치고, 추론이 필요하며, 여러 소스의 데이터가 필요한 복잡한 쿼리를 처리합니다. 트레이드오프는 쿼리당 높은 비용과 지연 시간입니다. 대부분의 애플리케이션에서 가장 좋은 접근법은 단순한 쿼리에는 기본 RAG로 시작하고 복잡한 질문은 Agentic RAG로 라우팅하는 것입니다 -- 단순한 시스템이 어려움을 겪을 때만 에이전트를 사용합니다.

📚