70일차 자료 추가(답 제외), 69일차 flow.py call -v 반영

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mcchaeandClaude Opus 5.5 committed 2026-10-21 21:34:02 +09:00
1 parent eb1903bb51
commit 2478da876f
62 files changed
+4961 -30

No files matched your search

+184
View File
@@ -0,0 +1,184 @@
# 70일차 개요 · Workflow 템플릿화와 모듈화
> 운영·확장 관점의 AI 워크플로우 설계 고도화 · 2026-10-22
> 13장 · 각 장은 가로줄(`---`)로 나뉩니다. 1교시에는 1~5장을 보고, 나머지 장은 각 단계를 설명할 때 함께 띄웁니다.
| 장 | 범위 |
| --- | --- |
| 1~5 | 표지 · 목표 · 시간표 · 복사의 비용 · 오늘의 그림 |
| 6~7 | 1단계 · 템플릿화 |
| 8~9 | 2단계 · 모듈화 |
| 10~11 | 3단계 · 변경 관리 |
| 12~13 | 7교시 바이브 코딩 · 정리와 예고 |
---
## 1 / 13 · 표지
```mermaid
flowchart LR
K["공지 키트<br/>설정 표"] --> M[["규칙 검사<br/>모듈"]]
S["SMS"] --> M
T["시험용 웹훅"] --> M
classDef o fill:#F2A541,stroke:#F2A541,color:#fff
classDef t fill:#0F7C80,stroke:#0F7C80,color:#fff
classDef g fill:#8A9BA0,stroke:#8A9BA0,color:#fff
class K,S o
class M t
class T g
```
**70일차**
# Workflow 템플릿화와 모듈화
같은 것과 다른 것 · 설정 표 · Sub-workflow 모듈 · 계약 · 하위 호환 · 버전
<sub>운영·확장 관점의 AI 워크플로우 설계 고도화 · 2026-10-22</sub>
---
## 2 / 13 · 오늘 할 수 있게 될 세 가지
| | 오늘 할 수 있게 될 것 |
| :-: | --- |
| **①** | 복사본에서 같은 것·다른 것을 찾아 **설정 표 하나**로 여러 종류를 처리하는 워크플로우로 만든다 |
| **②** | 여러 곳에서 쓰는 일을 **모듈**(Sub-workflow)로 떼어 따로 시험하고, 두 워크플로우가 함께 쓴다 |
| **③** | 모듈을 바꿀 때 **하위 호환**은 같은 id로, **깨지는 변경**은 새 버전으로 두고 영향 받는 테스트를 모두 돌린다 |
---
## 3 / 13 · 오늘의 시간표
| ① 1~2교시 | ② 3~4교시 | ③ 5~6교시 | ④ 7~8교시 |
| --- | --- | --- | --- |
| **1단계** | **2단계** | **3단계** | **바이브 코딩** |
| 템플릿화 | 모듈화 | 변경 관리 | `tkit` |
| Lab 01 복사본 → 공지 키트 | Lab 02 모듈 · SMS | Lab 03 v1.1 · v2 · 영향 표 | 만들기 · 발표 · 정리 |
> 09:00 시작 · 50분 수업 10분 휴식 · 4교시 뒤 13:00~14:00 점심
---
## 4 / 13 · 복사의 비용
`samples/`: 69일차 공지 팀을 점검·보안·교육용으로 복사한 3개 (파일에서 비교한 값)
| | |
| --- | --- |
| 노드 | 9개, 이름은 모두 같음 |
| 다른 노드 | 4개 (웹훅 경로, 작성자 지시문, 규칙 검사 코드, 결과의 종류) |
| 같은 값이 두 곳에 | 꼭 넣을 문장이 지시문과 검사 코드에 따로 |
| 공통 규칙 하나 더하기 | 6곳 (파일 3개 × 지시문·검사) |
> 복사는 처음에는 빠르고, 고칠 때 비쌉니다.
---
## 5 / 13 · 오늘의 그림
```mermaid
flowchart LR
W(["kind · facts"]) --> KS["Kind settings<br/>(설정 표)"] --> A{{"작성자"}} --> M[["규칙 검사 모듈<br/>v1.1 · v2"]] --> R(["공지"])
SW(["facts"]) --> SA{{"SMS 작성"}} --> M1[["규칙 검사 모듈 v1.1"]] --> SR(["문자"])
```
> Lab 01(설정 표) → Lab 02(모듈, 두 번째 사용처) → Lab 03(모듈 바꾸기) 순서로 완성합니다.
---
## 6 / 13 · 1단계 · 같은 것, 다른 것, 우연히 다른 것
| 분류 | 예 | 어디로 |
| --- | --- | --- |
| 같은 것 | 흐름(웹훅 → 작성 → 검사 → 결과), 날짜·연락처 검사 | 그대로 하나 · 여러 곳에서 쓰면 모듈 |
| 종류마다 다른 것 | 머리말, 최대 길이, 꼭 넣을 문장 | **설정 표** |
| 우연히 다른 것 | 한 파일만 고친 규칙, 오타 | 복사가 만든 버그 → 하나로 맞춤 |
---
## 7 / 13 · 1단계 · 설정 표와 없는 값 (수업 준비 측정)
| | 결과 |
| --- | --- |
| 공지 키트 (표 3줄) `lab01` | 5/5 |
| 표에 없는 `survey`를 보냄 (예제) | 머리말·익명 문장 없이 **그대로 게시** |
| 표에 한 줄 + 없는 종류는 400과 목록 | `lab01-challenge` 1/4 → 4/4 |
> 표에 없는 종류는 규칙도 없습니다. 없으면 멈추고, 있는 종류를 알려 줍니다.
---
## 8 / 13 · 2단계 · Sub-workflow 모듈
```mermaid
flowchart LR
C["부르는 쪽<br/>Execute Workflow<br/>id modRuleCheck01"] -->|"facts · draft ·<br/>max_length · required_phrases"| T["모듈<br/>Execute Workflow Trigger"] --> R["Rule checks"] -->|"passed · codes · issues"| C
```
| 확인 (n8n 2.42.6) | |
| --- | --- |
| 웹훅 없는 모듈도 push로 게시되고 불러짐 | ✔ |
| 시험용 웹훅으로 모듈만 시험 `lab02-module` | 5/5, 0.1초 (LLM 없음) |
| 키트가 모듈을 부르게 바꾼 뒤 `lab01` | 5/5 → 5/5 (테스트 수정 없음) |
---
## 9 / 13 · 2단계 · 두 번째 사용처: SMS
| | 공지 키트 | SMS |
| --- | --- | --- |
| 모듈 | 같은 `modRuleCheck01` | 같은 `modRuleCheck01` |
| `max_length` | 설정 표 (500~800) | 80 |
| `required_phrases` | 설정 표 | `[]` |
| 테스트 | `lab01` 5/5 | `lab02-challenge` 4/4 |
> 다른 값은 모듈 **안**이 아니라 **입력**으로. 모듈 안에 "SMS면 80"이 들어가면 쓰는 곳이 늘 때마다 모듈을 고칩니다.
---
## 10 / 13 · 3단계 · 하위 호환 변경 (같은 id)
사외 링크 금지: 새 입력 `allowed_domains`(없으면 `intra.example.com`), 새 코드 `external_link`
| 수업 준비 때 | 결과 |
| --- | --- |
| 처음 (`new URL()`로 호스트 읽기) | `lab03` 2/4 — 사내 링크도 막음 (Code 노드에 `URL` 없음) |
| 글자로 호스트 자르기 | 4/4 |
| push 직후 쓰는 곳 모두 | 모듈 시험 5/5 · 키트 5/5 · SMS 4/4 |
---
## 11 / 13 · 3단계 · 깨지는 변경은 v2 (새 id)
| | v1.1 (`modRuleCheck01`) | v2 (`modRuleCheck02`) |
| --- | --- | --- |
| 결과 | `passed`, `codes`, `issues` | `passed`, `blocking`, `warnings`, `issues` |
| `too_long` | 막음 | 경고 |
| 쓰는 곳 | SMS, 시험용 웹훅 | 공지 키트, v2 시험용 웹훅 |
> 수업 준비 때: 키트를 v2로 옮기며 키트 결과의 `codes`를 빼자 `lab01` **2/5**. `codes`를 남기고 새 필드를 **더해** 5/5. 계약은 층마다 있습니다.
---
## 12 / 13 · 7교시 · 바이브 코딩 `tkit`
```text
$ tkit ~/vibe/templates
▸ n8n-notice-kit name: [training-mail] prefix: [[교육 신청 확인]] max_length: [400]
```
- 템플릿 폴더 + `template.yaml` → 변수를 채워 새 파일 (cookiecutter 방식)
- 가장 까다로운 곳: 템플릿 변수와 n8n 표현식 `{{ }}`이 겹침
---
## 13 / 13 · 정리와 71일차 예고
| 오늘 | 한 줄 |
| --- | --- |
| 1단계 | 다른 것은 설정 표 한 곳에, 표에 없으면 멈춘다 |
| 2단계 | 여러 곳에서 쓰는 일은 모듈로, 다른 값은 입력으로, 시험용 웹훅으로 따로 시험 |
| 3단계 | 하위 호환은 같은 id, 깨지는 변경은 새 id. 바꾸면 영향 표의 테스트를 모두 |
- 71일차: **RAG 기반 검색·응답** — 사내 규정 문서를 검색해 근거와 함께 답하기 · 바이브 코딩 `tdoc`