말씀선집 GraphRAG 연구/DB 구축 방향
DB 구축 방향
이 문서는 말씀선집 GraphRAG 연구를 실제 검색 시스템으로 구현하기 위한 1차 데이터베이스 설계 방향과 파이프라인 구조를 정리한다.
목적
목표는 말씀선집 전체를 권, 페이지, 제목, 본문 단위로 검색하고, 주제, 인물, 개념 관계를 그래프로 연결하여 질문에 대해 근거 페이지와 함께 답하게 만드는 연구용 GraphRAG 기반 말씀 검색 시스템을 세우는 것이다.
현재 자료 확인
- NAS 경로:
~/ffwpcb/말씀선집 - 실제 마운트 경로:
/run/user/1000/gvfs/smb-share:server=172.30.1.1,share=ffwpcb,user=ffwpcbai/말씀선집 - PDF 수: 615권
- 전체 페이지: 약 207,548쪽
- 전체 용량: 약 765MB
- 샘플 확인:
001권.pdf,615권.pdf - 텍스트 추출:
pdftotext로 본문 추출 가능 - OCR 판단: 1차 단계에서는 OCR 불필요
- 로컬 디스크 여유: 약 52GB
기본 저장 원칙
원본 PDF는 NAS에 그대로 둔다. 로컬에는 원본을 복사하지 않고 다음 산출물만 저장한다.
- 파일 목록과 해시값
- 페이지별 추출 텍스트
- 문단 및 청크 데이터
- 임베딩 벡터
- 키워드 검색 색인
- 지식그래프 노드와 관계
- 처리 로그와 실패 목록
이 방식은 NAS 원본 보존, 로컬 저장공간 절약, 재처리 가능성 확보에 유리하다.
1차 DB 구성안
PostgreSQL + pgvector
1차 연구용 중심 DB로 사용한다.
주요 역할:
- 문서 메타데이터 관리
- 권, 페이지, 청크 저장
- 임베딩 벡터 저장
- 질의 결과의 출처 추적
- 처리 상태 관리
핵심 테이블 후보:
source_files: PDF 파일 경로, 권수, 파일명, 크기, 해시값volumes: 권 단위 메타데이터pages: 권, 페이지 번호, 추출 텍스트sections: 제목, 소제목, 설교 단위 구간chunks: 검색용 본문 청크chunk_embeddings: 청크별 임베딩 벡터ingest_runs: 처리 실행 기록ingest_errors: 추출 실패와 재처리 대상
Neo4j
GraphRAG 고도화 단계에서 추가한다.
주요 역할:
- 인물, 개념, 사건, 장소, 시대, 주제군을 노드로 저장
- 말씀 본문과 핵심 개념의 관계를 연결
- 개념 흐름, 시대별 변화, 주제별 관계망 검색 지원
노드 후보:
VolumePageChunkSermonTitlePersonPlaceConceptDoctrineTermEventEraTopic
관계 후보:
CONTAINSNEXTMENTIONSEXPLAINSCONTRASTS_WITHRELATED_TOBELONGS_TO_TOPICEVIDENCE_OF
OpenSearch + nori analyzer
한국어 전문검색 고도화 단계에서 검토한다.
정확한 용어 검색이 중요한 이유:
- 참부모
- 복귀섭리
- 천지인부모
- 원구피스컵
- 탕감
- 재림
이런 용어는 의미 검색보다 키워드 검색이 더 정확한 경우가 많다. 따라서 벡터 검색만으로 가지 않고 키워드 검색과 결합한다.
권장 구축 순서
처음부터 615권 전체를 넣지 않는다. 먼저 앞, 중간, 뒤 표본으로 파이프라인 품질을 확인한다.
1단계: 샘플 인벤토리
- 대상:
001권.pdf,615권.pdf, 중간 권수 1-3개 - 파일 경로, 권수, 페이지 수, 파일 크기, 해시값 저장
- 실패 파일과 중복 파일 확인
2단계: 페이지별 텍스트 추출
pdftotext기반 추출- 페이지 단위로 텍스트 저장
- 추출 공백, 깨진 문자, 쪽머리와 쪽번호 패턴 확인
3단계: 구조화
- 권 번호
- PDF 페이지 번호
- 본문 내 인쇄 페이지 번호
- 설교 제목
- 소제목
- 문단
출처 인용을 위해 권과 페이지가 반드시 보존되어야 한다.
4단계: 청크 분할
권장 기본값:
- 청크 크기: 한국어 기준 800-1,200자
- 겹침: 100-200자
- 제목과 페이지 메타데이터를 청크마다 포함
설교 문맥을 보존하기 위해 단순 글자 수 절단보다 문단 기준 분할을 우선한다.
5단계: 임베딩 생성
선택지:
- 빠른 연구용: OpenAI 계열 임베딩 API
- 비용 절감과 로컬화: 한국어 성능이 괜찮은 로컬 임베딩 모델
1차는 샘플 권수만 임베딩하여 검색 품질을 비교한다.
6단계: GraphRAG 추출
LLM을 사용해 청크에서 다음 항목을 추출한다.
- 인물
- 장소
- 핵심 개념
- 섭리 용어
- 사건
- 시대
- 주제
- 개념 간 관계
추출 결과는 바로 확정하지 않고 검수 가능한 후보 그래프로 저장한다.
7단계: 질의응답 테스트
테스트 질의 유형:
- 키워드형: 특정 용어가 나오는 권과 페이지 찾기
- 의미형: 유사한 뜻의 말씀 찾기
- 관계형: A 개념과 B 개념의 연결 설명
- 시대별 변화형: 특정 주제가 권수 흐름에 따라 어떻게 변하는지 확인
- 목회 활용형: 설교 준비를 위한 근거 말씀 찾기
파이프라인 스크립트 구조안
향후 실제 구현 시 다음 구조를 기준으로 둔다.
words-graphrag/
README.md
docker-compose.yml
.env.example
config/
sources.yml
chunking.yml
graph_schema.yml
scripts/
01_inventory.py
02_extract_pages.py
03_normalize_text.py
04_chunk_pages.py
05_embed_chunks.py
06_extract_graph.py
07_load_neo4j.py
08_query_smoke_test.py
sql/
001_init.sql
002_pgvector.sql
003_indexes.sql
data/
extracted/
logs/
samples/
notebooks/
retrieval_quality_check.ipynb
1차 판단
현재 자료는 PDF 텍스트 추출이 가능하고 전체 용량도 크지 않다. 따라서 첫 단계는 OCR이나 대형 인프라가 아니라, 정확한 출처 보존과 샘플 파이프라인 검증이어야 한다.
가장 현실적인 첫 목표는 다음과 같다.
001권,615권, 중간 권수 1-3개를 대상으로 페이지별 추출을 완료한다.- PostgreSQL에 파일, 페이지, 청크 메타데이터를 저장한다.
- pgvector 또는 별도 벡터 저장소에 샘플 임베딩을 넣는다.
- 질문에 대해 “몇 권 몇 쪽” 근거를 돌려주는 RAG를 먼저 만든다.
- 그 다음 Neo4j에 인물, 개념, 주제 관계를 붙인다.
관련 문서
- 말씀선집 GraphRAG 연구/DB 구조 설계와 테스트 결과
- 상위 문서: 말씀선집 GraphRAG 연구
- 로컬 문서:
/home/ruyjin/.openclaw/workspace/project_docs/말씀선집그래프RAG/DB_SETUP_PLAN.md