From bae070c352e8b2aedeb8d2225509f20425ea8b32 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Fri, 20 Mar 2026 17:48:33 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20RAG=20=EA=B3=84=ED=9A=8D=204=EA=B1=B4?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=ED=98=84=EC=8B=A4=20=EB=B0=98=EC=98=81?= =?UTF-8?q?=20=E2=80=94=20=EA=B8=B0=EC=A1=B4=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?/=EA=B5=AC=ED=98=84=20=EC=83=81=ED=83=9C/=EB=AF=B8=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=ED=95=AD=EB=AA=A9=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- ...서_RAG_1차_MD_메타_정규화_계획.md | 26 +++++------- ..._RAG_2차_PGVector_JSONB_적재_계획.md | 40 ++++++++++++++----- ..._3차_OCR_관계확장_동기화_계획.md | 8 +++- ...빙_다형식문서_RAG_적용1_계획.md | 35 ++++++++-------- 4 files changed, 66 insertions(+), 43 deletions(-) diff --git a/journey/plans/260320_다형식문서_RAG_1차_MD_메타_정규화_계획.md b/journey/plans/260320_다형식문서_RAG_1차_MD_메타_정규화_계획.md index 3b7a057..df66bb7 100644 --- a/journey/plans/260320_다형식문서_RAG_1차_MD_메타_정규화_계획.md +++ b/journey/plans/260320_다형식문서_RAG_1차_MD_메타_정규화_계획.md @@ -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) diff --git a/journey/plans/260320_다형식문서_RAG_2차_PGVector_JSONB_적재_계획.md b/journey/plans/260320_다형식문서_RAG_2차_PGVector_JSONB_적재_계획.md index 8b2dbf4..5c14eeb 100644 --- a/journey/plans/260320_다형식문서_RAG_2차_PGVector_JSONB_적재_계획.md +++ b/journey/plans/260320_다형식문서_RAG_2차_PGVector_JSONB_적재_계획.md @@ -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) diff --git a/journey/plans/260320_다형식문서_RAG_3차_OCR_관계확장_동기화_계획.md b/journey/plans/260320_다형식문서_RAG_3차_OCR_관계확장_동기화_계획.md index bb62cd6..e65ac2e 100644 --- a/journey/plans/260320_다형식문서_RAG_3차_OCR_관계확장_동기화_계획.md +++ b/journey/plans/260320_다형식문서_RAG_3차_OCR_관계확장_동기화_계획.md @@ -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` diff --git a/journey/plans/260320_로빙_다형식문서_RAG_적용1_계획.md b/journey/plans/260320_로빙_다형식문서_RAG_적용1_계획.md index fa1328b..e5732d5 100644 --- a/journey/plans/260320_로빙_다형식문서_RAG_적용1_계획.md +++ b/journey/plans/260320_로빙_다형식문서_RAG_적용1_계획.md @@ -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에서 흡수한 항목