---
date: 2026-03-26
subject: IR Deck 평가 빈 응답 문제 해결
status: closed
closed_date: 2026-03-26
closed_reason: max_tokens + response_format + pending/failed 상태 저장 적용으로 해결
---

# IR Deck 평가 빈 응답 문제 해결

## 현상
- LLM evaluation이 빈 응답 반환 → 평가 실패
- 프런트 3분간 무한 폴링 (404)
- "평가 처리 중 오류가 발생했습니다" 표시 불가

## 근본 원인

- **max_tokens=1000**: IR 평가 JSON은 수천 토큰 필요한데 기본값 1000으로 응답 잘림
- **response_format 미사용**: LLM이 서두/마크다운 혼입 가능
- **DB에 상태 없음**: 실패 시 행 자체가 없어 404 무한 폴링
- **LLM 원문 미로깅**: 뭐가 잘려서 실패했는지 알 수 없음

## 수정 내용

### 백엔드 (rb8001)

- `ir_analyzer.py` — `call_llm`에 `max_tokens`, `response_format` 파라미터 추가
- `ir_deck_analyzer.py` — `_evaluate_comprehensive`에서:
  - `max_tokens=4000` (env: `IR_EVAL_MAX_TOKENS`)
  - `response_format={"type": "json_object"}` (JSON 강제)
  - `json.loads` 직접 파싱 (`extract_json_from_text` 제거)
  - JSON 파싱 실패 시 원문 첫 500자 로그
- `ir_valuation_repository.py` — `status` + `error_message` 컬럼 추가, `create_evaluation_pending`, `update_evaluation_status` 함수
- `ir_deck.py` — POST /evaluate에서 즉시 pending INSERT, 실패 시 failed UPDATE, GET에서 pending/failed/completed 분기

### 프런트 (frontend-ir-valuation)

- `useEvaluation.ts` — status 필드 분기 (pending→폴링, failed→중단+"평가 실패", completed→표시)
- 404 3회 연속 시 폴링 중단

### DB

- `ALTER TABLE ir_deck_evaluations ADD COLUMN status VARCHAR(20) DEFAULT 'completed'`
- `ALTER TABLE ir_deck_evaluations ADD COLUMN error_message TEXT`

### 설정

- `/home/admin/robeing/.env` — `DEFAULT_LLM_MAX_TOKENS=1000`, `IR_EVAL_MAX_TOKENS=4000`

## 원칙 반영

- `coding-principles.md` — "비동기 작업의 상태 추적" 원칙 추가
- `infrastructure-ssot-principle.md` — "프로젝트 루트 env 원칙" 추가

## 검증

- evaluation_id=1efaf078 테스트: pending→completed 12초, 67점 C등급
- 이전: 빈 응답 2회 재시도 후 failed
- 이후: JSON 강제 + 4000 토큰으로 정상 완료
