오픈 소스 Python 기반 구현은 https://aka.ms/graphrag 곧 제공될 예정
0 Abstract
- "데이터셋의 주요 주제는 무엇인가?"와 같은 전체 텍스트 말뭉치를 대상으로 하는 전역적 질문에 대해서 잘 작동 안함
- 명시적인 검색 작업이 아닌 Query Focused Summarization(QFS) 작업이기 때문임
- Graph RAG는 RAG, QFA를 결합함
- 1. 문서에서 중요 개념과 관계를 추출해서 지식 그래프를 만듬
- 그래프에서 비슷한 개념들을 그룹화하고, 각 그룹에 대한 요약을 미리 생성
RAPTOR와 비슷한데..? 다만 RAPTOR는 노드간의 edge정보가 없음. & 과거 개발 되었던 알고리즘으로 GRAPH를 구성
1. Introduction
- 최근 대규모 언어 모델(LLM)를 사용해 복잡한 분야에서 인간과 유사한 센스메이킹을 자동화하려는 시도가 이루어지고 있음.
- 하지만 전체 텍스트 말뭉치에 대한 질문에 답하는 것은 여전히 어려움.
- 기존의 RAG 방식은 지역적인 정보 검색에는 효과적이지만, 전체 데이터셋에 대한 포괄적인 이해를 요구하는 질문에는 적합하지 않음
- 모델의 컨텍스트창이 커지며, 많은 문장을 입력으로 사용할 수 있으나, Lost in the middle로 손실될 수 있는 정보들이 있음.
- 이 논문에서는 이러한 한계를 극복하기 위해 'Graph RAG' 제안 (Figure 1)
- 이 방법은 LLM을 사용하여 문서에서 지식 그래프를 추출
- 그래프 구조를 활용하여 효율적으로 전체 데이터셋을 요약
- 실험 결과, 이 방법은 기존 RAG 방식보다 더 포괄적이고 다양한 답변을 생성할 수 있음을 보임
2 Graph RAG Approach & Pipeline
2.1 Source Document -> Text Chunks
문서에서 추출한 입력 텍스트를 처리를 위해 얼마나 짧게 텍스트 청크로 분할할 것인가 하는 것이다.
- 긴 청크 : LLM 호출 횟수를 줄이지만, 필요 없는 정보가 들어갈 수 있음.
- 작은 청크 : 더 많은 엔티티를 참조하여 추출해야함.
2.2 Text Chunks -> Element Instances
각 청크에서 그래프 노드와 엣지의 인스턴스를 식별 및 추출
- 다중 파트 LLM 프롬프트 사용해서 수행
- 텍스트에서 모든 엔티티를 식별(이름, 유형, 설명 등)
- 명확하게 관련된 엔티티 간의 모든 관계를 식별 (출발점, 도착점, edge에 관한 설명 포함)
- 두 종류의 요소 인스턴스(엔티티-노드, 관계)는 모두 튜플 목록으로 출력
- 프롬프트로 엔티티, 관계 추출하는 방법
- In-context Learning
- 예를 들어, 이 연구의 기본 프롬프트는 사람, 장소, 조직과 같은 광범위한 "명명된 엔티티"를 추출 가능
(과학, 의학, 법률)과 같은 전문 지식이 필요한 분야에서는 해당 도메인에 특화된 예시를 사용하면 더 좋은 결과를 얻을 수 있다.
- 예를 들어, 이 연구의 기본 프롬프트는 사람, 장소, 조직과 같은 광범위한 "명명된 엔티티"를 추출 가능
- 보조 추출 프롬프트 : 엔티티, 엣지 외에 추가적인 정보를 추출하기 위한 별도 지시문
- 기본 속성 프롬프트 : 감지된 엔티티와 엣지를 추출하는 것을 목표
여기에는 주제, 객체, 유형, 설명, 원본 텍스트 범위, 시작 및 종료 날짜가 포함 예) 아인슈타인은 1921년에 노벨 물리학상을 수상했다주제 : 아인슈타인객체 : 노벨 물리학상유형 : 사실 진술설명 : 1921년에 노벨 물리학상 수상시작 날짜 : 1921년
- 기본 속성 프롬프트 : 감지된 엔티티와 엣지를 추출하는 것을 목표
- 글리닝(Gleaning) : 이전에 놓친 정보를 다시한번 살피는 과정
- 효율성과 품질의 균형을 맞추기 위해, 우리는 지정된 최대치까지 여러 라운드의 "글리닝"을 사용
- LLM이 추출에서 놓친 엔티티를 감지하도록함.
- 1) LLM에게 모든 엔티티가 추출되었는지 평가하도록 요청. 이때 예/아니오 결정을 강제하기 위해 100의 로짓 바이어스를 사용
- 2) LLM이 엔티티가 누락되었다고 응답하면, "마지막 추출에서 많은 엔티티가 누락되었다"는 프롬프트를 사용하여 LLM이 이 누락된 엔티티들을 글리닝하도록 함.
- 이 접근 방식을 통해 품질 저하나 노이즈 유입 없이 더 큰 청크 크기를 사용할 수 있다.(Figure 2)
- In-context Learning
2.3 Element Instances →Element Summaries
- LLM을 사용한 "추출"은 이미 일종의 추상적 요약 과정이다.
- 문장 -> 노드, 엣지, 다양한 주제들
- 상위 그래프로 만들기 위해선, 단일 설명 텍스트로 변환을 해야하는데, 이때 LLM의 요약이 필요함.
- 잠재적 문제: LLM이 동일한 엔티티를 일관되지 않게 추출할 수 있다.
-> 이로 인해 중복 엔티티나 중복 노드가 생길 수 있다. - 해결책: 다음 단계에서 관련 엔티티들의 "커뮤니티"를 감지하고 요약한다.
-> 중복된 노드들이 하나의 공통 엔티티에 속할 것이기에 로버스트하다.
-> 단, 전제는, 같은 커뮤니티에 묶인 경우, 공통적인 주제에 대해서 묶여야 한다는 부분은 있음.
- 잠재적 문제: LLM이 동일한 엔티티를 일관되지 않게 추출할 수 있다.
- 일반적인 graph와 차별화
- 지식 그래프는 주로 간결한 지식 트리플(주제, 술어, 객체)에 의존
- 반면, 풍부하게 텍스트로 설명을 함.
2.4 Element Summaries →Graph Communities
- 2.3 단계에서 생성된 인덱스는 '방향이 없고', '엣지에 가중'이 있는 그래프로 모델링
- 엔티티가 노드
- 관계가 엣지
- 엣지 가중치는 (1/인스턴스)로 가중치가 부여됨.
- 커뮤니티 감지 알고리즘을 사용하여 그래프를 노드 커뮤니티로 분할한다.
- 이 파이프라인에서는 Leiden 알고리즘을 사용
- 커뮤니티 수 등을 정함.
개요 : 뇌피셜임.1) 각 노드를 개별 커뮤니티로 시작함.2) 개별 노드를 이웃 커뮤니티로 이동시켜보고, 모듈성 변화를 계산해봄(Computation Cost가 많을 것 같은데, 이에대한 최적화가 있을 것으로 예상함)3) 모듈성이 가장 많이 증가하는 이동을 선택4) 모듈성 증가가 없으면 노드는 원래 커뮤니티에 남는다.5) 1-4는 bottom Up이고, 완성된 Bottom Up에서 Top Down으로 이동 단계를 다시 수행해봄.
2.5 Graph Communities →Community Summaries
- Leiden 계층 구조의 각 커뮤니티에 대해 보고서 형식의 요약을 만드는 것
- 그래프 계층 구조는 Leiden으로 만들어짐.
- 목적 : 전역 쿼리에 답변하는데 사용되는 '인덱스'의 역할을 하기 위해, 요약 생성.
- 이러한 요약은 그 자체로 데이터셋의 전체 구조와 의미를 이해하는 데 유용
- 질문이 없는 상태에서도 말뭉치를 이해하는 데 사용될 수 있다.
- 커뮤니티 요약은 다음과 같은 방식으로 생성
- 리프 레벨 커뮤니티: 엣지 중요도 계산
- 우선순위가 정해진 후 토큰 제한에 도달할 때까지 반복적으로 LLM 컨텍스트 윈도우에 추가된다.
- 우선순위 지정은 다음과 같이 이루어짐 :
- 노드의 중요도 계산 : 노드가 얼마나 많은 연결을 가지고 잇는지 카운트(차수 라고 함)
연결이 많을수록 그 노드는 중요하다고 간주 됨 - 엣지의 중요도 결정 : 각 엣지는 두개의 노드를 연결하는데, 이 두 노드의 차수를 합산하여 엣지의 중요도를 결정
- 엣지 정렬 : 모든 엣지를 중요도에 따라 내림차순으로 정렬 (노드의 중요도는 정렬시에 사용안함)
- 정보 추가 : 엣지가 정렬된 순서대로 각 엣지에 대해:
a) 소스 노드에 대한 설명 추가
b) 타겟 노드에 대한 설명 추가
c) 이 노드들과 관련된 추가 속성 정보 추가
d) 엣지 자체(즉, 두 노드 간의 관계)에 대한 설명 추가
- 노드의 중요도 계산 : 노드가 얼마나 많은 연결을 가지고 잇는지 카운트(차수 라고 함)
- 상위 레벨 커뮤니티: 요약 생성
- 모든 정보를 한번에 처리 가능한 경우(컨텍스트 윈도우)
- 커뮤니티의 모든 요소(노드 엣지 등)에 대한 요약이 컨텍스트 윈도우에 다 들어가면,
- 모든 요소에 대한 상세한 정보를 포함해 요약 생성
- 정보가 너무 많아 한번에 처리 불가한 경우
- a) 서브 커뮤니티(더 작은 하위 그룹)를 크기순으로 정렬. 더 많은 정보를 가진 서브 커뮤니티가 우선순위를 갖는다
- b) 가장 큰 서브 커뮤니티부터 시작하여, 그 서브 커뮤니티의 전체 요약(더 짧은 버전)을 사용
- c) 이 과정을 반복하면서 더 작은 서브 커뮤니티의 요약을 추가
- d) 모든 정보가 주어진 공간에 맞을 때까지 이 과정을 계속 진행.
- 모든 정보를 한번에 처리 가능한 경우(컨텍스트 윈도우)
- 리프 레벨 커뮤니티: 엣지 중요도 계산
2.6 Community Summaries →Community Answers →Global Answer
- 사용자 쿼리가 주어지면, 이전 단계에서 생성된 커뮤니티 요약을 사용하여 여러단계 과정을 통해 최종 답변을 생성
- 쿼리와 모든 커뮤니티쌍 간의 요약을 만들고, 관련 있는 커뮤니티들만 필터링해서 점차 global answer로 다가감
-> Cost가 상당히 많이 들어가겠는데? 최적의 균형 : 뇌피셜너무 상위 레벨을 사용하면 답변이 너무 일반적일 수 있고, 너무 하위 레벨을 사용하면 전체적인 맥락을 놓칠 수 있다.예: "전체적인 주제는 무엇인가요?"라는 질문에는 상위 레벨 요약이 적합할 수 있다.반면, "특정 주제에 대한 세부 정보는 무엇인가요?"라는 질문에는 하위 레벨 요약이 더 적합할 수 있다논문의 3절에서는 이러한 다양한 레벨의 요약을 사용했을 때의 효과를 실제로 평가
- 답변 생성 3 단계 :
- Prepare community summaries : 정보를 균등하게 분배하여 중요한 내용이 누락되지 않도록 한다.
- 과정:
a) 모든 커뮤니티 요약을 모으고
b) 이 요약들을 무작위로 섞는다
c) 섞인 요약을 일정 크기(예: 500토큰)의 청크로 나눈다. - 이유 : LLM은 주어진 컨텍스트의 시작과 끝 부분에 더 주목하는 경향이 있어, 무작위로 섞음으로써 모든 정보가 고르게 주목받을 기회를 갖게 된다.
- 과정:
- Map community answers : 각 청크에서 관련 정보를 추출하여 중간 답변을 생성
- 과정:
a) 각 청크를 별도의 LLM 인스턴스에 입력으로 제공
b) LLM은 각 청크에 대해 두 가지 생성- 사용자 질문에 대한 중간 답변
- 이 답변의 유용성을 0-100 사이의 점수로 평가
- 0점인 답변은 제거
- 과정:
- Reduce to global answer : 중간 답변들을 종합하여 최종적인 포괄적 답변을 생성
- 과정:
a) 중간 답변들을 유용성 점수에 따라 내림차순으로 정렬
b) 높은 점수의 답변부터 시작하여 새로운 컨텍스트 윈도우에 추가
c) 컨텍스트 윈도우의 토큰 제한에 도달할 때까지 이 과정을 반복
d) 최종적으로 채워진 컨텍스트를 사용하여 LLM이 종합적인 전역 답변을 생성 - 이유: 가장 관련성 높은 정보를 우선적으로 사용하면서도, 다양한 커뮤니티의 정보를 포함하여 포괄적인 답변을 만들 수 있다
- 과정:
- Prepare community summaries : 정보를 균등하게 분배하여 중요한 내용이 누락되지 않도록 한다.
3. Evaluation
3.1 데이터 : 팟캐스트 전사본, 뉴스 기사
3.2 Queries
- 기존 벤치마크 데이터는 검색에 맞춤화 되어있는 데이터셋이라 '활동 중심 접근법'을 사용
이 내용은 생략 하겠음
3.3 Conditions
총 6가지 방법을 비교함
- Graph RAG(C0) : 루트 레벨(가장 높은 레벨) 요약(가장 적은 수)를 사용
- Graph RAG(C1) : 고수준 커뮤니티 요약을 사용(C0의 하위 커뮤니티)
- Graph RAG(C2) : 중간 레벨 커뮤니티 요약을 사용(C1의 하유 커뮤니티)
- Graph RAG(C3) : 저수준 커뮤니티(가장 많은 수)(리프노드)
- 텍스트 요약 방법(TS) : 2.6절에서 설명한 방법
- 단순한 "의미론적 검색" RAG 접근법(SS) : 텍스트 청크를 검색하여, 컨텍스트 윈도우에 근접할 때까지 추가한 RAG
그래프 인덱싱 과정에서 팟캐스트 데이터셋의 경우 글리닝(놓칠 수 있는 정보를 다시 한번 살펴 추출하는 과정)
600 토큰의 컨텍스트 윈도우 크기 사용
3.4 Merics
3.2의 데이터는 ground truth가 없기에 LLM을 사용해 head-to-head comparison방법을 사용하였다.
일대일 측정 항목 :
- 포괄성: 답변이 질문의 모든 측면과 세부사항을 다루기 위해 얼마나 많은 세부정보를 제공하는가?
- 다양성: 질문에 대해 얼마나 다양하고 풍부한 관점과 통찰을 제공하는가?
- 권한 부여: 답변이 독자가 주제를 이해하고 정보에 기반한 판단을 내리는 데 얼마나 도움이 되는가?
- 직접성: 답변이 얼마나 구체적이고 명확하게 질문을 다루는가?
평가를 위해 LLM에게
- 질문, 목표 메트릭, 그리고 한 쌍의 답변을 제공(표2에서는 Graph RAG와 Naive RAG 비교)
한 데이터 셋에 대해서 6C2 (15개) 만큼의 비교가 필요 - 메트릭에 따라 어떤 답변이 더 나은지 평가하도록 함.
- 그 이유도 설명하도록 함.
- LLM은 승자가 있으면 승자를, 그렇지 않으면 근본적으로 유사하고 차이가 무시할 만한 경우 동점을 부여함.
- LLM의 확률적 특성을 고려하여 각 비교를 5번 실행하고 평균 점수를 사용(표 2)
3.5 Configuration
- 목적: 컨텍스트 윈도우 크기가 성능에 미치는 영향을 탐구
- 배경:
- gpt-4-turbo와 같은 모델은 128k 토큰과 같이 큰 컨텍스트 크기를 가짐
- 긴 컨텍스트에서 "중간에 정보가 손실"될 수 있는 문제 존재
- 테스트 방법:
- 4가지 컨텍스트 윈도우 크기 테스트: 8k, 16k, 32k, 64k
- 기준 조건(SS)에 대한 최적의 컨텍스트 크기 결정
- 결과:
- 가장 작은 크기인 8k가 포괄성 비교에서 가장 우수 (평균 승률 58.1%)
- 다양성(평균 승률 52.4%)과 권한 부여(평균 승률 51.3%)에서도 8k가 다른 크기와 비슷한 성능
- 결론:
- 최종 평가에 8k 토큰의 고정 컨텍스트 윈도우 크기 사용
3.6 Results
- 인덱싱 결과:
- 팟캐스트 데이터셋: 8,564 노드, 20,691 엣지
- 뉴스 데이터셋: 15,754 노드, 19,520 엣지
- Global Approach vs. 단순 RAG:
- 모든 Global 접근법이 단순 RAG보다 포괄성과 다양성 측면에서 일관되게 우수
- 커뮤니티 요약 vs. 원본 텍스트:
- 커뮤니티 요약이 대체로 답변의 포괄성과 다양성에서 작지만 일관된 개선 보임
(루트 레벨 요약 제외)
- 커뮤니티 요약이 대체로 답변의 포괄성과 다양성에서 작지만 일관된 개선 보임
- 효율성:
- Graph RAG가 원본 텍스트 요약보다 더 적은 컨텍스트 토큰 필요
- 저수준 커뮤니티 요약(C3): 26-33% 더 적은 토큰 사용
- 루트 레벨 커뮤니티 요약(C0): 97% 이상 더 적은 토큰 사용
2.6방법을 사용하면 쿼리와 모든 커뮤니티에 대해서 요약을 진행해야 하는데, 이에대한 것은 고려 된 부분인가?
- Matrix Empowerment:
- 전역적 접근법 vs. 단순 RAG(SS), Graph RAG vs. 원본 텍스트 요약(TS) 우세가 없음.
4. Related Work
생략
5. Discussion
- 평가의 한계:
- 약 100만 토큰 범위의 두 말뭉치(팟캐스트 전사본, 뉴스 기사)에 대한 특정 유형의 질문만 평가
- 다양한 질문 유형, 데이터 유형, 데이터셋 크기에 따른 성능 변화 연구 필요
- 센스메이킹 질문과 목표 메트릭(포괄성, 다양성, 권한 부여, 직접성)에 대한 최종 사용자 검증 필요
- SelfCheckGPT와 같은 도구를 사용한 hallucination 비율 비교 필요
- 그래프 인덱스 구축의 트레이드오프:
- Graph RAG가 다른 방법들보다 일관되게 우수한 성능 보임
- 그래프를 사용하지 않는 원본 텍스트 전역 요약 접근법도 경쟁력 있는 성능 보여줌
- 실제 적용 시 고려할 요소: 계산 예산, 데이터셋당 예상 쿼리 횟수, 그래프 인덱스의 부가 가치(일반 커뮤니티 요약, 다른 그래프 관련 RAG 접근법 활용 등)
- 향후 연구 방향:
- 사용자 쿼리와 그래프 주석 간 임베딩 기반 매칭을 통한 지역적 RAG 접근법 개발
- 커뮤니티 보고에 대한 임베딩 기반 매칭과, 맵-리듀스 요약을 결합한 하이브리드 RAG 방식 개발
- 커뮤니티 계층의 더 많은 레벨에 걸친 "롤업" 작업 확장
- 상위 레벨 커뮤니티 요약 정보를 따라가는 탐색적 "드릴 다운" 메커니즘 구현
'DeepLearing > NLP(LLM)' 카테고리의 다른 글
[논문리뷰] Large Language Monkeys: Scaling Inference Computewith Repeated Sampling (0) | 2024.09.30 |
---|---|
[Antropic 리뷰] Introducing Contextual Retrieval (2) | 2024.09.30 |
[논문리뷰] RAG-FUSION: A NEW TAKE ON RETRIEVAL-AUGMENTEDGENERATION (0) | 2024.09.27 |
[논문리뷰] Tree Of Thought (2) | 2024.09.27 |
[논문리뷰] MemoRAG : MOVING TOWARDS NEXT-GEN RAG VIA MEMORY-INSPIRED KNOWLEDGE DISCOVERY (1) | 2024.09.25 |
[논문리뷰]SAIL: Search-Augmented Instruction Learning (1) | 2024.09.23 |
[논문리뷰] In-Context Retrieval-Augmented Language Models (1) | 2024.09.08 |
[논문리뷰] Out of the BLEU: how should we assess quality of the Code Generation models? (1) | 2024.08.27 |