# RAG 검색 응답 키 불일치 수정 (chunk_text vs content)

**날짜**: 2025-11-22
**작성자**: Claude
**관련 파일**:
- `rb8001/app/services/ir_analyzer.py`
- `skill-rag-file/app/models/requests.py`
- `skill-rag-file/app/api/search.py`

**관련 문서**:
- `251122_happybell80_chromadb_dimension_mismatch.md`
- `251122_coldmail_extraction_improvement_tdd.md`

---

## 문제 상황

차원 불일치(384→768) 해결 및 재인덱싱 완료 후에도 IR 분석 결과 모든 필드 N/A.

**실제 파일 테스트**: `650c305b-e45a-4ff4-8bcb-87096f804605` (team `79441171-3951-4870-beb8-916d07fe8be5`)
- ChromaDB 컬렉션: 731개 청크 존재
- RAG 검색 시 결과 0건
- LLM에 빈 입력 전달 → N/A

---

## 원인 분석

### 1. skill-rag-file API 응답 형식
- **requests.py:25**: `SearchResult.chunk_text` 필드 정의
- **search.py:55**: `chunk_text=doc` 로 텍스트 반환
- 응답: `{"results": [{"chunk_text": "내용", ...}], ...}`

### 2. ir_analyzer 파싱 로직
- **ir_analyzer.py:47**: `r.get("content", "")` 로 읽기 시도
- `chunk_text` ≠ `content` → 빈 문자열 반환
- `raw_results = {}` → LLM에 `{}` 전달 → N/A

---

## 해결 방안

**ir_analyzer.py:47**: `content` → `chunk_text` 키 수정

```python
# 변경 전
return "\n".join([r.get("content", "") for r in results])

# 변경 후
return "\n".join([r.get("chunk_text", "") for r in results])
```

---

## 구현 완료

**커밋**: `8feea8b` - fix: read chunk_text from rag search results
**수정 파일**: `rb8001/app/services/ir_analyzer.py:47`

**검증 필요**: 재인덱싱 완료 후 실제 파일 테스트
```bash
docker exec -i rb8001 python3 /code/scripts/test_ir_extraction_real_file.py \
  650c305b-e45a-4ff4-8bcb-87096f804605 79441171-3951-4870-beb8-916d07fe8be5
```

---

## 교훈

### API 스펙 확인 부족
- skill-rag-file 통합 시 응답 형식 추측으로 구현 (`content` 키 사용)
- 실제 스펙: `SearchResult` 모델의 `chunk_text` 필드
- 교훈: 스킬 통합 전 Pydantic 모델 또는 API 문서 직접 확인 필수

### 연쇄 문제 해결 시 중간 검증
- 차원 불일치 해결 → 재인덱싱 → 여전히 N/A
- 각 단계마다 실제 API 응답 확인 필요 (ChromaDB 로그, API 응답 출력)
- 교훈: 문제 해결 후 실제 데이터 흐름 검증으로 숨은 문제 조기 발견
