From f4cd53257b1b8d2b5c6d4cc62db1d9770b0eca71 Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Wed, 15 Oct 2025 00:11:33 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Coldmail=20workflow=20LangGraph=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=8A=B8=EB=9F=AC=EB=B8=94?= =?UTF-8?q?=EC=8A=88=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Docker 빌드 dependency resolution 타임아웃 해결 (openai>=1.110.0) - Slack 401 에러 해결 (토큰 워크스페이스 불일치 + API Key 누락) - PDF 업로드 중복 파일 처리 (PostgreSQL 직접 삭제) - Lists API 통합 테스트 결과 및 IR 분석 실패 이슈 - 교훈 및 남은 작업 정리 --- ...claude_coldmail_workflow_langgraph_test.md | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md diff --git a/troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md b/troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md new file mode 100644 index 0000000..93a56bf --- /dev/null +++ b/troubleshooting/251015_claude_coldmail_workflow_langgraph_test.md @@ -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 컬럼 구조