docs: 트러블 보정 + 리서치(원인 3건) + 계획(P0 파일명검색 + P1 맥락전달)
- A1: 이미지 PDF chunk_text OCR 깨짐 → 파일명 보조 검색으로 해소 - B: grounding 독립 검색 → 이전 결과 컨텍스트 전달 - 테스트 결과 A 5건 기록 (3 PASS, 2 FAIL) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
624e563372
commit
d625a41ef8
45
journey/plans/260322_검색품질2차_파일명보조검색_대화맥락전달_계획.md
Normal file
45
journey/plans/260322_검색품질2차_파일명보조검색_대화맥락전달_계획.md
Normal file
@ -0,0 +1,45 @@
|
||||
---
|
||||
type: plans
|
||||
tags: [plans, rag, companyx, search-quality, context]
|
||||
status: open
|
||||
depends_on: 260321_하이브리드검색_품질개선_계획.md
|
||||
closing_criteria: A1 고유번호증 검색 적중 + B1 후속 질문 답변 성공 + 기존 PASS 회귀 없음
|
||||
---
|
||||
|
||||
# 260322 검색 품질 2차 — 파일명 보조 검색 + 대화 맥락 전달
|
||||
|
||||
## 목적
|
||||
|
||||
- A1(이미지 PDF 검색 미적중)을 파일명 기반 보조 검색으로 해소한다.
|
||||
- B 유형(대화 맥락 미연결)을 이전 grounding 결과 전달로 해소한다.
|
||||
|
||||
## 원인 → 조치 매핑
|
||||
|
||||
| # | 원인 | 조치 | 서버 | 우선순위 |
|
||||
|---|------|------|------|----------|
|
||||
| 1 | 이미지 PDF chunk_text가 깨져서 키워드/벡터 검색 모두 실패 | `team_document.filename` 기반 보조 키워드 매칭 추가 | 24 (skill-rag-file) | P0 |
|
||||
| 2 | 후속 질문에서 이전 검색 결과 미참조 | `try_companyx_grounding()`에 이전 grounding 결과(문서명 목록) 전달 | 24 (rb8001) | P1 |
|
||||
|
||||
## 작업 상세
|
||||
|
||||
### P0: 파일명 보조 검색
|
||||
|
||||
- `postgres_vector_store.py`의 `hybrid_search()` 또는 별도 메서드에서 `team_document.filename ILIKE '%쿼리키워드%'` 결과를 RRF에 합산
|
||||
- 벡터/키워드 검색이 못 잡는 이미지 PDF를 파일명으로 보완
|
||||
- 기존 검색 결과와 RRF 합산하므로 회귀 위험 낮음
|
||||
|
||||
### P1: 대화 맥락 전달
|
||||
|
||||
- `message_service.py`에서 이전 grounding 결과의 `grounding_doc_ids`와 `message`를 저장
|
||||
- 후속 `try_companyx_grounding()` 호출 시 이전 문서명 목록을 컨텍스트로 전달
|
||||
- LLM 프롬프트에 "이전 대화에서 참조한 문서: [목록]" 추가
|
||||
|
||||
## 검증 기준
|
||||
|
||||
- A1: "고유번호증 보여줘" → 고유번호증 파일 기반 답변
|
||||
- B1: "서면의결서 찾아줘" → 성공 → "이 문서 내용 말해줘" → 성공
|
||||
- 기존 16개 샘플 PASS 유지
|
||||
|
||||
## 닫는 조건
|
||||
|
||||
- A1 + B1 통과 + 기존 회귀 없음
|
||||
42
journey/research/rag/260322_검색미적중_PDF바이너리청크품질_대화맥락_리서치.md
Normal file
42
journey/research/rag/260322_검색미적중_PDF바이너리청크품질_대화맥락_리서치.md
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
type: research
|
||||
tags: [research, rag, companyx, search-quality, pdf, context]
|
||||
status: open
|
||||
research_target: A1/A3 검색 미적중 원인과 B 유형 대화 맥락 미연결 원인 확정
|
||||
---
|
||||
|
||||
# 260322 검색 미적중·PDF 바이너리 청크 품질·대화 맥락 리서치
|
||||
|
||||
## 목적
|
||||
|
||||
- 테스트셋 A1(고유번호증), A3(오늘전통 사업계획서) 검색 실패의 직접 원인을 확정한다.
|
||||
- B 유형(대화 맥락 미연결)의 구조적 원인을 확인한다.
|
||||
|
||||
## 사실 (Facts)
|
||||
|
||||
### 1. A1: 고유번호증 검색 미적중
|
||||
|
||||
- 파일 `고유번호증_컴퍼니엑스 IP 투자조합 9호.pdf`는 인덱싱 완료 (doc_id `4aa6f0e8`)
|
||||
- 검색 "컴퍼니엑스 IP 투자조합 9호 고유번호증"으로 top-5에 미등장
|
||||
- chunk_text 내용: OCR 깨진 문자열 (`단 제 & 대표자 성명 er 피 발 급 사 유...`)
|
||||
- **원인**: PDF 바이너리 임베딩 경로에서 `_build_preview_text()`가 텍스트 추출 결과를 chunk_text에 넣는데, 이미지 PDF의 경우 OCR이 없어서 깨진 문자열이 들어감. 키워드 "고유번호증"이 tsv 토큰에 정상으로 안 들어가고, 임베딩도 깨진 텍스트 기반이라 쿼리와 거리가 멂.
|
||||
|
||||
### 2. A3: 오늘전통 사업계획서 검색 실패
|
||||
|
||||
- `companyx_todaytradition.pdf`가 검색 1위로 잡히지만, 이 파일이 "오늘전통 6기 2차년도 사업계획서"인지 불명
|
||||
- `1_원차_사업계획서(예산수정)_260317.pdf`가 5위에 잡히지만 파일명에 "오늘전통 6기"가 없음
|
||||
- **원인**: 200개 파일에 "오늘전통 6기 사업계획서" 제목의 문서가 없거나, 있어도 파일명·내용이 다르게 인덱싱됨
|
||||
|
||||
### 3. B 유형: 대화 맥락 미연결
|
||||
|
||||
- `try_companyx_grounding(user_id, message)`는 매번 `message`만 받음
|
||||
- 이전 대화의 검색 결과, 문서명, 답변 내용을 후속 호출에 전달하는 경로 없음
|
||||
- `message_service.py`에서 `save_message_conversation()`으로 대화를 저장하지만, 다음 grounding 호출에서 이전 대화를 읽지 않음
|
||||
|
||||
## 원인 요약
|
||||
|
||||
| 유형 | 직접 원인 | 해결 방향 |
|
||||
|------|----------|----------|
|
||||
| A1 (검색 미적중) | 이미지 PDF의 chunk_text가 OCR 깨진 문자열 | OCR 보강 또는 파일명 기반 키워드 보조 검색 |
|
||||
| A3 (내용 불일치) | 200개에 해당 문서 미포함 또는 파일명 불일치 | 인덱싱 범위 문제 (200개 한계) |
|
||||
| B (맥락 미연결) | grounding이 매번 독립 검색, 이전 대화 미참조 | 이전 grounding 결과를 후속 호출에 컨텍스트로 전달 |
|
||||
@ -4,7 +4,7 @@ tags: [companyx, rag, grounding, llm, context, rb8001]
|
||||
status: open
|
||||
opened_date: 2026-03-22
|
||||
severity: high
|
||||
root_cause:
|
||||
root_cause: A 유형은 LLM 과보수가 아니라 검색 미적중(고유번호증 top-5 미등장) + 파일명-질문 불일치. B 유형은 grounding이 매번 독립 검색이라 이전 대화 맥락 참조 불가.
|
||||
---
|
||||
|
||||
# 260322 Company X RAG LLM 판단 과보수 + 대화 맥락 미연결
|
||||
@ -46,11 +46,37 @@ root_cause:
|
||||
| C2 | 점심 뭐 먹을까? | 일반 챗봇 응답 (grounding failure → fallback) | 라우팅 완화 후 경계 |
|
||||
| C3 | 고유번호증이 뭐야? 일반적으로 설명해줘 | 일반 지식 답변 (grounding 아님) | 내부 문서 아닌 일반 질문 |
|
||||
|
||||
## 테스트 결과 (260322)
|
||||
|
||||
### A. LLM 판단 과보수
|
||||
|
||||
| # | 질문 | 결과 | 직접 원인 |
|
||||
|---|------|------|----------|
|
||||
| A1 | 고유번호증 보여줘 | **FAIL** | 고유번호증 파일이 검색 top-5에 미등장. LLM 문제가 아니라 검색 문제 |
|
||||
| A2 | 다리마티 계약 조건 | **PASS** | |
|
||||
| A3 | 오늘전통 사업계획서 요약 | **FAIL** | companyx_todaytradition.pdf가 잡히지만 "6기 사업계획서" 내용이 아님 |
|
||||
| A4 | 관리보수 비교 | **PASS** | |
|
||||
| A5 | 재무상태표 수치 | **PASS** | |
|
||||
|
||||
**A 유형 결론**: LLM이 과보수적인 게 아니라, 검색이 관련 문서를 못 찾거나 무관한 문서를 찾아주는 것. LLM은 제공된 컨텍스트 기준으로 올바르게 판단하고 있음.
|
||||
|
||||
### B. 대화 맥락 — 미테스트 (A 유형 원인 확정 후 별도 진행)
|
||||
|
||||
### C. 경계 — 미테스트
|
||||
|
||||
## 확정된 원인
|
||||
|
||||
1. **A1**: 고유번호증 PDF가 바이너리 임베딩 경로로 인덱싱되어 chunk_text가 OCR 깨진 문자열. 키워드 "고유번호증"이 tsv에 정상 토큰으로 안 들어감
|
||||
2. **A3**: 검색은 되지만 파일명·내용이 질문과 불일치. "오늘전통 6기"를 특정하는 문서가 200개에 포함되어 있지 않을 가능성
|
||||
3. **B 유형**: grounding이 `try_companyx_grounding()` 단일 호출로 매번 독립 검색. 이전 대화의 검색 결과·문서명을 후속 질문에 전달하는 경로 없음
|
||||
|
||||
## 관련 파일
|
||||
|
||||
- `rb8001/app/services/companyx_grounding_service.py`: `_call_llm_companyx_grounding()`, `_build_grounded_response()`
|
||||
- `rb8001/app/services/message_service.py`: 대화 맥락 전달 경로
|
||||
- `skill-rag-file/app/services/indexing_pipeline.py`: PDF 바이너리 임베딩 경로의 chunk_text 품질
|
||||
|
||||
## 관련 문서
|
||||
|
||||
- [260322 답변 품질 트러블 (닫힘)](./260322_companyx_rag_답변품질_장황_무관문서혼입_점수노출.md)
|
||||
- [260321 하이브리드 검색 품질 개선 계획 (닫힘)](../plans/260321_하이브리드검색_품질개선_계획.md)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user