GraphRAG + GLM-4 기반 《홍루몽》 전편 중국어 검색 증강 시스템 구축

GraphRAG는 그래프 신경망과 검색 증강 생성 기술을 결합한 고급 모델로, 그래프 구조 정보와 외부 지식 검색을 활용하여 텍스트 생성의 품질과 관련성을 향상시킵니다.

graphrag-practice-chinese는 GraphRAG의 응용 예제 프로젝트입니다. 이 프로젝트의 특징은 OpenAI 모델을 대체할 수 있는 방법을 제공하고, 기존 프롬프트와 문서 분할 방식을 수정하여 GraphRAG의 중국어 콘텐츠 처리 능력을 향상시킨 점입니다.

본 프로젝트를 통해 LLM과 결합하여 <홍루몽> 전문에 대한 인덱스를 구축하고 쿼리 테스트를 진행했습니다.

환경 구성 (중요)

git clone https://github.com/zhaoyingjun/graphrag-practice-chinese.git

cd ./graphrag-practice-chinese

# 프로젝트 의존성 설치
pip install -r ./requirements.txt

# input 디렉토리 생성 (인덱스 구축용 텍스트 파일 기본 경로, settings.yaml의 input 항목에서 변경 가능)
mkdir ./input

# 이 명령어는 graphrag-practice-chinese 디렉토리 내에 .env와 settings.yaml 파일을 생성합니다.
python -m graphrag.index --init --root ./

설정 파일 수정

GraphRAG의 주요 설정 파일은 .envsettings.yaml 두 가지입니다.

  • .env: GraphRAG 파이프라인 실행에 필요한 환경 변수를 포함합니다. 기본적으로 GRAPHRAG_API_KEY=<API_KEY>만 정의되어 있습니다.
  • settings.yaml: 파이프라인 관련 설정을 포함합니다.

프로젝트 루트 디렉토리에는 참고용 설정 파일인 demo.envsettings.demo.yaml이 있습니다. 이를 참조하여 수정하거나, 이름을 변경하여 초기화된 설정 파일을 덮어쓸 수 있습니다.

추론 및 요약 단계에서 많은 토큰이 소모되므로, 무료로 호출 가능한 glm-4-flash 모델 사용을 권장합니다. <홍루몽> 전문 인덱스 구축 시 약 700만 개의 토큰이 소모되었습니다. 개인 학습 목적으로는 적절히 사용하시기 바랍니다.

최적화 전략 — 중국어 중심 모델 설정

최적화 1: 텍스트 분할

기본 방식은 토큰 수로 문서를 분할하지만, 중국어의 경우 청크 간에 깨진 문자가 발생할 수 있습니다. Langchain-ChatChat 오픈소스 프로젝트를 참고하여, 중국어 문자 수를 기준으로 텍스트를 분할합니다.

방법 1:

splitter/tokens.py를 사용하여 파이썬 라이브러리의 graphrag/index/verbs/text/chunk/strategies/tokens.py를 교체합니다.

방법 2:

splitter/chinese_text_splitterChineseTextSplitter를 문서 분할 방법으로 사용합니다. settings.yaml 파일에 새로운 splitter 부분을 추가해야 합니다.

# ... 기타 설정 동일 ...
chunks:
  size: 2500
  overlap: 300
  group_by_columns: [id]

splitter:
  type: custom
  module: splitter.chinese_text_splitter
  class: ChineseTextSplitter
  params:
    pdf: false
    sentence_size: 250
# ... 기타 설정 동일 ...

방법 2 수정 설명:

  1. 기존 chunks 부분은 유지합니다.
  2. 새로운 splitter 부분을 추가합니다.
    • type: custom: 사용자 정의 분할기를 사용함을 의미합니다.
    • module: splitter.chinese_text_splitter: ChineseTextSplitter 클래스가 포함된 모듈 경로입니다.
    • class: ChineseTextSplitter: 사용할 클래스 이름입니다.
    • params: ChineseTextSplitter에 전달할 매개변수입니다. pdf: falsesentence_size: 250으로 설정되어 있습니다.

주의사항:

  1. chinese_text_splitter.py 파일이 GraphRAG에서 찾을 수 있는 위치에 있어야 합니다.
  2. 수정 후 settings.yaml을 저장하고 인덱스 구축 명령을 다시 실행하면 ChineseTextSplitter가 적용됩니다.

최적화 2: 중국어 프롬프트 사용

초기화 후 prompts 디렉토리의 네 가지 프롬프트 파일은 모두 영어로 작성되어 있으며, LLM에 영어 출력을 요구합니다.

중국어 콘텐츠를 더 잘 처리하기 위해 gpt-4o 모델을 사용하여 네 개의 프롬프트를 중국어로 번역하고, LLM이 중국어로 결과를 출력하도록 수정했습니다.

프롬프트를 직접 수정하려면 파일 이름과 출력 키 필드 및 형식을 변경하지 않도록 주의해야 합니다. 그렇지 않으면 GraphRAG가 정상적으로 동작하지 않을 수 있습니다.

최적화 3: 모델 호출

GraphRAG는 기본적으로 OpenAI 모델을 사용하며, 이는 중국어 지원에 최적화되어 있지 않습니다. 중국어 지원을 위해 bigmodel을 사용합니다. 이 모델은 중국 AI 기업 Zhipu AI에서 제공합니다.

최적화 4: 모델 선택

GraphRAG는 기본적으로 gpt-4o 모델을 사용하지만, 중국어 지원 개선을 위해 glm-4-plus 모델을 선택했습니다.

인덱스 구축

  1. 다음 명령어를 실행하면 GraphRAG가 지정된 경로에서 .envsettings.yaml을 로드하고 설정에 따라 인덱스를 구축합니다.
python -m graphrag.index --root ./graphrag-practice-chinese

현재 경로가 graphrag-practice-chinese인 경우:

python -m graphrag.index --root ./

지정된 경로에 설정 파일이 있고 api_key가 올바르게 설정되어 있는지 확인해야 합니다.

사용자 정의 샘플 데이터:

GraphRAG는 기본적으로 input 디렉토리의 txt 파일을 인덱싱합니다. 파일 경로나 유형을 변경하려면 settings.yamlinput 부분을 수정합니다.

주의! GraphRAG는 `txt` 또는 `csv` 파일만 지원하며, 인코딩은 `utf-8`이어야 합니다.

<홍루몽> 원문을 사용하므로 settings.yamlbase_dirinput/hongloumeng으로 수정했습니다.

# ... 기타 설정 동일 ...
input:
  type: file # 또는 blob
  file_type: text # 또는 csv
  base_dir: "input/hongloumeng"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"
# ... 기타 설정 동일 ...

<홍루몽> 원문 파일은 hongloumeng-txt 프로젝트에서 다운로드하여 input/hongloumeng 디렉토리에 저장할 수 있습니다.

  1. 구축 과정에서 outputcache 디렉토리가 자동으로 생성됩니다.
  2. 인덱스 구축이 완료되면 "All workflows completed successfully" 메시지가 표시됩니다. (GPU가 없으면 시간이 오래 걸릴 수 있습니다.)

쿼리 테스트

글로벌 쿼리

python -m graphrag.query --root ./graphrag-practice-chinese --method global "이야기의 주제는 무엇인가요?"

결과 예시:

SUCCESS: Global Search Response:
《홍루몽》의 주제는 가, 왕, 사, 설 사대 가문의 흥망성쇠를 통해 봉건 사회의 다양한 모순과 갈등을 묘사하고, 봉건 사회의 부패와 쇠퇴를 드러내는 것입니다. 이야기는 복잡한 인물 관계를 통해 당시 사회의 풍습과 도덕 관념을 반영합니다. 소설은 보옥, 대옥, 보채 등 주요 인물의 비극적인 사랑을 통해 인간성, 운명, 사회 관계 등의 주제를 탐구하고, 봉건 예교와 제도에 대한 비판을 나타냅니다.

또한 소설은 인생, 운명, 사랑, 결혼 등의 주제를 탐구하며, 작가의 삶과 사회에 대한 깊은 사색을 반영합니다. 가보옥, 임대옥, 설보채 등 주요 인물의 형상을 통해 봉건 사회에서 인간성의 복잡성과 비극성을 보여주고, 인간성의 빛과 어두움을 드러냅니다. 이야기의 인물 운명과 가문의 흥망은 당시 사회의 현실을 반영하는 동시에, 작가의 아름다운 인간성에 대한 추구와 이상 사회에 대한 염원을 표현합니다.

종합하면, 《홍루몽》의 주제는 봉건 사회의 부패와 쇠퇴를 드러낼 뿐만 아니라, 인간성, 운명, 사회 관계 등의 주제를 탐구하며 깊은 사상적 함의와 예술적 가치를 지닙니다.

로컬 쿼리

python -m graphrag.query --root ./graphrag-practice-chinese --method local "가모가 보옥에게 어떤 태도를 보이나요?"

결과 예시:

SUCCESS: Local Search Response:
가모의 보옥에 대한 태도는 여러 측면에서 요약할 수 있습니다:

1.  **애정과 관심:** 가모는 보옥을 깊이 애정합니다. 《홍루몽》에서 가모는 여러 번 보옥을 방문하고, 직접 정원에 와서 그를 돌보며 관심과 사랑을 보여줍니다. 예를 들어, 가모는 왕부인과 함께 보옥을 방문하여 그의 병세를 묻습니다(Data: Entities (4704, 2929, 3895, 5470, 5868)).

2.  **총애와 관용:** 가모는 보옥의 행동에 관대합니다. 보옥은 고집스럽고 때로는 터무니없는 성격이지만, 가모는 항상 너그럽게 대합니다. 예를 들어, 가모가 보옥의 유모 "늙은 것"을 꾸짖는 장면은 그녀의 총애를 드러냅니다(Data: Relationships (528, 2124)).

3.  **기대와 교육:** 가모는 보옥을 총애하지만, 그의 교육에도 관심을 둡니다. 가모는 보옥의 교육과 성장에 주목합니다(Data: Entities (2702, 5524, 5868)).

4.  **감정 교류:** 가모와 보옥은 깊은 감정적 유대감을 공유합니다. 가모는 보옥의 신체 건강뿐만 아니라 심리 상태에도 관심을 가지며, 둘 사이의 깊은 정을 보여줍니다(Data: Sources (607, 314, 481)).

종합하면, 가모의 보옥에 대한 태도는 애정, 관심, 총애, 관용과 함께 기대와 교육을 포함하는 복잡한 감정 관계입니다.

글로벌 쿼리와 로컬 쿼리의 차이

특징 로컬 검색 (Local Search) 글로벌 검색 (Global Search)
검색 범위 특정 엔티티를 시작점으로 함 사전 계산된 엔티티 커뮤니티 요약 기반
검색 방법 엔티티 임베딩 및 그래프 탐색 사용 각 커뮤니티에 질문하고 답변을 집계
적용 시나리오 특정 엔티티에 대한 정밀 쿼리 광범위한 주제 질문
성능 단순 작업에 더 효율적 복잡한 다단계 쿼리에 적합
복잡성 상대적으로 낮음 높음, 더 많은 계산 리소스 필요
응답 속도 일반적으로 더 빠름 쿼리 복잡성에 따라 느릴 수 있음
통찰 깊이 보통 더 깊음, 맥락과 관계를 더 포괄적으로 이해
토큰 사용량 낮음 높음, 여러 번의 LLM 호출로 인해
구현 의존성 벡터 검색 및 그래프 탐색 사전 계산된 커뮤니티 요약 및 여러 번의 LLM 호출
최적 사용 사례 빠르고 직접적인 답변이 필요한 경우 심층 통찰과 복잡한 추론이 필요한 시나리오

태그: GraphRAG GLM-4 검색증강생성 중국어처리 LLM

6월 10일 20:38에 게시됨