1. Graph RAG란 무엇인가?

AI 개발자라면 "RAG (검색 증강 생성)"는 이제 익숙한 개념일 것입니다. 하지만 단순 RAG가 키워드 중심의 "단어 찾기"라면, Graph RAG는 데이터 사이의 연결 고리를 파악하는 "맥락 이해하기"의 영역입니다.

🔍 기존 RAG vs Graph RAG 비교

구분 기존 RAG (Vector Search) Graph RAG (Knowledge Graph)
비유 도서관 사서: 키워드가 있는 페이지만 찾아줌 탐정의 수사 보드: 인물과 사건을 실로 연결해 관계를 파악함
작동 방식 텍스트 유사도(Similarity) 기반 검색 개체(Entity)와 관계(Relation) 기반 연결
장점 구축이 쉽고 빠름 복잡한 인과관계 파악, 전체 요약에 강력함
단점 "전체적인 주제가 뭐야?" 같은 질문에 약함 구축 비용이 비싸고 인덱싱 시간이 오래 걸림

2. RAG 구축의 양대 산맥: LlamaIndex vs LangChain

Graph RAG를 시작하기 전에 반드시 짚고 넘어가야 할 것이 있습니다. 바로 "무엇으로 만들 것인가?"입니다. 많은 개발자가 LangChain과 LlamaIndex 사이에서 고민하지만, 사실 이 둘은 "RAG 시스템 내에서 담당하는 역할(Role)"이 완전히 다릅니다.🔍 RAG 관점에서의 결정적 차이

구분 LlamaIndex 🦙 LangChain 🦜🔗
RAG에서의 역할 전문 사서 (The Librarian) 총괄 매니저 (The Manager)
핵심 집중 "데이터를 얼마나 잘 찾을 것인가?" "찾은 데이터로 무엇을 할 것인가?"
데이터 처리 텍스트 청킹, 임베딩, 그래프 구조화에 특화됨 기본적인 로더는 제공하나 깊이 있는 최적화는 부족함
Graph RAG PropertyGraphIndex 등 전용 모듈 제공 (구축 쉬움) 그래프 체인을 직접 구성해야 함 (구축 어려움)
추천 상황 고품질의 검색 결과가 최우선일 때 챗봇의 대화 흐름이나 도구 사용이 중요할 때

1️⃣ LlamaIndex: 데이터의 깊이를 파고들 때 (Data-Centric)

  • Graph RAG에서의 강점: 복잡한 텍스트에서 개체(Entity)와 관계(Relation)를 추출하고 저장하는 과정이 자동화되어 있습니다.
  • 예시: 수천 페이지의 의학 논문이나 법률 문서에서 정확한 인과관계를 찾아야 한다면 LlamaIndex가 압도적으로 유리합니다.

2️⃣ LangChain: 서비스의 흐름을 만들 때 (Application-Centric)

  • RAG에서의 강점: 단순히 검색만 하는 게 아니라, 검색 결과가 없으면 구글링을 하거나, 사용자에게 되묻는 식의 유연한 대처가 가능합니다.

💡 결론: 멘탈 케어 앱에는 무엇을 써야 할까? (Hybrid Strategy)

  • LlamaIndex의 역할 (RAG 엔진):
    • 사용자의 1년 치 일기 데이터를 분석하여 "스트레스(원인) → 불면증(결과)"과 같은 지식 그래프를 구축하고, 질문에 대한 정확한 맥락을 찾아냅니다.
  • LangChain의 역할 (서비스 뼈대):
    • LlamaIndex가 찾아낸 원인을 바탕으로, 사용자의 감정 상태에 맞춰 위로의 말을 건네거나 명상 음악 API를 실행하는 워크플로우를 관리합니다.

요약: "데이터를 씹고 뜯고 맛보고 즐기는 건 LlamaIndex에게, 그 데이터를 가지고 손님(사용자)을 접대하는 건 LangChain에게 맡기세요."

  • 성공적인 서비스를 위해서는 두 도구의 장점만 뽑아서 섞어 쓰는(Hybrid) 전략이 가장 효율적입니다.
  • LangChain은 "애플리케이션의 로직"을 연결하는 데 강합니다. 검색된 데이터를 가지고 번역을 하거나, 요약을 하거나, API를 호출하는 등 '행동(Action)'을 제어합니다.
  • LlamaIndex는 "LLM을 위한 데이터 프레임워크"를 표방합니다. 즉, 엉망인 데이터를 LLM이 이해하기 좋게 정리하고(Indexing), 질문에 딱 맞는 정보를 꺼내오는(Retrieval) 기술에 올인한 도구입니다.
  • RAG(검색 증강 생성)는 크게 '검색(Retrieval)'과 '생성/제어(Generation & Flow)' 두 단계로 나뉩니다. 이 두 프레임워크는 각각의 단계에서 강점을 보입니다.
  • 왜 이 두 도구를 비교해야 할까요? Graph RAG의 핵심인 '데이터 구조화'를 누가 더 잘하느냐가 성공의 열쇠이기 때문입니다.

3. 프레임워크 없이 Graph RAG 직접 구현하기 (Custom Implementation)

LlamaIndex 같은 도구 없이, 순수 파이썬과 DB만으로 Graph RAG를 구축하려면 어떻게 해야 할까요? 이 과정을 이해하면 Graph RAG의 본질을 더 잘 알 수 있습니다. 이 방식은 "내 마음대로 커스터마이징"이 가능하지만, 구현 난이도가 높습니다.

🛠️ 구축 4단계 프로세스

1단계: 프롬프트 엔지니어링 (추출기 만들기)

LLM에게 텍스트를 주고 JSON 형태로 관계를 뽑아내도록 강력한 시스템 프롬프트를 짜야 합니다.

Python
 
# System Prompt 예시
system_prompt = """
당신은 데이터 분석가입니다. 아래 텍스트에서 'Entity(개체)'와 'Relation(관계)'를 추출하여 JSON으로 반환하세요.
형식: {"head": "원인/주체", "relation": "관계", "tail": "결과/대상"}
예시: "팀장님이 화를 내서 슬펐다" -> {"head": "팀장님", "relation": "화를 냄", "tail": "나"}, {"head": "팀장님의 화", "relation": "유발함", "tail": "슬픔"}
"""

2단계: 그래프 데이터베이스(Graph DB) 저장

추출된 JSON 데이터를 Neo4jNetworkX 같은 그래프 DB에 저장합니다. 이때 벡터 임베딩도 함께 저장해야 검색 성능이 올라갑니다.

  • 사용 도구: Neo4j Python Driver, NetworkX
  • 작업: 노드(Node) 생성, 엣지(Edge) 연결, 중복 제거(Entity Resolution) 로직 직접 구현.

3단계: 검색 (Retrieval) - Cypher Query 작성

사용자가 질문하면, 이를 DB 언어(Cypher 등)로 변환하거나, 미리 정의된 룰에 따라 그래프를 탐색해야 합니다. 자연어 질문을 쿼리로 바꾸는 과정이 매우 까다롭습니다.

Cypher
 
MATCH (p:Person)-[r:CAUSES]->(s:Symptom)
WHERE p.name = '팀장님'
RETURN s

4단계: 답변 생성 (Synthesis)

그래프 DB에서 찾아온 연결 관계(트리플)를 자연어 문장으로 바꿔서 다시 LLM에게 넘겨줍니다.

  • Context: "팀장님 --(유발)--> 스트레스 --(유발)--> 불면증"
  • LLM에게 전달: "위의 관계를 참고하여 사용자의 불면증 원인을 설명해줘."

⚖️ LlamaIndex 사용 vs 직접 구현 비교

구분 LlamaIndex (PropertyGraphIndex) 직접 구현 (Custom)
구현 난이도 (코드 5~10줄) (전처리, DB연동, 쿼리 작성 필요)
데이터 추출 내장된 추출기 자동 실행 프롬프트 직접 설계 및 파싱 필요
유지 보수 라이브러리 업데이트만 하면 됨 데이터 스키마 변경 시 코드 전체 수정
추천 대상 빠르게 검증하고 싶은 스타트업/개발자 초대형/특수 목적의 그래프 최적화가 필요한 팀

4. LlamaIndex로 저비용 고효율 Graph RAG 구축하기

그렇다면 현실적으로 가장 효율적인 방법은 무엇일까요? LlamaIndex를 활용해 비용은 낮추고 성능은 높이는 전략을 소개합니다.

🧠 실전 시나리오: 멘탈 케어 AI 만들기

사용자의 일기 데이터를 분석해 불면증의 원인을 찾아주는 AI를 만든다고 가정해봅시다.

  • 일반 RAG의 한계
    • 질문: "나 요즘 왜 잠을 못 자지?"
    • 검색: '잠', '불면' 키워드 검색.
    • 결과: "오늘 잠이 안 와서 따뜻한 우유를 마셨다." (현상만 찾고 원인은 못 찾음)
  • Graph RAG의 해결책
    • 그래프 연결: [새 프로젝트] → (유발) → [야근] → (유발) → [팀장님의 압박] → (결과) → [스트레스] → (증상) → [불면증]
    • AI 답변: "최근 시작한 새 프로젝트로 인한 야근과, 그 과정에서 팀장님과의 갈등이 스트레스가 되어 불면증으로 이어진 것 같습니다."
    • 핵심: 떨어져 있는 정보들을 **'연결 고리'**를 통해 찾아냅니다.

💰 저비용 구축 전략 (Cost Optimization)

Graph RAG는 LLM 사용량이 많아 비용이 비쌀 수 있습니다. 이를 해결하는 3가지 전략입니다.

  1. 모델 이원화 전략:
    • 추출(Extraction): 단순 노동인 관계 추출은 저렴한 GPT-4o-mini나 로컬 모델(Ollama, GLiNER) 사용.
    • 답변(Generation): 최종 추론은 똑똑한 GPT-4o 사용.
  2. LlamaIndex 활용: PropertyGraphIndex를 사용하여 복잡한 그래프 구축 과정을 코드 몇 줄로 자동화.
  3. 무료 DB 활용: Neo4j Community Edition (Docker)을 사용하여 저장소 비용 절감.

5. 핵심 코드 (Python + LlamaIndex)

LlamaIndex를 사용하여 벡터 검색과 그래프 검색을 동시에 수행하는 하이브리드 검색 구현 예시입니다.

Python
 
from llama_index.core import PropertyGraphIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI

# 1. 가성비 모델 설정 (추출용 - 비용 절감 핵심!)
cheap_llm = OpenAI(model="gpt-4o-mini")

# 2. 데이터 로딩 (내 일기장 데이터)
documents = SimpleDirectoryReader("./my_diary_data").load_data()

# 3. 그래프 인덱스 생성 (자동으로 관계 추출 및 저장)
# 내부적으로 LLM이 텍스트를 읽고 그래프(노드+엣지)를 생성함
index = PropertyGraphIndex.from_documents(
    documents,
    llm=cheap_llm,
    show_progress=True
)

# 4. 검색 엔진 생성 (질문하기)
query_engine = index.as_query_engine()

# 5. 질문 및 답변 출력
response = query_engine.query("내가 요즘 스트레스 받는 근본적인 원인이 뭐야?")
print(response)

 

6. 마치며

Graph RAG는 AI가 인간처럼 '맥락'을 이해하게 만드는 핵심 기술입니다. 초보자나 1인 개발자라면 LlamaIndex로 빠르게 프로토타입을 만들고, 서비스가 고도화되어 아주 디테일한 튜닝이 필요할 때 직접 구현으로 넘어가는 로드맵을 추천합니다.

특히 멘탈 케어처럼 "감정의 흐름"이나 "사건의 인과관계"가 중요한 서비스라면, Graph RAG는 선택이 아닌 필수입니다.

+ Recent posts