DOCS/troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md
Claude-51124 f4cd53257b docs: Coldmail workflow LangGraph 테스트 트러블슈팅
- Docker 빌드 dependency resolution 타임아웃 해결 (openai>=1.110.0)
- Slack 401 에러 해결 (토큰 워크스페이스 불일치 + API Key 누락)
- PDF 업로드 중복 파일 처리 (PostgreSQL 직접 삭제)
- Lists API 통합 테스트 결과 및 IR 분석 실패 이슈
- 교훈 및 남은 작업 정리
2025-10-15 00:11:33 +09:00

6.3 KiB

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

# 변경 전
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 서버):

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 F09J1HPPQJGRobeing 워크스페이스 (T0925SXPS4D)
  • 환경변수 SLACK_BOT_TOKENCompany-X 토큰 사용 중
  • 워크스페이스 불일치로 401 발생

해결: 파일: rb8001/.env:98,139

# 변경 전
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/.envSKILL_SLACK_API_KEY 환경변수 없음

해결: 파일: rb8001/.env:43

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

company_name = ir_metrics.get("business_area", "Unknown")  # "N/A"가 올 수 있음

근본 원인: IR 분석 실패

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