docs: Coldmail workflow LangGraph 테스트 트러블슈팅

- Docker 빌드 dependency resolution 타임아웃 해결 (openai>=1.110.0)
- Slack 401 에러 해결 (토큰 워크스페이스 불일치 + API Key 누락)
- PDF 업로드 중복 파일 처리 (PostgreSQL 직접 삭제)
- Lists API 통합 테스트 결과 및 IR 분석 실패 이슈
- 교훈 및 남은 작업 정리
This commit is contained in:
Claude-51124 2025-10-15 00:11:33 +09:00
parent 1b6a0b3140
commit f4cd53257b

View File

@ -0,0 +1,221 @@
# Coldmail Workflow LangGraph 테스트 및 트러블슈팅
**날짜**: 2025-10-15
**작성자**: Claude
**관련 파일**:
- `rb8001/app/services/workflows/coldmail_workflow.py`
- `rb8001/app/services/coldmail_processor.py`
- `rb8001/.env`
---
## 배경
Priorities 2, 3, 4 완료 후 LangGraph coldmail workflow 테스트 수행:
- Priority 2: LLM JSON 파싱 버그 수정 (마크다운 블록 제거)
- Priority 3: Slack 메시지에 IR 분석 결과 포함
- Priority 4: LangGraph 워크플로우 구현 (316줄 → 114줄)
---
## 문제 1: Docker 빌드 dependency resolution 타임아웃
### 증상
```
INFO: pip is looking at multiple versions of langchain-openai...
```
- 빌드 시 langchain 패키지 의존성 해결에 과도한 시간 소요
### 원인
- requirements.txt에 `openai==1.6.1` (구버전)
- langchain-openai는 `openai>1.109.1` 필요
- 버전 불일치로 resolver가 수백 개 조합 시도
### 해결
**파일**: `rb8001/requirements.txt:20,40-42`
```txt
# 변경 전
openai==1.6.1
langchain>=0.1.0
langchain-openai>=0.0.2
langgraph>=0.2.0
# 변경 후
openai>=1.110.0
langchain==0.3.27
langchain-openai==0.3.35
langgraph==0.6.10
```
**빌드 명령**: `docker compose build --no-cache`
---
## 문제 2: PDF 업로드 중복 에러
### 증상
```
Failed to upload [공문]...pdf: 400 - {"detail":"File already exists for this team"}
No PDF attachments processed for email 18606
Result: 0 processed
```
### 원인
- 이전 테스트에서 업로드된 파일이 DB에 남아있음
- `team_document.file_hash` 중복 체크로 재업로드 차단
- PDF 업로드 실패 시 `process_coldmail()``None` 반환
- `processed_results`에 추가되지 않아 0건 처리
### 해결
**PostgreSQL 접속** (51123 서버):
```bash
ssh -i /home/admin/.ssh/id_rsa_deploy -p 51123 admin@192.168.219.45 \
"PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c \
\"DELETE FROM team_document WHERE id IN ('...','...');\""
```
**교훈**:
- 테스트 전 기존 데이터 정리 필요
- `coldmail_processor.py`에 PDF 업로드 실패 시 에러 핸들링 부족
---
## 문제 3: Slack 401 Unauthorized 에러
### 증상
```
Failed to upload file to Slack: 401
Failed to create list item: 401
Failed to send summary to Slack: 401
```
### 원인 분석
**1차 추정**: 토큰 만료 또는 권한 문제
- 테스트용 List `F09J1HPPQJG`**Robeing 워크스페이스** (T0925SXPS4D)
- 환경변수 `SLACK_BOT_TOKEN`**Company-X 토큰** 사용 중
- 워크스페이스 불일치로 401 발생
**해결**:
**파일**: `rb8001/.env:98,139`
```bash
# 변경 전
SLACK_BOT_TOKEN=xoxb-9417291383105-9472690865840-... # Company-X
SLACK_LIST_ID=F09J1HPPQJG
# 변경 후
SLACK_BOT_TOKEN=xoxb-9073915808149-9107868204992-... # Robeing
SLACK_LIST_ID=F09J1HPPQJG # 테스트용 List (Robeing workspace)
```
**2차 문제**: API Key 누락
```
Status: 401
Response: {"detail":"API key is missing"}
```
**원인**: `rb8001/.env``SKILL_SLACK_API_KEY` 환경변수 없음
**해결**:
**파일**: `rb8001/.env:43`
```bash
SERVICE_API_KEY=skill-slack-api-key-2025
SKILL_SLACK_API_KEY=skill-slack-api-key-2025 # 추가
```
**재시작**: `docker compose down && docker compose up -d`
---
## 문제 4: Lists API 필드 형식 에러
### 증상
```
Failed to create list item: 400
{"levelname": "ERROR", "message": "Failed to create list item: invalid_arguments"}
```
### 원인
- IR 분석 실패로 `business_area="N/A"` 반환
- `company_name = ir_metrics.get("business_area", "Unknown")` → 빈 문자열 ""
- Slack Lists API가 빈 문자열을 거부
**파일**: `rb8001/app/services/coldmail_processor.py:73`
```python
company_name = ir_metrics.get("business_area", "Unknown") # "N/A"가 올 수 있음
```
### 근본 원인: IR 분석 실패
```json
{
"business_area": "N/A",
"investment_stage": "N/A",
"revenue": "N/A",
"growth_rate": "N/A",
"team_size": "N/A",
"tech_advantage": "N/A"
}
```
**IR 분석 실패 이유** (추정):
1. PDF에서 텍스트 추출 실패
2. ChromaDB 검색 실패 (임베딩 없음)
3. LLM 프롬프트 문제
---
## 검증 결과
### 성공 항목
- ✅ LangGraph 워크플로우 정상 동작 (fetch → filter → process → send)
- ✅ Docker 빌드 성공 (openai>=1.110.0)
- ✅ PDF 파일 중복 제거 후 재테스트 가능
- ✅ Robeing 토큰으로 변경 후 인증 성공
- ✅ SKILL_SLACK_API_KEY 추가 후 Lists API 200 OK
- ✅ 테스트 List 아이템 생성 성공 (Rec09LJQYLAH2)
### 실패 항목
- ❌ PDF 업로드 실패 시 에러 핸들링 부족 → `processed_results=0`
- ❌ IR 분석 실패 → 모든 필드 "N/A"
- ❌ company_name="" → Lists API invalid_arguments (400)
- ❌ 요약 메시지 전송 실패 (401) - 채널 권한 문제
---
## 교훈
### 1. 테스트 환경 설정
- **토큰 워크스페이스 일치**: List ID와 SLACK_BOT_TOKEN의 워크스페이스 확인 필수
- **API Key 체크리스트**: SKILL_SLACK_API_KEY, SERVICE_API_KEY 등 필수 환경변수 누락 방지
- **데이터 정리**: 테스트 전 DB/파일 중복 데이터 삭제
### 2. 에러 핸들링
- **PDF 업로드 실패 시**: 빈 결과 대신 기본값 또는 부분 처리 결과 반환
- **IR 분석 실패 시**: "N/A" 대신 "Unknown Company" 등 유효한 기본값 사용
- **필드 검증**: Lists API 전송 전 빈 문자열 체크
### 3. 개발 프로세스
- **환경변수 재시작**: `.env` 수정 후 반드시 `docker compose down && up -d` (restart 불가)
- **로그 확인 순서**: rb8001 → skill-slack → skill-rag-file 순으로 체크
- **PostgreSQL 접속**: `ssh -i id_rsa_deploy -p 51123` 사용
### 4. LangGraph 워크플로우
- **장점**: 코드 단순화 (316줄 → 114줄), 조건부 라우팅 명확
- **단점**: 중간 노드 실패 시 전체 파이프라인 영향, 에러 핸들링 복잡도 증가
---
## 남은 작업
1. **IR 분석 개선**: ChromaDB 검색 또는 LLM 프롬프트 수정
2. **에러 핸들링 강화**: `coldmail_processor.py` 부분 실패 시에도 결과 반환
3. **필드 검증**: company_name이 "N/A" 또는 ""일 때 기본값 설정
4. **채널 권한**: COLDMAIL_CHANNEL_ID에 대한 봇 권한 확인
---
## 관련 문서
- 251014_coldmail_ir_analysis_scenario.md - 전체 시나리오
- 251014_slack_lists_file_attachment.md - Lists API 구현
- 250930_naverworks_slack_04_lists_api_skill_integration.md - Lists 컬럼 구조