- 트러블슈팅 문서 추가: 260121_coldmail_multi_confirm_loop_fix.md - 계획 문서 archive 이동: 260121_coldmail_multi_confirm_and_summary_fix.md - 테스트 원칙 보완: 컨테이너 테스트 파일 반영 방법 (docker cp) - 백엔드 원칙 보완: 테스트 원칙에 컨테이너 반영 추가
2.6 KiB
2.6 KiB
콜드메일 다중 확인 루프 및 요약 메시지 개선
날짜: 2026-01-21
작성자: happybell80
관련 파일: rb8001/app/services/workflows/coldmail_workflow.py
문제 상황
- 다중 이메일 확인 시 1개만 처리: 오다가다, 에듀온 2개 모두 "맞음" 클릭 → 에듀온만 처리됨
- 요약 메시지 부적절:
None억원 (신뢰도 0%)표시 → IR 분석 안 된 건 의미 없는 정보
원인 분석
문제 1: 워크플로우 종료
confirm → send고정 엣지로 인해 첫 확인 후 바로 요약 전송 → 종료- 나머지
waiting_confirmation유실
문제 2: median None 처리 누락
send_node에서median이 None인 경우 처리 로직 없음f"- {company}: {median}억원"→None억원표시
해결 방법
Phase 1: 다중 확인 루프
# route_after_confirm() 함수 추가
def route_after_confirm(state: ColdmailState) -> str:
if state.get("waiting_confirmation"):
return "wait_confirmation"
else:
return "send"
# confirm → send 고정 엣지를 조건부 엣지로 변경
workflow.add_conditional_edges(
"confirm",
route_after_confirm,
{
"wait_confirmation": "wait_confirmation",
"send": "send"
}
)
Phase 2: 요약 메시지 개선
# median이 None이면 IR 분석 대기 표시
if median is None:
summary_lines.append(f"- {company}: 등록 완료 (IR 분석 대기)")
elif is_hold:
...
else:
summary_lines.append(f"- {company}: {median}억원 (신뢰도 {conf_pct}%)")
변경 내용
| 파일 | 변경 |
|---|---|
| coldmail_workflow.py L311-325 | route_after_confirm() 함수 추가 |
| coldmail_workflow.py L365-372 | confirm → send 조건부 엣지로 변경 |
| coldmail_workflow.py L267-269 | send_node median None 처리 추가 |
| tests/test_coldmail_workflow_multi_confirm.py | 5개 테스트 케이스 추가 |
검증
단위 테스트
docker exec rb8001 pytest tests/test_coldmail_workflow_multi_confirm.py -v
# 5 passed
배포
git push origin main→ Gitea Actions 자동 배포docker ps | grep rb8001→ 재시작 확인 완료
교훈
- LangGraph 루프 패턴: 조건부 엣지로 동일 노드 재진입 가능 (고정 엣지 대신
route_after_*함수 사용) - None 값 처리 필수: 외부 데이터(IR 분석 결과 등)는 None 가능성 항상 고려
- 테스트 컨테이너 반영: tests 디렉토리는 볼륨 마운트 아님 →
docker cp또는 재빌드 필요