Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RAG 기반 문서 검색·답변 시스템 (공공기관 내부규정 QA)

공공기관 내부규정 문서 3종(10장 이내)을 대상으로 구조 인식 계층형 청킹 → Supabase(pgvector) 적재 → Naive RAG / Advanced RAG(Jina Re-Rank) 비교 질의응답을 구현한 과제 프로젝트입니다.

1. 과제 요건 매핑

요건 구현 내용
문서 공공기관 내부규정 양식 문서 3종, 총 10장 이내 (docs/)
청킹 구조 인식 계층형 청킹 — 조(條) 단위 분할 + 문서명 > 장 > 조 경로를 임베딩 텍스트에 결합 (Contextual Chunk)
Vector DB Supabase pgvector — 기존 실습과 겹치지 않는 regulation_chunks 테이블 / match_regulation_chunks 함수 (sql/)
Chat Model OpenRouter — 결과 생성: openai/gpt-4o-mini (크레딧 없이 실행 시 무료 모델 nvidia/nemotron-3-super-120b-a12b:free + 혼잡 시 예비 모델 자동 전환)
Re-Rank Jina AI jina-reranker-m0 (Rerank API)
RAG 방식 Naive RAG vs Advanced RAG(멀티쿼리 확장 + 재랭킹) 비교

임베딩은 Jina jina-embeddings-v3(1024차원)를 사용해 리랭크와 같은 API 키 하나로 처리합니다.

2. 아키텍처

docs/*.md (내부규정 3종)
   │  01_구조인식_청킹.ipynb        ← 조 단위 청킹 + 계층 경로 결합
   ▼
chunks_regulation.json
   │  02_임베딩_supabase적재.ipynb  ← jina-embeddings-v3 (1024차원)
   ▼
Supabase: regulation_chunks (pgvector)
   │  03_RAG_질의응답.ipynb
   ├─ Naive RAG    : 질문 임베딩 → 벡터 검색 top4 → OpenRouter 답변
   └─ Advanced RAG : 멀티쿼리 3개 → 후보 검색·중복제거
                     → jina-reranker-m0 재랭킹 top4 → OpenRouter 답변

3. 실행 방법

3-1. 설치

python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -r requirements.txt

3-2. API 키 준비 (전부 무료)

cp .env.example .env   # 발급받은 키를 .env에 입력
발급 방법 용도
SUPABASE_URL / SUPABASE_KEY supabase.com 가입 → New Project → Settings → API Vector DB
OPENROUTER_API_KEY openrouter.ai 가입 → Keys 메뉴에서 발급 답변 생성 (기본값이 무료 모델)
JINA_API_KEY jina.ai 가입 → API 키 확인 (무료 크레딧) 임베딩 + 리랭크 겸용

3-3. Supabase 테이블 생성 (최초 1회)

Supabase Dashboard → SQL Editor에서 sql/setup_regulation_chunks.sql 전체를 실행합니다.

3-4. 노트북 순서대로 실행

순서 노트북 하는 일
1 notebooks/01_구조인식_청킹.ipynb 규정 문서를 조 단위로 청킹 → chunks_regulation.json
2 notebooks/02_임베딩_supabase적재.ipynb Jina 임베딩 생성 후 Supabase 적재 + 검색 테스트
3 notebooks/03_RAG_질의응답.ipynb Naive RAG vs Advanced RAG 비교 질의응답

4. 청킹 기법 설명 — 구조 인식 계층형 청킹

규정·법령 문서는 조(條)가 자연스러운 의미 단위입니다. 고정 길이 청킹은 조항 중간을 자르고, Semantic 청킹은 "제8조"라는 구조 정보를 잃습니다. 이 프로젝트는:

  1. 마크다운 구조(# 문서명, ## 제N장, **제N조(제목)**)를 파싱해 조 단위로 분할
  2. 각 청크에 문서명 > 장 > 조번호(조제목) 계층 경로를 메타데이터로 저장
  3. 경로를 본문 앞에 붙인 텍스트를 임베딩 — "② 처리기간을 연장한 때에는…" 같은 조각도 어느 규정의 어떤 조항인지 벡터에 반영됨 (Contextual Chunk)

5. Naive RAG vs Advanced RAG

구분 Naive RAG Advanced RAG
검색 쿼리 원 질문 1개 LLM이 재작성한 멀티쿼리 3개
후보 선택 벡터 유사도 top 4 후보 ~30개 → jina-reranker-m0 재랭킹 top 4
강점 단순, 빠름, 저비용 질문 표현이 규정 어휘와 달라도 검색됨, 근거 정밀도 향상

6. 프로젝트 구조

├── docs/                          # 대상 문서 (공공기관 내부규정 3종)
│   ├── 01_민원응대및처리지침.md
│   ├── 02_공문서작성및관리규정.md
│   └── 03_유연근무제운영지침.md
├── notebooks/
│   ├── 01_구조인식_청킹.ipynb
│   ├── 02_임베딩_supabase적재.ipynb
│   └── 03_RAG_질의응답.ipynb
├── sql/
│   └── setup_regulation_chunks.sql
├── chunks_regulation.json         # 01 노트북 산출물
├── requirements.txt
├── .env.example                   # 실제 키는 .env(비공개)에만 저장
└── README.md

.env.gitignore에 포함되어 커밋되지 않습니다. API 키를 저장소에 올리지 마세요.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages