---
tags: [plans, rag, robeing, pgvector, jsonb, postgres, schema]
type: plans
status: closed
closed_date: 2026-03-22
closed_reason: 200개 대상 PGVector 적재 + tsvector + 하이브리드 검색 + AGE 그래프 모두 구현·검증 완료
depends_on: 260320_다형식문서_RAG_1차_MD_메타_정규화_계획.md
closing_criteria: front matter와 청크를 PostgreSQL JSONB·pgvector 구조로 적재해 검색 가능 상태로 만든다
---

# 260320 다형식문서 RAG 2차 PGVector·JSONB 적재 계획

## 목적

- 1차에서 생성한 MD와 메타를 PostgreSQL 중심 저장 구조로 적재한다.
- 2차 범위는 설계 별칭 `document_files`, `document_chunks`에 해당하는 운영 실체 `team_document`, `team_document_chunk`에 문서와 청크를 저장하고, PGVector 검색을 붙이는 것이다.

## 참조 문서

- [PGVector·JSONB RAG 스키마 설계 리서치](../research/rag/260320_PGVector_JSONB_RAG_스키마_설계_리서치.md)
- [Front Matter 메타데이터 설계 리서치](../research/rag/260320_FrontMatter_메타데이터_설계_리서치.md)

## 범위

- MD 파생본 읽기
- front matter -> JSONB 적재
- 본문 청크 분리
- 청크별 임베딩 생성
- PGVector 인덱스 구성
- 키워드 검색용 TSVECTOR 구성

## 실제 구현 현황 (코드 기준)

### 이미 존재하는 테이블 (신규 생성 불필요)
- `team_document`: 문서 단위 관리 (id, team_id, filename, file_hash, storage_path, text_content, chunk_count, processing_status, metadata JSONB)
- `team_document_chunk`: 청크 단위 관리 (id, team_id, document_id, chunk_text, embedding vector(768), metadata JSONB)
- 인덱스: HNSW cosine(embedding), GIN(metadata), compound(team_id+document_id)

### 구현 완료
- 문서/청크 테이블 분리 ✅
- JSONB 메타데이터 ✅
- PGVector 768차원 + HNSW cosine 인덱스 ✅
- 벡터 유사도 검색 (`PostgresDocumentVectorStore.search()`) ✅
- 하이브리드 인덱싱 (PDF 바이너리 직접 + 텍스트 fallback) ✅
- file_hash 기반 중복 방지 ✅
- 200개 파일 인덱싱 스크립트 (`reindex_companyx_latest_200.py`) ✅

### 2026-03-22 기준 구현 반영
- `team_document_chunk.tsv` + GIN 인덱스 + 자동갱신 트리거 구현 완료
- 하이브리드 검색(vector + keyword + graph) 및 RRF 정규화 구현 완료
- `rb8001` grounding 서비스가 `search_mode=hybrid`로 이 검색 경로를 사용 중
- 리랭킹 전용 계층은 아직 없음

### 핵심 코드 경로
- 인덱싱: `skill-rag-file/app/services/indexing_pipeline.py` → `embedding.py` → `postgres_vector_store.py`
- 검색: `skill-rag-file/app/api/search.py` → `postgres_vector_store.search()`
- 그라운딩: `rb8001/app/services/companyx_grounding_service.py`

## 산출물

- ~~PostgreSQL 스키마~~ → 이미 존재 (`team_document`, `team_document_chunk`)
- ~~적재 배치 스크립트~~ → 이미 존재 (`reindex_companyx_latest_200.py`)
- ~~tsvector 컬럼 + GIN 인덱스 추가 마이그레이션~~ → 구현 완료
- ~~하이브리드 검색 구현~~ → 구현 완료
- 설계 별칭과 운영 테이블명 차이를 설명하는 정합화 문단

## 완료 조건

- 벡터 검색 + 키워드 검색이 모두 동작한다.
- source_path/file_hash 기준 중복 적재 방지가 된다.
- 재적재 시 변경 문서만 갱신할 수 있다.

## 현재 상태 (260320)

- `team_document`: Company X 1,121건 completed, 51건 processing
- `team_document_chunk`: 3,095건 (768차원 임베딩, HNSW cosine 인덱스)
- 인덱싱 스크립트: `skill-rag-file/scripts/reindex_companyx_latest_200.py`
- 200개 대상 파일 리스트: `/tmp/latest_200_companyx.txt`
- 텍스트 추출 + 청크 + Gemini Embedding 2 적재 완료

## 현재 상태 보정 (2026-03-22)

- `team_document` Company X 기준 1,174건, `team_document_chunk` 3,474건이다.
- `tsvector + GIN`, `vector/keyword/hybrid 검색`, `Apache AGE graph_score 합산`은 모두 구현됐다.
- 이 문서에서의 `document_files`, `document_chunks`는 설계 별칭이고, 운영 실제는 `team_document`, `team_document_chunk`다.

## Unresolved

- 200개 샘플 수준을 넘어 2천/5천/1만 건 확장 시 적재 속도와 실패 격리 기준이 아직 문서화되지 않았다.
- 삭제·이동·재처리 시 `team_document`와 MD, 그래프를 어떤 순서로 동기화할지 운영 계약이 부족하다.
- 리랭킹 계층과 대량 재색인 품질 게이트는 아직 별도 정의가 없다.

## 보류

- OCR 보강
- 관계 그래프 확장
- 로빙 런타임 직접 연결
