- Slack Lists 컬럼 조회 API + 동적 매핑으로 하드코딩 제거 - LangGraph 체크포인트 + LLM 기반 에러 분석 노드 추가 - 페이로드 수정 후 재시도 구조 설계 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
3.9 KiB
Coldmail IR 분석 실패 원인 분석
날짜: 2025-10-15 작성자: Claude 관련 파일:
rb8001/app/services/ir_analyzer.pyskill-rag-file/app/api/upload.pyrb8001/app/services/workflows/coldmail_workflow.py
문제 상황
Coldmail 브리핑 (09:05) 실행 시 IR 분석 결과 모든 필드 "N/A" 반환, Slack Lists API에서 400 - invalid_arguments 에러 발생.
참조: 251015_claude_coldmail_workflow_langgraph_test.md
원인 분석
1단계: PDF 업로드 실패
rb8001 로그 (09:05:13): Failed to upload: 400 - File already exists for this team, 0/2 처리 성공
코드 위치: skill-rag-file/app/api/upload.py:62-71
중복 파일 발견 시 HTTPException 발생, document_id 반환하지 않음.
2단계: RAG 검색 실패
skill-rag-file /api/search 테스트 결과: {"results":[],"total_results":0}
team_id 3550cef6-63e1-4ceb-8802-a25c9d1c6917에 업로드된 문서 없음 (DB 조회 0건).
중복 파일이 테스트 중 수동 삭제됨 (251015_claude_coldmail_workflow_langgraph_test.md 문제 2 참고).
3단계: IR 분석 "N/A" 반환
코드 위치: ir_analyzer.py:86-178
- query_rag() 6회 호출 (사업분야, 투자단계, 매출, 성장률, 팀규모, 기술우위)
- 검색 결과 없음 → raw_results 빈 딕셔너리
- LLM에 빈 데이터 전달 → system_prompt:134 "If information is not available, use 'N/A'"
- 모든 필드 "N/A" 반환
연쇄 효과
PDF 업로드 실패 → document_id = None → RAG 검색 0건 → IR 분석 "N/A" → Lists API 에러
해결 방안
1. 중복 파일 처리 개선 (필수)
위치: skill-rag-file/app/api/upload.py:68-71
현재: 중복 시 HTTPException 발생
개선: 중복 시 기존 document_id 반환 (멱등성 보장)
2. Slack Lists 동적 컬럼 매핑
문제: 하드코딩된 컬럼 ID (Col09HQTDUM0T 등) - Lists 필드 변경 시 코드 수정 필요
해결:
- skill-slack에 Lists 컬럼 조회 API 추가 (
GET /api/v1/lists/{list_id}/columns) - coldmail_processor.py에서 컬럼명으로 동적 매핑 (
"회사명" → Col09HQTDUM0T) - 컬럼 누락 시 해당 필드만 skip, 나머지 전송
효과: Lists 구조 변경 시 코드 수정 불필요
3. LangGraph 체크포인트 + LLM 기반 에러 복구
위치: workflows/coldmail_workflow.py
현재 구조 (stateless):
메일 조회 → PDF 업로드 → IR 분석 → Slack 전송
개선 구조 (체크포인트 + 에러 복구):
메일 조회 → PDF 업로드 → IR 분석 → Slack 전송
↓ (400 에러)
LLM 에러 분석 → 페이로드 수정 → 재전송
구현:
- PostgresSaver 체크포인트 활성화
- Slack 전송 실패 시 에러 메시지 + 원본 payload를 LLM에게 전달
- LLM structured output으로 수정된 payload 받아서 재시도
- 각 노드별 실패 시 해당 지점부터 재시도 (처음부터 재실행 방지)
제약: Slack API가 상세 에러 정보 제공해야 LLM이 수정 가능
교훈
중복 체크는 경고, 에러 아님
중복 파일 시 기존 리소스 반환으로 워크플로우 계속 진행 (멱등성 보장)
Cascading Failure 방지
PDF 업로드 실패 → 전체 IR 분석 실패. 체크포인트로 부분 실패 격리 필요.
프레임워크 도입 vs 실효성
LangGraph 도입했으나 체크포인트 없이 stateless 실행 = 코드 정리만 달성. 핵심 기능까지 구현해야 실효성.
로그 수집 검증
skill-rag-file 로그가 OpenSearch 미수집. 모든 서비스 로그 수집 검증 필요.
참고 문서
- 251015_claude_coldmail_workflow_langgraph_test.md: 테스트 결과
- 251014_coldmail_ir_analysis_scenario.md: IR 분석 시나리오
- 250925_langgraph_vs_n8n_comparison.md: 체크포인트 개념