RAG

기존 RAG의 한계를 그래프로 돌파한다 — Graph RAG 동작 원리 완전 정리

cell-devlog 2026. 3. 24. 13:07
반응형

 

RAG(Retrieval Augmented Generation)를 써보셨다면 이런 답답함을 느끼신 적 있으실 거예요.

"분명히 관련 문서인데, 왜 엉뚱한 답이 나오지?"

이건 기존 RAG의 구조적인 한계 때문입니다. 이번 글에서는 그 한계를 그래프 기반으로 돌파한 Graph RAG의 개념과 동작 원리를 처음부터 끝까지 정리해 드릴게요.


기존 RAG의 문제점

기존 RAG는 문서를 chunk 단위로 잘라서 관련 chunk를 검색한 뒤 LLM에 넘겨주는 방식이에요.

여기서 두 가지 문제가 생깁니다.

첫째, 연결 관계를 놓칩니다. 문서를 잘게 쪼개다 보면 chunk 사이의 맥락과 관계가 끊겨요. "A는 B의 원인이다"라는 정보가 두 chunk에 걸쳐 있으면 그냥 사라지는 거예요.

둘째, context가 LLM 처리 용량을 초과합니다. 관련 chunk를 무작정 다 넣다 보면 LLM이 감당할 수 없는 양이 들어가게 됩니다.


Graph RAG는 뭐가 다른가

Graph RAG는 문서를 단순히 검색하는 게 아니라, 그래프 기반으로 재구성하고 커뮤니티 단위로 요약해서 처리합니다.

아래가 전체 파이프라인이에요.

 

크게 **Indexing Time(왼쪽)**과 **Query Time(오른쪽)**으로 나뉘어요. 왼쪽에서 문서를 그래프로 만들어 두고, 오른쪽에서 질문이 들어오면 커뮤니티 요약 기반으로 답변을 생성하는 구조입니다.


동작 원리 — 6단계

Step 1. 데이터 분할 (Source Documents → Text Chunks)

문서를 텍스트 chunk로 분리합니다. chunk 크기는 600 토큰이 효율성과 정확성의 균형이 가장 좋다고 알려져 있어요.

아래 그래프를 보면 chunk 크기가 작을수록 entity 추출량이 많고, gleaning(반복 추출) 횟수가 늘수록 누락된 entity도 추가로 잡아낸다는 걸 확인할 수 있어요.

 

Step 2. 주요 요소 추출 (Text Chunks → Element Instances)

각 chunk에서 **노드(Node)**와 **엣지(Edge)**를 추출합니다.

  • Node: 문서 속 주요 개체(entity). 예) 질병, 판례, 기술명
  • Edge: 두 개체 간의 관계. 예) "A는 B의 원인이다"

추출은 도메인에 맞춘 프롬프트와 Few-shot learning으로 LLM이 수행해요.

도메인별로 예시를 들면 이렇습니다.

  • 의료: Node = 질병, 증상 / Edge = 질병과 증상의 상관관계
  • 법률: Node = 판례, 논점 / Edge = 판례와 논점의 관계

처음 추출에서 누락된 entity는 gleaning 과정을 반복하면서 추가로 잡아냅니다. gleaning은 "깨알처럼 줏어담다"는 뜻으로, 여기저기 흩어진 단편적인 정보를 쥐어짜듯 모으는 과정이에요.

Step 3. 요소 요약 생성 (Element Instances → Element Summaries)

추출된 노드와 엣지를 요약하는 단계예요. 예를 들어 "재생 가능 에너지" 노드라면 "태양광 기술과 정책적 지원"처럼 도메인 맞춤형 요약 텍스트를 생성합니다.

"AI"와 "Artificial Intelligence"처럼 중복되는 개념은 이 단계에서 하나로 묶어 처리해요.

Step 4. 그래프 생성 및 커뮤니티 구성 (Element Summaries → Graph Communities)

요약된 노드와 엣지를 그래프로 연결하고, Leiden 알고리즘으로 연관성이 강한 노드들을 커뮤니티로 묶습니다.

커뮤니티는 쉽게 말해 엣지 값(연관성)이 높은 노드들의 그룹이에요. 예를 들어 "기후 변화" 커뮤니티 안에는 "재생 가능 에너지", "탄소 배출", "정책 개혁" 노드가 묶이는 식이죠.

 

Leiden 알고리즘이란?


Leiden은 그래프에서 커뮤니티를 자동으로 찾아주는 알고리즘입니다. 노드들이 어떻게 연결되어 있는지 분석해서, 강하게 연결된 그룹을 자동으로 묶어줘요.

작동 방식은 4단계예요.

초기 커뮤니티 설정 — 노드 각각을 독립적인 커뮤니티로 시작

노드 이동 — 노드를 다른 커뮤니티로 이동시켜 모듈러리티(Modularity)를 증가시킴

커뮤니티 병합 — 비슷한 커뮤니티들을 합쳐 더 큰 그룹 형성

반복 — 더 이상 모듈러리티가 증가하지 않을 때까지 반복

Leiden의 특징은 빠르고 정확하다는 거예요. 기존 Louvain 알고리즘을 개선한 버전으로, 커뮤니티 내부가 단절되는 문제를 방지했습니다.

알고리즘 특징

Louvain 빠르지만 잘못된 커뮤니티가 생길 가능성 있음
Leiden 더 정확하고 단절된 커뮤니티 방지

SNS 친구 관계 그래프에 Leiden을 적용하면 이런 식으로 커뮤니티가 나뉩니다.

  • A, B, C → 그룹 1
  • D, E, F → 그룹 2
  • G, H → 그룹 3

강하게 연결된 친구들끼리 자동으로 묶이는 거예요.

 

Step 5. 커뮤니티 요약 생성 (Graph Communities → Community Summaries)

각 커뮤니티를 요약합니다. 두 레벨로 나뉘어요.

  • Leaf 레벨 커뮤니티 (가장 세부적): 노드와 엣지 정보를 중요도 순으로 정렬해서 LLM context로 제공
  • 상위 레벨 커뮤니티: context 용량 초과 시 leaf 커뮤니티 요약을 짧은 텍스트로 압축해서 처리

Step 6. 응답 생성 (Community Summaries → Global Answer)

질문이 들어오면 관련 커뮤니티 요약을 기반으로 중간 응답을 각각 생성하고, LLM이 유용성 기준으로 점수화합니다. 점수 높은 순서대로 결합해서 최종 응답을 만들어요.


실제 예시로 이해하기

질문: "현재 기술 산업의 주요 트렌드는 무엇인가요?"

Step 1. 관련 커뮤니티 선택

Graph RAG는 이 질문과 관련된 커뮤니티를 찾아요.

  • AI 윤리 커뮤니티
  • 데이터 프라이버시 커뮤니티
  • 생성형 AI 응용 커뮤니티

Step 2. 커뮤니티별 중간 응답 생성

각 커뮤니티 요약을 기반으로 LLM이 개별 응답을 만들어요.

  • AI 윤리: "AI의 투명성과 책임 있는 데이터 사용이 중요하게 논의되고 있습니다."
  • 데이터 프라이버시: "데이터 보호 규정이 강화되며, 사용자 개인정보의 안전한 관리를 위한 기술 개발이 활발합니다."
  • 생성형 AI 응용: "생성형 AI는 콘텐츠 생성, 고객 서비스, 제품 디자인 등 다양한 산업에 응용되고 있습니다."

Step 3. 최종 응답 결합

"현재 기술 산업의 주요 트렌드는 AI 윤리, 데이터 프라이버시, 그리고 생성형 AI 응용입니다. AI의 투명성과 책임 있는 데이터 사용이 강조되며, 데이터 보호 규정이 강화되고 있습니다. 또한, 생성형 AI는 다양한 산업에서 응용 가능성을 확장하고 있습니다."

기존 RAG였다면 세 커뮤니티의 맥락을 연결하지 못하고 단편적인 답변이 나왔을 거예요. Graph RAG는 커뮤니티 간 관계를 보존하고 있어서 이렇게 포괄적인 답변이 가능합니다.


기존 RAG vs Graph RAG 한눈에 비교

구분 기존 RAG Graph RAG

데이터 처리 chunk 단순 검색 그래프 기반 재구성
연결 관계 놓침 노드/엣지로 보존
context 관리 초과 가능성 있음 커뮤니티 요약으로 압축
응답 품질 단편적 포괄적, 맥락 유지

마무리

Graph RAG는 단순히 관련 문서를 검색하는 수준을 넘어서, 데이터 간의 관계와 맥락을 보존한 채로 답변을 생성하는 구조입니다. 특히 복잡한 도메인(의료, 법률, 금융)처럼 개체 간 관계가 중요한 분야에서 기존 RAG보다 훨씬 강력한 성능을 보여줘요.

RAG 기반 시스템을 운영 중이시라면 Graph RAG로의 전환을 한 번쯤 검토해 보시길 추천드립니다. 😄


 

반응형