- Docker 빌드 dependency resolution 타임아웃 해결 (openai>=1.110.0) - Slack 401 에러 해결 (토큰 워크스페이스 불일치 + API Key 누락) - PDF 업로드 중복 파일 처리 (PostgreSQL 직접 삭제) - Lists API 통합 테스트 결과 및 IR 분석 실패 이슈 - 교훈 및 남은 작업 정리
6.3 KiB
6.3 KiB
Coldmail Workflow LangGraph 테스트 및 트러블슈팅
날짜: 2025-10-15 작성자: Claude 관련 파일:
rb8001/app/services/workflows/coldmail_workflow.pyrb8001/app/services/coldmail_processor.pyrb8001/.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
F09J1HPPQJG는 Robeing 워크스페이스 (T0925SXPS4D) - 환경변수
SLACK_BOT_TOKEN이 Company-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/.env에 SKILL_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 분석 실패 이유 (추정):
- PDF에서 텍스트 추출 실패
- ChromaDB 검색 실패 (임베딩 없음)
- 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줄), 조건부 라우팅 명확
- 단점: 중간 노드 실패 시 전체 파이프라인 영향, 에러 핸들링 복잡도 증가
남은 작업
- IR 분석 개선: ChromaDB 검색 또는 LLM 프롬프트 수정
- 에러 핸들링 강화:
coldmail_processor.py부분 실패 시에도 결과 반환 - 필드 검증: company_name이 "N/A" 또는 ""일 때 기본값 설정
- 채널 권한: 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 컬럼 구조