From 19969d1d441589bdd14d2607bb2d23e44ada5de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B1=84=EB=AC=B8=EC=B0=BD=40MBA?= Date: Tue, 13 Oct 2026 16:24:23 +0900 Subject: [PATCH] =?UTF-8?q?PPTX=3D>MD,=20=EB=A8=B8=EB=A9=94=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=20=EB=B7=B0=EC=96=B4=20=EC=82=AC=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lecture/64/00-DAY64-OVERVIEW.md | 614 ++++++++++++++++++++++++++++++ Lecture/64/00-DAY64-OVERVIEW.pptx | Bin 64781 -> 0 bytes Lecture/64/00-DAY64-PREP.md | 2 +- 3 files changed, 615 insertions(+), 1 deletion(-) create mode 100644 Lecture/64/00-DAY64-OVERVIEW.md delete mode 100644 Lecture/64/00-DAY64-OVERVIEW.pptx diff --git a/Lecture/64/00-DAY64-OVERVIEW.md b/Lecture/64/00-DAY64-OVERVIEW.md new file mode 100644 index 0000000..07749c5 --- /dev/null +++ b/Lecture/64/00-DAY64-OVERVIEW.md @@ -0,0 +1,614 @@ +# 64일차 개요 · AI 워크플로우 개념 및 구성 요소 이해 + +> 노코드 멀티 에이전트 워크플로우 설계 및 운영 · 2026-10-14 +> 26장 · 각 장은 가로줄(`---`)로 나뉩니다. 1교시에는 1~3장과 25장만 보고, 나머지 장은 각 단계를 설명할 때 함께 띄웁니다. + +| 장 | 범위 | +| --- | --- | +| 1~3 | 표지 · 오늘의 목표 · 시간표 | +| 4~12 | 1단계 · 개념과 전체 아키텍처 | +| 13~20 | 2단계 · LLM·Tool·Memory와 데이터 흐름 | +| 21~24 | 3단계 · 업무 자동화 시나리오 분석 | +| 25~26 | 실습 · 퀴즈와 예고 | + +--- + +## 1 / 26 · 표지 + +```mermaid +flowchart LR + I((입력)) --> L((LLM)) --> T((Tool)) --> M((Memory)) --> O((출력)) + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef t fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef o fill:#F2A541,stroke:#F2A541,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + class I,O g + class L t + class T o + class M m +``` + +**64일차** + +# AI 워크플로우 개념 및 구성 요소 이해 + +LLM·Tool·Memory 기반 AI Workflow 구조 이해 · 업무 자동화 시나리오 분석 + +노코드 멀티 에이전트 워크플로우 설계 및 운영 · 2026-10-14 + +--- + +## 2 / 26 · 오늘 할 수 있게 될 세 가지 + +| | 목표 | 내용 | +| :-: | --- | --- | +| **①** | **AI 워크플로우를 설명한다** | 정해진 경로 위에 AI 판단 단계를 둔 업무 흐름 · 규칙 자동화·AI Agent와 비교 · 실행 기록 읽기 | +| **②** | **LLM·Tool·Memory를 구분한다** | 노드 설정과 출력 형식 · LLM의 한계를 보완하는 방식 · 노드 사이의 데이터 흐름 | +| **③** | **업무를 워크플로우로 분석한다** | 후보 고르기 → AS-IS·TO-BE(예외 경로 포함) → 단계를 노드로 바꾸고 실행해 검증 | + +--- + +## 3 / 26 · 오늘의 시간표 + +| ① 1~2교시 | ② 3~4교시 | ③ 5~6교시 | ④ 7~8교시 | +| --- | --- | --- | --- | +| **1단계** | **2단계** | **3단계** | **정리** | +| 개념과 전체 아키텍처 | LLM·Tool·Memory와 데이터 흐름 | 업무 자동화 시나리오 분석 | 퀴즈 A·B·C · 오늘의 정리·예고 | +| Lab 01 실행 기록 읽기 | Lab 02 노드 연결 | Lab 03 분석·설계 | 퀴즈 20분 | + +> 09:00 시작 · 50분 수업 10분 휴식 · 12:00~13:00 점심 · LLM은 OpenAI `gpt-4.1-mini` (안 될 때 Ollama) + +--- + +## 4 / 26 · 코드로 만들던 것을 노드와 선으로 + +지난 3개월: 코드로 순서 → 설정 파일로 순서(`teams.yaml`) → 이번 교과목: 그림으로 순서 + +| 지난 3개월 · 코드 | 이번 교과목 · 노코드 워크플로우 | +| --- | --- | +| **`engine.py`에 실행 순서 작성** | 캔버스에 노드를 놓고 선으로 연결 | +| **함수 인자로 데이터 전달** | 앞 노드 결과를 다음 노드 입력에 연결(매핑) | +| **`providers/` 레지스트리로 LLM 선택** | LLM 노드 설정에서 모델 선택 | +| **MCP Client로 Tool 호출** | Tool 노드 추가 (HTTP·DB·MCP) | +| **Redis Stream·로그로 실행 추적** | 실행 이력 화면에서 노드별 입력·출력 확인 | + +> **왼쪽은 이미 해 본 것, 오른쪽은 같은 일에 새 이름이 붙는 것입니다** + +--- + +## 5 / 26 · 왜 실행 순서를 그림으로 꺼내나 + +**실무에서 매주 오는 요청** + +- "분류에 '보안' 항목을 하나 더 넣어 주세요" +- "보내기 전에 팀장이 한 번 보게 해 주세요" +- "FAQ에 없으면 담당자에게 알려 주세요" + +| 코드 | 그림 | +| --- | --- | +| 고치고 → 테스트하고 → 다시 배포 | 노드 하나 추가 · 선 하나 변경 | + +| 좋아지는 점 | 다루는 날 | +| --- | --- | +| **바꾸는 속도** | 65~67일차 | +| **함께 보기** | 오늘 3단계 | +| **문제 찾기** | 실행 기록 · 76~77일차 | +| **운영** | 버전·비용·오류 · 74~79일차 | + +> **노코드가 코드를 없애지는 않는다**: 자주 바뀌는 순서·연결은 그림으로, 복잡한 처리는 Code 노드·HTTP Request로 기존 API 호출 + +--- + +## 6 / 26 · AI 워크플로우란 + +여러 단계를 정해진 연결 순서대로 실행하고, 그중 판단이 필요한 단계만 AI가 맡는 업무 흐름 + +```mermaid +flowchart LR + A["문의 도착
시작"] --> B["본문 정리
데이터 처리"] --> C["문의 분류
AI"] --> D["FAQ 검색
Tool"] --> E["답변 초안
AI"] --> F["기록·전달
저장"] + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + classDef d fill:#5B8E7D,stroke:#5B8E7D,color:#fff + class A g + class C,E ai + class D tool + class B,F d +``` + +> **AI가 맡은 단계는 6개 중 2개** +> AI 단계가 적고 위치가 분명할수록 결과를 예측하고 관리하기 쉽습니다. +> 판단이 필요한 곳에만 AI 노드, 규칙으로 되는 일은 데이터 처리·Tool 노드에. + +--- + +## 7 / 26 · 누가 다음 행동을 결정하는가 + +| | 규칙 기반 자동화 | AI 워크플로우 | AI Agent | +| --- | --- | --- | --- | +| **결정 주체** | 개발자가 정한 규칙 | 설계자가 정한 경로 + 일부 AI 단계 | AI 모델이 상황을 보고 결정 | +| **예시** | 매일 9시 매출 엑셀 메일 발송 | 문의 분류 → FAQ 검색 → 답변 초안 | 목표만 주면 Tool을 스스로 선택 | +| **특징** | 예측 쉬움 · 유연성 낮음 · 저렴 | 검증 쉬움 · 비용 예측 가능 | 유연성 높음 · 비용·추적 어려움 | + +> **실무 원칙: 가능한 한 워크플로우로, 꼭 필요한 곳에만 Agent로** (9월 `06_agent-workflow` 복습) + +--- + +## 8 / 26 · 같은 업무를 세 방식으로: 출장 날씨 안내 + +```mermaid +flowchart TB + subgraph R["① 규칙"] + direction LR + r1["출장 등록"] --> r2["날씨 조회"] --> r3{"강수 ≥ 50%?"} + end + subgraph W["② AI 워크플로우"] + direction LR + w1["출장 등록"] --> w2["날씨 조회 (Tool)"] --> w3["안내 문장 (LLM)"] + end + subgraph A["③ Agent"] + direction LR + a1["Agent 판단"] <--> a2["날씨"] + a1 <--> a3["일정"] + a1 <--> a4["숙소"] + end + R ~~~ W ~~~ A + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef ag fill:#C65D3B,stroke:#C65D3B,color:#fff + class r1,r3,w1 g + class r2,w2,a2,a3,a4 tool + class w3 ai + class a1 ag +``` + +| | ① 규칙 | ② AI 워크플로우 | ③ Agent | +| --- | --- | --- | --- | +| **특징** | 규칙에 없는 안내(바람·기온 차)는 못 함 | 경로는 고정, 문장만 상황에 맞게 (= 오늘 실습 `02-llm-tool.json`) | 새 요청에도 대응, 대신 호출 수·비용이 매번 다름 | +| **LLM 호출 횟수** | 0 | 1 | 2~5 (상황마다) | +| **같은 입력 → 같은 결과?** | 예 | 거의 같음 | 달라질 수 있음 | + +--- + +## 9 / 26 · 기본 용어와 실행 기록 읽기 + +| 용어 | 뜻 | 코드에서 | +| --- | --- | --- | +| **노드** | 한 가지 일을 하는 단계 | 함수 하나 | +| **연결 (Edge)** | 실행 순서와 데이터 경로 | 함수 호출 순서 | +| **페이로드** | 노드 사이를 오가는 데이터 | 인자·반환값 | +| **실행 기록** | 노드별 입력·출력·시간 | TraceEvent 목록 | + +```text +runs/…-02-llm-tool.json (수업 준비 때) +weather tool ok 0.3ms + args {"city": "제주"} + output {"condition": "비", "rain_chance": 80} +answer llm ok 4978.8ms + provider "openai" + prompt 날씨 데이터: {…} 질문: 우산이… + output "네, … 우산이 필요합니다." +``` + +> **읽는 순서** 들어간 것(args·prompt) → 나온 것(output) → 걸린 시간(ms) · LLM 답이 이상하면 **prompt부터** + +--- + +## 10 / 26 · 실행 순서는 연결이 정한다 + +```mermaid +flowchart LR + S["start"] --> A["기억 읽기"] + S --> B["날씨 조회"] + A --> C["LLM 추천"] + B --> C + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + class S g + class A m + class B tool + class C ai +``` + +기억 읽기와 날씨 조회는 서로 기다리지 않음 · LLM 추천은 둘 다 끝나야 실행 (48일차 Join) + +| 엔진의 순서 계산 (위상 정렬) | +| --- | +| 1. 들어오는 연결이 없는 노드부터 실행 | +| 2. 끝난 노드에서 나가는 연결을 지움 | +| 3. 들어오는 연결이 없어진 노드를 다음에 | +| 4. 모두 실행할 때까지 반복 | + +> ⚠ **고리(A → B → A)는 순서를 정할 수 없음** → `Error: Edges contain a cycle.` + +> **연결 `["weather", "answer"]` = 순서(뒤에 실행) + 데이터(`{{nodes.weather.output}}` 사용 가능)** · 데이터를 쓰려면 반드시 뒤에 연결 + +--- + +## 11 / 26 · AI 워크플로우의 전체 아키텍처 + +```mermaid +flowchart LR + A["① 시작
사용자 요청
이벤트 · 일정"] --> B["② 엔진
순서 계산
데이터 전달
오류 처리"] --> C["③ 노드
LLM · RAG · Tool
Memory
데이터 처리"] --> D["④ 결과
화면 응답
알림 · 저장"] + B -.-> E["⑤ 운영
실행 기록 · 버전(74) · 비용(75)
오류(76) · 로그(77) · 품질(78) · 보안(73)"] + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef o fill:#F2A541,stroke:#F2A541,color:#fff + classDef t fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + classDef p fill:#7A6FB0,stroke:#7A6FB0,color:#fff + class A g + class B o + class C t + class D m + class E p +``` + +지난 실습: Streamlit(시작) → FastAPI·PatternEngine(엔진) → Agent·MCP·DB(노드) → SSE·화면(결과) + +> **오늘 miniflow는 실패하면 '멈추고 기록'까지** · 다른 길로 보내기는 65일차, 재시도는 72일차 + +--- + +## 12 / 26 · 좋은 노드 설계 원칙 + +노드를 나누면 실행 기록이 곧 문제 찾기 도구가 됩니다 + +| 원칙 | 나쁜 예 | 좋은 예 | +| --- | --- | --- | +| **한 노드는 한 가지 일** | LLM 하나가 분류·검색·답변까지 | 분류(LLM) → 검색(Tool) → 답변(LLM) | +| **이름은 하는 일로** | `llm1`, `node3` | `classify`, `faq`, `draft` | +| **출력 형식을 정한다** | "분류해 주세요" | "account·network·device·software·other 중 하나만" | +| **실패를 생각한다** | Tool이 실패하면 어떻게 될지 모름 | "도시를 못 찾으면?"을 설계 때 적어 둠 | +| **AI는 꼭 필요한 곳에만** | 글자 수 세기를 LLM에 (1~2초, 가끔 틀림) | `count_chars` Tool (0.0ms, 항상 정확) | + +n8n 미리 보기: Trigger(Webhook) · 흐름 제어(IF·Switch·Merge) · 데이터 처리(Set·Code) · HTTP Request · AI Agent + +--- + +## 13 / 26 · LLM의 한계를 Tool과 Memory가 채운다 + +| LLM · 판단 | Tool · 손과 발 | Memory · 기억 | +| --- | --- | --- | +| **분류 · 추출 · 요약 · 생성** | **날씨 API · DB 조회 · MCP Tool · 사내 시스템** | **단기(세션) · 장기(선호·이력) · 지식(RAG)** | +| 최신 정보·내부 문서를 모름
호출마다 기억이 없음
계산·규칙에 약함 | 최신 데이터와 외부 실행을 담당 | 실행과 실행 사이를 이어 줌 | + +| LLM의 한계 | 생기는 문제 | 보완 | +| --- | --- | --- | +| **최신 정보·외부 실행** | "오늘 제주 날씨"를 지어냄 · 티켓 등록 불가 | Tool | +| **회사 내부 문서** | 사내 규정을 그럴듯하게 틀리게 | RAG | +| **이전 실행** | 매번 같은 정보를 다시 물어봄 | Memory | + +--- + +## 14 / 26 · LLM 노드 설정과 출력 형식 + +사람이 읽을 답과 다음 노드가 읽을 답은 다르게 설계합니다 + +| `system` | `prompt` | 모델 | `temperature` | +| --- | --- | --- | --- | +| 역할·규칙 (매번 같음) | 이번 데이터 `{{input.ticket}}` | `gpt-4.1-mini` (`.env`) | 기본 0.2 · 분류는 낮게 | + +| 문의 (수업 준비 때 `gpt-4.1-mini`) | 형식 지시 없음: "분류해 주세요" | 형식 지시 있음: `classify` 노드 | +| --- | --- | --- | +| **프린터에서 출력이 안 됩니다** | "… '프린터 문제' 또는 '출력 문제'로 분류할 수 있습니다." | `device` | +| **메일 프로그램에 로그인이 안 돼요** | "… 분류는 다음과 같이 할 수 있습니다: - 분류: 이메…" | `software` | +| **회의실 예약은 어떻게 하나요?** | "… '시스템 사용 방법' 또는 '서비스 이용 문의'로…" | `other` | + +> **노드용 프롬프트**: 허용 값을 모두 적기 · 값만 답하게 · 근거 범위 정하기 · 모를 때의 답 정하기 ("없으면 other") + +--- + +## 15 / 26 · 같은 답이 맞는 답은 아니다 + +**"메일 프로그램에 로그인이 안 돼요"** + +```mermaid +flowchart LR + Q["메일 프로그램에
로그인이 안 돼요"] --> C["classify (LLM)
4번 모두 software"] + Q --> F["FAQ 검색 (Tool)
FAQ-002 계정 잠김 · FAQ-005 메일함"] + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + class Q g + class C ai + class F tool +``` + +> **일관성(같은 답) ≠ 정확성(맞는 답)** · 원인은 모델보다 '경계 사례의 기준이 없음' → `system`에 기준 추가, 두 노드가 다르면 사람에게 + +**"암호를 바꾸고 싶어요" · 단어가 다르면** + +| classify (LLM) | FAQ 검색 (키워드) | 05 워크플로우 | +| --- | --- | --- | +| `account` (뜻을 알아들음) | 0건 ('암호'가 키워드에 없음) | `result`에서 `'0' not found`로 실패 | + +→ 뜻으로 찾는 임베딩 검색(RAG)은 71일차 + +--- + +## 16 / 26 · LLM 노드는 어디서 실행되나 · 대체 경로 + +| | 클라우드 API · **오늘 기본** | 로컬 LLM · **대체용** | +| --- | --- | --- | +| **모델** | OpenAI `gpt-4.1-mini` | Ollama `gemma3:4b` (내 노트북) | +| **키·비용** | API 키 · 사용량만큼 비용 | 키·비용 없음 | +| **데이터** | 제공사 서버로 | 노트북 밖으로 안 나감 | +| **속도·품질** | 대체로 빠르고 품질이 높음 | 노트북 성능·모델 크기에 좌우 | + +**문의 4건 분류 정답 수 (수업 준비 때)** + +| 모델 | 정답 | +| --- | :-: | +| `gpt-4.1-mini` (기본) | **4/4** | +| `gemma3:4b` (대체) | **4/4** | +| `gemma3:1b` (8GB 대체) | **1/4** · 나머지를 모두 `software`로 답함 | + +```mermaid +flowchart LR + N["LLM 노드"] --> O["OpenAI ✕
키 오류·한도·인터넷"] --> L["Ollama가 답함"] + classDef d fill:#0F3D3E,stroke:#0F3D3E,color:#fff + classDef r fill:#C65D3B,stroke:#C65D3B,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + class N d + class O r + class L m +``` + +> **대체 경로는 서비스를 이어 주지만 같은 품질을 보장하지 않음** · 누가 답했는지는 실행 기록의 `provider` + +--- + +## 17 / 26 · Tool 노드: 정할 것 네 가지와 실패 세 종류 + +| 정할 것 | `get_weather` 예 | +| --- | --- | +| **이름·설명** | 오늘의 도시 날씨 조회 | +| **인자** | `city` (서울·부산·제주·강릉) | +| **결과 형식** | `city` · `condition` · `temp_c` · `rain_chance` · `air` | +| **실패** | `Unknown city '평양'` | + +| 실패 종류 | 예 | 처리 | +| --- | --- | --- | +| **입력이 잘못됨** | 없는 도시 | 다시 묻기 (65일차 Condition) | +| **잠깐 안 됨** | 네트워크·시간 초과 | 다시 시도 (72일차) | +| **결과가 없음** | FAQ 0건 | 담당자에게 (오늘 3단계) | + +> **Function Calling (29~31일차)** LLM이 Tool을 고름 · 상황마다 다름 · 질문 유형이 넓을 때 +> **워크플로우 Tool 노드** 설계자가 위치를 정함 · 경로에 있으면 항상 실행 · 절차가 정해져 있을 때 +> 67일차: AI Agent 노드로 두 방식을 함께 + +--- + +## 18 / 26 · Memory 노드: 무엇을, 어떤 키로, 언제 지울까 + +```json +// .miniflow-memory.json +{ + "user:minji": {"preference": "실내 전시"}, + "ticket:kim": {"last_ticket": "VPN …", + "last_category": "network"} +} +// key: "ticket:{{input.user}}" → 사용자마다 따로 +``` + +| | Memory | 실행 기록 | +| --- | --- | --- | +| **목적** | 다음 실행이 쓰려고 | 사람이 확인하려고 | +| **무엇을** | 필요한 값 몇 개 | 모든 노드의 입력·출력·시간 | +| **오늘** | `.miniflow-memory.json` | `runs/*.json` | + +| 조심할 것 | | +| --- | --- | +| **개인정보** | 필요한 것만, 보관 기간을 정해서 (73일차) | +| **오래된 기억** | 저장한 날짜를 함께 남기기 | +| **잘못된 기억** | 틀린 분류가 저장되면 다음 실행까지 영향 → 저장 전 확인 | + +--- + +## 19 / 26 · LLM·Tool·Memory의 상호작용 패턴 4가지 + +```mermaid +flowchart TB + subgraph P1["① 근거 제공"] + direction LR + a1["Tool"] --> a2["LLM"] + end + subgraph P2["② 인자 추출"] + direction LR + b1["LLM"] --> b2["Tool"] + end + subgraph P3["③ 개인화 순환"] + direction LR + c1["Mem"] --> c2["LLM"] --> c3["Mem"] + end + subgraph P4["④ 검색 증강"] + direction LR + d1["검색"] --> d2["LLM"] + end + P1 ~~~ P2 ~~~ P3 ~~~ P4 + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + class a1,b2,d1 tool + class a2,b1,c2,d2 ai + class c1,c3 m +``` + +| 패턴 | 실습 파일 | 실패 모습 | +| --- | --- | --- | +| **① 근거 제공** | `02-llm-tool.json` | 데이터에 없는 내용을 덧붙임 | +| **② 인자 추출** | Lab 02 도전 과제 | "질문에서 도시: 부산" → `Unknown city` | +| **③ 개인화 순환** | `03` → `04` | 틀린 값이 기억되어 계속 영향 | +| **④ 검색 증강** | `05` (FAQ 검색) | 검색 0건이면 답도 근거 없음 | + +> **업무 워크플로우는 패턴을 이어 붙인 것** · `05-tech-support-ticket` = ③ 개인화 순환 + ④ 검색 증강 + +--- + +## 20 / 26 · 데이터 흐름: 표현식 `{{ }}` 읽기와 문제 찾기 + +| 표현식 | 뜻 | 실제 값 | +| --- | --- | --- | +| `{{input.city}}` | 워크플로우 입력 | 제주 | +| `{{nodes.weather.output}}` | 노드 결과 전체 | `{"city": "제주", …}` | +| `{{nodes.weather.output.rain_chance}}` | 결과의 한 필드 | 80 | +| `{{nodes.faq.output.0.id}}` | 목록 첫 번째(0번)의 id | FAQ-003 | + +n8n: `{{ $json.city }}` · `{{ $('weather').item.json.rain_chance }}` + +| 문제 찾는 순서 | +| --- | +| 1. 실패한 노드의 `error` — `'not found'` = 경로 문제 | +| 2. 앞 노드 `output`의 실제 모양 | +| 3. LLM이면 `prompt` | +| 4. 고치고 `validate` → `run` | + +> **validate OK ≠ 맞는 흐름** +> `Execution order` 줄을 읽고 내가 원한 순서인지 확인 (Lab 02: `answer → result → length` 순서면 `'length' not found`) + +--- + +## 21 / 26 · 업무 자동화 시나리오 분석 6단계 + +도구부터 열지 말고 업무를 글과 그림으로 먼저 분해합니다 · 실무에서는 ①~④가 절반 이상 + +```mermaid +flowchart LR + A["① 후보 고르기
5기준 점수"] --> B["② AS-IS
현재 흐름·시간"] --> C["③ TO-BE
정상 + 예외"] --> D["④ 단계 → 노드
입력·출력"] --> E["⑤ 작성·실행
my-scenario.json"] --> F["⑥ 검증·개선
정상·문제 입력"] + classDef t fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + class A,B,C,D t + class E,F m +``` + +**자동화 후보 판단 기준** + +| 반복성 | 절차의 명확성 | 데이터 준비 | 판단의 난이도 | 실패했을 때 영향 | +| :-: | :-: | :-: | :-: | :-: | +| 매일·매주 | 문서로 정리됨 | 메일·폼·DB | 분류·요약·초안 | 되돌릴 수 있음 | + +> **환불처럼 반복은 많지만 실패 영향이 큰 일은 사람 확인을 넣어 자동화** (9월 `mini_agent_07_human_approval`) + +--- + +## 22 / 26 · 후보 점수 매겨 보기 (1~5점, 실패 영향은 작을수록 높게) + +| 기준 | IT 문의 분류·초안 | 환불 처리 | 계약서 최종 승인 | +| --- | :-: | :-: | :-: | +| **반복성** | 5 | 4 | 1 | +| **절차의 명확성** | 4 | 4 | 2 | +| **데이터 준비** | 5 | 4 | 3 | +| **판단의 난이도** | 4 | 3 | 1 | +| **실패했을 때 영향** | 4 | 2 | 1 | +| **합계 (25점)** | **22** | **17** | **8** | +| **결론** | 우선 자동화 | 사람 확인 후 자동화 | 사람이 처리 | + +> **점수는 정답이 아니라 같은 기준으로 이야기하는 도구** · 전부 자동화보다 가장 아픈 단계(FAQ 검색+초안)부터 + +--- + +## 23 / 26 · 사례: 사내 IT 문의 · AS-IS → TO-BE → 예외 경로 + +80~82일차 단위 프로젝트 '지능형 Tech Support 자동화'의 가장 작은 버전 + +```mermaid +flowchart TB + subgraph AS["AS-IS"] + direction LR + x1["메일 확인"] --> x2["유형 판단
1~2분"] --> x3["FAQ 검색
3~5분"] --> x4["답변 작성
5분"] --> x5["대장 기록
1분"] + end + subgraph TB["TO-BE"] + direction LR + y1["이력
(Memory)"] --> y2["분류
(LLM)"] --> y3["FAQ 검색
(Tool)"] --> y4{"other?
FAQ 0건?"} + y4 -->|"아니요"| y5["초안
(LLM)"] --> y6["담당자 확인"] + y4 -->|"예"| y7["담당자에게 바로"] + end + AS ~~~ TB + classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff + classDef m fill:#5B8E7D,stroke:#5B8E7D,color:#fff + classDef ai fill:#0F7C80,stroke:#0F7C80,color:#fff + classDef tool fill:#F2A541,stroke:#F2A541,color:#fff + classDef p fill:#7A6FB0,stroke:#7A6FB0,color:#fff + classDef r fill:#C65D3B,stroke:#C65D3B,color:#fff + class x1,x2,x3,x4,x5 g + class y1 m + class y2,y5 ai + class y3,y4 tool + class y6 p + class y7 r +``` + +| 예외 | 언제 | 어디로 | +| --- | --- | --- | +| **범위 밖 문의** | 분류가 `other` | 담당자에게 바로, 초안 만들지 않음 | +| **근거 없음** | FAQ 0건 (점심 메뉴) | "담당자가 확인 후 연락" + 전달 | +| **분류와 검색이 다름** | `software`인데 계정 FAQ | 담당자 확인 필수 | +| **Tool 실패** | 검색 시스템 장애 | 재시도 → 담당자 | + +마름모 = 65일차 Condition(IF) · 오늘은 그림과 표로 남김 + +> **정상 경로만 그리면 반쪽짜리 설계** · 성공 기준은 숫자로 ("테스트 10건 중 9건 정답, FAQ 0건은 모두 담당자에게") + +--- + +## 24 / 26 · AI를 쓰지 않을 단계와 사람 확인 위치 + +| 단계 | AI 대신 | 이유 | +| --- | --- | --- | +| **금액·수량 계산** | Tool·데이터 처리 | 정확해야 하고 규칙으로 해결 | +| **날짜 형식 변환** | 데이터 처리 | 항상 같은 결과 | +| **권한 확인** | 규칙·Tool | 보안 판단을 AI에 맡기면 위험 | +| **분류 → 담당 부서 대응표** | 규칙 (Condition·Switch) | 수업 준비 때 대체 모델이 부서 이름에 엉뚱한 글자를 붙임 | +| **결제·삭제 실행** | 사람 확인 후 Tool | 되돌리기 어려움 | + +| 사전 승인 | 예외만 확인 | 사후 검토 | +| :-: | :-: | :-: | +| 실행 직전 · 환불 · 외부 발송 | 조건에 걸린 것만 · IT 문의 · 리뷰 답글 | 처리 후 일부 · 회의록 요약 · 내부 보고 | + +> **처음에는 사전 승인으로 시작** → 실행 기록으로 품질을 확인한 뒤 예외만 확인으로 줄여 간다 + +--- + +## 25 / 26 · 오늘의 실습: miniflow로 워크플로우 실행하기 + +```bash +$ cd ~/aio-01d4-stu/Last3Mon/64/workflow-lab +$ uv run miniflow check + Reply (openai, …) +$ uv run miniflow run \ + flows/02-llm-tool.json \ + -i city=제주 -i question="우산?" +$ uv run miniflow show flows/05-….json +``` + +| | 실습 | 내용 | +| :-: | --- | --- | +| **1** | **Lab 01** · 첫 워크플로우 실행과 실행 기록 읽기 | args·prompt → output → ms · 지난 프로젝트를 노드로(과제) | +| **2** | **Lab 02** · LLM·Tool·Memory 연결하기 | Tool → LLM · Memory로 실행 잇기 · 노드 추가 · OpenAI·Ollama 비교 | +| **3** | **Lab 03** · 시나리오 분석과 워크플로우 설계 | 템플릿(예외 경로 포함) · `my-scenario.json` · 정상·문제 입력 비교 | + +- LLM은 OpenAI(`Last3Mon/.env`의 키) · 키·인터넷이 안 되면 Ollama가 대신 답함 +- 구조만 볼 때는 `MINIFLOW_LLM=mock` (LLM 없이 정해진 답) + +> ⚠ **키는 `.env`에만 · 채팅·문서·화면 캡처에 올리지 않기** + +--- + +## 26 / 26 · 7교시 퀴즈 · 그리고 내일 + +| A · 기본 | B · 응용 | C · 심화 | +| :-: | :-: | :-: | +| 용어와 개념 | 노드 역할 · 데이터 흐름 | 설계 판단 · 실행 기록 해석 | + +- 단계별 10문항 · 20분 · 원하는 단계 선택 +- 마지막 주관식 '더 알고 싶은 것'은 선택 · 점수 없음 + +> **65일차 예고** +> Trigger · Condition · Action +> **FAQ 결과가 없으면 어디로 보낼까?** +> n8n 실습 환경 (Docker 이미지는 오늘 밤 집에서) + +### *오늘의 한 문장: 경로는 설계자가, 판단은 AI가, 기억과 데이터는 Memory와 Tool이* diff --git a/Lecture/64/00-DAY64-OVERVIEW.pptx b/Lecture/64/00-DAY64-OVERVIEW.pptx deleted file mode 100644 index dbb81eca2dfca39fc4660432dbad904bfacbd30c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64781 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 bfhOQ(#32CF4