본문 바로가기
Knowledge Graph

[MS] GraphRAG 사용하기📊 (5) Indexing Dataflow 이해하기

by Chaewon Park 2024. 9. 2.

 

Indexing Dataflow

 

📌The GraphRAG Knowledge Model

 

 'Knowledge Model'은 data-model 정의에 부합하는 데이터 결과물의 명세서다. 다음과 같은 엔티티 타입들이 제공된다. 이 필드들은 기본적으로 텍스트를 임베딩한 필드들이다.

`Document` 시스템에 입력되는 문서로 CSV의 행이나 `.txt` 파일이다.
`TextUnit`  텍스트를 분석하기 위한 청크(chunk: 텍스트 조각)다. 청크의 크기(size), 겹침 정도(overlap), 데이터 경계 준수 여부에 대한 설정은 다음과 같다.

 일반적인 사용 사례로는 `CHUNK_BY_COLUMNS`를 `id`로 설정해서 Document와 TextUnit 간의 관계를 다대다 관계 대신 1대다 관계로 절정하는 것이다.
`Entity`  TextUnit으로부터 추출된 엔티티다. 이는 사람, 장소, 이벤트 또는 사용자가 제공하는 기타 엔티티 모델을 나타낸다.
`Relationship`  두 엔티티 사이의 관계를 나타낸다. 이는 `Covariate`로부터 발생하다.
`Covariate`  엔티티에 대한 시계열적인 진술을 포함하는 추출된 주장(claim) 정보다.
 * 엔티티에 대한 진술을 포함하고 있고 이 진술은 시간에 구속될 수 있다는 의미인 것 같다.
`Community Report`  엔티티가 생성되면, 계층적 커뮤니티를 탐지하고 이 계층의 각 커뮤니티에 대한 보고서를 생성한다.
`Node`  임베딩되고 클러스터된 엔티티와 문서의 graph-view 레이아웃 정보를 담고 있는 테이블이다.

 


 

📌The Default Configuration Workflow

 

 Default-configuration workflow가 텍스트 문서를 GraphRAG Knowledge Model 로 어떻게 변환하는지 보자. 이 페이지는 이 과정에서  주요 단계들을 overview 형태로 보여준다.

그림 1. Default-configuration workflow

 

📍1단계: TextUnits 구성하기

 

 1번째 단계는 입력 문서를 TextUnits로 변환하는 것이다. TextUnits는 그래프 추출 기술에 사용되는 텍스트 조각을 의미한다. 또한, 추출된 지식 아이템의 출처를 추적하고, 원본 텍스트로 다시 연결하는데 사용된다.

 

  • `Chunk Size`
    사용자가 설정할 수 있다. 기본값은 300 토큰이지만, 단일 'glean' 단계에서 1200 토큰 크기의 청크를 사용하는 경우 긍정적인 경험을 얻었다. (여기서 'glean' 단계란, 후속 추출 과정을 의미한다.) 청크가 커질수록 출력의 정확도는 낮아지고 참조 텍스트의 의미가 감소할 수 있지만, 처리 속도는 크게 향상될 수 있다.

그림 2. Glean 단계 정의

 

  • `그룹화 설정`
    사용자가 설정할 수 있다. 디폴트 값으로는 청크가 문서 경계에 맞추어* Document와 TextUnit 간에 1대다 관계가 성립된다. 그러나 드물게 이 관계를 다대다로 변경할 수 있다. 이는 문서가 매우 짧을 때 여러 문서를 결합하여 의미 있는 분석 단위를 구성해야 하는 경우에 유용하다. (e.g. Tweets 또는 Chat log)
 By default, we align our chunks to document boundaries, meaning that there is a strict 1-to-many relationship between Documents and TextUnits.

 

 * 이 문장에서 Boundary가 무슨 말인지는 잘 모르겠지만, 내가 추측한 바로는 그냥 '문서의 끝'을 말하는 것 같다. 그림 3과 같이 문서의 내용이 많으면 청크가 커도 한 문서에서 여러 개의 청크가 나오기 때문에 1대다 관계가 성립할 수 있다. 하지만 문서의 양이 트위터처럼 적다면, 청크의 양을 채우기 위해(?) 다른 문서에서 청크를 채우기 때문에 다대다 형식이 성립되는 것 같다.

그림 3. (왼) 1대다 관계, (우) 다대다 관계

 

각 TextUnit은 텍스트 임베딩되어 파이프라인의 다음 단계로 전달됩니다.

그림 4. Documents into Text Chunks

 


 

📍2단계: 그래프 추출하기

 

 이 단계에서는 각 Text Unit을 분석하여 그래프의 기본 구성 요소인 엔티티(Entities), 관계(Relationships), 그리고 주장(Claims)을 추출한다. 엔티티와 관계는 `entity_extract` verb를 통해 한 번에 추출되며, 주장은 `claim_extract` verb를 통해 추출됩니다. 결과는 결합되어 파이프라인의 다음 단계로 전달됩니다.

 

그림 5. Graph Extraction

 

1) Entity & Relationship Extraction
 그래프 추출의 첫 번째 단계에서, LLM(대규모 언어 모델)을 사용해 각 텍스트 유닛을 처리하여 원시 텍스트로부터 엔터티와 관계를 추출합니다. 이 단계의 결과물은 텍스트 유닛에 대한 서브그래프(subgraph)로, 이름, 유형, 설명을 포함한 엔터티 목록과 출처, 대상, 설명을 포함한 관계 목록을 담고 있습니다.
 이 서브그래프들은 병합되며, 동일한 이름과 유형을 가진 엔터티들은 그들의 설명을 배열로 만들어 병합됩니다. 마찬가지로, 동일한 출처와 대상을 가진 관계들도 그들의 설명을 배열로 만들어 병합됩니다.

 

2) Entity & Relationship Summarization

 이제 우리는 설명 목록(a list of descriptions)을 포함한 엔티티와 관계의 그래프를 가지고 있으므로, 각 엔티티와 관계에 대한 단일 설명으로 이 목록들을 요약할 수 있다. 이는 LLM을 사용해 각 설명에서 모든 고유한 정보를 포착하는 짧은 요약을 생성함으로써 이루어진다. 이를 통해 모든 엔터티와 관계는 간결한 단일 설명을 가지게 된다.

 

3) Claim Extraction & Emission

  마지막으로, 독립적인 워크플로우로서, 소스 텍스트 유닛에서 주장을 추출한다. 이 주장들은 평가된 상태와 시간 경계를 가진 긍정적이고 사실적인 진술을 나타낸다. 이들은 Covariates 라는 주요 산출물로 나온다.

 

 * Note: 주장 추출은 선택 사항이고 기본적으로 꺼져 있다. 주장 추출을 하려면 유용한 프롬프트 튜닝이 필요하기 때문이다.


 

📍3단계: 그래프 확장 (Graphd Augmentation)

 

 이제 엔터티와 관계의 사용 가능한 그래프를 가지고 있으므로, 이들의 커뮤니티 구조를 이해하고 추가 정보를 통해 그래프를 확장하려고 한다. 이는 커뮤니티 탐지(Community Detection)그래프 임베딩(Graph Embedding)이라는 두 단계로 이루어진다. 이 단계들은 그래프의 위상 구조를 명시적(커뮤니티) 및 암시적(임베딩)으로 이해할 수 있는 방법을 제공한다.

 

1) Community Detection 

 이 단계에서는 `Hierarchical Leiden Algorithm`을 사용하여 엔터티 커뮤니티의 계층 구조를 생성한다. 이 방법은 커뮤니티 크기 임계값에 도달할 때까지 그래프에 재귀적인 커뮤니티 클러스터링을 적용한다. 이를 통해 그래프의 커뮤니티 구조를 이해하고, 다양한 세분화 수준에서 그래프를 탐색하고 요약할 수 있는 방법을 제공한다.

그림 6. Graph Augmentation

What is 'Hierarchical Leiden Algorithm'?

정리 후 게시할 예정

 

2) Graph Embedding

 이 단계에서는 Node2Vec 알고리즘을 사용하여 그래프의 벡터 표현을 생성한다. 이를 통해 그래프의 암시적 구조를 이해하고, 쿼리 단계에서 관련된 개념을 찾기 위한 추가적인 벡터 공간을 제공한다.

 

3) Graph Tables Emission

그래프 확장 단계가 완료되면, 최종 엔티티와 관계 테이블은 텍스트 필드가 텍스트 임베딩된 후 발행된다.

 


 

📍4단계: Community Summarization

 

그림 7. Community Summarization

 

 이 단계에서는 엔터티와 관계의 기능적인 그래프, 엔터티의 커뮤니티 계층 구조, 그리고 Node2Vec 임베딩을 가지고 있다.

 이제 이러한 커뮤니티 데이터를 바탕으로 각 커뮤니티에 대한 보고서를 생성하여, 그래프의 여러 세분화 지점에서 그래프를 고수준으로 이해하고자 한다. 예를 들어, 커뮤니티 A가 최상위 커뮤니티라면 전체 그래프에 대한 보고서를 받게 되고, 더 낮은 수준의 커뮤니티라면 로컬 클러스터에 대한 보고서를 얻게 된다.

 

1) Generate Community Reports

 이 단계에서는 LLM을 사용하여 각 커뮤니티에 대한 요약을 생성한다. 이를 통해 각 커뮤니티에 포함된 고유한 정보를 이해하고, 그래프를 고수준에서 또는 저수준에서 파악할 수 있다. 이러한 보고서에는 커뮤니티의 하위 구조 내에서 주요 엔터티, 관계, 주장에 대한 실행 개요와 참조가 포함된다.

 

2) Summarize Community Reports

 이 단계에서는 생성된 각 커뮤니티 보고서를 LLM을 통해 간단히 사용할 수 있도록 요약한다.

 

3) Community Embedding

 이 단계에서는 커뮤니티 보고서, 커뮤니티 보고서 요약, 커뮤니티 보고서 제목의 텍스트 임베딩을 생성하여 커뮤니티의 벡터 표현을 만든다.

 

4) Community Tables Emission

마지막으로, 일부 정리 작업을 수행하고 CommunitiesCommunityReports 테이블을 발행한다.

 


 

📍 5단계: Document Processing

 

 이 단계에서 Knowledge Model을 위한 Document 테이블을 생성한다.

그림 8. Document Processing

 

1) Augment with Columns (CSV Only)

 워크플로우가 CSV 데이터를 처리하는 경우, Documents 출력에 추가 필드를 추가하도록 워크플로우를 구성할 수 있다. 이 필드들은 들어오는 CSV 테이블에 존재해야 한다.

 

2) Link to TextUnits

이 단계에서는 각 문서를 첫 번째 단계에서 생성된 텍스트 유닛(TextUnits)과 연결합니다. 이를 통해 어떤 문서가 어떤 텍스트 유닛과 관련이 있는지, 그리고 그 반대의 경우도 이해할 수 있다.

 

3) Document Embedding

 이 단계에서는 문서의 조각을 평균 임베딩하여 문서의 벡터 표현을 생성한다. 문서를 중첩되지 않은 청크로 다시 나눈 다음, 각 청크에 대해 임베딩을 생성한다. 그런 다음 이 청크들을 토큰 수에 따라 가중치를 부여하여 평균화한 값을 문서 임베딩으로 사용한다. 이를 통해 문서 간의 암시적 관계를 이해할 수 있으며, 문서의 네트워크 표현을 생성하는 데 도움이 됩니다.

 

4) Documents Table Emission

이 시점에서 지식 모델에 Documents 테이블을 발행할 수 있습니다.

 


 

📍 6단계: Network Visualization

 

 이 워크플로우 단계에서는 기존 그래프 내의 고차원 벡터 공간을 지원하기 위해 네트워크 시각화를 위한 몇 가지 단계를 수행한다. 이 시점에서 두 개의 논리적 그래프가 사용되고 있는데, 하나는 Entity-Relationship 그래프이고, 다른 하나는 Document 그래프다.

그림 9. Network Visualization Workflows

 

 각 논리적 그래프에 대해 UMAP 차원 축소를 수행하여 그래프의 2D 표현을 생성한다. 이를 통해 그래프를 2D 공간에서 시각화하고, 그래프 내의 노드 간의 관계를 이해할 수 있다. 생성된 UMAP 임베딩은 Nodes 테이블로 출력된다. 이 테이블의 각 행은 해당 노드가 문서인지 엔티티인지 구분하는 구분자와 UMAP 좌표를 포함하고 있다.

 

 

 6단계에 대해서는 잘 모르겠다. 시각화할 수 있는 방법을 얘기하는 것 같은데 어떻게 UMAP으로 시각화해야 되는지에 대한 이야기는 공식문서에 실려있지 않다.