Files
aio-01d4-stu/Last3Mon/64/LAB-03-SCENARIO-ANALYSIS.md

107 lines
5.3 KiB
Markdown

# Lab 03 · 업무 자동화 시나리오 분석과 워크플로우 설계
- 관련 강의: [3단계 · 업무 자동화 시나리오 분석](../../Lecture/64/03-STAGE3-AUTOMATION-SCENARIO.md)
- 소요 시간: 약 45분 (개인 또는 2인 1조)
- 목표: 하나의 업무를 분석해 노드와 연결로 바꾸고, 실제로 실행해 검증한다.
- 제출물
- `my-work/LAB-03-SCENARIO-ANALYSIS.md` (분석 문서)
- `workflow-lab/flows/my-scenario.json` (워크플로우)
## 1. 예시 먼저 실행해 보기 (10분)
```bash
cd ~/aio-01d4-stu/Last3Mon/64/workflow-lab
uv run miniflow memory --clear
uv run miniflow run flows/05-tech-support-ticket.json -i user=kim -i ticket="비밀번호를 잊어버려서 로그인이 안 돼요"
uv run miniflow run flows/05-tech-support-ticket.json -i user=kim -i ticket="VPN 접속이 계속 끊겨요"
uv run miniflow run flows/05-tech-support-ticket.json -i user=lee -i ticket="점심 메뉴 추천해줘"
```
| 실행 | 확인할 것 |
| --- | --- |
| 1번째 | `category`와 `faq_id`가 무엇인가? |
| 2번째 | `history` 노드 출력에 1번째 문의가 남아 있는가? |
| 3번째 | 어느 노드에서 왜 멈추었는가? `draft` 노드는 무엇이라고 답했는가? 이 경우 실제 업무에서는 어떻게 처리해야 할까? |
3번째 실행에서는 FAQ 검색 결과가 없는데도 LLM이 답변 초안을 만들고, 마지막 `result` 노드에서 멈춥니다. Mock으로 실행(`MINIFLOW_LLM=mock`)하면 `draft` 노드에서 바로 멈춥니다. **근거가 없을 때 실제 LLM이 어떻게 행동하는지** 실행 기록에서 확인해 보세요.
| 모델 (수업 전 측정) | `draft`가 쓴 답 | `result` |
| --- | --- | --- |
| `gpt-4.1-mini` | "점심 메뉴 추천에 관한 FAQ가 현재 제공되지 않아 … 양해 부탁드립니다" (솔직하게 답함) | `'0' not found`로 실패 |
| 대체 `gemma3:4b` (`MINIFLOW_LLM=ollama`) | "… FAQ 검색 결과가 없습니다. (FAQ ID: other-123)" (**없는 FAQ 번호를 지어냄**) | `'0' not found`로 실패 |
좋은 모델은 근거가 없다고 말했지만, 워크플로우는 어느 쪽이든 마지막에 가서야 멈춥니다. 모델이 바뀌어도 안전하려면 "FAQ가 없으면 담당자에게" 같은 **경로**가 필요합니다 (65일차 Condition).
`uv run miniflow show flows/05-tech-support-ticket.json`으로 구조도 확인합니다.
## 2. 시나리오 분석 (15분)
1. 아래 시나리오 중 하나를 고릅니다. 직접 겪은 업무로 만들어도 됩니다.
| 번호 | 시나리오 |
| --- | --- |
| S1 | 회의록 요약 후 할 일 정리 |
| S2 | 쇼핑몰 상품 리뷰 분류와 답글 초안 |
| S3 | 신규 입사자 질문 응답 |
| S4 | 출장 전 날씨·준비물 안내 |
| S5 | IT 문의 처리 확장 (분류별 담당 부서 안내) |
2. 템플릿을 복사합니다.
```bash
cd ~/aio-01d4-stu
mkdir -p Last3Mon/64/my-work
cp Last3Mon/64/templates/SCENARIO-ANALYSIS-TEMPLATE.md Last3Mon/64/my-work/LAB-03-SCENARIO-ANALYSIS.md
```
3. 모든 항목을 채우고 AS-IS·TO-BE를 Mermaid로 그립니다.
4. TO-BE의 각 단계를 LLM·Tool·Memory·데이터 처리·사람 확인 중 하나로 분류합니다.
## 3. 워크플로우로 옮기기 (15분)
TO-BE를 `flows/my-scenario.json`으로 작성합니다. 지금 사용할 수 있는 노드와 Tool로 표현할 수 있는 부분만 작성하고, 나머지(메일 발송, 사람 확인 등)는 분석 문서에 "향후 노드"로 적습니다.
시작용 뼈대:
```json
{
"name": "My scenario",
"description": "시나리오 설명",
"inputs": ["user", "text"],
"nodes": [
{"id": "start", "type": "input"},
{"id": "history", "type": "memory_read", "key": "my:{{input.user}}"},
{"id": "judge", "type": "llm",
"prompt": "다음 내용을 분류해 주세요: {{input.text}}",
"mock": {"rules": [{"if_contains": ["키워드"], "then": "분류값"}], "default": "other"}},
{"id": "save", "type": "memory_write", "key": "my:{{input.user}}",
"value": {"last_text": "{{input.text}}", "last_label": "{{nodes.judge.output}}"}},
{"id": "result", "type": "output", "value": {"label": "{{nodes.judge.output}}"}}
],
"edges": [["start", "history"], ["start", "judge"], ["history", "save"], ["judge", "save"], ["save", "result"]]
}
```
```bash
uv run miniflow validate flows/my-scenario.json
uv run miniflow show flows/my-scenario.json
uv run miniflow run flows/my-scenario.json -i user=me -i text="..."
```
Tip
- LLM 노드의 프롬프트에는 답의 형식(정해진 값, 문장 수 등)을 분명히 적습니다. LLM 답이 매번 달라 흐름 확인이 어려우면 `mock`의 `rules`·`template`을 함께 적고 `MINIFLOW_LLM=mock`으로 구조부터 확인합니다.
- 사용할 수 있는 Tool은 `uv run miniflow tools`로 확인합니다 (`get_weather`, `search_faq`, `count_chars`).
- `show` 결과를 분석 문서의 "구현한 워크플로우" 항목에 붙여 넣습니다.
## 4. 검증 (5분)
정상 입력 2개와 문제가 생길 수 있는 입력 1개로 실행하고, 결과를 분석 문서의 "실행 결과" 표에 기록합니다.
## 확인
- [ ] 분석 템플릿의 모든 항목을 채웠다.
- [ ] AS-IS와 TO-BE를 Mermaid로 그렸다.
- [ ] `my-scenario.json`이 `validate`를 통과했다.
- [ ] 정상 입력과 문제 입력의 실행 결과를 비교했다.