23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Graph RAG를 이용한 AI Agent 시스템 구현의 1단계로,
Microsoft의 GraphRAG를 이용하여 LLM을 이용한 Knowledge Graph 생성과 지식 검색을 테스트해보았다.
Vector DB를 이용하는 기존 RAG 시스템과 달리, Microsoft GraphRAG는 정보 검색에 지식 그래프(Knowledge Graph를 활용하여 기존 RAG를 강화하는 프레임워크이다.
LLM 기반 지식 그래프 생성: GraphRAG는 LLM모델을 사용하여 주어진 텍스트 데이터로부터 주요 개체(Entity)와 각 Entity간의 관계(Relationship)을 식별하고,
각각을 설명하는 의미적인 맥락을 생성함. 이런 과정을 통해 생성된 지식 그래프는 평면적인 문서가 아닌, 연결된 데이터간의 탐색을 가능하게한다.
GraphRAG 공식 블로그(https://microsoft.github.io/graphrag)에 간단한 사용부터 고급 튜닝까지 자세하게 안내하고 있다.
사전 준비 사항: GraphRAG 구동을 위한 Python 설치가 선행되어야 하며, Python 3.10~3.12 버전을 공식적으로 지원하고 있어, 현재 사용하고 있는 python 버전을 확인하고 진행하는 것이 좋다,
python --version소스 코드 복제 & graphrag 모듈 설치
git clone https://github.com/microsoft/graphrag
pip install graphrag # 관리자 권한이 없으면, 이 단계에서 권한 부족으로 설치가 완료되지 않으므로, 실행환경을 관리자 권한으로 실행한 후 진행하도록 한다.작업 공간 만들기
: 앞의 단계에서 소스 복제와 pip 모듈 설치가 완료되면, 이제 작업공간을 만들고 본격적인 설정이 시작된다.
mkdir -p ./[작업공간명]/input문서 업로드
: 앞에서 만든 작업공간의 input 폴더에 변환하고자 하는 문서를 위치시켜주면 되는데, 아직까지 GraphRAG 프레임워크에서는 PDF, 또는 PPTX, DOCX 같은 오피스 파일들의 처리는 지원하지 않고 *.txt, *.csv, *.json 파일만 지원하고 있다. 만약 원본 문서가 PDF나 오피스 문서라면, MarkItDown(https://github.com/microsoft/markitdown)이라는 역시 Microsoft에서 제공하는 문서변환 프레임워크로 간단한 형태의 변환이 가능하다.
이번 테스트에서는 생텍쥐페리의 소설 '어린왕자'의 본문 내용을 Text 파일로 변환하여 사용해보았다.
작업 공간 초기화
: 아래 스크립트를 실행하면, log, output, prompts 폴더와 함께 .env, settings.yaml 파일 등 GraphRAG를 구성하는 작업공간 기본 요소들이 셋팅된다.
graphrag init --root ./[작업공간명]환경 설정
: GraphRAG에서는 OpenAI API와, Azure OpenAI Service의 API를 연결하여 사용할 수 있는데, OpenAI API를 사용할 경우에는 .env 파일에 GRAPHRAG_API_KEY 값만 입력해주면 설정은 완료된다.
본 테스트에서는 Azure OpenAI Service를 사용하였고, LLM 모델은 GPT-4.1, Embedding은 text-embedding-3-large 모델을 사용하였다.
추가 환경 설정
: settings.yaml 파일에 extract_graph > entity_types을 설정하는 부분이 있는데, 문서로부터 개체를 식별할 때, 개체 유형을 어떻게 구분할지를 정의하는 설정이다.
기본 값은 organization, person, geo, event의 네 가지 유형으로 정의되어 있고, 이번 테스트에서는 소설의 특성을 고려하여 다음 다섯가지로 개체 유형을 재정의해봤다.
1. character(인물): 소설에 등장하는 모든 인물
2. event(사건, 에피소드): 소설의 줄거리를 구성하는 특정 사건이나 에피소드
3. location(장소): 이야기가 펼쳐지는 공간적 배경
4. object(사물): 소설에서 중요한 의미를 갖거나 상호작용의 대상이 되는 객체(사물)
5. concept(개념, 또는 주제): 소설의 핵심적인 주제나 철학 등
Indexing
: 인덱싱을 실행하면, 이제 GraphRAG 내에 사전 설정된 프롬프트들을 이용하여 LLM으로 개체/관계 식별 부터 Graph 데이터 생성까지의 전체 과정이 자동으로 진행된다.
graphrag index --root ./[작업공간명]: GraphRAG Indexing의 과정으로 생성된 모든 데이터는 output 폴더에 *.parquet 파일로 생성되며, VS Code나 Cursor 등을 이용하고 있다면, 확장 프로그램을 설치하여 간단하게 생성된 데이터들을 확인해볼 수 있다.
개체(Entity) 데이터
: 개체 데이터는 개체명(title)과, 개체유형, 설명, 발생빈도, 차수(Dgree) 정보로 구성된다. 여기서 차수는 해당 개체와 연결된 노드의 수로 이해하면 된다.
관계(Relation) 데이터
: 관계 데이터에는 가중치(Weight)와 결합 차수(Combined Dgree) 정보가 포함되는데, 각각은 해당 관계의 중요도, 거리, 강도 등을 표현하고, 결합 차수는 해당 노드와 연결된 이웃 노드들의 차수(Dgree) 값의 총합으로, 해당 노드의 영향력을 나타내는 정보라고 볼 수 있다.
Graph 데이터
: 역시 output 폴더에 생성되는 graph.graphml 파일을 통해 시각화된 지식 그래프를 살펴 볼 수 있는데, 이를 확인하기 위해서는 별도의 프로그램이 필요하다. 여기서는 GraphRAG 블로그에 소개된 Gephi를 사용하였다.
Gephi에서 기본적인 파일 불러오기만을 해서는 그럴듯한(?) 형태의 그래프가 표시되지 않기에 약간의 튜닝이 필요하다.
이 그래프를 보면, 뭔가 복잡하고 그럴듯해 보이지만, 제대로 된 구조를 가지고 있는지는 알 수 없다.
잘 기억나지는 않지만, 익숙한 주제들로 필터링해서 살펴 보도록 하자.
[지리학자]: 지리학자와 사막이 어떤 연결점이 있었는지 의아하지만, 소설 내용이 잘 떠오르는 않는 관계로 다음 주제로 넘어가본다.
[나]: 소설 어린왕자의 주인공은 '나'와 동일 인물이지만, 여기서는 별도의 개체로 식별된 것을 볼 수 있다.
서비스로서의 확장성을 고려해본다면, LLM이 간편하게 만들어주는 지식그래프는 달콤하게 들리지만, 복잡한 지식그래프로부터 오류를 찾고 이를 조정하는 과정은 쉽지 않게 느껴졌다.
: 사용한 모델이 추론 모델이 아님에도 응답 데이터의 형태가 추론과 유사한 형태를 보이고 있다.
이것이 RAG 응답 생성 프롬프트의 영향인지, 아니면 지식 탐색 과정이 응답에 반영된 것인지는 추후 사용된 프롬프트를 확인해볼 필요가 있다.
: 원문으로 제공한 텍스트 문서는 소설의 본문 내용만 포함시켰기에, 작가에 대한 정보는 포함되어있지 않았다. 엄밀하게 이야기하자면 할루시네이셔인셈이다.
추가로 확인해봤을 때, 작가에 대한 정보가 '어린왕자'라는 개체에 대한 설명을 생성하는 과정에서 포함되었기에,
개체 생성 프롬프트만 튜닝하면 해결될 문제인지, 아니면 응답 부분까지 손봐야할 부분인지는 확인이 필요하다.
: 기존 Vector DB 방식의 RAG는 검색된 Chunk, 또는 검색된 Chunk 주변의 Chunk를 포함시켜 Context Window를 확장하는 형태로밖에 구현이 불가하므로,
주어진 지식에 대한 포괄적인 질문에 답변하는데에는 한계가 있었기에, 이런 유형의 질문에 대한 응답이 Graph DB를 활용한 RAG의 차별점이라고 할 수 있다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.