공공기관 내부규정 문서 3종(10장 이내)을 대상으로 구조 인식 계층형 청킹 → Supabase(pgvector) 적재 → Naive RAG / Advanced RAG(Jina Re-Rank) 비교 질의응답을 구현한 과제 프로젝트입니다.
| 요건 | 구현 내용 |
|---|---|
| 문서 | 공공기관 내부규정 양식 문서 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 키 하나로 처리합니다.
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 답변
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtcp .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 키 확인 (무료 크레딧) | 임베딩 + 리랭크 겸용 |
Supabase Dashboard → SQL Editor에서 sql/setup_regulation_chunks.sql 전체를 실행합니다.
| 순서 | 노트북 | 하는 일 |
|---|---|---|
| 1 | notebooks/01_구조인식_청킹.ipynb |
규정 문서를 조 단위로 청킹 → chunks_regulation.json |
| 2 | notebooks/02_임베딩_supabase적재.ipynb |
Jina 임베딩 생성 후 Supabase 적재 + 검색 테스트 |
| 3 | notebooks/03_RAG_질의응답.ipynb |
Naive RAG vs Advanced RAG 비교 질의응답 |
규정·법령 문서는 조(條)가 자연스러운 의미 단위입니다. 고정 길이 청킹은 조항 중간을 자르고, Semantic 청킹은 "제8조"라는 구조 정보를 잃습니다. 이 프로젝트는:
- 마크다운 구조(
# 문서명,## 제N장,**제N조(제목)**)를 파싱해 조 단위로 분할 - 각 청크에
문서명 > 장 > 조번호(조제목)계층 경로를 메타데이터로 저장 - 경로를 본문 앞에 붙인 텍스트를 임베딩 — "② 처리기간을 연장한 때에는…" 같은 조각도 어느 규정의 어떤 조항인지 벡터에 반영됨 (Contextual Chunk)
| 구분 | Naive RAG | Advanced RAG |
|---|---|---|
| 검색 쿼리 | 원 질문 1개 | LLM이 재작성한 멀티쿼리 3개 |
| 후보 선택 | 벡터 유사도 top 4 | 후보 ~30개 → jina-reranker-m0 재랭킹 top 4 |
| 강점 | 단순, 빠름, 저비용 | 질문 표현이 규정 어휘와 달라도 검색됨, 근거 정밀도 향상 |
├── 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 키를 저장소에 올리지 마세요.