docs: 콜드메일 시나리오 줄번호 검증 및 LangGraph 구체화
- 우선순위 2: ir_analyzer.py:155 JSON 전처리 로직 구체화 - 우선순위 3: coldmail_briefing.py:188,291 정확한 위치 검증 - 우선순위 4: LangGraph StateGraph, 노드, 엣지 구현 방법 명시 - 구현 완료 섹션 축약 (7줄로 압축) - 분석 결과 예시 1줄로 축약 - 95줄 (100줄 이하 준수) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
b6a60d725c
commit
b0ddfc0dc4
@ -25,33 +25,19 @@
|
|||||||
|
|
||||||
## 구현 완료 (2025-10-14)
|
## 구현 완료 (2025-10-14)
|
||||||
|
|
||||||
### 파일 처리
|
- coldmail_briefing.py:78-302: 전체 플로우
|
||||||
- coldmail_briefing.py:75-263: 전체 플로우
|
- naverworks_file_processor.py:94-135: PDF → skill-rag-file 업로드
|
||||||
- naverworks_file_processor.py:94-135: PDF 다운로드 → skill-rag-file 업로드
|
- ir_analyzer.py:86-168: RAG 6회 쿼리 → LLM 요약
|
||||||
- 파일 영속성: SSHFS allow_other 해결 (251014_skill-rag-file_sshfs_allow_other_해결.md)
|
- startup_valuation.py:63-173: 베이지안 VC Method
|
||||||
|
- coldmail_briefing.py:191-221,241,246: Slack Lists 파일 첨부
|
||||||
### AI 분석 기능
|
- coldmail_briefing.py:262-285: Slack 피드백 버튼
|
||||||
- ir_analyzer.py:86-168: extract_ir_metrics() - RAG 6회 쿼리 → LLM 요약
|
- coldmail_filter.py:29-76: Naive Bayes 학습
|
||||||
- startup_valuation.py:63-173: valuate_startup() - 베이지안 VC Method
|
|
||||||
|
|
||||||
### Slack 통합
|
|
||||||
- coldmail_briefing.py:176-248: Slack Lists 아이템 생성
|
|
||||||
- coldmail_briefing.py:221-247: 피드백 버튼 (✅ 맞음 / ❌ 아님)
|
|
||||||
- coldmail_filter.py:29-76: Naive Bayes 학습 루프
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 분석 결과 예시 (굿베이션)
|
## 분석 결과 예시
|
||||||
|
|
||||||
**파일**: 27페이지, 4.7MB → 14 chunks
|
굿베이션 (IT 인테리어 플랫폼): 27페이지 → 14 chunks, 밸류에이션 100억원 (30-300억원), 신뢰도 90%
|
||||||
|
|
||||||
**기업**: 굿베이션 (IT 인테리어 플랫폼) / 설립 7개월 / 팀 4명 / 자본 2억
|
|
||||||
|
|
||||||
**강점**: 시장 문제 인식, IT 차별화, 24조 시장
|
|
||||||
**약점**: 실적 전무, 소규모 팀, 자본 부족, 경쟁사 존재
|
|
||||||
|
|
||||||
**밸류에이션**: 100억원 (범위: 30-300억원)
|
|
||||||
**신뢰도**: 90% (Bayesian adjustment factor 기반)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -74,19 +60,32 @@
|
|||||||
|
|
||||||
### 우선순위 3: Slack 메시지에 IR 분석 결과 추가
|
### 우선순위 3: Slack 메시지에 IR 분석 결과 추가
|
||||||
- coldmail_briefing.py:144 다음: processed_results = [] 추가
|
- coldmail_briefing.py:144 다음: processed_results = [] 추가
|
||||||
- coldmail_briefing.py:176 다음: processed_results.append({"company": company_name, "ir": ir_metrics, "valuation": valuation_result})
|
- coldmail_briefing.py:188 다음: processed_results.append({...}) 추가
|
||||||
- coldmail_briefing.py:291: summary_text 수정
|
- company_name, ir_metrics.get("revenue"), valuation_result.median, valuation_result.confidence 포함
|
||||||
- 현재: f"콜드메일 {processed_count}건 처리 완료 (...)"
|
- coldmail_briefing.py:291 교체:
|
||||||
- 변경: for 루프로 각 회사별 밸류에이션, 신뢰도 포함
|
- 기존: f"콜드메일 {processed_count}건 처리 완료 (...)"
|
||||||
|
- 변경: summary_lines = [f"콜드메일 {processed_count}건 처리 완료"]
|
||||||
|
- for item in processed_results: summary_lines.append(f"- {item['company']}: {item['median']}억원 (신뢰도 {int(item['confidence']*100)}%)")
|
||||||
|
- summary_text = "\\n".join(summary_lines)
|
||||||
|
|
||||||
### 우선순위 4: LangGraph 워크플로우
|
### 우선순위 4: LangGraph 워크플로우
|
||||||
- requirements.txt: langgraph, langgraph-checkpoint-postgres 추가
|
- requirements.txt: langgraph 추가
|
||||||
- app/workflows/coldmail_workflow.py: StateGraph 정의
|
- app/workflows/__init__.py: 빈 파일 생성
|
||||||
- State: TypedDict (emails, coldmail_candidates, processed_results)
|
- app/workflows/coldmail_workflow.py 생성:
|
||||||
- 노드: fetch_emails, filter_coldmail, process_attachments, analyze_ir, create_slack_item, send_summary
|
- from typing import TypedDict; from langgraph.graph import StateGraph, END
|
||||||
- 엣지: fetch → filter → process → analyze → create → send
|
- class ColdmailState(TypedDict): emails: list, coldmail_candidates: list, processed_results: list, session: object
|
||||||
- 조건부 엣지: process (첨부파일 유무), analyze (성공/실패)
|
- async def fetch_emails_node(state): coldmail_briefing.py:93-121 로직 이동
|
||||||
- coldmail_briefing.py:78: _run_coldmail_briefing()에서 workflow.invoke() 호출
|
- async def filter_coldmail_node(state): coldmail_briefing.py:123-141 로직 이동
|
||||||
|
- async def process_email_node(state): coldmail_briefing.py:145-287 for 루프 내용 이동
|
||||||
|
- async def send_summary_node(state): coldmail_briefing.py:289-300 로직 이동
|
||||||
|
- graph = StateGraph(ColdmailState)
|
||||||
|
- graph.add_node("fetch", fetch_emails_node), add_node("filter", filter_coldmail_node), add_node("process", process_email_node), add_node("send", send_summary_node)
|
||||||
|
- graph.add_edge("fetch", "filter"), add_edge("filter", "process"), add_edge("process", "send"), add_edge("send", END)
|
||||||
|
- workflow = graph.compile()
|
||||||
|
- coldmail_briefing.py:78-302: _run_coldmail_briefing() 전체 교체
|
||||||
|
- from app.workflows.coldmail_workflow import workflow
|
||||||
|
- initial_state = {"emails": [], "coldmail_candidates": [], "processed_results": [], "session": session}
|
||||||
|
- result = await workflow.ainvoke(initial_state)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user