티스토리 뷰
작성일: 2026년 01월 19일
카테고리: AI, LLM, RAG
키워드: RAG, Retrieval-Augmented Generation, GraphRAG, Agentic RAG, Knowledge Graph, LLM

요약
LLM은 모르는 것을 그럴듯하게 지어낸다(환각). 이 문제를 해결하기 위해 2020년 RAG가 등장했고, 기본 RAG의 한계를 극복하기 위해 두 가지 방향으로 발전했다: Agentic RAG(반복 검색, 도구 선택)와 GraphRAG(관계 기반 검색). 이 글에서는 RAG 기술의 발전 흐름을 정리하고, "LLM API는 한 번 호출하면 끝인데, 누가 RAG 루프를 돌리는가?"라는 질문에 답한다.
시작점: LLM의 환각 문제
ChatGPT에게 "우리 회사 매출이 얼마야?"라고 물으면 두 가지 중 하나가 벌어진다.
- "죄송합니다, 그 정보를 알 수 없습니다"
- 그럴듯한 숫자를 지어낸다
후자를 환각(Hallucination)이라고 부른다. LLM은 학습 데이터에 없는 정보를 요청받으면, 패턴을 기반으로 "있을 법한" 답을 생성해버린다.
| 한계 | 설명 |
|---|---|
| 학습 데이터 이후 정보 없음 | 2024년 3월 이후 뉴스를 모름 |
| 내부 데이터 접근 불가 | 회사 매출, 고객 정보 등 |
| 실시간 정보 부재 | 현재 주가, 날씨 등 |
| 정확성 보장 불가 | "아마 그럴 것이다"를 확신처럼 말함 |
이 문제를 해결하기 위해 RAG가 등장했다.
2020년: 기본 RAG의 등장
아이디어: 모르면 찾아보자
2020년, Facebook AI Research(현 Meta AI)의 Lewis et al.이 RAG(Retrieval-Augmented Generation) 논문을 발표했다. 아이디어는 단순하다. "모르는 건 찾아보고 답하자."
도서관 사서를 생각해보자. 사서는 모든 책의 내용을 암기하지 않는다. 대신 질문을 받으면:
- 관련 책을 찾아서
- 해당 내용을 읽고
- 질문에 맞게 정리해서 답한다
RAG도 동일하게 작동한다:
[사용자 질문] → [관련 문서 검색] → [검색 결과 + 질문을 LLM에 전달] → [답변 생성]기본 RAG 아키텍처
graph LR
Q[질문] --> E[임베딩]
E --> VS[벡터 검색]
VS --> D[관련 문서]
D --> LLM[LLM]
Q --> LLM
LLM --> A[답변]
style Q stroke:#2563eb,stroke-width:2px
style LLM stroke:#16a34a,stroke-width:2px
style A stroke:#16a34a,stroke-width:2px
핵심 구성 요소:
- 임베딩(Embedding): 텍스트를 숫자 벡터로 변환. "의미가 비슷한 텍스트는 비슷한 벡터를 갖는다"
- 벡터 데이터베이스: 임베딩된 문서들을 저장하고, 유사한 문서를 빠르게 검색
- LLM: 검색된 문서와 질문을 받아 최종 답변 생성
기본 RAG의 한계
기본 RAG를 구현하면 곧바로 여러 문제에 부딪힌다.
1. 검색 품질 문제
- 검색된 문서가 질문과 무관하거나 불충분하면, LLM은 여전히 환각을 일으킨다
- 벡터 검색은 "의미적 유사성"만 찾는다. "프로젝트가 몇 개야?" 같은 정확한 숫자는 못 찾는다
2. 단발성 검색의 한계
- 검색 1회 → 답변 생성으로 끝난다
- 검색 결과가 부족해도 재검색하지 않는다
3. 관계 추론 불가
- "김철수와 같은 팀의 시니어 개발자는?" → 벡터 검색으로는 답할 수 없다
- 엔티티 간의 관계를 이해해야 하는 질문에 취약하다
이 한계들을 극복하기 위해 두 가지 방향의 발전이 이루어졌다.
발전 방향 1: Agentic RAG (2022~)
2022년 Yao et al.의 ReAct 논문이 발표되고, LangChain/LlamaIndex 같은 프레임워크가 등장하면서 에이전트 기반 RAG가 확산되었다.
핵심 질문: 누가 RAG 루프를 돌리는가?
LLM API를 사용해본 사람이라면 이런 의문이 생긴다:
"LLM은 Chat API 한 번 호출하면 끝인데, 원하는 답이 나올 때까지 계속 검색하고 재시도하는 건 누가 하는 거지?"
이 질문에 대한 답이 Agentic RAG의 핵심이다.
LLM은 뇌일 뿐, 손발이 없다
LLM API 호출의 본질:
# LLM은 텍스트 입력 → 텍스트 출력, 그게 전부다
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "검색해줘"}]
)
# response.content = "네, 검색하겠습니다" ← 말만 한다. 실제로 검색하지 않는다.
LLM은 생각만 할 수 있고, 행동은 할 수 없다. 데이터베이스에 접속하거나, 파일을 읽거나, API를 호출하는 것은 LLM의 능력 밖이다.
에이전트 = LLM의 손발
에이전트(Agent)는 LLM에게 "손발"을 달아주는 코드다.
LLM = 뇌 (생각, 판단, 계획)
Agent 코드 = 몸 (실제 행동 실행)에이전트 루프의 구조:
def agent_loop(question):
messages = [{"role": "user", "content": question}]
while True: # ← 이 루프는 Python 코드가 돌린다!
# 1. LLM에게 "다음에 뭘 할지" 물어본다
response = llm.call(messages)
# 2. LLM이 "도구를 써달라"고 요청했는지 확인
if response.tool_calls:
for tool_call in response.tool_calls:
# 3. 코드가 실제로 도구를 실행한다
result = execute_tool(tool_call.name, tool_call.arguments)
messages.append({"role": "tool", "content": result})
else:
# 4. 도구 호출이 없으면 최종 답변
return response.content
핵심 포인트:
while True루프는 Python 코드가 실행한다- LLM은 텍스트로 "search_documents 도구를 사용해달라"고 요청만 한다
- 실제 검색은 코드가 실행한다
- 결과를 다시 LLM에게 전달하면, LLM이 다음 행동을 결정한다
기본 RAG vs Agentic RAG
| 기본 RAG | Agentic RAG |
|---|---|
| 검색 1회 → 답변 | 필요한 만큼 반복 검색 |
| 검색 방법 고정 | LLM이 상황에 맞게 선택 |
| 실패 시 그대로 답변 | 실패 감지 → 재시도 |
| 단순 파이프라인 | 자율적 루프 |
Agentic RAG는 LLM의 판단력과 코드의 실행력을 결합한다.
자세한 구현 방법은 Agentic RAG에서 다룬다.
발전 방향 2: GraphRAG (2024~)
기본 RAG의 또 다른 한계를 해결하기 위해 지식 그래프 기반 RAG가 등장했다. 2024년 4월 Microsoft가 GraphRAG를 발표하고, 7월에 오픈소스로 공개하면서 이 접근법이 본격적으로 주목받았다.
벡터 검색의 한계: 관계를 모른다
벡터 검색은 "의미적 유사성"을 찾는 데 탁월하지만, 관계를 이해하지 못한다.
질문: "김철수 부장과 같은 팀에서 일하는 시니어 개발자는?"
벡터 검색:
- "김철수"와 의미적으로 유사한 문서 검색
- 결과: 김철수가 언급된 문서들... 하지만 관계 추론은 불가능
그래프 검색:
MATCH (p:Person {name: "김철수"})-[:BELONGS_TO]->(t:Team)
<-[:BELONGS_TO]-(colleague:Person)-[:HAS_ROLE]->(r:Role {level: "Senior"})
WHERE r.type = "Developer"
RETURN colleague.name
결과: ["이영희", "박지훈"] ← 정확한 관계 기반 답변
GraphRAG: 지식 그래프 + RAG
GraphRAG는 지식 그래프(Knowledge Graph)를 RAG에 통합한다.
graph TB
Q[질문] --> A[에이전트]
A -->|의미적 검색| V[벡터 DB]
A -->|관계 검색| G[그래프 DB]
A -->|정확한 조회| S[SQL DB]
V --> C[컨텍스트 통합]
G --> C
S --> C
C --> LLM
LLM --> R[답변]
style Q stroke:#2563eb,stroke-width:2px
style A stroke:#ea580c,stroke-width:2px
style LLM stroke:#16a34a,stroke-width:2px
style R stroke:#16a34a,stroke-width:2px
에이전트의 역할:
- 질문 분석: "이 질문에는 어떤 검색이 필요한가?"
- 도구 선택: 벡터/그래프/SQL 중 적합한 도구 선택
- 결과 통합: 여러 소스의 결과를 하나의 컨텍스트로 결합
- 답변 생성: 통합된 컨텍스트로 최종 답변 생성
Microsoft GraphRAG
Microsoft가 개발한 GraphRAG는 전역적 질문에 답할 수 있는 구현체다.
기존 RAG: "이 문서에 뭐라고 써있어?"
GraphRAG: "전체 데이터에서 주요 테마가 뭐야?"
커뮤니티 탐지와 계층적 요약을 통해 대규모 문서 집합에서 전역적 질문에 답한다.
자세한 내용은 Microsoft GraphRAG 구현에서 다룬다.
발전 흐름 정리
[LLM 환각 문제]
↓
[2020년: 기본 RAG]
"모르면 찾아보자"
- 벡터 검색 → 답변 생성
- 한계: 단발성, 관계 추론 불가
↓
┌─────────────────────────────────────┐
│ │
↓ ↓
[방향 1: Agentic RAG] [방향 2: GraphRAG]
(2022~ ReAct, LangChain) (2024~ MS GraphRAG)
"필요하면 여러 번 찾아보자" "관계도 이해하자"
- 에이전트 루프 도입 - 지식 그래프 통합
- LLM = 뇌, 코드 = 손발 - 벡터 + 그래프 하이브리드
- Tool Calling - 엔티티 간 관계 추론
│ │
└─────────────────────────────────────┘
↓
[현재: 하이브리드 RAG 시스템]
- Agentic + GraphRAG 결합
- Neo4j, TypeDB 등 그래프 DB
- 온톨로지 기반 데이터 모델링기술 스택
| 구성 요소 | 선택지 |
|---|---|
| 벡터 DB | Pinecone, Weaviate, Milvus, Neo4j (네이티브 벡터 지원) |
| 그래프 DB | Neo4j, Amazon Neptune, TypeDB |
| 오케스트레이션 | LangChain, LlamaIndex, Haystack |
| 임베딩 모델 | OpenAI Ada, Cohere, HuggingFace 모델 |
| LLM | GPT-4, Claude, Gemini, 오픈소스 모델 |
Neo4j는 벡터 검색과 그래프 쿼리를 하나의 DB에서 제공한다. 별도 벡터 DB 운영이 부담스럽다면 고려할 만하다.
참고 자료
공식 문서
관련 블로그
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
| Essential GraphRAG Part 8: RAG 평가 체계 (0) | 2026.01.19 |
|---|---|
| Essential GraphRAG Part 7: Microsoft GraphRAG 구현 (0) | 2026.01.19 |
| Essential GraphRAG Part 6: LLM으로 지식 그래프 구축 (0) | 2026.01.19 |
| Essential GraphRAG Part 5: Agentic RAG - 스스로 판단하는 검색 시스템 (0) | 2026.01.19 |
| Essential GraphRAG Part 4: Text2Cypher - 자연어를 그래프 쿼리로 (0) | 2026.01.19 |
- Total
- Today
- Yesterday
- AGENTS.md
- react
- PYTHON
- AI agent
- backend
- Claude Opus 4.5
- authorization
- architecture
- Kubernetes
- authentication
- AI
- security
- Ontology
- AI Development
- Developer Tools
- troubleshooting
- knowledge graph
- LLM
- 개발 도구
- claude code
- Development Tools
- Next.js
- Tax Analysis
- api gateway
- frontend
- imprun.dev
- Rag
- SHACL
- Go
- Tailwind CSS
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
