최근(이라기에는 꽤 오래 전부터) RAG라는 용어가 빈번하게 들려오기 시작했는데,
알고 보니 업무에서 진행하고 있던 지식그래프 검색과 어느 정도 연관되어 있었다 👀
LLM이 더 대답을 잘 하기 위하여 문서로부터 정보를 검색하는 RAG에서,
더 나아가 지식그래프와 결합하여 더욱 정확한 정보를 얻는 GraphRAG가 화두되고 있다.
Microsoft에서 올해 초(2024년 4월) 이와 연관된 논문 및 python 패키지를 공개하여 이에 대해 살펴보고자 한다.
RAG(Retrieval Augmented Generation)란?
LLM을 사용하다 보면 종종 잘못된 정보를 진실처럼 답변하는 환각 현상을 경험해봤을 것이다.
이러한 hallucination 문제를 해결하고자 제기된 RAG는 외부 지식 출처로부터 정보를 가져와서 대답을 생성하는 기법으로,
우리가 LLM에게 질문했을 때, 답변을 문서에서 정보를 찾아서 반환해주는 방식이다.
RAG는 다음과 같은 주요 컴포넌트로 구성되어 있으며,
이를 기반으로 질문 입력 -> 문서 검색(Retriever) -> 답변 생성(Generator) 이 이루어지게 된다.
- 검색기(Retriever)
: 주어진 질문이나 프롬프트에 적합한 외부 데이터 소스(knowledge 및 document 데이터 등)를 검색한다. - 생성기(Generator)
: 검색된 정보를 기반으로 답변을 생성하는 것으로,
주로 Transformer 기반의 언어 모델이 활용되며 사용자에게 적절한 답변이 전달된다.
GraphRAG란?
물론 RAG가 정확한 정보에 대한 대답을 해주면서 기존 LLM 보다는 향상된 결과를 보여주어
QFS(Query-Focused Summarization)라는 특정 질문에 대한 주제에 대해서는 잘 대답을 해주지만,
전체 텍스트에 대한 종합적인 질문에 대해서는 제대로 대답하지 못하는 문제가 존재했다.
이를 위해 제시된 새로운 방식이 바로 RAG에 Graph를 더한 GraphRAG이다.
GraphRAG는 LLM을 통해 지식그래프를 생성하고 각 entity 별로 요약 정보를 미리 만들어두어
여러 정보를 통합적으로 요약해서 종합적인 답변을 줄 수 있도록 구현된 방식이다.
GraphRAG는 위 구조도과 같은 단계로 진행되는데, 각 단계는 아래와 같이 진행된다.
- Source Documents → Text Chunks
- 원본 문서에서 텍스트를 추출하여 길이에 따라 작은 chunk 단위로 분할한다.
- 이 때 text chunk가 길면 호출 횟수가 줄어들지만 짧을수록 더 정밀하게 정보를 얻을 수 있으므로
LLM의 호출 효율성과 정보 손실 방지를 균형 있게 유지할 수 있도록 조정되어야 한다.
(예를 들어, chunk 길이 600을 사용하면 chunk 길이를 2400으로 사용할 때 보다 약 2배 더 많은 entity를 추출할 수 있다.)
- Text Chunks → Element Instances
- 각 text chunk로부터 각각 그래프의 node와 edge가 추출된다.
(여기에서의 node는 entity 단위로, edge는 entity 간의 관계(relation)를 나타내는 지식그래프 형식을 띄게 된다.) - 이 과정에서 LLM prompt를 통해 entity 이름, 유형, 설명 및 연관 relation등이 추출된다.
- 각 text chunk로부터 각각 그래프의 node와 edge가 추출된다.
- Element Instances → Element Summaries
- 추출된 entity와 relation 각각에 대하여 요약하여 그래프 요소별로 summary가 생성된다.
- 이를 통해 동일 entity의 중복을 줄이고 일관된 요약을 제공한다.
- Element Summaries → Graph Communities
- 생성된 그래프를 커뮤니티 탐지 알고리즘(Leiden 등)을 통해 연관 그룹 단위로 분할된다.
- 이렇게 생성된 군집(community)는 전체 그래프를 요약할 때 기반이 되는 구조가 된다.
- Graph Communities → Community Summaries
- 각 community의 entity / relation을 요약하여, community 단위로 요약이 생성된다.
- 이를 통해 entity 또는 relation 에 대한 세부적인 질문에 대해서도 답변을 잘 생성할 수 있도록 활용된다.
- Community Summaries → Community Answers → Global Answer
- 사용자가 질문을 하면 커뮤니티 요약을 이용해 각 커뮤니티의 답변을 생성하고,
각 커뮤니티 답변을 종합하여 최종 답변을 제공한다.
- 사용자가 질문을 하면 커뮤니티 요약을 이용해 각 커뮤니티의 답변을 생성하고,
평가 결과
논문에서 무엇보다 유심히 봐야 할 내용인 평가 결과에 대해서 살펴보고자 한다.
우선 평가를 위한 문서 dataset은 아래 2가지와 같이 팟캐스트 대본과 뉴스 기사가 사용되었다.
- Podcast Transcripts
: Microsoft CTO 케빈 스콧이 진행하는 기술 리더와의 인터뷰 Behind the Tech 팟캐스트 대본을 모은 데이터이다. (text chunk 1,669개) - News Articles
: 2013년 9월~2023년 12월까지의 뉴스 기사 데이터로, 연예부터 과학까지 다양한 주제로 구성되어 있다. (text chunk: 3,197개)
질의 dataset의 경우 일반적으로는 공개되어 있는 open domain QA 데이터셋(HotPotQA, MultiHop-RAG)을 사용하지만,
여기에서는 데이터셋 전체에 대해 파악하는지 판단할 수 있는 질의가 필요하다.
따라서 LLM(!)을 통해 질의를 생성하였으며, 데이터셋별로 짧은 description을 주면서 N개의 잠재적 user와 user별 N개의 task를 식별해서 전체 말뭉치를 이해해야 하는 질의가 생성되도록 했다. (해당 논문에서는 N=5로 설정하여 총 125개의 질의를 생성하였다.)
평가 기준은 다음과 같이 6가지 조건을 기준으로 진행되었으며,
- C0, C1, C2, C3: 커뮤니티 요약 상세 수준을 다르게 해서 root-level 부터 low-level 까지 나누어 사용한다.
- TS (Text Summarization): source text에서 직접 MapReduce 방식으로 답변을 생성한다.
- SS (naive RAG): text chunk를 직접 검색해서 context window 에 추가하는 naive RAG 방식을 이용한다.
평가 지표는 아래와 같이 4가지로 구분하여 측정한다.
- Comprehensiveness (포괄성): 답변이 질문에 포함된 모든 요소를 다루는가
- Diversity (다양성): 답변이 제공하는 정보가 다양하고 풍부한가
- Empowerment (이해도 지원): 답변이 주제를 깊이 이해하고 정보에 기반한 판단을 할 수 있도록 돕는가
- Directness (직접성): 답변이 질문에 대해 얼마나 직접적으로 명확하게 답하는가
각 기준과 지표에 따라 아래와 같이 평가 결과를 나타내며, 아래 표는 각 평가 조건이 서로 비교될 때의 승률(win rate)을 나타낸다.
기준 조건(가로) 대비 비교 대상 조건(세로)가 나타나지며, 각 조건이 다른 조건이랑 비교됐을 때 얼마나 더 우수하게 평가되는지 살펴볼 수 있다.
이와 같은 결과에 따라 아래와 같이 결과가 정리될 수 있다.
- Global Approaches VS Naive RAG
- Global Approaches는 naive RAG보다 포괄성(comprehensiveness)과 다양성(diversity) 측면에서 좋은 결과를 보였다.
* comprehensiveness 승률: Podcast 데이터셋 - 72~83% / 뉴스 기사 데이터셋 - 72~80%로 나타났다.
* diversity 승률: Podcast 데이터셋 - 75~82% / 뉴스 데이터셋 - 62~71% - Naive RAG는 직접성(directness)에서 높은 점수를 받았는데,
이는 간결하게 정보를 제공하는 데 있어 naive RAG가 강점을 가진다는 의미를 내포한다.
- Global Approaches는 naive RAG보다 포괄성(comprehensiveness)과 다양성(diversity) 측면에서 좋은 결과를 보였다.
- Community Summaries VS Source Texts
- Community Summary들을 활용한 Graph RAG는 source text보다 포괄성(comprehensiveness)과 다양성(diversity)에서 좀 더 좋은 성과를 보였다.
* comprehensiveness 승률: Podcast 데이터셋 - 57% / 뉴스 데이터셋 - 64%
* diversity 승률: Podcast 데이터셋 - 57% / 뉴스 데이터셋 - 60% - Graph RAG의 Community Summary 방식은 source text에 비해 토큰 비용을 26~33% 줄이는 효율적인 모습을 나타냈다. 특히 root-level community summary 방식은 전체 비용을 97%까지 절감할 수 있었다.
- Community Summary들을 활용한 Graph RAG는 source text보다 포괄성(comprehensiveness)과 다양성(diversity)에서 좀 더 좋은 성과를 보였다.
- Empowerment (이해도와 정보 제공 능력 평가)
- LLM을 활용한 평가에 따르면, 사용자에게 정보의 구체적인 예시, 인용, 출처 등을 제공하는 것이
Empowerment 측면에서 중요한 역할을 했으며, 이를 통해 사용자가 보다 깊이 있는 이해를 할 수 있다는 결론이 나왔다. - 이를 통해 향후 더 많은 구체적인 정보를 포함하도록 추출 프롬프트를 조정하면,
Graph RAG 방식의 Empowerment 성과를 더 높일 수 있는 가능성을 보여주었다.
- LLM을 활용한 평가에 따르면, 사용자에게 정보의 구체적인 예시, 인용, 출처 등을 제공하는 것이
추가로 얼마전 개최되었던 지식그래프 관련 포럼 Ontotext Knowledge Graph Forum 2024 에서도
해당 Microsoft GraphRAG를 활용한 세션이 있어서 참고해보면 좋을 것 같다.
References
https://proceedings.neurips.cc/paper/2020/file/6b493230205f780e1bc26945df7481e5-Paper.pdf
https://github.com/microsoft/graphrag/tree/main
https://arxiv.org/pdf/2404.16130
(함께 읽어보면 좋을 글또 분들의 RAG 관련 글 🙌)
'DATA SCIENCE' 카테고리의 다른 글
[KG] LLM에 날개를 달아줄 지식그래프 (Unifying Large Lanuage Models and Knowledge Graphs 논문) (2) | 2023.07.02 |
---|---|
[KG] 세상의 모든 데이터를 하나로 연결하는 지식그래프 (Knowledge Graph) (1) | 2023.03.12 |
[Kaggle] kernel 내 plot에서 한글 깨짐 해결 (0) | 2020.07.05 |
[Kaggle] kernel에서 data 추가하기 (0) | 2020.07.05 |