🤖 AI/ML

Agentic RAG

Agentic RAG

에이전트가 능동적으로 검색과 생성을 수행하는 RAG. 복잡한 질문에 효과적.

📖 상세 설명

Agentic RAG는 기존 RAG(Retrieval-Augmented Generation)에 자율적 의사결정 능력을 추가한 고급 검색-생성 시스템입니다. 단순히 쿼리를 받아 검색하고 응답하는 것을 넘어, AI 에이전트가 검색 전략을 계획하고, 검색 결과를 평가하며, 필요시 추가 검색을 수행하거나 다른 데이터 소스를 탐색합니다.

기존 RAG의 한계를 극복하기 위해 2024년부터 본격적으로 주목받기 시작했습니다. 단순 RAG는 복잡한 질문이나 다단계 추론이 필요한 경우 한계가 있었고, LlamaIndex의 Agent 기능, LangChain의 Self-Query Retriever 등이 Agentic RAG의 대표적 구현체로 자리잡았습니다.

Agentic RAG의 핵심 기능은 Query Decomposition(복잡한 질문 분해), Adaptive Retrieval(검색 결과에 따른 전략 조정), Self-Reflection(응답 품질 자체 평가), Multi-Source Routing(질문 유형에 따른 데이터 소스 선택)입니다. 예를 들어 "2023년 삼성전자 매출과 SK하이닉스 매출을 비교해줘"라는 질문은 두 개의 하위 쿼리로 분해되어 각각 검색 후 결합됩니다.

기업 지식 관리 시스템에서 사내 문서, 이메일, 슬랙 메시지 등 여러 소스를 연결하여 복합적인 질문에 답변할 수 있습니다. 법률/금융 분야에서는 규정 변경 이력을 추적하며 최신 정보를 제공하고, 고객 서비스에서는 FAQ, 매뉴얼, 이전 티켓을 종합하여 정확한 답변을 생성합니다.

💻 코드 예제

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.llms.openai import OpenAI

# 여러 데이터 소스에서 인덱스 생성
hr_docs = SimpleDirectoryReader("./data/hr").load_data()
finance_docs = SimpleDirectoryReader("./data/finance").load_data()
product_docs = SimpleDirectoryReader("./data/product").load_data()

hr_index = VectorStoreIndex.from_documents(hr_docs)
finance_index = VectorStoreIndex.from_documents(finance_docs)
product_index = VectorStoreIndex.from_documents(product_docs)

# 각 인덱스를 도구로 변환
hr_tool = QueryEngineTool(
    query_engine=hr_index.as_query_engine(),
    metadata=ToolMetadata(
        name="hr_policy",
        description="인사 정책, 휴가, 복리후생 관련 질문에 사용"
    )
)

finance_tool = QueryEngineTool(
    query_engine=finance_index.as_query_engine(),
    metadata=ToolMetadata(
        name="financial_data",
        description="회사 재무제표, 매출, 예산 관련 질문에 사용"
    )
)

product_tool = QueryEngineTool(
    query_engine=product_index.as_query_engine(),
    metadata=ToolMetadata(
        name="product_info",
        description="제품 스펙, 가격, 재고 관련 질문에 사용"
    )
)

# Agentic RAG: ReAct 에이전트 생성
llm = OpenAI(model="gpt-4", temperature=0)
agent = ReActAgent.from_tools(
    [hr_tool, finance_tool, product_tool],
    llm=llm,
    verbose=True,  # 추론 과정 출력
    max_iterations=10
)

# 복잡한 질문도 자동으로 분해하여 처리
response = agent.chat(
    "우리 회사 주력 제품의 2023년 매출은 얼마이고, "
    "해당 제품팀의 휴가 정책은 어떻게 되나요?"
)
print(response)

🗣️ 실무 대화 예시

📊 RAG 시스템 개선 회의에서

"기존 RAG로는 '지난 분기 대비 매출 변화'같은 비교 질문에 제대로 답을 못 해요. Agentic RAG로 바꾸면 질문을 분해해서 두 분기 데이터를 각각 검색한 다음 비교 분석까지 자동으로 해줍니다."

💼 기술 면접에서

"Agentic RAG와 일반 RAG의 차이점을 설명해주세요. 일반 RAG는 검색-생성 1회 파이프라인이고, Agentic RAG는 에이전트가 검색 전략을 동적으로 결정하고 필요시 반복 검색합니다. Self-RAG나 CRAG도 비슷한 개념입니다."

🔧 아키텍처 설계에서

"데이터 소스가 5개 이상이면 Router를 붙여서 Agentic RAG로 가는 게 좋아요. 질문 유형에 따라 적절한 소스를 선택하고, 검색 결과가 부족하면 다른 소스를 추가로 탐색하도록 설계합니다."

⚠️ 주의사항

⏱️
응답 지연 시간 증가

다단계 추론과 반복 검색으로 일반 RAG 대비 2~5배 응답 시간이 길어집니다. 실시간성이 중요한 서비스에서는 타임아웃 설정과 스트리밍 응답을 고려하세요.

💰
API 비용 증가

에이전트의 추론 과정에서 LLM 호출이 여러 번 발생합니다. 복잡한 질문은 10회 이상 호출될 수 있으므로, max_iterations 제한과 비용 모니터링이 필수입니다.

🔍
검색 품질 의존성

기본 검색 품질이 낮으면 Agentic RAG도 좋은 결과를 내기 어렵습니다. 먼저 벡터 인덱스 품질, 청킹 전략, 임베딩 모델을 최적화한 후 Agentic 기능을 추가하세요.

🔗 관련 용어

📚 더 배우기