docs: RAG 계획 4건 코드 현실 반영 — 기존 테이블/구현 상태/미구현 항목 명시
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
25db212d80
commit
bae070c352
@ -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)
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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`
|
||||
|
||||
@ -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에서 흡수한 항목
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user