2026-10-12 09:55:49 +09:00
# 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
2026-10-27 23:16:10 +09:00
cd ~/aio-01d4-stu/Last3Mon/64/workflow-lab
2026-10-12 09:55:49 +09:00
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` 노드는 무엇이라고 답했는가? 이 경우 실제 업무에서는 어떻게 처리해야 할까? |
2026-10-12 22:29:38 +09:00
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).
2026-10-12 09:55:49 +09:00
`uv run miniflow show flows/05-tech-support-ticket.json` 으로 구조도 확인합니다.
## 2. 시나리오 분석 (15분)
1. 아래 시나리오 중 하나를 고릅니다. 직접 겪은 업무로 만들어도 됩니다.
| 번호 | 시나리오 |
| --- | --- |
| S1 | 회의록 요약 후 할 일 정리 |
| S2 | 쇼핑몰 상품 리뷰 분류와 답글 초안 |
| S3 | 신규 입사자 질문 응답 |
| S4 | 출장 전 날씨·준비물 안내 |
| S5 | IT 문의 처리 확장 (분류별 담당 부서 안내) |
2. 템플릿을 복사합니다.
```bash
2026-10-27 23:16:10 +09:00
cd ~/aio-01d4-stu
2026-10-12 09:55:49 +09:00
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
2026-10-12 22:29:38 +09:00
- LLM 노드의 프롬프트에는 답의 형식(정해진 값, 문장 수 등)을 분명히 적습니다. LLM 답이 매번 달라 흐름 확인이 어려우면 ` mock`의 ` rules`·` template`을 함께 적고 ` MINIFLOW_LLM=mock`으로 구조부터 확인합니다.
2026-10-12 09:55:49 +09:00
- 사용할 수 있는 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`를 통과했다.
- [ ] 정상 입력과 문제 입력의 실행 결과를 비교했다.