AI Sparkup

복잡한 AI 세상을 읽는 힘 ⚡

단순 RAG는 끝났다, 에이전틱 리트리벌의 시대가 왔다

AI와 데이터를 다루는 개발자라면 RAG(Retrieval-Augmented Generation)에 대해 한 번쯤 들어보셨을 것입니다. 최근 LlamaIndex가 발표한 기술 블로그에서는 “단순한 RAG는 이제 한계에 다다랐다”며 새로운 패러다임으로 에이전틱 리트리벌(Agentic Retrieval)을 제시했습니다.

출처: Unsplash – AI와 데이터 검색의 진화

에이전틱 리트리벌은 AI 에이전트가 스스로 최적의 검색 전략을 선택하고 실행하는 지능적인 검색 시스템입니다. LlamaIndex의 기술 블로그에서 소개된 이 개념은 단순히 벡터 유사도로 문서를 찾던 기존 방식에서 벗어나, 상황에 맞는 다양한 검색 모드를 조합해 더 정확하고 맥락적인 정보를 제공하는 방법을 제시합니다.

기존 RAG 방식의 한계점

전통적인 RAG 시스템은 “naive top-k retrieval”이라는 단순한 방식에 의존해왔습니다. 문서를 작은 청크(chunk)로 나누고, 쿼리와 가장 유사한 상위 k개의 청크를 벡터 유사도로 찾아 반환하는 방식입니다.

# 기존 RAG의 단순한 접근 방식
query = "Microsoft의 본사는 어디에 있나요?"
# 1. 쿼리를 벡터로 변환
# 2. 벡터 데이터베이스에서 유사도 검색  
# 3. 상위 k개 청크 반환
nodes = index.as_retriever().retrieve(query)

하지만 이런 단순한 접근 방식은 여러 문제점을 가지고 있습니다:

맥락 손실 문제: 문서를 작은 조각으로 나누면서 중요한 맥락 정보가 사라집니다. 예를 들어, 재무 보고서에서 특정 수치의 배경과 의미를 제대로 파악하기 어렵습니다.

획일적 검색 방식: 모든 쿼리에 대해 동일한 검색 방식을 적용합니다. 하지만 “특정 파일의 내용을 찾는 질문”과 “일반적인 개념을 묻는 질문”은 서로 다른 접근법이 필요합니다.

단일 지식베이스 의존: 하나의 벡터 데이터베이스에만 의존하므로, 다양한 형태의 문서(PDF, PPT, 웹페이지 등)를 효과적으로 활용하기 어렵습니다.

에이전틱 리트리벌의 핵심 개념

에이전틱 리트리벌은 이러한 한계를 극복하기 위해 AI 에이전트를 활용합니다. 에이전트가 질문의 성격을 분석하고, 상황에 맞는 최적의 검색 전략을 선택하는 것입니다.

Agentic Retrieval Process
출처: Unsplash – 지능적 검색 프로세스의 개념

다중 검색 모드 지원

LlamaIndex 블로그에서 소개된 LlamaCloud의 에이전틱 리트리벌 시스템은 세 가지 핵심 검색 모드를 제공합니다:

1. chunk 모드: 전통적인 청크 기반 검색으로, 문서의 일부분에서 정확한 정보를 찾을 때 사용됩니다.

2. files_via_metadata 모드: 특정 파일명이 언급된 질문에 대응합니다. 예를 들어 “2024_MSFT_10K.pdf 파일에서 Microsoft의 재무 전망에 대해 뭐라고 하나요?”와 같은 질문에 적합합니다.

3. files_via_content 모드: 특정 파일을 지정하지 않고 주제에 대한 일반적인 질문을 할 때 사용됩니다. “Microsoft의 재무 전망은 어떤가요?”와 같은 질문이 여기에 해당합니다.

자동 라우팅 시스템

가장 혁신적인 부분은 auto_routed 모드입니다. 이 모드에서는 경량 AI 에이전트가 질문을 분석하고, 위 세 가지 모드 중 가장 적합한 방식을 자동으로 선택합니다.

# 에이전트가 자동으로 최적 검색 모드를 선택
nodes = financial_index.as_retriever(
    retrieval_mode="auto_routed"
).retrieve("Microsoft의 본사는 어디에 있나요?")

# 선택된 검색 모드 확인 가능
print(nodes[0].metadata["retrieval_mode"])  # "chunks" 출력

실제 구현 방법: LlamaCloud 기반 단계별 가이드

LlamaIndex 블로그에서 소개된 에이전틱 리트리벌을 실제로 구현하는 방법을 단계별로 살펴보겠습니다. 이 구현은 LlamaCloud 플랫폼을 기반으로 합니다.

1단계: 기본 인덱스 생성

먼저 문서들을 인덱싱하는 기본 설정부터 시작합니다:

import os
from llama_index.indices.managed.llama_cloud import LlamaCloudIndex

# 재무 보고서 인덱스 생성
financial_index = LlamaCloudIndex.from_documents(
    documents=[],  # 빈 문서 리스트로 시작
    name="Financial Reports",
    project_name=project_name,
)

# 재무 보고서 폴더의 모든 PDF 파일 업로드
financial_reports_directory = "./data/financial_reports"
for file_name in os.listdir(financial_reports_directory):
    file_path = os.path.join(financial_reports_directory, file_name)
    financial_index.upload_file(file_path, wait_for_ingestion=False)

financial_index.wait_for_completion()

2단계: 다중 검색 모드 활용

생성된 인덱스에서 다양한 검색 모드를 활용할 수 있습니다:

query = "Microsoft의 본사는 어디에 있나요?"

# 각기 다른 검색 모드로 질의
chunk_nodes = financial_index.as_retriever(
    retrieval_mode="chunk"
).retrieve(query)

metadata_nodes = financial_index.as_retriever(
    retrieval_mode="files_via_metadata"
).retrieve(query)

content_nodes = financial_index.as_retriever(
    retrieval_mode="files_via_content"
).retrieve(query)

# 자동 라우팅 모드 (추천)
auto_nodes = financial_index.as_retriever(
    retrieval_mode="auto_routed"
).retrieve(query)

3단계: 다중 지식베이스 통합

실제 운영 환경에서는 다양한 형태의 문서들을 다뤄야 합니다. 재무 보고서, 프레젠테이션 슬라이드, 회의록 등이 모두 다른 최적화 설정을 필요로 합니다.

# 슬라이드 인덱스 추가 생성
slides_index = LlamaCloudIndex.from_documents(
    documents=[],
    name="Slides",
    project_name=project_name,
)

# PowerPoint 파일들 업로드
slides_directory = "./data/slides"
for file_name in os.listdir(slides_directory):
    file_path = os.path.join(slides_directory, file_name)
    slides_index.upload_file(file_path, wait_for_ingestion=False)

4단계: 복합 검색 시스템 구축

이제 여러 인덱스를 통합하는 복합 검색 시스템을 만들어보겠습니다:

from llama_cloud import CompositeRetrievalMode
from llama_index.indices.managed.llama_cloud import LlamaCloudCompositeRetriever

# 복합 검색기 생성
composite_retriever = LlamaCloudCompositeRetriever(
    name="Knowledge Agent",
    project_name=project_name,
    create_if_not_exists=True,
    mode=CompositeRetrievalMode.ROUTED,  # 지능적 인덱스 선택
    rerank_top_n=5,  # 상위 5개 결과 재순위화
)

# 각 인덱스를 상세한 설명과 함께 추가
composite_retriever.add_index(
    financial_index,
    description="SEC 신고서와 매출 분석을 포함한 상세 재무 보고서",
)

composite_retriever.add_index(
    slides_index,
    description="제품 업데이트와 프로젝트 인사이트를 다루는 팀 회의 슬라이드",
)

# 통합 검색 실행
query = "2024년 Q4 재무 보고서에서 매출 성장에 대해 어떻게 설명하고 있나요?"
nodes = composite_retriever.retrieve(query)

# 검색 결과와 사용된 모드 확인
for node in nodes:
    print(f"검색 출처: {node.metadata['retrieval_mode']} - {node.text}")

완전한 에이전틱 검색 시스템

최종적으로, 모든 레벨에서 에이전트가 작동하는 완전한 시스템을 구축할 수 있습니다:

  1. 상위 레벨: 복합 검색기가 LLM 기반 분류를 사용해 관련 서브 인덱스를 결정
  2. 서브 인덱스 레벨: auto_routed 검색 모드가 쿼리에 가장 적합한 검색 방법을 결정

이 시스템은 사용자의 질문을 이해하고, 적절한 지식 베이스를 선택하며, 최적의 검색 전략을 적용하는 완전 자동화된 지능형 검색 환경을 제공합니다.

에이전틱 리트리벌이 가져올 변화

에이전틱 리트리벌은 단순히 기술적 개선을 넘어서 AI 시스템의 패러다임 자체를 바꾸고 있습니다. 기존의 “인간이 검색 방식을 정하고 AI가 실행하는” 모델에서 “AI가 스스로 최적의 검색 전략을 수립하고 실행하는” 모델로의 전환입니다.

이러한 변화는 특히 엔터프라이즈 환경에서 중요한 의미를 가집니다. 다양한 부서에서 생성되는 서로 다른 형태의 문서들을 하나의 통합된 시스템으로 검색할 수 있게 되며, 사용자는 복잡한 검색 문법을 배울 필요 없이 자연스러운 언어로 원하는 정보를 얻을 수 있습니다.

또한 AI 에이전트가 주도하는 자율적 업무 처리 시스템에서는 정확하고 맥락적인 정보 검색이 필수적입니다. 에이전틱 리트리벌은 이러한 요구사항을 충족하는 핵심 인프라 역할을 하고 있습니다.

앞으로 우리는 더욱 정교하고 지능적인 검색 시스템들을 경험하게 될 것입니다. LlamaCloud와 같은 플랫폼들이 제공하는 에이전틱 리트리벌 서비스를 통해 개발자들은 복잡한 검색 로직을 직접 구현할 필요 없이, 고수준의 지능형 검색 기능을 자신의 애플리케이션에 통합할 수 있습니다.


참고자료:

Comments