docs: RAG 계획 4건 코드 현실 반영 — 기존 테이블/구현 상태/미구현 항목 명시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
happybell80 2026-03-20 17:48:33 +09:00
parent 25db212d80
commit bae070c352
4 changed files with 66 additions and 43 deletions

View File

@ -21,28 +21,24 @@
- 최소 front matter 생성
- 기본 설명/요약 placeholder 생성
## 최소 front matter
## 실제 front matter (구현 기준)
- `title`
- `source_path`
- `md_path`
- `file_type`
- `modified_at`
- `status`
- `text_length`
- `summary`
- `title`, `source_path`, `md_path`, `file_type`, `file_size`, `modified_at`, `status`, `text_length`, `summary`
- 파일명 규칙: `원본파일명_확장자.md`
- 디렉터리: 원본 폴더 구조 1:1 미러링
## 산출물
- 원본 구조를 반영한 MD 파생본 디렉터리
- 최소 front matter가 붙은 MD 파일
- 처리 실패/스킵 목록
- ~~원본 구조를 반영한 MD 파생본 디렉터리~~`6.Company X_md/` 이미 존재
- ~~최소 front matter가 붙은 MD 파일~~ → 48,906개 생성 완료
- 처리 실패/스킵 목록 → 미확인
## 완료 조건
- 샘플 100~500개 파일에서 MD 생성 성공률을 확인한다.
- 주요 확장자별로 최소 한 번 이상 MD 생성이 검증된다.
- 원본 경로와 MD 경로의 1:1 대응이 보장된다.
- ~~샘플 100~500개 파일에서 MD 생성 성공률을 확인한다.~~ → 48,906개 생성됨
- ~~주요 확장자별로 최소 한 번 이상 MD 생성이 검증된다.~~ → pdf/hwp/xlsx/pptx/docx 확인
- ~~원본 경로와 MD 경로의 1:1 대응이 보장된다.~~ → 원본 53,336 vs MD 48,906 (차이 원인 확인 필요)
- 본문 텍스트 추출 (48,744건이 text_length: 0)
## 현재 상태 (260320)

View File

@ -19,23 +19,43 @@
- PGVector 인덱스 구성
- 키워드 검색용 TSVECTOR 구성
## 핵심 결정
## 실제 구현 현황 (코드 기준)
- 문서 테이블과 청크 테이블은 분리한다.
- front matter는 JSONB로 적재한다.
- 의미 검색과 키워드 검색을 모두 지원한다.
- 아직 관계형 연결은 최소로 둔다.
### 이미 존재하는 테이블 (신규 생성 불필요)
- `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`) ✅
### 미구현
- `team_document_chunk`에 tsvector 컬럼 없음 → **키워드 검색(TSVECTOR + GIN) 추가 필요**
- 하이브리드 검색(벡터+키워드 RRF 합산) 없음
- 리랭킹 없음
### 핵심 코드 경로
- 인덱싱: `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 스키마
- 적재 배치 스크립트
- 샘플 질의 결과
- ~~PostgreSQL 스키마~~ → 이미 존재 (`team_document`, `team_document_chunk`)
- ~~적재 배치 스크립트~~ → 이미 존재 (`reindex_companyx_latest_200.py`)
- tsvector 컬럼 + GIN 인덱스 추가 마이그레이션
- 하이브리드 검색 구현
## 완료 조건
- 샘플 문서셋에서 메타 필터 + 벡터 검색이 동작한다.
- source_path 기준 중복 적재 방지가 된다.
- 벡터 검색 + 키워드 검색이 모두 동작한다.
- source_path/file_hash 기준 중복 적재 방지가 된다.
- 재적재 시 변경 문서만 갱신할 수 있다.
## 현재 상태 (260320)

View File

@ -14,10 +14,16 @@
- OCR 후보 선별
- OCR 결과를 기존 MD와 DB에 누적
- `document_relations` 생성
- ~~`document_relations` 생성~~ → Apache AGE 그래프로 대체
- 파일 변경 감지 및 재처리
- soft delete 반영
## 실제 코드 현황
- OCR: 미구현. 현재 인덱싱은 텍스트 추출 + PDF 바이너리 직접 임베딩만.
- 관계: 미구현. Neo4j 컨테이너 존재하나 2개월 전 중지됨. Apache AGE로 방향 변경.
- 동기화: 외부→내부 NAS cron 있음. NAS→DB 자동 인덱싱은 없음 (수동 스크립트만).
## 관계 생성 우선순위
1. front matter `related`

View File

@ -34,33 +34,34 @@
## 적용 범위
- `rb8001`
- 필요시 `skill-rag-file`
- 문서 회수와 근거 응답에 필요한 최소 질의 경로
- `rb8001` (`companyx_grounding_service.py`)
- `skill-rag-file` (`search.py`, `postgres_vector_store.py`)
- `skill-embedding` (Gemini Embedding 2 게이트웨이)
## 최소 동작 흐름
## 이미 구현된 질의 흐름 (코드 기준)
1. 사용자 질문 수신
2. 메타 필터 후보 결정
3. PGVector 벡터 검색 (의미 검색)
4. TSVECTOR 키워드 검색 (정확 매칭)
5. 벡터+키워드 하이브리드 점수 합산 (RRF 등)
6. Apache AGE 그래프 관계 확장
7. 근거 청크 선택
8. 로빙 응답 생성
9. 사용한 근거 기록
1. 사용자 질문 수신 → `should_handle_companyx_grounding()` 인텐트 판정
2. 질문 유형 분류 → `_classify_question_type()` (설명/사실확인/수치/재정리)
3. 멀티쿼리 생성 → `_build_query_candidates()` (7~9개 변형)
4. 벡터 검색 → `_search_companyx_documents()` (PGVector cosine)
5. LLM 근거 검증 → `_call_llm_companyx_grounding()` + Pydantic 검증
6. 응답 생성 → `CompanyXRAGOutput` (direct_answer, evidence_docs, failure_reason)
## 1차 목표
## 추가 필요한 검색 경로
- 로빙이 "찾아보겠습니다" 수준이 아니라 실제 근거 문서를 제시하게 한다.
- 근거 문서명, 경로, 핵심 문단을 응답에 포함하게 한다.
- retrieval 실패와 generation 실패를 분리해 로그에 남긴다.
| 검색 방식 | 현재 | 목표 |
|-----------|------|------|
| PGVector 벡터 검색 | ✅ 구현됨 | 유지 |
| TSVECTOR 키워드 검색 | ❌ 미구현 | 추가 |
| 하이브리드 점수 합산 (RRF) | ❌ 미구현 | 추가 |
| Apache AGE 그래프 관계 확장 | ❌ 미설치 | 추가 |
## 샘플 검증 질문
- 계약/MOU 근거 질문
- 특정 프로그램 운영 근거 질문
- 보고서 내 수치/표 근거 질문
- 260315 재오픈 질문 20개 (예: `오늘전통 프로그램을 Company X가 옐로펀치랑 같이 운영한다는 근거 있어?`)
## 260315에서 흡수한 항목