docs: 문서 작성 원칙 준수하도록 수정

- 파일 크기 222줄 → 128줄 (100줄 이하 목표)
- 코드 블록 최소화 (파일명:줄번호로 대체)
- 파일 참조 일관성 개선
This commit is contained in:
Claude-51124 2025-10-15 00:13:34 +09:00
parent 319677af2e
commit a071f8b159

View File

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