25 KiB
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 · 표지
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가 맡는 업무 흐름
flowchart LR
A["문의 도착<br/><small>시작</small>"] --> B["본문 정리<br/><small>데이터 처리</small>"] --> C["문의 분류<br/><b>AI</b>"] --> D["FAQ 검색<br/><small>Tool</small>"] --> E["답변 초안<br/><b>AI</b>"] --> F["기록·전달<br/><small>저장</small>"]
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 · 같은 업무를 세 방식으로: 출장 날씨 안내
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 목록 |
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 · 실행 순서는 연결이 정한다
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 워크플로우의 전체 아키텍처
flowchart LR
A["① 시작<br/>사용자 요청<br/>이벤트 · 일정"] --> B["② 엔진<br/>순서 계산<br/>데이터 전달<br/>오류 처리"] --> C["③ 노드<br/>LLM · RAG · Tool<br/>Memory<br/>데이터 처리"] --> D["④ 결과<br/>화면 응답<br/>알림 · 저장"]
B -.-> E["⑤ 운영<br/>실행 기록 · 버전(74) · 비용(75)<br/>오류(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 · 같은 답이 맞는 답은 아니다
"메일 프로그램에 로그인이 안 돼요"
flowchart LR
Q["메일 프로그램에<br/>로그인이 안 돼요"] --> C["classify (LLM)<br/><b>4번 모두 software</b>"]
Q --> F["FAQ 검색 (Tool)<br/><b>FAQ-002 계정 잠김 · FAQ-005 메일함</b>"]
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로 답함 |
flowchart LR
N["LLM 노드"] --> O["OpenAI ✕<br/>키 오류·한도·인터넷"] --> 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 노드: 무엇을, 어떤 키로, 언제 지울까
// .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가지
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단계
도구부터 열지 말고 업무를 글과 그림으로 먼저 분해합니다 · 실무에서는 ①~④가 절반 이상
flowchart LR
A["① 후보 고르기<br/><small>5기준 점수</small>"] --> B["② AS-IS<br/><small>현재 흐름·시간</small>"] --> C["③ TO-BE<br/><small>정상 + 예외</small>"] --> D["④ 단계 → 노드<br/><small>입력·출력</small>"] --> E["⑤ 작성·실행<br/><small>my-scenario.json</small>"] --> F["⑥ 검증·개선<br/><small>정상·문제 입력</small>"]
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 자동화'의 가장 작은 버전
flowchart TB
subgraph AS["AS-IS"]
direction LR
x1["메일 확인"] --> x2["유형 판단<br/>1~2분"] --> x3["FAQ 검색<br/>3~5분"] --> x4["답변 작성<br/>5분"] --> x5["대장 기록<br/>1분"]
end
subgraph TB["TO-BE"]
direction LR
y1["이력<br/>(Memory)"] --> y2["분류<br/>(LLM)"] --> y3["FAQ 검색<br/>(Tool)"] --> y4{"other?<br/>FAQ 0건?"}
y4 -->|"아니요"| y5["초안<br/>(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로 워크플로우 실행하기
$ 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 이미지는 오늘 밤 집에서)