# 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 컬럼 구조