Hands-On RAG for Production · 제9장 지식 그래프 RAG 통합 구축 GraphRAG 인프라 의사결정 결론

Chapter 09 — 도면 A9 / 결선도

지식 강화 RAG Knowledge-Enhanced RAG

벡터 검색은 확률과 유사성을 다루고, 결정론적 사실을 다루지 않는다. 그래서 개념적으로 가까운 텍스트는 잘 찾아내면서도 실체 사이의 관계를 정확히 짚어야 하는 질의에서 무너진다. 지식 그래프는 유사성을 찾는 대신 알려진 사실의 경로를 순회한다.

원서Hands-On RAG for Production
O’Reilly, 2026
저자Ofer Mendelevitch
Forrest Sheng Bao
범위제9장 전문 (원서 pp.279–309)
그림 9-1 ~ 9-3, 표 9-1 · 9-2
구성9개 절 · 코드 예제 8블록
도해 4점 · 결정 체크리스트
Failure 01 · Time-bound 시점에 구속된 사실 “2022년 10월 트위터의 CEO는 누구인가?”

임베딩은 과거와 현재의 정보를 뭉개는 경향이 있다. 검색되는 텍스트에 따라 일론 머스크, 잭 도시, 파라그 아그라왈이 요청된 날짜와 아무 정렬 없이 돌아온다.1

Failure 02 · Intersection 다중 제약의 교차 “와파린과 자몽주스 모두와 상호작용하는 약은?”

조건을 동시에 만족해야 할 때 시맨틱 검색은 보장된 교집합보다 느슨하게 관련된 텍스트를 끌어올린다. 와파린 상호작용 청크나 자몽주스 상호작용 청크는 오지만 둘을 함께 다룬 청크는 아니다.

Failure 03 · Multi-hop 연쇄 추론 “인셉션을 감독한 사람이 감독한 2014년 영화의 주연은?”

벡터 검색은 주제적 유사성을 다루지만 관계의 단계별 연쇄를 따라가지 않는다. 인셉션 관련 청크는 오지만 그 점들을 이어 붙이는 데 실패한다.

순회 — 유사성이 아니라 알려진 사실의 경로를 따라간다 Inception Movie · 2010 Christopher Nolan Person Interstellar Movie · 2014 주연 배우 Person DIRECTED ← DIRECTED → ACTED_IN ← ① 시작 노드를 찾는다 ② 역방향 순회로 감독을 찾는다 ③ 그의 영화 중 2014년만 남긴다 ④ 출연 관계를 따라간다 노드를 순회하면 정밀한 결과를 얻고, 시맨틱 검색이 채우기 어려운 질문에 답할 수 있다
〈멀티홉 순회〉 지식 그래프에 질의하는 일은 유사성을 찾는 일이 아니다. 알려진 사실이나 실체의 경로를 순회하는 일이다.
00서론 · 확률과 사실 사이

유사성으로는
닿을 수 없는 질문

RAG는 정보 검색에 접근하는 방식을 근본적으로 바꿨다. 키워드 일치라는 경직된 세계를 넘어 더 유동적이고 직관적인 시맨틱 검색의 영역으로 옮겨왔다. 이 전환으로 문서가 담은 특정 단어만이 아니라 개념적 의미에 근거해 문서를 찾을 수 있게 되었다.

그런 강점에도, 벡터 검색이나 하이브리드 검색만으로 세운 시스템은 실체 사이의 관계를 더 정밀하게 이해해야 하는 질의에서 힘들어할 수 있다. 이 문제가 생기는 이유는 벡터 검색이 확률과 유사성을 다루고 결정론적 사실을 다루지 않기 때문이다. 앞의 세 유형이 그런 예다.

7장에서 논의한 대로 AI 에이전트가 질의를 하위 질의로 세심히 쪼개고 도구를 반복적으로 써서 이 시나리오들을 온전히 다룰 수 있을지도 모른다. 그럼에도 이 장에서 탐색하려는 것은 이 질문이다. AI 에이전트에 의존하지 않고 RAG의 검색 정확도를 개선할 방법이 있는가.

답은 지식 그래프(KG)다. 이런 유형의 질의를 다루는 데 값진 도구가 되며, KG를 만들고 배포하는 프로덕션 복잡성은 이런 복잡한 질의가 흔하고 고품질 응답의 실패가 사업 결과에 실질적 영향을 줄 때 정당화된다.

01기초 · 노드와 엣지

지식 그래프 개요

지식 그래프는 사실적 지식을 기계가 읽을 수 있는 형태로 부호화한, 상호연결된 실체의 네트워크다.2 KG가 실무에서 어떻게 작동하는지 보이기 위해 IMDb 데이터셋을 쓴다. 영화, TV 시리즈, 비디오 게임과 그것에 관여한 사람들에 관한 구조화된 데이터를 제공하며, 각각 고유한 IMDb ID로 식별된다.

노드 — 엔티티

그래프의 노드는 객체, 사람, 장소, 개념 같은 실세계 실체를 나타낸다. IMDb의 경우 노드에는 Movie, Person, Genre, Character 등이 포함된다. 노드는 흔히 각 노드에 관한 추가 정보를 제공하는 속성을 갖는다. Movie 노드는 개봉 연도 같은 속성을 가질 수 있다.

엣지 — 관계

노드 사이의 연결이며 서로 어떻게 관계되는지 정의한다. IMDb의 경우 ACTED_IN, DIRECTED, HAS_GENRE, BELONGS_TO, APPEARS_IN, MENTIONS 같은 것들이다.

Christopher Nolan Born: 1970 Christian Bale Born: 1974 Cillian Murphy Born: 1976 Leonardo DiCaprio Born: 1974 Oppenheimer Release year: 2023 The Dark Knight Release year: 2008 Inception Release year: 2010 Titanic Release year: 1997 DIRECTED DIRECTED DIRECTED ACTED_IN ACTED_IN ACTED_IN ACTED_IN Person 노드 Movie 노드
〈그림 9-1〉 영화를 위한 지식 그래프의 예. 두 유형의 노드(Person, Movie)와 두 유형의 엣지(ACTED_IN, DIRECTED)가 있다.

KG에 질의하는 일은 벡터 검색처럼 유사성을 찾는 일이 아니다. 알려진 사실이나 실체의 경로를 순회하는 일이다. 앞의 멀티홉 질문에 답하려면 구조화된 질의를 수행한다. Inception 노드를 찾고, DIRECTED 엣지를 거슬러 크리스토퍼 놀런을 찾고, 그에게서 나가는 모든 DIRECTED 엣지를 순회해 다른 영화를 찾고 2014년 것만 남기고, 마지막으로 각 영화 노드에서 ACTED_IN 엣지를 따라 주연 배우를 식별한다.

지식 그래프를 어떻게 검색하는가

그래프 데이터베이스는 데이터를 그래프 구조로 저장하며 데이터 포인트 사이의 관계를 강조하는 특수한 NoSQL 데이터베이스다. 행과 열의 표를 쓰는 전통적 관계형 데이터베이스와 달리 노드와 엣지로 그래프 데이터를 표현하며, 그래프 질의의 효율적 실행을 위해 설계되었다. 대표적인 예로 Neo4j, Amazon Neptune, Kuzu, TigerGraph가 있다. 그래프 데이터베이스와 상호작용해 정보를 얻으려면 Cypher나 SPARQL 같은 그래프 질의 언어를 쓴다.

Cypher

Neo4j를 위해 개발된 Cypher는 그래프 구조 자체를 시각적으로 닮은, 직관적이고 대단히 읽기 좋은 문법으로 알려져 있다. Cypher에서 노드는 소괄호 ()로, 엣지는 대괄호 []로 표현된다. 어떤 사람이 영화를 감독한 패턴을 찾으려면 이렇게 쓴다.

Cypher · 패턴 문법
(p:Person)-[:DIRECTED]->(m:Movie)
Cypher · 「오펜하이머」의 감독을 찾는 완전한 질의
MATCH (p:Person)-[:DIRECTED]->(m:Movie)
WHERE m.title = 'Oppenheimer'
RETURN p.name
결과Christopher Nolan

이 질의는 데이터베이스에 지정된 패턴을 MATCH하고, 영화 제목이 오펜하이머인 곳을 WHERE로 걸러내고, 찾아낸 사람 노드의 name 속성을 RETURN하라고 지시한다.

SPARQL

SPARQL은 지식 그래프의 특수한 유형인 RDF 트리플 스토어의 표준 질의 언어다. 그래프를 구성하는 세 부분 진술인 트리플에 질의하기 위해 선언적 패턴 매칭 문법을 쓴다.

주어 (subject)서술되는 자원the resource being described
서술어 (predicate)속성 또는 관계the property or relationship
목적어 (object)값 또는 관련 자원the value or related resource
SPARQL · 같은 질의를 트리플 패턴으로
SELECT ?personName
WHERE {
  ?movie  :title     "Oppenheimer" .
  ?person :directed  ?movie .
  ?person :name      ?personName .
}

?person, ?movie, ?personName은 변수다. WHERE 절의 각 줄은 데이터베이스가 맞춰야 할 트리플 패턴이다. Cypher만큼 시각적으로 매력적이지는 않지만 SPARQL은 그래프의 연결 데이터에 질의하는 강력한 W3C 표준이며, 필요한 데이터를 정확히 지정하도록 설계되었다. 그래프 이론의 탐색보다는 데이터 전달의 형태와 최적화에 관한 것이다.

실무에서는 둘 다 비슷한 결과를 얻을 수 있고, 그래프 데이터베이스가 무엇을 제공하는지와 무엇에 익숙한지에 정말로 달려 있다. 이 장의 나머지는 Cypher로 예제를 제공하지만 SPARQL로도 손쉽게 할 수 있으며, 어느 하나를 선호한다는 표시는 아니다.

온톨로지와 스키마

지식 그래프의 세계에서 온톨로지스키마라는 용어를 자주 듣게 된다. 둘은 밀접히 관련되지만 시스템 설계에서 서로 다른 목적을 갖는다.

온톨로지 — 실재의 규칙

도메인의 형식적이고 추상적인 모델이며 그래프의 “실재의 규칙”을 정의한다. 크리스토퍼 놀런 같은 구체적 데이터 포인트에는 관심이 없고, 범주와 그 범주들이 상호작용하는 논리적 제약을 정의한다. 영화 도메인에서 온톨로지는 “사람은 영화를 감독할 수 있다”고 규정하지만 “영화는 사람을 감독할 수 없다”고 규정하며, 영화는 개봉 연도를 가져야 한다고 정의한다.

스키마 — 데이터베이스 수준의 구현

그 온톨로지의 데이터베이스 수준 구현이다. 시스템이 데이터를 저장하고 색인하는 방법을 알도록 그래프 데이터베이스에 적용하는 라벨, 관계 유형, 데이터 제약의 구체적 집합이다. 온톨로지가 영화에 개봉 연도가 있다고 말하면, 스키마는 DB의 Movie 노드가 release_year라는 속성을 정수로 저장한다고 정의한다.

RAG에서 둘의 역할이 갈린다

RAG와 함께 쓸 때 온톨로지는 LLM이 데이터의 논리를 이해하도록 돕는다(“감독의 배우를 찾으려면 Movie 노드를 거쳐 순회해야 한다”). 반면 스키마는 LLM에 (흔히 텍스트 서술로) 제공하는 것이며, 그래야 LLM이 그 데이터를 가져올 올바른 Cypher나 SPARQL 코드를 생성할 수 있다.

02통합 · 두 가지 사용 패턴

RAG에서 지식 그래프 쓰기

KG를 RAG에 어떻게 쓸 수 있는지 보이기 위해 영화 세계의 예를 확장해, 상호보완적인 두 데이터 소스로 영화 지식 그래프를 만든다.

IMDb — 검증된 뼈대

비상업용 IMDb 데이터셋이 노드와 관계의 기본 집합, 즉 영화의 검증된 “누가·무엇을·언제”를 제공한다. Movie, Person, Character, Genre 같은 노드를 만들고, 영화의 개봉 연도나 사람의 역할 같은 노드 속성을 붙인다.

MovieSum — 대사와 장면

허깅페이스의 MovieSum 데이터셋에 담긴 영화 각본이 대사와 장면 서술을 제공한다. 이 각본을 텍스트 청크로 쪼개 Chunk 노드를 채운다.

영화 지식 그래프 구축하기

시작하려면 먼저 Neo4j를 설치하고 사용자명과 비밀번호로 계정을 설정한다(다시 말하지만 어떤 그래프 데이터베이스든 괜찮다). 다음 단계는 각본 자체의 처리다. 각 각본에서 먼저 XML 태그를 정리한 뒤 LangChain으로 청크로 쪼갠다.

Python · 각본 정제와 청킹
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=CHUNK_SIZE,
    chunk_overlap=CHUNK_OVERLAP,
    length_function=len,
    is_separator_regex=False,
)

cleaned_script = re.sub(r'<[^>]+>', ' ', script_content)
cleaned_script = re.sub(r'\s+', ' ', cleaned_script).strip()
chunks = text_splitter.split_text(cleaned_script)

이 청크를 Chunk 노드로 그래프에 넣기 전에, 명명 실체 인식(NER)의 한 형태로 각본의 Character 실체를 식별한다. 다행히 영화 각본에는 등장인물 이름이 대문자로 쓰이는 공통 구조가 있어 정규식으로 비교적 쉽게 식별할 수 있다.

Python · 정규식으로 등장인물 이름 추출
# 패턴 1: 등장인물 이름으로 시작하는 줄 (전부 대문자, 콜론이나 줄바꿈이 뒤따른다)
# 예: "JOHN:", "MARY\n"
char_pattern1 = re.findall(
    r'^([A-Z][A-Z\s]{2,20}?)(?::|$)', script_text, re.MULTILINE
)
characters.update(
    [name.strip() for name in char_pattern1 if len(name.strip()) > 2]
)

# 패턴 2: 괄호 안의 등장인물 이름
# 예: "(JOHN enters)", "(MARY speaking)"
char_pattern2 = re.findall(
    r'\(([A-Z][A-Z\s]{2,15}?)(?:\s+[a-z]|\))', script_text
)
characters.update(
    [name.strip() for name in char_pattern2 if len(name.strip()) > 2]
)

이 정규식으로 추출된 이름 일부는 틀리므로, 더 견고하게 만들기 위한 임시 파싱 로직을 추가한다. 유효한 등장인물 이름은 각본에 최소 세 번 나타나야 하고, THE·AND·WITH·HIM처럼 이름으로 오인될 수 있는 흔한 단어를 제거한다.

여기서 드러나는 사실 — KG 구축은 도메인 전문성을 요구한다

이것이 말해 주는 바가 있다. 지식 그래프를 만들고 유지하는 일은 도메인 전문성을 요구하는 어려운 과제다. 예측 가능한 서식과 전부 대문자 이름이라는 명확한 단서를 주는 영화 각본과 달리, 고객 계약서·지원 티켓·시스템 로그 같은 엔터프라이즈 데이터는 흔히 지저분하고 서식이 일관되지 않다. 깨끗하고 구조화된 예시와 실세계 데이터의 모호성 사이의 이 간극을 메우는 일이, KG 구축이 여전히 고비용 사업으로 남아 있는 이유다.

마지막 단계는 그래프의 관계를 만드는 일이다. 여기서는 Chunk 노드를 Movie 노드와 Character 노드에 연결한다. 「골든아이」의 어떤 청크에서 KOLKHAZHNA, MARINA, BOND라는 등장인물이 언급되었다면, 그 청크에 대해 다음 관계를 그래프 구조에 추가할 수 있다.

Cypher · MovieSum에서 나오는 관계
(Chunk)-[:MENTIONS]->(Character)
(Character)-[:APPEARS_IN]->(Movie)
Cypher · IMDb에서 나오는 관계
(Person)-[:DIRECTED]->(Movie)
(Person)-[:ACTED_IN]->(Movie)
(Movie)-[:HAS_GENRE]->(Genre)
(Character)-[:PORTRAYED_BY]->(Person)

이제 필요한 것을 갖췄다. 영화 각본의 청크와 메타데이터를 IMDb의 추가 정보와 관계와 통합한 지식 그래프다.

질의 시점에 지식 그래프를 쓰는 법

KG가 노드와 관계로 채워지면 두 가지 흔한 사용 패턴 가운데 하나로 질의 흐름에 통합할 수 있다. 청크 보강하이브리드 그래프 검색이다.

패턴 1 — 청크 보강

이 접근에서 검색 과정은 사용자 질의에 의미적으로 가장 관련된 텍스트 청크를 찾는 표준 벡터 검색으로 시작한다. 그러나 원시 청크 텍스트는 흔히 “얇은” 참조를 담고 있다. 잘못 표기된 이름이나 “그”라는 대명사처럼, LLM이 사실적 답변을 제공하는 데 필요한 온전한 맥락이 결여된 것들이다.

KG로 이 청크를 동적으로 보강한다. 텍스트에서 발견된 실체에 대해 그래프 조회를 수행하는 방식이다. 다음 질의를 생각해 보자. “‘They call it a Royale with Cheese’라고 말한 배우는 누구이고, 어떤 영화였는가?”

먼저 표준 벡터 검색으로 “Royale with Cheese” 텍스트를 담은 청크를 찾는다. 최상위 일치로 다음 청크가 검색될 수 있다.

벡터 검색이 찾아낸 최상위 청크 (원문 그대로) for this to search you. Searching you is a right that the cops in Amsterdam do n’t have. JULES That did it, man - I’m f#%kin’ goin', that’s all there is to it. VINCENT You’ll dig it the most. But you know what the funniest thing about Europe is? JULES What? VINCENT It’s the little differences. … Also, you know what they call a Quarter Pounder with Cheese in Paris? JULES They do n’t call it a Quarter Pounder with Cheese? VINCENT No, they got the metric system there, they would n’t know what the f#%k a Quarter Pounder is. JULES What’d they call it? VINCENT Royale with Cheese. JULES ( repeating . ) Royale with Cheese. What’d they call a Big Mac? VINCENT Big Mac’s a Big Mac, but they call it Le Big Mac.

벡터 검색은 성공했다. 정확한 대사 줄을 찾아냈다. 그러나 원시 텍스트를 보면 이것으로는 사용자 질문에 답할 수 없다. 영화 이름이 없고, 배우 이름도 없고, 등장인물 이름(Vincent)만 있다.

이 청크가 지저분해 보이는 이유

검색된 위 청크는 등장인물 이름과 텍스트가 섞여 있고 “do n’t”처럼 공백이 끼어든 오타도 있어 지저분해 보인다. 그러나 이것은 MovieSum과 IMDb 데이터셋에서 예제 노트북의 코드로 추출한 정확히 그 청크다.

그래프 보강 단계는 청크 텍스트에서 Character: Vincent 실체를 식별하고, KG로 텍스트에 없는 추가 맥락을 얻는다.

Character: VincentIS_REAL_NAMEVincent Vega
Character: VincentPLAYED_BYActor: John Travolta
Character: VincentAPPEARS_INMovie: Pulp Fiction

원시 청크 텍스트만 LLM에 보내는 대신, 청크와 이 추가 정보를 담은 지식 맥락 패킷을 함께 보낸다. 그러면 LLM이 100% 확실하게 답할 수 있고, 모호한 조각이 데이터가 풍부한 사실로 변한다.

사용자 질의 벡터 DB 얇은 청크 그래프 DB 청크 보강 보강된 청크 생성 LLM 응답 엔티티 조회는 색인된 단순 조회다 — 지연이 사실상 없고 프로덕션에서 대단히 안정적이다
〈그림 9-2〉 청크 보강 워크플로. 벡터 DB에서 검색된 최초 청크가 그래프 DB로 보강된 뒤 생성 LLM 단계로 넘어간다. KG는 여기서 벡터 검색 결과에 주석과 구조와 메타데이터를 더하는 고충실도 맥락 제공자로 기능한다.

패턴 2 — 하이브리드 그래프 검색

이 접근에서는 먼저 LLM에게 사용자의 자연어 질문을 그래프 데이터베이스가 실행할 수 있는 형식적 그래프 질의 언어로 직접 변환하도록 요청한다. 그래프에서 관련 청크를 추출해 벡터 기반 검색이 가져온 청크와 결합하려는 의도다.

이것이 성공하려면 LLM에 먼저 그래프의 스키마를 주어야 한다. 가용한 노드 라벨(Person, Movie, Chunk), 관계 유형(:DIRECTED, :ACTED_IN), 속성의 청사진이다. 이 스키마가 유효한 그래프 질의를 쓰기 위해 필요한 “어휘”와 “문법”을 LLM에 제공한다. 예로 이 질문을 생각해 보자. “골든아이의 모든 등장인물은 누구인가? 그중 누가 본드와 상호작용했는가?”

Cypher · LLM이 스키마로 무장해 생성한 질의
// 1단계: 골든아이의 모든 등장인물을 찾는다
MATCH (m:Movie)
WHERE toLower(m.title) CONTAINS 'goldeneye'
WITH m
MATCH (c:Character)-[:APPEARS_IN]->(m)
WITH m, collect(DISTINCT c.name) AS all_characters, m.title AS movie_title

// 2단계: 본드와 상호작용한 인물을 찾는다 (같은 청크에 함께 언급된 경우)
MATCH (m2:Movie)
WHERE toLower(m2.title) CONTAINS 'goldeneye'
MATCH (ch:Chunk)-[:BELONGS_TO]->(m2)

// 본드를 언급하는 청크를 찾는다 (퍼지 매칭: 'bond')
MATCH (ch)-[:MENTIONS]->(bond_char:Character)
WHERE toLower(bond_char.name) CONTAINS 'bond'

// 같은 청크에 언급된 다른 인물을 찾는다
MATCH (ch)-[:MENTIONS]->(other_char:Character)
WHERE other_char <> bond_char

WITH movie_title, all_characters,
     collect(DISTINCT other_char.name) AS interacted_with_bond,
     collect(DISTINCT ch.text)[0..10] AS chunks
RETURN movie_title, all_characters, interacted_with_bond, chunks

벡터 검색의 청크만 쓰면 정보가 부족해 RAG는 “이 질문에는 답할 수 없다”고 응답한다. 그러나 벡터 검색의 청크와 그래프 DB의 청크를 결합해 생성 LLM에 함께 보내면 훨씬 나은 응답을 얻는다.

결합 후 응답 (일부)**골든아이의 등장인물:** James Bond · Marina · Trevelyan · Savatier · Morley · Kolkhazna · Romaly · Valentin · Elliot Harmsway · Technicians · Guards · Militiamen · Bartender · Gunner · Jordan · Xenia **본드와 상호작용한 인물:** - Marina (여러 장면, 로맨스와 액션 시퀀스 포함) - Trevelyan (직접 대결과 대화) - Savatier (본드와 물리적 격투) - Romaly (본드가 지시를 내린다) - Valentin (바에서의 대화) - Bartender (본드에게 술을 낸다) - Xenia (적대자, 갈등을 통해 상호작용) … **상호작용이 불분명하거나 없는 인물:** - Kolkhazna의 죽은 조수 - Jordan (Xenia에게 살해됨, 주어진 맥락에서 본드와 직접 상호작용 없음)
사용자 질의 번역 LLM text-to-Cypher 그래프 DB 벡터 DB 청크 노드 · 청크 청크 생성 LLM 결합된 맥락 응답 Cypher 질의 그래프의 사실적 정밀함과 시맨틱 검색의 개념적 이해를 결합한다
〈그림 9-3〉 RAG 파이프라인에서의 그래프 질의 생성. 번역 LLM이 자연어를 Cypher로 옮겨 그래프 DB를 실행하고, 그 결과를 벡터 검색의 청크와 합쳐 생성 LLM에 넘긴다.
시맨틱 검색의 개념적 이해와 KG의 사실적 정밀함을 결합하면, 어느 한쪽만으로는 이룰 수 없는 훨씬 넓은 범위의 질문에 더 높은 정확도로 답할 수 있다. LLM과 KG를 결합한 그래프 증강 프레임워크 HippoRAG는 멀티홉 질의응답 벤치마크에서 표준 RAG 기준선 대비 최대 약 20% 높은 정확도를 낸다.

보강과 하이브리드 검색 중에 고르기

둘 다 KG의 힘을 활용하지만 서로 다른 문제를 풀고 서로 다른 운영 비용을 안고 온다.

청크 보강은 “메타데이터 우선” 전략이다. 벡터 검색이 관련 텍스트를 찾는 데 이미 효과적이지만 그 텍스트 자체에 더 넓은 맥락이 없다고 가정한다. 질의는 의미론적이면서(영화의 특정 대사를 묻는 것처럼) 답에는 조각에 없는 외부 사실(배우 이름 같은)이 필요할 때 이상적인 선택이다. 검색된 청크 ID의 색인된 단순 조회이므로 지연이 사실상 없고 프로덕션에서 대단히 안정적이다.

하이브리드 그래프 검색은 반대로 “발견 우선” 전략이다. 사용자 질의가 구조적이거나 관계적이어서 벡터 검색이 놓칠 연결을 순회해야 할 때 뛰어나다(“세 장면 이상에서 본드와 상호작용한 모든 인물을 찾아라”). 그러나 이 힘에는 무시할 수 없는 프로덕션 복잡성이 따른다. LLM이 자연어를 데이터베이스 질의로 번역하는 “text-to-Cypher” 파이프라인을 관리해야 하고, LLM이 유효하지 않은 문법을 환각하는 등의 추가 위험이 생긴다. 안전하게 돌리려면 질의 타임아웃과 재시도 전략을 고려해야 한다.

표 9-1. 프로덕션에서 청크 보강과 하이브리드 그래프 검색의 비교
항목청크 보강하이브리드 그래프 검색
일차 목표특정 텍스트 조각의 맥락화관계와 집계의 발견
적합한 경우사실적 근거 부여(날짜, 이름, ID)멀티홉 추론(누가 누구를 만났는가)
실행 위험낮음 — 색인된 단순 조회높음 — 질의 환각이나 느린 조인
지연최소 — 밀리초 이하 조회가변 — LLM과 질의 복잡성에 따라
구현직관적. 최소 기능 제품에 훌륭하다복잡. “text-to-Cypher” 또는 “text-to-SPARQL” 튜닝이 필요하다
프로덕션에서 마주할 것 — 엔티티 폭발

어떤 패턴을 쓰든 KG의 성공은 데이터 엔지니어링 성숙도에 달려 있다. 프로덕션에서는 엔티티 폭발을 마주하게 된다. 하나의 실체가 여러 노드로 사상되는 현상이다. 추출 파이프라인이 “007”, “James Bond”, “Bond”를 하나의 노드로 병합하지 않고 세 개의 다른 노드로 만들어 버리는 식이다.

고충실도 KG를 만들고 유지하는 일은 상당한 “오프라인” 엔지니어링 노력이며, 질의 정확도 향상의 이득과 저울질해야 한다. 가장 흔하게는 6장의 평가가 이 결정에 훌륭한 입력을 제공한다. 응답 품질을 분석하면 어떤 종류의 질의가 실패하는지, KG가 그것을 성공시킬 수 있는지 볼 수 있다.

막 시작하는 단계라면 청크 보강이 흔히 “가장 값어치 있는” 선택이며, 낮은 위험으로 즉각적인 사실적 근거를 제공한다. 사용 사례가 복잡한 추론과 문서 간 집계로 진화하면 유사성 기반 검색의 한계를 돌파하기 위해 하이브리드 그래프 파이프라인에 대한 투자가 필요해질 수 있다.

임베딩을 어디에 둘 것인가

프로덕션에서 위 패턴을 구현할 때의 또 하나의 중요한 결정은 벡터 임베딩이 어디에 상주할지다. 이 선택은 시스템의 일관성, 지연, 운영 오버헤드에 영향을 준다.

그래프 DB에 함께 저장

현대 그래프 데이터베이스는 네이티브 벡터 인덱스를 지원하므로, 각 청크 노드에 chunk.embedding 속성으로 임베딩을 직접 저장할 수 있다. 이 접근에서 검색 흐름은 하나의 데이터베이스 트랜잭션 안에서 시맨틱 검색과 그래프 순회를 함께 수행할 수 있다. 원자적 일관성과 임베딩의 단일 진실 원천을 제공한다. 다만 이제 벡터 DB의 임베딩 처리에 의존하게 되고, 그것이 복잡한 그래프 순회와 RAM을 두고 경쟁해 아주 큰 데이터셋에서 성능 병목을 낳을 수 있다.

벡터 DB에 분리 저장

표준 RAG 검색 흐름을 유지하고 임베딩은 벡터 DB에 둔다. 청크가 검색되면 시스템이 그 chunk_id로 그래프 DB를 조회해 보강이나 추가 순회를 수행한다. 이 접근은 고성능 검색 파이프라인(벡터 검색, 하이브리드 검색, 재순위 포함)을 그래프 순회와 독립적으로 유지하게 해준다. 다만 이제 벡터 DB와 그래프 DB가 온전히 동기화되도록 보장할 책임이 생긴다. 벡터 스토어에서 검색한 청크가 그래프에는 더 이상 존재하지 않아 애플리케이션 오류를 내는 상황을 피해야 한다.

03구축 · 자동화의 벽

지식 그래프 구축

영화 KG를 만든 일반적 접근은 이렇다. 먼저 그래프 스키마를 설계했다. Person, Movie, Character, Genre, Chunk 노드와 ACTED_IN, PORTRAYED_BY, DIRECTED 같은 관계를 포함하기로 정했다. 그다음 IMDb와 MovieSum 데이터셋의 맞춤 전처리로 그래프 자체를 채웠다.

영화 각본에서는 등장인물 이름이 비교적 쉽게 식별되기에 이 과정의 일부를 자동화할 수 있었다. 그러나 그 단순화에도 “her”나 “his”처럼 이름으로 오인된 단어를 제거하는 수작업이 필요했다. IMDb 데이터셋은 이미 만들어지고 정제되어 있었다. 그 데이터셋의 제작자들이 어려운 일을 전부 해준 것이다.

각본을 다룬 경험은 그럼에도 데이터 추출의 최선의 경우를 대표한다. 내부 기업 데이터로 KG를 만드는 일은 비정형 “다크 데이터”와 일관되지 않은 스키마와 고립된 레거시 시스템의 미궁을 항해하는 일이다. 각본 몇 편 정제하는 것이 고되게 느껴졌다면, 수백만 개의 조각난 PDF와 스프레드시트와 이메일과 사적 데이터에 같은 과정을 수행하는 일을 상상해 보라. 도메인 전문성이 절대적으로 필요하다.

지식 그래프 구축의 자동화

수작업으로 KG를 선별하면 깨끗하고 정확한 결과를 낼 수 있지만, 전문가 주도의 이 접근은 노동 집약적이고 빠르게 심각한 병목이 된다. 실제로 KG 구축은 현대 엔터프라이즈 애플리케이션의 요구를 충족할 만큼 확장되는 일이 드물다. 새롭고 비정형인 정보가 끊임없이 흘러드는 동적 RAG와 에이전틱 시스템에서 특히 그렇다. 대신 텍스트에서 그래프를 만드는 자동화 접근이 점점 흔해지고 있으며, 세 단계를 따른다.

  1. 핵심 “사물”을 찾는다 (엔티티 식별). 텍스트를 훑어 중요한 명사를 찾고 범주화한다. “Apple”을 “조직”으로, “Steve Jobs”를 “사람”으로 식별하는 식이다. 이 사물들이 그래프의 노드가 된다.
  2. 연결을 찾는다 (관계 추출). 문장을 분석해 이 사물들이 어떻게 관계되는지 알아낸다. “Apple was founded by Steve Jobs”라는 문장을 보고 (Apple, FOUNDED_BY, Steve Jobs)로 표현되는 연결을 만든다.
  3. 중복을 정리한다 (엔티티 링킹). 마지막으로 같은 사물의 다른 이름들이 모두 하나의 항목이나 노드를 가리키도록 데이터를 정리한다. “Apple”, “Apple Inc.”, “아이폰을 만드는 회사”가 모두 같은 실체임을 학습한다.

LLM을 쓰면 이 단계들이 극적으로 정돈된다. 과제마다 별도의 구식 전문 NLP 모델을 쓰는 대신, 강력한 LLM 하나가 문서를 읽고 구조화된 실체–관계 트리플 집합을 직접 출력하도록 프롬프트를 받을 수 있다. 엔지니어링 복잡성이 단순해지고, LLM의 방대한 세계 지식과 섬세한 맥락 이해 덕에 결과도 흔히 개선된다.

기대치를 조절해야 한다

그러나 순전히 LLM으로만 하는 트리플 추출은 여전히 잡음이 많고 도메인 의존적이다. 프로덕션 환경에서 LLM 단독 파이프라인은 흔히 그래프를 부트스트랩하는 출발점일 뿐이며, 사업 결과에 요구되는 고충실도를 달성하려면 대다수 팀이 혼합 추출 전략을 구현한다. LLM으로 실체와 관계를 제안하게 하고, 그것을 결정론적 발견법(ID나 날짜의 정규식), 검증을 위한 고전적 NLP 모델, 그리고 결정적 실체에 대한 전문가 품질보증을 위한 인간 개입 인터페이스라는 계층을 통과시키는 방식이다.

엔티티 링킹 — 하나의 사물, 여러 이름

LLM을 써도 핵심 난제가 남는다. 실세계 엔터프라이즈 데이터는 지저분하고 일관되지 않으며, 하나의 실세계 “사물”이 여러 다른 이름이나 식별자로 참조될 수 있다.

금융의 기업 실체

하나의 법인이 뉴스 기사와 규제 제출 서류와 내부 보고서에서 “IBM Inc.”, “International Business Machines Corp.”, “I.B.M.”, 또는 그냥 “IBM”으로 나타날 수 있다.

제약의 약물 성분

하나의 약이 상품명(“Tylenol”), 일반명·활성 성분명(“acetaminophen”), 정식 화학명(“N-acetyl-para-aminophenol”)으로 자주 불린다.

공급망과 이커머스의 제품

“iPhone 15 Pro 256GB” 하나가 벤더나 시스템마다 “Apple iPhone 15 Pro (256)”이나 “IP15PRO-256BLK”로 등재될 수 있다.

엔티티 링킹을 효과적으로 다루려면 명확한 온톨로지를 정의하는 데서 시작해야 한다. 도메인에 존재하는 “사물”(사람·회사·약물 같은 실체의 클래스나 유형)과 그것들이 가질 수 있는 속성과 관계를 정의하는 것이다. 엔티티 링킹의 맥락에서 온톨로지는 “하나의 사물, 여러 이름” 문제를 풀 기본 구조를 제공한다. 회사 실체가 하나의 정규 명칭(“International Business Machines Corp.”)과 별칭 목록(“IBM”, “I.B.M.”)을 갖는다고 정의할 수 있다. 나중에 시스템이 “IBM Inc.”를 만나면 새 노드를 만드는 것이 아니라 그것을 별칭으로 인식해 기존 정규 노드에 연결하는 것이 자기 과제임을 안다.

온톨로지를 목표 구조로 손에 쥐고 나면, 엔티티 링킹 과정은 실체를 능동적으로 맞추고 연결하고 병합하는 일이 된다. 이는 단일 알고리즘이 아니라 다단계 파이프라인이며 보통 두 단계를 포함한다.

1. 정규화
원시 텍스트를 정제하고 표준화한다. “Corp.”와 “Corporation”을 모두 “corp”로 만들고, 모든 텍스트를 소문자로 바꾸는 식이다.
2. 후보 생성
같은 “사물”을 나타내는 실체를 찾을 때, 모든 실체를 다른 모든 실체와 비교하지 않도록 탐색 공간을 좁힌다. 어떤 식으로든 유사한 사람 실체만 비교하는 식이며, 단순 문자열 비교(“Chris”와 “Christopher”에 대한 자로–윙클러 거리)에서 복잡한 맥락적·도메인 특수 유사도 지표까지 쓴다.

전체 과정은 초기 부트스트랩 단계를 포함한다. 기존 데이터 전체에 대규모 작업을 돌려 정규 실체의 최초 집합을 만든다. 그 뒤에는 증분 모드를 쓰는 것이 일반적이다. 새 비정형 데이터가 도착하면 엔티티 링킹 모델이 새 표면형(“Tylenol”)을 그래프의 기존 정규 실체(“acetaminophen”의 Drug 노드)에 맞춘다.

여기에 인간 개입을 더할 수도 있다. 시스템의 일치 신뢰도가 낮으면(“Christian”이 “Christopher”와 같은지 반반이라면) 전문가 검토를 위해 모호성에 표시를 단다. 희소한 인간 노력을 가장 어려운 경우에만 집중시켜, 시스템이 확장하면서도 전문가 피드백으로 정확도를 계속 학습하고 개선하게 한다. 엔티티 링킹(전산학 문헌에서 레코드 연결이라고도 한다)은 대규모와 지저분한 데이터에서 특히 어렵고, LLM의 막대한 힘을 활용해도 텍스트에서 KG를 생성하는 자동화가 어렵다는 사실을 부각시킨다.

표준 온톨로지와 기성 지식 그래프를 활용하기

지식 그래프를 맨땅에서 만드는 일은 위험이 큰 사업이다. 한 추정에 따르면 그런 프로젝트의 50% 이상이 실패한다.3 기술적 이유는 흔히 관련된 복잡성, 특히 엔티티 링킹의 복잡성을 과소평가하는 것이다. 그러나 또 하나의 흔한 이유는 초점을 맞춘 사용 사례 주도 접근을 택하는 대신 도메인의 “모든 것”을 모델링하려는 시도다.

표준 온톨로지는 이 불필요한 함정을 피하게 돕는 출발점을 제공한다. 금융이나 의료 같은 특정 도메인의 핵심 개념과 관계를 정의하는 형식적이고 표준화된 구조를 제공한다. 온톨로지를 충분히 생각해 두면 개발 시간을 절약하는 것만이 아니라 데이터 모델이 올바르고 일관되고 상호운용 가능하도록 보장해, 지나치게 넓고 쓸 수 없는 그래프를 만드는 흔한 함정을 막는다.

FIBO — 금융 산업 업무 온톨로지

EDM 협의회가 개발했으며 Corporation, Security, Loan 같은 금융 개념에 정밀한 어휘를 제공한다. 그 가치는 정확한 실체 해소에 필수적인, 상세하고 표준화된 속성에 있다.

DrugBank — 의료의 기성 그래프

약물과 화학 성분 사이의 관계를 사상하는 포괄적 지식 그래프로 기능한다. 아토르바스타틴이라는 하나의 약 실체가 알려진 단백질 표적(HMG-CoA 환원효소), 그것을 대사하는 효소(CYP3A4), 상호작용하는 다른 약물에 구체적 관계로 연결되어 있다.

온톨로지를 쓰는 일은 지식 그래프의 청사진을 제공하므로 도움이 되지만, 데이터로 채워야 하는 일은 여전히 남는다. Dun & Bradstreet, Refinitiv(현 LSEG), S&P Global 같은 기업은 엔티티 링킹이라는 어려운 일에 수백만 시간을 투자했고, 최근에는 D-U-N-S 번호나 PermID 같은 정규 식별자를 부여해 실체를 고유하게 식별하고 복잡한 기업 위계를 사상하는 선별 데이터 피드로 이 데이터를 라이선스하는 방향으로 움직이고 있다.

이런 데이터를 라이선스하는 일차적 가치는 고품질의, 이미 해소된 핵심 지식 그래프를 제공한다는 점이다. 모든 것을 스스로 해소하는 막대한 노력을 면하게 된다. 과제는 훨씬 작고 다루기 쉬운 문제로 축소된다. 새롭고 지저분한 내부 데이터를 제공자의 확립된 정규 실체에 연결하는 일이다. 그러면 우리 시스템의 “IBM”이나 “I.B.M.”을 “International Business Machines Corp.”의 단일 골든 레코드에 연결할 수 있다. 다만 이런 라이선스 KG에도 단점이 있다. 라이선스 비용에 더해, 이 특정 형태의 KG를 쓰겠다는 약속과 다른 모든 데이터 시스템이 그것에 맞춰야 한다는 점을 고려해야 한다.

04GraphRAG · 커뮤니티와 계층 요약

GraphRAG

용어 정리

어떤 AI 엔지니어는 “GraphRAG”라는 용어를 그래프의 도움을 받는 모든 형태의 RAG를 서술하는 데 쓴다. 그러나 이 장에서는 마이크로소프트 리서치가 도입한 특정 접근을 가리킬 때 GraphRAG라는 용어를 쓴다. “제임스 본드 영화 전체의 주요 주제는 무엇인가?”처럼 데이터셋 전체의 정보를 종합해야 하는 넓고 탐색적인 의미 파악(sensemaking) 질의에 답하도록 설계된 접근이다.

기술적 용어로 이 과정은 질의 초점 요약(QFS, query-focused summarization)이라 알려져 있다. 몇 개의 구체적 조각이나 청크를 검색하는 것이 아니라, 데이터의 전역적 조망에 근거해 포괄적 답변을 생성하는 것이 목표다.

GraphRAG는 LLM으로 원본 문서에서 그래프를 자동 구축한다. 그 그래프로 클러스터(커뮤니티)를 식별하고, 그것을 요약하고, 이 과정을 그래프 최상위까지 반복해 전역적 맥락의 이해를 가능하게 한다.

① 그래프 구축 — 실체와 관계 추출 ② 커뮤니티 검출 커뮤니티 A 커뮤니티 B 커뮤니티 C ③ 계층 요약과 질의 최상위 — 포괄적 주제 중간 요약 중간 요약 세부 세부 세부 의미 파악 질의 관련 커뮤니티 요약 선택 요약별 부분 답변 생성 최종 종합 응답 원문을 검색해 요약하는 통상적 파이프라인과 달리, 커뮤니티 요약에서 출발해 부분 답변을 모아 최종 응답을 만든다 사전 정의된 스키마에 근거하지 않고, 원본 문서가 담은 지식의 구조를 직접 표현한다
〈GraphRAG의 세 단계〉 LLM이 그래프를 자동 구축하고, 커뮤니티 검출 알고리즘이 밀집 연결된 실체의 클러스터를 찾고, 각 커뮤니티에 여러 계층 수준의 요약을 생성한다. 질의 시점에는 원문 대신 그 요약에서 출발한다.
지식 그래프 구축
LLM으로 비정형 텍스트 코퍼스에서 사람·장소·개념 같은 핵심 실체와 그 사이의 관계를 자동 추출하고 지식 그래프를 동적으로 구성한다. 이 그래프는 사전 정의된 스키마에 근거하지 않고, 원본 문서 자체가 담은 지식의 직접적 구조 표현이며, 서로 다른 아이디어와 실체가 텍스트 전반에서 어떻게 상호연결되는지 포착한다.
커뮤니티 검출
GraphRAG의 일차적 혁신은 이 새로 만든 그래프를 어떻게 활용하는가에 있다. 그것을 그냥 통상적인 지식 그래프로 취급하는 대신, 커뮤니티 검출 알고리즘을 적용해 밀집 연결된 실체의 클러스터를 식별한다. 이 “커뮤니티”가 데이터에 담긴 핵심 주제와 의미론적 토픽을 대표하고, GraphRAG는 LLM으로 아주 구체적인 하위 주제부터 넓고 포괄적인 주제까지 여러 계층 수준에서 각 커뮤니티의 요약을 생성한다.
질의
의미 파악 질의에 응답할 때 GraphRAG의 질의 엔진은 통상적 파이프라인처럼 원문을 검색해 LLM으로 요약하지 않는다. 대신 질의에 답하는 가장 관련성 높은 커뮤니티 요약을 찾고, 각 요약에 근거해 LLM으로 부분 답변을 생성한다. 그다음 또 한 번의 LLM 호출이 이 부분 답변들을 모아 최종적인 포괄적 응답을 만든다.

실제로 돌려 보기 — 비용과 시간

마이크로소프트의 graphrag 패키지는 오픈소스다. MovieSum 데이터셋에 적용해 본다. GraphRAG는 색인 시점에 모든 문서를 처리하기 위해 아주 많은 LLM 호출을 하므로 꽤 비싸고 시간이 걸린다. 그래서 비용이 합리적인 수준이 되도록 무작위로 영화 20편을 고른다.

Python · 데이터 로드와 표본 추출
import pandas as pd
import numpy as np
from datasets import load_dataset

moviesum_dataset = load_dataset("rohitsaxena/MovieSum")
moviesum_df = pd.DataFrame(moviesum_dataset['train'])

np.random.seed(42)
SAMPLE_SIZE = 20
indices = np.linspace(0, len(moviesum_df) - 1, SAMPLE_SIZE, dtype=int)
filtered_df = moviesum_df.iloc[indices].copy()
$6.32
영화 20편의 비용

노트북에 담긴 비용 추정 함수가 계산한 값이다.

$560+
MovieSum 전체 1,800편

그리고 이것은 영화 1,800편일 뿐이다. 구글 드라이브나 SharePoint 계정 전체라면 얼마가 들지 상상해 보라.

45분
20편의 색인 시간

괜찮은 M4 맥 노트북에서 영화 20편만으로 약 45분이 걸렸다.

Python · 문서 준비와 색인 구축
from datetime import datetime

input_docs = []
current_date = datetime.now()
for idx, row in filtered_df.iterrows():
    input_docs.append({
        'id': row['imdb_id'],
        'title': row['movie_name'],
        'text': row['script'],
        'creation_date': current_date
    })
input_df = pd.DataFrame(input_docs)

from graphrag.api import build_index
from graphrag.config.load_config import load_config

GRAPHRAG_DIR = Path("./graphrag_workspace")
config = load_config(root_dir=GRAPHRAG_DIR)

results = await build_index(
    config=config,
    input_documents=input_df,
    verbose=True
)

이것은 한참 걸린다. GraphRAG 색인이 단순한 일회 통과 과정이 아니기 때문이다. 시스템은 모든 텍스트 청크마다 수십 번의 순차적 LLM 호출을 해야 한다. 먼저 실체와 주장을 추출하고, 그 실체를 해소하고 병합하고, 마지막으로 여러 계층의 커뮤니티 요약을 생성한다. 이 단계 각각이 연산이 비싸고 LLM의 추론 속도에 의존하므로, 적은 데이터셋에서도 누적 지연이 커진다.

GraphRAG는 출력 폴더에 build_index 과정의 결과를 담은 파케이 파일들을 생성한다. 질의를 돌리려면 먼저 이 데이터셋을 판다스 데이터프레임으로 로드한다.

Python · 산출물 로드
config = load_config(root_dir=GRAPHRAG_DIR)

entities_df      = pd.read_parquet(OUTPUT_DIR / "entities.parquet")
relationships_df = pd.read_parquet(OUTPUT_DIR / "relationships.parquet")
communities_df   = pd.read_parquet(OUTPUT_DIR / "communities.parquet")
reports_df       = pd.read_parquet(OUTPUT_DIR / "community_reports.parquet")
text_units_df    = pd.read_parquet(OUTPUT_DIR / "text_units.parquet")
local_search — 상향식 탐색

탐색적인 “아래에서 위로” 방법이다. 먼저 질의와 가깝게 맞는 몇 개의 씨앗 노드를 그래프에서 식별하고, 그 엣지를 따라 밖으로 “걸어” 가까이 있고 맥락적으로 관련된 노드와 관계(1홉이나 2홉 이웃)를 발견한다. 필요한 맥락이 그래프의 국소적 “이웃” 안에 있을 가능성이 높은, 구체적이고 상세한 질문에 이상적이다.

global_search — 하향식 종합

포괄적인 “위에서 아래로” 전략이다. 씨앗 노드에서 확장하는 데 그치지 않고 그래프 전체를 훑어, 직접 연결되어 있지 않더라도 질의 개념에 의미적으로 관련된 모든 노드와 관계와 전체 하위 커뮤니티를 식별한다. 그래프의 여러, 어쩌면 서로 연결되지 않은 부분의 정보를 종합해야 하는 넓고 고수준인 질의에 더 적합하다.

예로 “모든 영화 각본에 걸친 주요 주제와 서사 패턴은 무엇인가?”라는 질의로 global_search를 돌리면 다음과 같은 결과를 얻는다.

global_search 출력 (요약 발췌)분석된 영화 각본들은 장르와 인물 유형과 배경을 넘나드는, 반복되는 주제와 서사 패턴의 풍부한 태피스트리를 드러낸다. 이 주제들은 흔히 서로 얽혀 인간의 감정과 초자연적 요소와 사회적 역학과 갈등을 탐색하는 복잡한 이야기를 만든다. ## 1. 갈등과 투쟁 - 물리적·군사적 갈등: 코난이 적대 부족과 제국과 맞서는 장면, 블라드가 메흐메드의 군대를 방어하는 장면, 투란 기병의 폭력적 약탈… 생존과 리더십과 반란과 폭력의 대가라는 주제를 강조한다 [Data: Reports (177, 665, 684, …)]. - 개인적·사회적 대립: 전쟁을 넘어 가정 폭력과 법적 분쟁과 사회적 긴장을 포함한 대인 갈등을 탐색한다 [Data: Reports (239, 442, 118, …)]. - 초자연적 전투: 빙의와 심령과 악령과의 싸움… 일상적 가족 생활과 비상한 위협을 뒤섞어 트라우마 속의 정서적 회복력을 부각시킨다 [Data: Reports (878, …)]. ## 2. 가족과 대인 관계 - 부모–자식 유대: 샘과 조나 볼드윈의 부자 관계가 슬픔과 지지와 복잡한 가족 역학이라는 주제를 예시한다 [Data: Reports (1, 44, 468, …)]. … [이하 생략]

주목할 점은 응답이 [Data: Reports (…)] 형태로 어떤 커뮤니티 보고서에 근거했는지 표시한다는 것이다. 전체 응답은 꽤 방대하다.

GraphRAG가 잘못된 도구인 경우

의미 파악 질문에 답하는 힘에도 GraphRAG의 일차적 단점은 앞서 본 대로 선행 전처리의 막대한 비용과 시간이다. 표준 RAG 시스템이 텍스트를 청킹하고 벡터 임베딩을 생성하는 비교적 빠르고 저렴한 과정만 필요한 반면, GraphRAG는 다단계의 연산 집약적 전처리 파이프라인에 들어간다. 강력한 LLM이 먼저 코퍼스 전체를 읽어 실체와 관계를 추출하고, 방대한 지식 그래프를 만들고, 복잡한 커뮤니티 검출 알고리즘을 그 그래프에 돌리고, 마지막으로 다시 LLM으로 식별된 모든 주제의 계층 요약을 생성한다.

빠르게 변하는 코퍼스

뉴스 피드, 지원 티켓, 활발한 코드 저장소처럼 자주 갱신되는 데이터에서는 커뮤니티 요약을 계속 재계산해야 하는 필요가 흔히 재무적으로도 운영적으로도 실행 불가능하다.

지연에 민감하거나 개인화된 질의

여러 커뮤니티 요약을 종합하는 과정은 본질적으로 표준 벡터 조회보다 느리다. 1초 미만 응답이 필요한 애플리케이션이나 특정 사용자의 사적 데이터에 맞춘 질의에는 적합하지 않다.

원문 그대로의 인용이 필요한 경우

GraphRAG는 고수준 추상화에 뛰어나다. 감사나 법적 준수를 위해 문서의 정확한 원문 문장을 LLM이 제공해야 한다면, 커뮤니티 보고서의 요약된 성격은 너무 “손실이 큰” 것일 수 있다.

궁극적으로 질의가 대부분 단순한 사실 검색(“X의 가격은 얼마인가?”)이라면, GraphRAG의 상당한 투자는 표준 시맨틱 검색에 비해 거의 아무 투자수익도 주지 않는다.

05인프라 · 운영의 실체

그래프 데이터베이스 인프라

지식 그래프를 애플리케이션에 통합하는 일은 아키텍처 결정에 그치지 않는다. 장기적인 운영·시스템 수준의 약속이다. 고정밀하고 설명 가능한 답변의 잠재력이 큰 만큼, 그래프 데이터베이스를 만들고 확장하고, 무엇보다 유지하는 복잡성도 크다. 먼저 그래프 데이터베이스를 어떻게 고를지 본다. 이 선택이 운영 지침 전체를 좌우한다.

전통적 서버·클러스터 — Neo4j, TigerGraph
전용 VM이나 쿠버네티스 클러스터에서 상태를 가진 독립 서비스로 돌릴 수 있고, 여러 면에서 전통적 SQL 데이터베이스처럼 작동한다. 여기서 데브옵스 팀이 설치, 설정, 클러스터링, 샤딩, 자원 관리, 네트워크 보안 등 모든 것을 책임진다. 속성 그래프는 흔히 메모리에 묶여 있고 성능은 “뜨거운” 그래프를 RAM에 담는 데 달려 있으므로 사이징이 결정적이다. 엄격한 온프레미스·규제 제약이 있거나, 관리형 서비스가 허용하지 않는 데이터베이스 엔진의 저수준 맞춤화가 필요하면 좋은 선택이다.
관리형 클라우드 서비스 — Neo4j Aura, Amazon Neptune
PaaS 접근에서는 세밀한 통제를 운영 단순성과 맞바꾼다. 클라우드 제공자가 패치와 백업과 고가용성을 처리하고, 부담이 서버 관리에서 비용 관리와 IAM 통합으로 옮겨간다. 멀티테넌트 접근과 고가용성과 자동 백업이 필요하지만 사내 그래프 DB 전문성이나 전담 데브옵스 자원이 없다면 이것을 고른다.
임베디드 라이브러리 — Kuzu, DuckDB
더 최근의 “서버리스” 모델에서 데이터베이스는 애플리케이션 프로세스 안에서 돌아가는 라이브러리다. “데이터베이스”는 디스크의 파일 하나일 뿐이다. 전통적 서버 관리자 역할이 사라지고, 난제는 데이터 생애 주기와 빌드 관리가 된다. 돌아가는 애플리케이션 컨테이너 안의 정적 그래프 파일을 어떻게 갱신하는가. 새 데이터 파일을 만들어 새 컨테이너 이미지에 담고 배포를 롤아웃할 견고한 CI/CD 파이프라인이 필요하다. KG가 비교적 작고(10~20GB 이하) 대체로 읽기 전용이며 CI/CD로 갱신할 수 있다면 훌륭한 선택이다.

일상적 운영의 네 가지 난제

난제 1 — ETL, 가장 과소평가되는 비용

이것은 단연 가장 과소평가되는 비용이다. 낡은 그래프는 쓸모없는 그래프다. 원천 데이터가 끊임없이 변할 수 있고, KG를 최신으로 유지할 신뢰할 만한 ETL 파이프라인을 만들어야 한다. 결정적으로 프로덕션에서 이 파이프라인은 데이터 완전성을 풀어야 한다. 여러 소스에서 그래프를 만드는 일은 연산의 연쇄이므로, 가져오기가 중간에 실패하면 “깨진” 그래프로 끝날 위험이 있다(각본 청크는 들어왔는데 IMDb 메타데이터 동기화가 죽는 경우).

전통적 SQL 데이터베이스가 원자성을 보장하기 위해 트랜잭션에 의존하는 반면, 큰 그래프 “빌드”를 하나의 트랜잭션으로 감싸는 일은 흔히 실행 불가능하다. 데이터베이스를 몇 시간 잠그고 메모리를 소진할 수 있다. 대신 프로덕션 시스템은 멱등성을 위해 설계할 수 있다. 적재 코드가 실패해 재시작하더라도 결과가 처음에 성공한 것과 같아지게 만드는 것이다. Cypher에서는 CREATE 대신 MERGE를 써서 달성한다. 데이터베이스가 실체의 존재를 확인한 뒤 추가한다. 멱등성을 배칭(전체 그래프가 아니라 노드 1,000개마다 커밋)과 결합하면, 프로덕션 엔터프라이즈 데이터의 지저분한 현실에 충분히 견디는 최종적 일관성 모델로 나아가게 된다.

난제 2 — 스키마 경직성과 진화

그래프 데이터베이스는 흔히 “스키마가 없다”고 홍보되지만, RAG 시스템은 유효한 Cypher나 SPARQL을 생성하려면 예측 가능한 구조를 요구한다. SQL과 달리 대부분의 그래프 DB에는 단순한 ALTER TABLE 명령이 없어서, 도메인이 진화하면(새 관계 유형을 추가하거나 실체를 쪼갤 때) 라이브 마이그레이션을 관리해야 한다. 무중단으로 수백만 노드와 엣지를 리팩터링하는 배경 스크립트를 돌리는 일이다. LLM의 질의 생성 로직이 데이터의 현재 상태와 동기화되도록 스키마 버전 관리를 고려할 만하다.

난제 3 — 성능과 슈퍼노드

멀티홉 그래프 순회(“CEO와 같은 도시에 사는 사용자가 리뷰한 것과 같은 제품을 리뷰한 모든 사용자를 찾아라”)는 지연이 가변적일 수 있다. 소요 시간은 질의의 깊이와 그래프의 구조에 달려 있고, “슈퍼노드”에 부딪히는지가 관건이다. 대부분의 그래프가 메모리 집약적이므로 충분한 RAM을 갖춘 하드웨어를 준비하고 수직·수평으로 확장할 수 있게 하는 일이 핵심이다. 이것은 비교적 특수한 기량이다. 팀은 Cypher·SPARQL 질의를 프로파일링하고, 병목을 식별하고, (표준과 벡터 양쪽의) 인덱스를 관리하고, 슈퍼노드 핫스팟을 피하기 위해 그래프의 일부를 재구조화하는 일을 배워야 한다.

난제 4 — 보안·백업·고가용성

상태를 가진 어떤 데이터베이스처럼 그래프 DB도 자동화되고 시험된 백업·복원 절차를 갖춘 견고한 재해 복구 계획을 요구한다. 그러나 그래프 기반 RAG의 보안은 저장 시 암호화를 넘는 복잡성을 더한다. 그래프는 흔히 서로 다른 소스의 데이터를 종합하므로, 인프라가 노드나 관계 수준의 RBAC를 지원해야 할 수 있다. LLM이 Company 노드는 순회할 수 있지만 연결된 Employee 노드의 Salary 속성은 볼 수 없도록 보장하는 식이다.

유지 오버헤드가 그래프 데이터베이스의 지속적이고 흔히 과소평가되는 운영 비용이라는 점을 다시 강조할 만하다. 핵심 난제는 데이터 신선도와 일관성의 보장이다. 원천 데이터가 변하면 그래프도 새 현실을 반영하도록 갱신되어야 한다.

06갱신 · 살아 있는 그래프

그래프 갱신 패턴과 진화

프로덕션에서 원천 데이터는 좀처럼 정적이지 않다. 살아 있는 데이터와 KG를 동기화하려면 “전면 재구축” 접근을 넘어 증분 유지로 나아가야 한다. 보통 두 가지 주요 패턴을 포함한다.

변경 데이터 캡처 (CDC)

원천 데이터가 Postgres 같은 전통적 데이터베이스에 있다면, 데이터베이스의 트랜잭션 로그를 듣고 행이 생성·갱신·삭제될 때마다 이벤트를 내보내는 CDC 도구(Debezium 등)를 쓸 수 있다. 그 이벤트를 KG의 MERGEDELETE 명령으로 사상한다.

이벤트 주도 아키텍처

새 PDF나 채팅 로그 같은 비정형 데이터에는 이벤트 주도 패턴이 선호된다. 새 문서가 저장소(S3 등)에 도착하면 서버리스 함수(AWS Lambda 등)를 촉발해 그 특정 파일에만 LLM 추출 파이프라인을 돌리고, 새 노드와 엣지를 기존 그래프에 덧붙인다.

엔티티 병합과 만료되는 사실

오래 돌아가는 KG의 흔한 예외 사례는 서로 다르다고 여겼던 두 실체가 같은 것으로 발견될 때다(“Twitter”와 “X”). 이를 다루려면 “병합” 로직을 구현해야 한다. 한 노드의 관계를 “살아남는” 노드로 재사상하고 다른 노드를 삭제하는 방식이다.

또 하나의 난제는 사실이 “만료될” 때다. 어떤 사람이 회사를 떠났다면 WORKS_AT 관계를 반드시 삭제할 필요는 없지만(역사적 맥락을 보존하기 위해), status: "inactive" 라벨로 툼스토닝해야 한다. 그러면 RAG 질의도 :WORKS_AT {status: "active"}를 필터하도록 갱신되어야 한다.

살아 있는 KG를 유지하려면 실시간 데이터 변경을 포착하는 자동 적재 파이프라인을 구현하면서, 동시에 정체성 충돌을 해소하고 늙어가는 사실의 유의미성을 관리하는 내부 생애 주기 로직을 적용해야 한다.
07의사결정 · 정확도와 비용

정확도와 비용의 교환

애플리케이션을 만들 때 근본적인 아키텍처 선택을 마주한다. “바닐라” RAG 구성을 유지할지, 지식 그래프 통합에 투자할지다. 이 결정은 바닐라 RAG의 상대적으로 낮은 비용과 단순성 대 잠재적이지만 보장되지는 않은 정확도 향상 사이의 고전적 엔지니어링 교환이다.

바닐라 RAG를 과소평가하지 말아야 한다. 추가 복잡성 없이 이미 요구사항을 충족할 수도 있고, 구현이 비교적 직관적이며 운영이 비용 효율적이다. 범용 질의응답이나 대규모 문서 집합의 요약 같은 많은 애플리케이션에서는 “방향이 맞는” 또는 “의미적으로 관련된” 맥락을 찾는 것만으로 LLM이 고품질 응답을 제공하는 데 충분하다.

GraphRAG나 KG 통합의 다른 접근을 구현하는 일은 사소한 추가가 아니다. 주요한 약속이다. 비용은 재무적인 것만이 아니고 개발과 운영 자원에 무거운 세금이다. 그래프 데이터 모델링에 크게 투자하고, 새 그래프 데이터베이스 인프라를 세우고 유지하고, 진화하는 원천 데이터와 그래프를 최신으로 유지할 복잡한 데이터 파이프라인을 만들고 유지해야 한다. 진실은 이 지속적 유지 부담이 흔히 과소평가되고 심각한 자원 유출이 될 수 있다는 것이다.

결정 체크리스트 — 지식 그래프에 투자할 것인가6 questions
사실적 실패

바닐라나 하이브리드 RAG가 평가에서 일관되게 실패하는 멀티홉·시점 구속·고제약 질의가 반복적으로 있는가.

근거 부여의 필연성

“확률적” 유사성이 너무 위험한, 특정 실체에 대한 100% 결정론적 근거 부여를 사용 사례가 요구하는가(법적 준수나 의약품 용량 등).

가용한 자산

맨땅에서 만드는 일을 피하기 위해 활용할 수 있는 기존 온톨로지 자산이 있는가(DrugBank나 LSEG 같은 라이선스 KG, FIBO 같은 표준 온톨로지).

데이터의 연결성

데이터가 그래프 구조와 자연스럽게 맞는가. 다시 말해 가치가 문서의 내용보다 기업 위계나 공급망 의존 관계처럼 문서 사이의 관계에 있는가.

장기적 소유

그래프 모델링, 스키마 진화, 복잡한 ETL 파이프라인을 장기적으로 소유할 역량이 있는 팀이 있는가.

사업적 투자수익

기대되는 정확도 향상이 위험 감소, 준수 보장, 새 수익 창출 기능의 개방처럼 명확한 사업 성과와 결부되어 있는가.

이 질문 가운데 최소 네 개에 “예”라고 답할 수 없다면, KG의 운영 “세금”이 현재 단계에서 얻을 이득을 넘어설 수 있다.
08결론

결론

이 장에서 KG가 가장 잘 답할 수 있는 유형의 질의에 대해 더 높은 품질의 응답을 얻는다는 목표로, RAG에 지식 그래프를 쓰는 발상을 소개했다. 벡터 검색이나 하이브리드 검색은 개념적 질의의 이해에 뛰어나지만, 시점에 구속된 사실이나 멀티홉 논리나 겹치는 제약을 담은 질문에서는 잘 작동하지 않을 수 있다. 지식 그래프는 반대로 이런 유형의 질문에 뛰어나다.

청크 보강이든 하이브리드 그래프 검색이든 KG를 통합하면 애플리케이션이 더 복잡한 질문에 개선된 정확도로 답할 수 있다. 그러나 이 진전은 무료가 아니다. 데이터 모델링, 엔티티 링킹, 적재 파이프라인, 인프라에 상당한 투자를 요구하며, 검색 정확도와 운영 복잡성·비용 사이의 결정적 교환을 강제한다.

RAG에서 KG를 쓰는 일은 진화하는 분야이며, 그 미래는 이 일을 어렵게 만드는 병목 자체를 자동화하는 데 있다. 고통스러운 수작업 그래프 구축이 실체와 관계를 높은 효율로 추출하는 LLM 주도 파이프라인에 자리를 내주고 있다. 다만 견고한 검증 계층과 인간의 감독으로 고정되어 있다는 조건에서다. 지식 강화 RAG의 미래는 이 병목을 자동화하면서, 사업 요구가 변할 때 스키마와 로직을 진화시킬 수 있는 “살아 있는” 그래프를 유지하는 데 있다.

그 두드러진 예가 마이크로소프트의 GraphRAG다. 거대언어모델로 원본 문서에서 직접 그래프를 구성한다. 그러나 마이크로소프트의 특정 구현은 상당한 비용과 지연을 들여올 수 있고 모든 엔터프라이즈 작업 부하에 적절하지는 않다. 더 넓게 보면, 지식 그래프로 강화된 RAG는 그래프 아키텍처가 애플리케이션의 데이터 모델과 질의 패턴과 프로덕션 제약을 중심으로 설계될 때 대단히 실용적일 수 있다.

실무에서 대다수 팀은 표준 RAG로 시작한다. 그리고 6장의 평가 기법으로 응답 정확도가 불충분한 문제 질의를 식별하고, 그것들에 대해 지식 강화 RAG나 GraphRAG를 시험한다.
표 9-2. 검색 방법 · 그래프 강화 · 에이전틱 오케스트레이션에 걸친 RAG 아키텍처 비교
접근적합한 경우핵심 한계비용과 복잡성
표준 RAG
벡터 검색
범용 질의응답, 유사성 기반 검색, 비정형 텍스트 멀티홉 논리, 시점 구속 사실, 엄격한 제약에서 힘들어할 수 있다 낮음. 만들고 유지하기 단순하다
키워드 하이브리드
벡터 + BM25
의미와 정확한 일치의 균형 시맨틱 검색에서 맞지 않는 특정 SKU나 이름을 놓칠 수 있다 낮음~중간. 벡터와 BM25 사이의 가중치 튜닝이 필요하다
KG 하이브리드 RAG 다중 제약을 가진 정밀한 사실 질의(“전기차도 소유한 CEO를 찾아라”) 여전히 멀티홉 논리와 깊은 관계에서 힘들어한다. 최신 KG를 만들고 유지해야 한다 높음. 상당한 데이터 엔지니어링이 필요하다
마이크로소프트
GraphRAG
넓은 “의미 파악” 질의(“이 1,000개 문서의 주요 주제는?”) 선행 처리 비용이 아주 높다. 실시간 데이터에 부적합하다. 원문 그대로의 세밀함이 없다 아주 높음. 연산이 비싼 적재
에이전틱 RAG 멀티홉 논리와 반복적 조사 과제 지연이 높다. 에이전트가 루프에 갇히거나 도구 경로를 환각할 수 있다 중간~높음. 견고한 오케스트레이션(LangGraph 등)이 필요하다

지식 그래프 연구 공동체는 KG를 RAG와 에이전틱 워크플로에 통합하는 더 낫고 단순하고 비용 효율적인 접근으로 계속 혁신하고 있으며, 이 기술이 시간이 갈수록 더 많은 가치와 더 나은 투자수익을 제공할 것으로 기대한다.

1 필터링된 ANN 같은 최근의 진전된 시맨틱 검색 구현은 예컨대 날짜로 필터링함으로써 이런 문제를 때때로 다룰 수 있다.

2 상호연결된 데이터의 힘을 보이기 위해 Wikidata Query Service를 살펴보기를 권한다. Wikidata는 위키백과의 구조적 골격으로 기능하는 방대한 협업 지식 그래프이며, 수백만 실체를 “노드”로, 그 관계를 “엣지”로 저장한다.

3 이 수치는 지난 수십 년간 지식 그래프 구축에 깊은 경험을 가진 전문가와의 대화에서 나왔다.

참고 자료: IMDb 비상업용 데이터셋, MovieSum(허깅페이스), Neo4j · Amazon Neptune · Kuzu · TigerGraph, FIBO(EDM 협의회), DrugBank, HippoRAG, 마이크로소프트 graphrag, O’Reilly Building Knowledge Graphs.