Skip to main content

GraphRAG: 지식 그래프로 LLM의 검색 성능 강화

이 글은 대규모 데이터셋 전반에 대해 확장 가능한 질의 중심 요약과 전역적 의미 파악을 가능하게 하기 위해 지식 그래프와 계층적 커뮤니티 탐지를 결합한 새로운 접근법인 GraphRAG를 소개합니다. 이 글은 AI 번역본입니다. 오역이 의심되는 부분은 댓글로 알려주세요.
Created on September 12|Last edited on September 12
대규모 언어 모델(LLM) 정보와 상호작용하는 방식을 혁신했지만, 전체 데이터셋 전반에 흩어진 단서들을 연결해야 하는 복잡하고 거시적인 질문 앞에서는 종종 한계를 드러냅니다. 전통적인 검색 증강 생성(RAG) 시스템 개별 정보 조각을 찾아내는 데에는 능하지만, 통찰을 종합하고 큰 그림을 이해하는 데에는 어려움을 겪을 수 있습니다. 이는 데이터를 서로 연결되지 않은 섬처럼 취급하여, 전체에 의미를 부여하는 숨은 관계들을 잇고 드러내지 못하기 때문입니다. 이러한 한계는 방대한 데이터를 진정으로 포괄적으로 이해하는 우리의 능력을 저해해, 단편적인 답변만 남기고 뭔가 빠져 있다는 느낌을 주게 합니다.
이 글에서는 GraphRAG이러한 과제를 해결하기 위해 데이터를 상호 연결된 지식 그래프로 변환하는 방식인 GraphRAG를 살펴보겠습니다. GraphRAG가 LLM이 개별 데이터 포인트를 넘어 전체 맥락을 파악하고 전역적 의미 파악 능력을 한 단계 끌어올려, 가장 복잡한 질의에도 더 풍부하고 통찰력 있는 답변을 제공하도록 어떻게 돕는지 알아봅니다.
마지막에는 직접 따라 해 볼 수 있도록 튜토리얼과 필요한 코드를 제공하겠습니다.
이미 GraphRAG에 익숙하신가요? 아래의 파란색 버튼을 클릭해 코드와 구현을 위한 튜토리얼로 바로 이동하세요.
Jump to the tutorial




목차




GraphRAG란 무엇인가요?

GraphRAG는 방대한 데이터셋을 엔티티와 관계로 이루어진 지식 그래프로 재구성하여, LLM이 일관되고 주제 중심의 답변을 생성할 수 있도록 합니다. 전체 말뭉치 전반의 넓은 맥락을 포착하고 통찰을 통합함으로써, 전통적인 RAG를 능가하며 전역적 의미 파악에 뛰어납니다.
전통적인 RAG(검색 증강 생성)는 대규모 데이터셋에서 정보를 검색하고 종합하는 데에는 효과적이지만, 전체 말뭉치 전반의 통찰을 종합해 넓고 주제적인 질의에 답하는 전역적 의미 파악에는 어려움을 겪습니다. 이는 RAG 시스템이 일반적으로 질의와의 의미적 유사도에 기반해 개별 텍스트 청크를 검색하고, 그들을 서로 분리된 상태로 처리하기 때문입니다. 명시적이고 국지적인 답이 있는 질의에는 이 방식으로도 충분하지만, 데이터셋 전반의 상위 수준 패턴, 주제, 포괄적 관계를 이해해야 하는 질문을 다룰 때에는 이러한 단편적 접근이 한계를 드러냅니다.
GraphRAG는 지식 그래프 기반 접근법을 도입해 데이터셋을 상호 연결된 엔티티와 관계의 네트워크로 재구성함으로써 이러한 과제를 해결합니다. 데이터셋을 분리된 청크로 다루는 대신, GraphRAG는 커뮤니티 감지 알고리즘을 사용해 관련 엔티티를 구조화되고 모듈화된 커뮤니티로 묶습니다. 각 커뮤니티는 독립적으로 요약되므로 대규모 데이터셋을 확장 가능하고 효율적으로 전처리할 수 있습니다. 질의 시에는 관련 커뮤니티를 검색해 그 요약을 종합하여 전체적인 응답을 만들며, 전역적 의미 파악 과제에 특히 적합합니다. 개별 증거가 아니라 데이터셋 전반의 연결성과 주제에 초점을 맞춤으로써, GraphRAG는 복잡한 ���역 질의에 대해 일관되고 포괄적이며 맥락적으로 풍부한 답변을 제공합니다.

핵심 개념 이해하기: RAG와 지식 그래프

GraphRAG를 더 깊이 이해하기 전에, 먼저 그 기반을 짚고 넘어가는 것이 중요합니다. RAG는 대규모 언어 모델(LLM)이 외부 데이터에 근거해 응답하도록 함으로써 정답률을 높이도록 설계되었으며, 이를 통해 사실을 지어내는 현상(“환각”)의 위험을 줄입니다.
검색 증강 생성(RAG)은 LLM의 성능을 외부 데이터와 결합합니다. 벡터 데이터베이스를 사용해 사용자 질의와 가깝게 일치하는 텍스트 청크를 저장하고 검색합니다. 데이터셋의 각 청크는 고차원 벡터로 변환되며, 사용자가 질문을 하면(질의 역시 벡터로 변환됨) RAG는 의미상 가장 가까운 벡터를 가진 청크들을 찾습니다. 이 방식은 질의와 일치하는 정보 조각을 추출하는 데에는 뛰어나지만, 각 조각을 서로 분리된 것으로 취급하여 그 사이의 연결 관계를 놓친다는 한계가 있습니다.
A 지식 그래프반면 지식 그래프는 사람, 장소, 개념 같은 엔티티와 그들 사이의 관계를 네트워크로 구조화합니다. 각 엔티티는 노드이며, 엣지는 노드들이 어떻게 연결되고 서로에 어떤 영향을 미치는지를 나타냅니다. 지식 그래프에서는 단순히 비슷한 텍스트 조각을 찾는 것을 넘어, 서로 다른 부분들이 어떻게 맞물려 돌아가는지를 이해하는 것이 핵심입니다. 예를 들어 A Christmas Carol의 지식 그래프에서는 “Scrooge”나 “Jacob Marley” 같은 노드가 있고, 누가 누구를 경고하거나 이끄는지를 보여주는 엣지로 연결될 수 있습니다. 이러한 상호 연결된 구조는 이야기 속 영향의 연쇄를 따라가는 등 더 복잡한 추론을 가능하게 합니다.
GraphRAG는 이러한 구조화된 관계를 적극적으로 활용합니다. 전통적인 벡터 기반 검색이 질의와 일치하는 청크만 찾는 데 그치는 반면, 그래프 기반 검색은 지식 그래프의 노드와 엣지로 이루어진 네트워크를 활용합니다. 이를 통해 시스템은 다단계 연결을 따라가며 더 깊이 추론하고, 맥락이 풍부한 답변을 제공합니다.
RAG와 지식 그래프를 결합함으로써, GraphRAG는 단순히 관련 정보를 끌어오는 데 그치지 않고 깊이와 일관성을 부여하는 관계까지 활용합니다. 덕분에 GraphRAG 같은 그래프 기반 접근법은 단순한 검색을 넘어 이해가 요구되는 복잡한 질문에 특히 강력합니다.

GraphRAG vs. 기본 RAG: 비교 분석

의미적 유사도만으로 뽑아낸 개별 청크에 의존하는 기본 RAG 방식과 달리, GraphRAG는 더 전체론적인 접근을 취합니다. 데이터셋을 엔티티와 관계로 이루어진 구조적 네트워크로 재배치하고, 이를 기반으로 커뮤니티라 불리는 응집력 있는 집합으로 조직합니다. 각 커뮤니티는 의미 있는 연결로 묶인 관련 정보의 촘촘한 클러스터, 즉 서로 연관된 개념이나 항목들의 집합을 나타냅니다.
예를 들어, 데이터셋에 다양한 디저트 레시피가 포함되어 있다고 가정해 보겠습니다. 전통적인 RAG 시스템이 “인기 있는 디저트의 특징과 조리 방법은 무엇인가요?” 같은 질의를 받으면, 과일 타르트 재료에 대한 짧은 설명, 초콜릿 케이크를 굽는 방법을 설명한 부분, 커스터드를 만드는 단계에 대한 서술처럼 몇 가지 단편적인 조각만 반환할 수 있습니다. 관련성은 있지만, 이런 조각들은 흩어져 있어 하나의 응집력 있는 개요로 묶이지 않습니다.
반면 GraphRAG는 이런 디저트들을 미리 커뮤니티로 조직해 둡니다. 예컨대 케이크 중심의 커뮤니티, 페이스트리 중심의 커뮤니티, 크리미한 디저트 중심의 커뮤니티처럼 묶어둘 수 있습니다. 각 커뮤니티에는 인덱싱 시점에 생성된 자체 요약이 이미 있습니다. 동일한 질문이 들어오면 GraphRAG는 이 요약들을 검색해 하나의 균형 잡힌 답변으로 통합합니다. 사용자가 흩어진 단편에서 정보를 머릿속으로 조합해야 하는 대신, GraphRAG는 여러 범주에 걸친 공통점, 차이점, 조리 방법을 두드러지게 보여주는 통합적 관점을 제시합니다.
여러 커뮤니티에서 얻은 통찰을 통합함으로써 GraphRAG는 기존 RAG의 한계를 극복합니다. 사용자가 해석해야 하는 산발적인 조각을 제시하는 대신, 맥락이 풍부한 통합 응답을 제공하여 거시적인 주제를 이해하고 의미 있는 연결을 도출하기에 이상적입니다.

GraphRAG 프로세스

GraphRAG는 대규모 언어 모델(LLM)과 지식 그래프를 결합하여 대규모 데이터셋을 인덱싱하고 질의할 수 있게 하며, 복잡하고 다면적인 질문에 정교한 답변을 제공합니다. 이 과정은 크게 두 단계로 구성됩니다. 인덱싱(데이터 준비)과 쿼리(사용자 질문에 대한 응답)입니다.

인덱싱: 텍스트를 지식 그래프로 변환하기

인덱싱 과정은 원본 문서를 사람, 사건, 개념 같은 엔티티와 그들 간의 관계를 포착하는 구조적 지식 그래프로 변환합니다. 또한 계층적 요약과 빠르고 풍부한 맥락 기반 검색을 가능하게 하는 벡터 임베딩을 생성합니다.
그래프 인덱스를 생성하는 단계는 다음과 같습니다:

1. 텍스트 청크 분할

대용량 원본 문서는 더 세밀한 처리를 위해 작은 단위의 텍스트 청크로 분할합니다. 각 청크는 문서 경계를 기준으로 구성하여 맥락을 보존하면서도 처리에 적합한 크기로 최적화합니다.

2. 엔티티 및 관계 추출

각 텍스트 청크는 LLM을 사용해 엔티티(예: 사람 이름, 장소, 개념)와 그들 사이의 관계(엔티티 간 연결)를 추출하도록 처리합니다. 예를 들어, A Christmas Carol에서는 엔티티로 “Scrooge”와 “Jacob Marley”가 있을 수 있고, 관계로는 “경고하다”나 “이끌다” 등이 포함될 수 있습니다.

3. 그래프 요약

엔티티와 관계를 추출한 뒤에는 그 설명을 간결하고 통합된 요약으로 정리합니다. LLM은 동일한 엔티티에 대한 여러 언급을 하나의 일관된 설명으로 병합하여 중복을 줄이고 간결한 그래프를 구성합니다.

4. 커뮤니티를 활용한 그래프 확장

Leiden 커뮤니티 탐지 알고리즘을 사용해 모듈러리티라는 척도를 최적화함으로써, 그래프의 노드들을 커뮤니티 내부 연결과 커뮤니티 간 연결을 비교해 얼마나 잘 묶였는지 평가하고, 밀접하게 연결된 커뮤니티로 효율적으로 그룹화합니다. 이 과정에서 그래프는 엔티티와 관계가 긴밀히 연결된 커뮤니티들로 계층적으로 클러스터링됩니다. 각 커뮤니티는 서로 관련된 정보를 모듈형으로 묶은 그룹을 의미합니다.
이 계층적 구조를 통해 그래프는 상위 수준의 개요와 세부 하위 주제를 모두 표현할 수 있으며, 서로 다른 세분화 수준에서 데이터셋을 확장 가능하고 체계적으로 분석할 수 있습니다.
💡

5. 커뮤니티 요약 및 임베딩

효율적인 질의 처리와 검색을 위해 각 커뮤니티는 LLM을 사용해 요약되며, 핵심 엔티티, 관계, 그리고 주제를 포착합니다. 이렇게 만든 요약은 추가로 다음과 같이 변환됩니다. 벡터 임베딩이는 서로 다른 세분화 수준에서 정보를 간결하게 표현한 임베딩으로 활용됩니다.
커뮤니티 임베딩: 전체 커뮤니티의 의미적 내용을 표현하여, 서로 관련된 정보 집합을 효율적으로 검색할 수 있게 합니다.
그래프 노드 임베딩: 그래프 내에서 개별 엔티티와 그들의 관계가 지닌 구조와 문맥을 포착합니다.
이 다층 임베딩 전략은 상위 수준 개요와 세부 통찰 사이의 간극을 메워, 복잡한 질의를 효과적으로 처리하는 시스템의 능력을 강화합니다.

쿼리: GraphRAG의 검색 모드

GraphRAG는 쿼리 목적에 맞게 설계된 Global, Local, DRIFT 세 가지 검색 모드를 제공합니다. Global Search는 전체 데이터셋을 종합적으로 통합하고, Local Search는 개별 엔티티에 초점을 맞춰 세부적으로 탐색합니다. DRIFT Search는 더 넓은 커뮤니티 맥락을 결합해 로컬 인사이트를 보강합니다.
이들 모드는 상호 보완적으로 작동하여, 상위 수준의 주제 탐색부터 특정 세부를 정확히 짚어내는 질의까지 폭넓은 유형을 포괄합니다. 기반이 되는 지식 그래프 구조를 활용함으로써, GraphRAG는 전체 개요가 필요할 때든 단일 요소의 연결 관계를 면밀히 들여다볼 때든 각 모드가 적절한 세분화 수준의 정보에 접근하도록 보장합니다.

Global Search

Global Search는 전체 데이터셋에 대한 전반적 이해가 필요한 질문에 답하기 위해, 사전에 생성된 모든 커뮤니티 보고서를 검색·처리합니다. 여러 주제를 가로지르는 거시적 질문에 특히 강하며, 최종 응답이 광범한 패턴과 공통된 주제를 충실히 반영하도록 보장합니다.
프로세스는 커뮤니티 요약을 더 작은 토큰 단위의 청크로 분할하는 것으로 시작하며, 관련 정보가 누락되지 않도록 합니다. 이렇게 분할된 청크는 병렬로 처리되고, LLM이 각 청크에 대해 중간 답변을 생성합니다. 각 응답은 0부터 100까지의 유용성 점수로 평가되어, 관련 없거나 점수가 낮은 답변은 걸러집니다.
가장 높은 점수를 받은 응답들은 최종 컨텍스트로 결합되며, LLM은 요약 단계를 통해 전역적인 답변을 생성합니다. 이 방식은 최종 응답이 전체 데이터셋을 반영하도록 보장하여, 여러 커뮤니티에 걸친 일관된 관점을 제공합니다. 말하자면, 전체를 관통하는 주제를 파악하거나 코퍼스 전반의 광범위한 개념을 요약하는 질문은 모든 커뮤니티의 인사이트를 통합하는 이 방법에 의존합니다.
이 코퍼스의 모든 이야기에서 드러나는 포괄적인 주제는 무엇인가요? 같은 질문에 가장 적합한 기본 모드입니다.
반면 Local Search는 지식 그래프 내의 특정 엔티티와 그들의 직접적인 연결 관계에 집중합니다. 그래프에서 관련 노드, 관계, 그리고 주장(클레임)을 조회함으로써, Local Search는 정밀한 세부 정보에 기반한 질의에 답할 수 있도록 합니다.
Local Search는 이렇게 수집한 로컬 정보를 해당 원문 텍스트 청크와 결합하여, 답변이 구체적이면서도 문맥에 단단히 기반하도록 보장합니다. 예를 들어, 카모마일의 치유 효능을 묻는 질문이라면, Local Search는 엔티티 “카모마일”과 그에 연결된 관계나 주장(클레임)을 추출해, 질의를 직접적으로 겨냥한 답변을 제공합니다.
DRIFT Search는 인접한 커뮤니티를 포함하여 Local Search를 확장합니다. 단일 노드만 살피는 대신 이웃한 문맥을 함께 참조해, 서로 연관된 엔티티들이 어떻게 영향을 주고받으며 형태를 만들어 가는지 보여 주는 더 풍부한 서사를 구성합니다.
이 접근 방식은 주변 그래프 구조에 담긴 관계와 요약을 폭넓게 활용해 응답의 풍부함을 크게 높입니다. 예를 들어, 유령들이 스크루지의 변화에 어떤 영향을 주는지를 이해하려면 특정 한 유령만 볼 것이 아니라 전체 “유령” 커뮤니티에서 통찰을 끌어와야 합니다. 로컬 수준의 정밀함과 커뮤니티 수준의 이해를 결합함으로써, DRIFT Search는 응답이 구체적이고 상호 연결되어 있으며 포괄적이도록 보장합니다.

프롬프트 튜닝

프롬프트 튜닝 는 선택 사항이지만 강력한 기능으로, 생성된 지식 그래프의 품질을 높이고 질의 성능을 개선하는 데 기여합니다. LLM을 활용해 도메인 특화 인컨텍스트 예시를 생성하면, 엔티티와 관계, 커뮤니티 요약의 추출을 보다 관련성 높고 정확하게 수행할 수 있습니다.
GraphRAG는 입력 데이터셋에 맞춘 프롬프트를 자동으로 생성하는 오토 튜닝 기능을 제공합니다. 이 과정은 데이터를 분석해 더 작은 텍스트 청크로 분할하고, 랜덤 샘플링이나 의미적 유사도 같은 방법으로 대표 샘플을 선택합니다. 이렇게 고른 샘플을 활용해 인덱싱 과정에서 LLM을 더 정확히 안내할 수 있는 정교한 프롬프트를 생성합니다. 프롬프트를 데이터셋의 도메인과 정렬함으로써, 오토 튜닝은 그래프의 정밀도와 질의 응답 시 시스템의 전반적 성능을 모두 향상시킬 수 있습니다.
정확도를 보장하기 위해 사용자는 생성된 예시를 시스템에 반영하기 전에 검토하고 검증할 수 있습니다. 검증된 프롬프트는 특히 전문적이거나 미묘한 데이터에서 일관성과 관련성을 유지하는 데 도움이 됩니다. 이 튜닝 옵션을 통해 GraphRAG는 복잡한 수동 설정 없이도 고유한 사용 사례에 맞게 적응할 수 있으며, 시스템 출력 품질을 확장 가능하게 향상시키는 방법을 제공합니다.
GraphRAG는 기본 프롬프트만으로도 즉시 사용할 수 있지만, 오토 튜닝을 추가하면 추출 품질을 최적화하고 더 깔끔한 그래프를 생성하며, 특히 전문 용어나 개념이 많은 데이터셋에서 질의 응답 품질을 개선할 수 있습니다. 이 튜토리얼에서는 GraphRAG에서 제공하는 기본 프롬프트를 사용하겠습니다.

튜토리얼: Weave 로깅을 사용한 GraphRAG 구현

이 튜토리얼은 대규모 언어 모델과 지식 그래프를 활용해 데이터셋을 인덱싱하고 질의하는 시스템인 GraphRAG 설정 과정을 안내합니다. 시스템을 초기화하고, 예시 데이터셋인 A Christmas Carol을 인덱싱한 뒤, 로컬 검색과 글로벌 검색을 모두 실행해 보겠습니다.
모니터링하고 OpenAI 호출과 파이프라인 실행을 시각화하기우리는 통합할 것입니다 Weave 원격 측정과 로깅을 위해서입니다. 마지막에는 광범위한 질의부터 구체적인 질의까지 처리할 수 있는 작동 가능한 GraphRAG 파이프라인을 갖추게 됩니다.

1단계: 환경 설정, 데이터 준비, 프로젝트 초기화

먼저 GraphRAG 라이브러리와 Weave를 포함한 필요한 의존성을 설치하세요:
pip install graphrag weave
다음으로 작업 공간을 설정하고 데이터를 준비합니다. 예시 데이터셋으로 A Christmas Carol을 사용해 보겠습니다.
mkdir -p ./ragtest/input curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./ragtest/input/book.txt
이제 GraphRAG 작업 공간을 초기화하세요. 이 과정에서 시스템에 필요한 구성 파일이 생성됩니다. 프로젝트를 초기화하려면 다음 명령을 실행하세요:
graphrag init --root ./ragtest
이 시점에서 두 가지 핵심 파일이 준비됩니다:
.env: OpenAI API 키를 포함한 환경 변수를 담고 있습니다. 여기에 자신의 키로 업데이트하세요: GRAPHRAG_API_KEY=<YOUR_OPENAI_API_KEY>.
settings.yaml: 인덱싱 파이프라인을 위한 구성 설정을 포함하며, 필요에 따라 사용자 지정할 수 있습니다.
이 튜토리얼에서는 다음을 사용하기로 선택했습니다 gpt-4o-mini LLM과 함께 text-embedding-3-small OpenAI의 embeddings 모델을 사용했지만, GraphRAG는 매우 다양한 모델을 지원하므로 공식 문서를 확인해 자신의 모델이 지원되는지 살펴보시길 권장합니다. 아래는 제 settings.yaml 파일의 일부입니다:
llm:
api_key: ${GRAPHRAG_API_KEY} # set this in the generated .env file
type: openai_chat # or azure_openai_chat
model: gpt-4o-mini
model_supports_json: true # recommended if this is available for your model.
parallelization:
stagger: 1.0
num_threads: 1

async_mode: threaded # or asyncio

embeddings:
async_mode: threaded # or asyncio
vector_store:
type: lancedb
db_uri: 'output/lancedb'
container_name: default
overwrite: true
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_embedding # or azure_openai_embedding
model: text-embedding-3-small


2단계: 데이터셋 인덱싱

이 단계에서는 앞서 다운로드한 책에 대해 인덱싱 파이프라인을 실행하여 지식 그래프를 구축합니다. 인덱싱 과정은 텍스트를 더 작은 청크로 분할하고, LLM을 사용해 엔터티와 그 관계를 추출한 뒤, 이를 계층적 커뮤니티로 클러스터링합니다.
각 커뮤니티에 대한 요약이 생성되며, 인덱싱 과정을 시각화할 수 있도록 OpenAI 호출을 로깅하기 위해 Weave가 통합됩니다. Weave는 OpenAI와의 네이티브 통합을 제공하므로, 여러분은 다음만 하면 됩니다 import weave 그리고 호출하세요 weave.init("your_project_name") 스크립트 내부에서 모든 OpenAI 호출을 Weave에 로깅합니다.
인덱싱을 시작하려면 다음을 확인하세요 settings.yaml 그리고 환경 변수 설정이 올바른지 확인하세요. 인덱싱 스크립트는 텍스트를 처리하고 의미 있는 구성 요소를 추출한 뒤, 지정된 디렉터리에 결과를 출력합니다. 오류가 발생하면 Weave가 문제를 로깅하여, 트러블슈팅을 위한 투명성과 추적 가능성을 제공합니다. 프로세스가 끝나면 지식 그래프와 커뮤니티 요약이 출력 폴더에 저장되어, 바로 쿼리할 수 있습니다.
인덱싱을 위한 코드는 아래와 같습니다(이 스크립트를 이전에 만든 내부에 추가하면 됩니다). ragtest 디렉터리):
from pathlib import Path
from graphrag.logger.types import LoggerType
from graphrag.cli.index import index_cli
import weave

# Initialize Weave for logging/telemetry
weave.init("graph_rag_index_pipeline")

def main():
# Hardcoded parameters
root_dir = Path("./")
config_path = Path("./settings.yaml")
verbose = True
memprofile = False
resume = None # Resume an existing run; set to None for fresh runs
logger = LoggerType.RICH # Logger type, e.g., RICH or SIMPLE
dry_run = False # If True, pipeline will validate but not execute
cache = True # Enable or disable LLM cache
skip_validation = False # Skip validation steps
output_dir = Path("./output") # Output directory for indexing results

print("Starting the indexing pipeline with Weave telemetry...")
try:
index_cli(
root_dir=root_dir,
config_filepath=config_path,
verbose=verbose,
resume=resume,
memprofile=memprofile,
cache=cache,
logger=logger,
dry_run=dry_run,
skip_validation=skip_validation,
output_dir=output_dir,
)
print("Indexing pipeline completed successfully.")
except Exception as e:
print(f"Error during indexing: {e}")
weave.log("index_pipeline_error", {"error": str(e)})

if __name__ == "__main__":
main()

인덱스 스크립트를 실행하고 나면 “output” 그리고 “cache” 디렉터리로, 각각 벡터 데이터베이스와 OpenAI 호출 로그를 포함합니다.
참고로 OpenAI API의 rate limiting 문제를 몇 가지 겪었는데, 이 문제는 다음을 조정하여 해결할 수 있습니다 settings.yaml 를 늘리기 위해 stagger 값을 줄이고 num_threads 의 파라미터 parallelization 의 섹션 settings.yaml 파일에서 OpenAI 호출 빈도를 낮추도록 설정하면 호출 속도가 줄어듭니다.
Weave 트레이스 대시보드는 각 호출의 완료 상태를 명확하게 보여주기 때문에, Weave 덕분에 이 문제를 빠르게 알아차릴 수 있었습니다.
문제를 인지하게 만든 Weave 대시보드의 스크린샷입니다:

Weave는 GraphRAG 같은 프레임워크에 최적의 도구입니다. GraphRAG의 핵심은 LLM을 사용해 그래프를 구성하는 작업에 있고, 이는 수백 건의 API 호출에 의존하며, 각 응답의 품질이 시스템 전체의 품질을 좌우합니다. 각 호출을 빠르고 쉽게 시각화할 수 있으면 그래프의 무결성을 확인하고, 어떤 프롬프트가 가장 좋은 그래프를 만들어 내는지에 대해 근거 있는 결정을 내릴 수 있습니다!

3단계: 글로벌 검색 쿼리 실행

데이터셋을 인덱싱한 뒤에는, 전체 데이터셋 전반의 통찰이 필요한 광범위하고 총체적인 질문에 답하기 위해 Global Search를 수행할 수 있습니다. Global Search는 미리 생성된 커뮤니티 요약을 맵-리듀스 방식으로 활용하며, 각 요약이 최종적인 종합 답변에 기여합니다.
Global Search 코드 예시는 다음과 같습니다:
from pathlib import Path
from graphrag.cli.query import run_global_search
import weave; weave.init("graph_rag_global_search")

def main():
# Hardcoded parameters
root_dir = Path("./")
data_dir = Path("./output")
config_path = Path("./settings.yaml")
query = "What is the role of Scrooge in the narrative?"
community_level = 2
dynamic_community_selection = False
response_type = "Multiple Paragraphs"
streaming = False

print(f"Running global search with query: '{query}'...")
try:
run_global_search(
config_filepath=config_path, # Adjust if needed to include configs
data_dir=data_dir,
root_dir=root_dir,
community_level=community_level,
dynamic_community_selection=dynamic_community_selection,
response_type=response_type,
streaming=streaming,
query=query,
)
print("Query completed successfully.")
except Exception as e:
print(f"Error while running global search: {e}")

if __name__ == "__main__":
main()
쿼리 스크립트는 글로벌 검색을 시작해 여러 커뮤니티에 걸친 요약을 가져옵니다. 그런 다음 각 요약의 관련성을 평가하고, 가장 유용한 응답을 결합해 상세한 글로벌 답변으로 종합합니다.
Weave를 사용하면 LLM 호출을 추적하고 시스템이 그래프 데이터와 상호작용하는 과정을 관찰할 수 있어, 쿼리 로직의 투명성과 검증 가능성을 보장할 수 있습니다.
또한 Weave를 임포트하고 호출함으로써 OpenAI 모델에 대한 호출을 로깅하는 데도 Weave를 사용했습니다. weave.init()스크립트를 실행한 뒤에는 Weave 내부에서 일련의 LLM 호출을 확인할 수 있습니다:


4단계: 로컬 검색 쿼리 실행

보다 구체적인 질의의 경우, 로컬 검색은 지식 그래프 내에서 특정 엔티티와 그들의 인접 관계에 초점을 맞춥니다. 이 방식은 관련 노드, 엣지, 그리고 연관된 원문 텍스트를 검색해 결합하고, 질의에 맞춘 정밀한 답변을 생성합니다.
from pathlib import Path
from graphrag.cli.query import run_local_search
import weave


weave.init("graph_rag_local_search")

def main():
# Hardcoded parameters
root_dir = Path("./")
data_dir = Path("./output")
config_path = Path("./settings.yaml")
query = "How does Scrooge's reaction to the Ghost of Christmas Yet to Come illustrate his fear of the future?"
community_level = 2
response_type = "Multiple Paragraphs"
streaming = False

print(f"Running local search with query: '{query}'...")
try:
run_local_search(
config_filepath=config_path,
data_dir=data_dir,
root_dir=root_dir,
community_level=community_level,
response_type=response_type,
streaming=streaming,
query=query,
)
print("Query completed successfully.")
except Exception as e:
print(f"Error while running local search: {e}")

if __name__ == "__main__":
main()

로컬 검색 스크립트는 “Scrooge”와 같은 특정 엔티티를 질의하여 프로세스를 시작하고, 그와 밀접하게 관련된 모든 정보를 검색합니다.
Weave는 OpenAI와의 상호작용을 로깅해, 접근된 엔티티와 쿼리 실행 과정을 시각화하는 데 도움을 줍니다. 로컬 검색은 그래프의 특정 부분에 초점을 좁혀 미세한 수준의 세부 정보가 필요한 질문에 특히 적합합니다.

결론

GraphRAG와 Weave를 활용하여 세부적인 질문과 폭넓은 질문을 모두 처리할 수 있는 파이프라인을 구축했습니다. Global Search는 전체 데이터셋을 활용해 상위 수준의 질문에 답하고, Local Search는 특정 엔티티와 관계를 정밀하게 겨냥합니다. Weave 통합으로 프로세스의 투명성이 강화되어 LLM 상호작용을 시각화하고 성능을 모니터링할 수 있습니다. 이제 대규모 데이터셋을 탐색하고 분석하기 위한 강력하고 확장 가능한 GraphRAG 시스템을 갖추게 되었습니다.
함께해 주셔서 감사합니다. 즐거운 질의 응답 되세요!


이 문서는 AI로 번역되었습니다. 오역이 있을 경우 댓글로 알려주세요. 원문 보고서는 다음 링크에서 확인하실 수 있습니다: 원문 보고서 보기