Agentic RAG

2026-04-07

개념

Agentic RAG는 [[RAG]]를 Agent 루프로 감싼 구조다. 검색을 한 번 돌려서 끝내지 않고, LLM이 검색 결과를 평가하고 부족하면 검색어를 바꿔 재시도한다. ReAct(Reason + Act) 패턴이라고도 부른다.

왜 필요한가

기본 RAG는 이렇게 동작한다.

질문 → 검색 → top-3 → LLM → 답변 (끝)

검색 결과가 별로여도 그걸로 답한다. 사람이 자료를 찾을 때는 "이건 아닌데?" 하고 다시 찾아보는데, 기본 RAG는 그걸 못 한다. [[RAG-한계와-보완]]에서 다룬 "검색 실패" 문제가 여기서 대부분 생긴다.

동작 예시

질문: "OAuth에서 토큰 탈취 방지하려면?"

Agent: "OAuth 검색해보자"
→ 검색 → OAuth-OIDC-SAML.md (토큰 발급 흐름만 있음)

Agent: "토큰 보호 관련이 부족한데. BFF도 검색해보자"
→ 재검색 → BFF.md (토큰을 서버에 보관하는 패턴)

Agent: "이제 충분해"
→ OAuth-OIDC-SAML.md + BFF.md로 답변 생성

기존 RAG vs Agentic RAG

기존 RAG Agentic RAG
검색 횟수 1번 필요한 만큼
검색어 사용자 질문 그대로 Agent가 재작성해가며
판단 없음 "충분한가?" 판단
도구 벡터 검색만 벡터, 키워드, 필터, 백링크 등 선택

ReAct 루프

Reasoning + Acting. Agentic RAG의 내부 동작.

질문 받음
  ↓
[Reason] 뭘 검색해야 하나?
  ↓
[Act] 검색 도구 호출
  ↓
[Observe] 결과가 충분한가?
  ├── 부족 → 검색어 바꿔서 다시 [Act]
  └── 충분 → 답변 생성

LLM이 각 단계를 텍스트로 적으면서 진행한다. "이 결과로는 토큰 보호 관련이 부족하다. BFF를 검색해야겠다"처럼.

Tool Use

Agent한테 도구를 줘야 한다. 하나의 검색 도구만 있으면 Agent가 할 일이 적다.

tools = {
    "vector_search": "벡터 유사도로 검색",
    "keyword_search": "키워드로 검색",
    "filter_by_tag": "특정 태그 노트에서만 검색",
    "get_backlinks": "이 노트를 참조하는 다른 노트 찾기",
}

Agent가 질문을 보고 어떤 도구를 쓸지, 몇 번 쓸지 판단한다.

단점

  • LLM 호출이 여러 번 → 느리고 비용 높음
  • Agent가 무한 루프 돌 수 있음 → 최대 반복 횟수 설정 필요
  • 작은 로컬 LLM으로는 도구 선택 판단이 약할 수 있음

Claude Code가 Agentic RAG

Claude Code가 정확히 이 구조다.

사용자 질문 → Glob으로 파일 찾기 → Read로 코드 읽기 → 부족하면 Grep으로 재검색
→ 충분하면 답변 또는 코드 수정

도구(Read, Grep, Bash 등)를 골라가며 반복 검색하는 Agent. Claude Code의 도구가 [[MCP]] 프로토콜로 연결돼 있다.

더 보기

  • [[RAG]] — 기본 RAG 파이프라인
  • [[RAG-한계와-보완]] — 왜 단일 검색이 부족한가
  • [[MCP]] — Agent와 도구를 연결하는 표준 프로토콜
  • [[Karpathy-LLM-Knowledge-Bases]] — Agent가 지식을 쌓아가는 대안 패턴

Backlinks

sunshinemoon · 2026