본문으로 건너뛰기
Train·Test 분할과 클라우드의 관리 범위

생성 수정

IBM * 레드햇 AX 과정 · 14강

Train·Test 분할과 클라우드의 관리 범위

2026년 6월 8일(월) ~ 6월 12일(금)

이 강의 문제풀이 — 배운 내용을 주관식 문답으로 확인해보세요.풀어보기 →

11. Train / Test 4분할 — 시험지와 정답지를 나누는 법

11.1 왜 나누는가

머신러닝에서는 일반화 성능을 확보하고 과적합(Overfitting) 을 방지하기 위해 전체 데이터를 학습용(Training) 과 시험용(Test) 으로 철저히 분리합니다.

과적합(Overfitting) — [학습 실패의 한 종류]인데, [학습 데이터는 잘 맞히지만 새 데이터는 못 맞히는 상태]라는 점에서 다른 실패와 구별된다.

기출문제만 통째로 외운 학생과 같습니다. 기출은 100점인데 실제 시험은 60점입니다. 그래서 한 번도 안 본 문제로 시험을 봐야 진짜 실력을 알 수 있습니다.

11.2 4분할 매트릭스 ⭐

전체 데이터를 문제(Feature)와 정답(Label) 관점으로 쪼개면 4단 분할 구조가 나옵니다.

       ┌──────────────────────────────────────┬──────────────────────────┐
       │               Features               │          Label           │
       │            (문제 / X 변수)            │    (정답 / y 변수 / GT)   │
┌──────┼──────────────────────────────────────┼──────────────────────────┤
│ Train│  X_train                             │  y_train                 │
│ Set  │  (학습용 문제집)                       │  (학습용 정답지)          │
├──────┼──────────────────────────────────────┼──────────────────────────┤
│ Test │  X_test                              │  y_test                  │
│ Set  │  (실전 시험지)                        │  (채점용 정답지)          │
└──────┴──────────────────────────────────────┴──────────────────────────┘

가로 축은 "문제냐 정답이냐", 세로 축은 "공부용이냐 시험용이냐" 입니다. 2×2 이므로 넷이 나옵니다. 3주차 1.2절의 좌표평면과 같은 사고법입니다.

11.3 각 영역의 역할과 통제 메커니즘

① Training Set (전체 데이터의 약 70~80%)

  • X_train — 모델에게 보여주는 학습용 입력 데이터(특성)입니다.
  • y_train — X_train 에 대응하는 정답(라벨)입니다. 모델은 이 둘을 교과서와 해설지처럼 함께 보며 가중치를 업데이트합니다.

② Test Set (전체 데이터의 약 20~30%)

  • X_test — 학습이 끝난 모델의 실력을 검증하기 위해 던져주는 실전 시험 문제입니다.
  • y_test — ⭐ 모델에게 절대 보여주지 않고 사람이 따로 쥐고 있는 채점용 정답지입니다. 모델이 X_test 를 풀어 예측값을 내놓으면, 그 결과를 y_test 와 비교해 최종 점수를 도출합니다.
from sklearn.model_selection import train_test_split

X = df.drop(columns=["Survived"])     # 문제  (Features)
y = df["Survived"]                    # 정답  (Label = Ground Truth)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model.fit(X_train, y_train)           # ✅ 학습에는 train 만 쓴다
pred = model.predict(X_test)          # ✅ 시험은 X_test 로만
score = accuracy_score(y_test, pred)  # ✅ y_test 는 채점할 때 딱 한 번

💡 random_state=42 는 난수 시드입니다. 같은 숫자를 주면 항상 같은 방식으로 쪼개집니다. 재현 가능성(Reproducibility) 을 위한 장치이고, 값 자체에 의미는 없습니다.

11.4 ⚠️ 데이터 누수 (Data Leakage)

만약 X_test 나 y_test 가 학습 과정(X_train, y_train)에 조금이라도 섞여 들어가면 시험 문제가 유출된 것과 같으므로, 실제 현장에서는 무용지물이 되는 부실한 모델이 생성됩니다.

데이터 누수(Data Leakage) — [모델 평가의 오류]인데, [평가에 쓰여야 할 정보가 학습 과정에 흘러들어간 상태]라는 점에서 다른 오류와 구별된다.

무서운 점은 누수가 있으면 점수가 올라간다는 것입니다. 그래서 알아채기 어렵습니다.

흔한 누수 경로무엇이 잘못됐나올바른 순서
전체 데이터로 스케일링한 뒤 나눔Test의 평균·분산 정보가 Train에 스며듦먼저 나누고, Train 기준으로 스케일링해서 Test에 적용
전체 데이터로 결측치를 채운 뒤 나눔같은 문제먼저 나눈 뒤 Train 통계로 채움
정답과 사실상 같은 컬럼을 피처로 씀예: "사망일자" 컬럼으로 생존 예측시점을 넘어선 정보는 제거
같은 사람 데이터가 Train과 Test에 둘 다 있음이미 본 사람을 다시 맞히는 셈사람 단위로 분할

⭐ 모든 전처리는 "나눈 다음에" 합니다. 순서 하나가 실험 전체를 무의미하게 만듭니다.

11.5 캐글 타이타닉의 train.csv 와 test.csv

1주차에서 타이타닉 데이터를 내려받았습니다. 이번 주에는 경진대회 페이지에서 다시 받았습니다. 파일이 두 개인 이유가 지금 설명됩니다.

🔗 https://www.kaggle.com/competitions/titanic/data

파일들어 있는 것4분할에서
train.csv피처 + Survived 컬럼 있음X_train + y_train
test.csv피처만, Survived 컬럼 없음X_test (y_test는 캐글이 쥐고 있음)

⭐ 캐글이 y_test 를 안 줍니다. 그게 경진대회의 규칙입니다. 참가자는 예측 결과만 제출하고, 캐글이 자기가 가진 정답으로 채점해 순위를 매깁니다. 즉 캐글 대회의 구조 자체가 11.3절의 통제 메커니즘을 그대로 구현한 것입니다.

💡 그래서 실무에서는 train.csv 를 또 한 번 쪼갭니다.

세트출처정답이 있는가언제 쓰나
Traintrain.csv 의 일부✅학습
Validationtrain.csv 의 나머지✅제출 전 자체 채점·튜닝
Testtest.csv❌ (캐글이 보관)최종 제출

12. IaaS / PaaS / SaaS — 어디까지 내가 관리하는가

12.1 세 모델의 정의

클라우드 서비스는 제공업체가 어디까지 관리하고, 사용자가 어디부터 제어하느냐에 따라 세 가지로 분류됩니다. 셋 다 ~ as a Service 로 끝납니다. "~를 서비스로 빌려 쓴다" 는 뜻입니다.

① IaaS — 서비스형 인프라② PaaS — 서비스형 플랫폼③ SaaS — 서비스형 소프트웨어
개념서버·스토리지·네트워크 등 하드웨어 자원만 가상화하여 제공인프라에 더해 애플리케이션 개발·실행 환경(플랫폼)까지 제공완성된 소프트웨어 자체를 빌려 쓰는 모델
제공 영역가상 서버(CPU·메모리), 스토리지, 네트워크, 방화벽하드웨어 자원 + OS, 미들웨어, 런타임(Python·Java·Node.js 구동 환경)인프라 + 플랫폼 + 애플리케이션 전체
사용자 관리 영역OS, 미들웨어, 런타임, 데이터, 애플리케이션애플리케이션 소스 코드, 데이터없음 (기능 이용 및 자체 데이터 활용)
장점인프라를 완전히 자유롭게 제어. 자체 구축 대비 초기 비용 절감서버·OS 관리 없이 코딩과 배포에만 집중해 개발 속도가 매우 빠름설치·업데이트 불필요, 브라우저 로그인만으로 즉시 사용
단점OS 설치·보안 설정·업데이트를 직접 해야 해 관리 부담과 진입장벽이 높음특정 플랫폼 종속성(Lock-in), 인프라 수준의 세부 제어 불가정해진 기능 외 커스터마이징·기능 변경 불가능
대표 예시AWS EC2, Google Compute Engine(GCE), Azure VMHeroku, Firebase, AWS Elastic Beanstalk, Google App EngineGoogle Drive, Gmail, Slack, Notion, Salesforce, Dropbox

12.2 책임 공유 모델 — 9층 표 ⭐

이 표 하나가 세 모델의 정의를 전부 대신합니다. 위에서 아래로 갈수록 하드웨어에 가깝습니다.

구성 요소On-Premise (자체 구축)IaaS (인프라 대여)PaaS (플랫폼 대여)SaaS (소프트웨어 대여)
애플리케이션 (App)사용자사용자사용자제공업체
데이터 (Data)사용자사용자사용자제공업체
런타임 (Runtime)사용자사용자제공업체제공업체
미들웨어 (Middleware)사용자사용자제공업체제공업체
운영체제 (OS)사용자사용자제공업체제공업체
가상화 (Virtualization)사용자제공업체제공업체제공업체
서버/하드웨어 (Server)사용자제공업체제공업체제공업체
스토리지 (Storage)사용자제공업체제공업체제공업체
네트워크 (Networking)사용자제공업체제공업체제공업체

⭐ 표를 읽는 법: 경계선이 위로 올라갈수록 내가 할 일이 줄어듭니다. On-Premise ── IaaS ── PaaS ── SaaS 순으로 자유도와 관리 부담이 함께 낮아집니다.

⚠️ 이건 발전 단계가 아닙니다. SaaS가 IaaS보다 진화한 것이 아닙니다. 3주차의 모놀리식/MSA 논의와 같습니다. 필요에 따라 고르는 것입니다.

12.3 "피자 만들기" 비유 네 가지

모델피자 비유무엇을 빌리나
On-Premise (자체 구축)집에서 도우 반죽·토핑·오븐·식기까지 전부 직접 준비아무것도 안 빌림 — 모든 것을 직접 책임
IaaS (밀키트)마트에서 도우와 토핑(인프라) 을 사 와서, 집 오븐으로 구워 먹음원재료만 빌림
PaaS (피자 배달)주문한 피자(개발 환경)가 배달되면, 내 식탁에서 음료(데이터)만 곁들여 먹음구동 환경까지 빌림
SaaS (피자 외식)레스토랑에서 완성된 피자를 먹고 나옴. 요리·서빙·설거지(유지보수)를 신경 안 씀완성품을 이용

💡 비유에서 '오븐'이 OS, '음료와 식기'가 데이터, '설거지'가 유지보수입니다. IaaS는 내 오븐을 쓰므로 OS를 내가 관리하고, PaaS는 배달되므로 OS를 안 건드립니다. 9층 표와 정확히 맞습니다.

12.4 선택 가이드

이럴 때이걸 고른다
인프라 아키텍처의 세부 제어권과 OS 단의 높은 자유도가 필요한 엔지니어링 중심 프로젝트IaaS
인프라 관리 리소스를 최소화하고 신속한 개발·배포가 최우선인 개발 팀PaaS
비즈니스 실무에 즉시 도입해 업무 생산성을 높이려는 기업 및 일반 사용자SaaS

12.5 우리가 쓰는 것들을 분류해 보기

이 교재에서 지금까지 쓴 도구들을 이 축에 얹으면 이렇게 됩니다.

도구분류왜
Vercel (프론트 배포)PaaS푸시하면 빌드·런타임·서버를 알아서 해준다. 내가 관리하는 건 코드와 환경변수뿐
Neon (PostgreSQL)PaaS 계열 (DBaaS)DB 엔진·백업·확장을 제공사가 관리. 나는 스키마와 데이터만
AWS EC2IaaS빈 서버를 받아 OS부터 내가 설치
GitHub / Notion / SlackSaaS완성된 소프트웨어를 로그인해서 씀
내 PC의 Ollama (14.7절)On-Premise모델도 런타임도 하드웨어도 전부 내 것
Gemini APISaaS 계열 (API 형태)완성된 모델을 호출만 함

⭐ 이 주에 Ollama를 로컬에 설치한 것은 의도적으로 On-Premise로 내려간 것입니다. 데이터가 밖으로 안 나가고, 토큰 비용이 0이며, 오프라인에서 돌아갑니다. 대신 성능과 관리 부담을 대가로 치릅니다.

앞으로 다시 만납니다 — Docker(14.5절)는 이 표의 가상화(Virtualization) 층을 다루는 기술입니다. "내 컴퓨터에서는 되는데 서버에서는 안 된다"는 문제가 이 층에서 생기고, 이 층에서 해결됩니다.


13. 프롬프트 · 커맨드 · 서치

13.1 세 개의 정의

같은 입력창처럼 보이지만 셋은 완전히 다른 것입니다.

① 프롬프트 (Prompt) — 컴퓨터가 입력을 받을 준비가 되었다는 '대기 신호', 또는 생성형 AI에게 내리는 '지시문'. 전통적 의미는 CLI(터미널)에서 입력을 기다리며 깜빡이는 C:\> 또는 $ 같은 기호이고, 현대적 의미는 생성형 AI로부터 원하는 답변을 얻기 위해 입력하는 자연어 질문이나 명령문입니다. 정해진 문법 없이 일상 언어로 자유롭게 지시할 수 있어 자유도가 매우 높습니다.

⚠️ 한 단어가 두 뜻을 가진 이유 — 어원이 같습니다. 라틴어 promptus = "준비된, 즉시 내놓는". 연극에서 배우에게 대사를 일러주는 사람이 프롬프터(prompter) 입니다. "다음 말을 하도록 유도하는 신호" 가 핵심 의미입니다. 터미널의 $ 는 사람에게, AI 프롬프트는 AI에게 다음 말을 하라는 신호입니다. 방향만 반대일 뿐 같은 단어입니다.

② 커맨드 (Command) — 시스템이나 소프트웨어에 특정 동작을 수행하도록 내리는 직접적인 '명령어'. 미리 정의된 엄격한 규칙과 문법(Syntax) 을 따라야 하고, 철자나 공백이 틀리면 에러가 나므로 자유도가 가장 낮습니다. 파일 목록 ls / dir, 폴더 생성 mkdir, 시스템 종료 shutdown 등이 여기 속합니다.

③ 서치 (Search) — 방대한 데이터나 시스템 내부에서 조건·키워드에 맞는 정보를 찾아내는 '탐색 행위(검색)'. 실행하거나 설정을 바꾸는 것이 아니라 이미 존재하는 데이터를 필터링해 보여달라고 요청하는 것이며, 대략 입력해도 연관 결과를 찾아줍니다. 구글/네이버 검색, 파일 탐색기 검색, 문서 내 단어 찾기(Ctrl + F)가 예입니다.

13.2 핵심 차이점 비교표 ⭐

구분프롬프트 (Prompt)커맨드 (Command)서치 (Search)
핵심 본질입력 대기 상태 / AI 지시문시스템 제어용 명령어데이터 정보 탐색 및 매칭
자유도매우 높음 (자연어 대화 가능)매우 낮음 (정해진 문법 필수)보통 (키워드/단어 입력)
입력 형태기호(>) 또는 자유로운 문장cd, mkdir, git commit 등"오늘 날씨", "보고서.docx" 등
주요 대상터미널 창, 생성형 AI(LLM)운영체제(OS), 프로그램 제어부검색엔진, 데이터베이스, 파일 시스템
입력 오류 시AI가 다시 묻거나 엉뚱한 답변 생성Command Not Found 에러 발생"검색 결과가 없습니다" 출력

⭐ 가장 중요한 줄은 마지막 줄입니다. 커맨드는 틀리면 멈춥니다. 그래서 안전합니다. 서치는 틀리면 빈손이라 손해가 없습니다. 그런데 프롬프트는 틀려도 뭔가를 만들어냅니다. 그게 위험합니다. "답이 나왔다"가 "맞았다"를 뜻하지 않습니다. 할루시네이션 문제의 뿌리가 여기 있습니다.

13.3 작동 흐름과 비유

사용자가 컴퓨터를 조작할 때 세 개념은 이렇게 연결됩니다. ① 반짝이는 프롬프트(입력창) 가 활성화되어 명령을 기다리고 → ② 시스템을 제어하려면 정확한 커맨드를 입력하거나 → ③ 정보를 얻으려면 키워드로 서치를 수행합니다.

개념일상 비유
프롬프트비서가 수첩을 들고 "말씀하세요, 대기 중입니다" 라고 말하는 상태 / 시험지의 "다음 질문에 답하시오"
커맨드군대에서 지휘관이 내리는 "차려", "앞으로 가" — 토를 달 수 없고 정확해야 하는 구호
서치거대한 도서관 서가에서 원하는 책(정보)을 찾기 위해 도서 검색대를 이용하는 행위

13.4 같은 구글인데 왜 하나는 서치, 하나는 프롬프트인가

이 주에 나온 질문입니다. 구글 검색과 제미나이(Gemini)는 같은 회사 제품이고 둘 다 입력창이 하나 있습니다. 그런데 하나는 '검색엔진'이라 부르고 하나는 '언어모델'이라 부릅니다. 차이는 입력창이 아니라 뒤에 있는 것입니다.

구글 검색 (Search)제미나이 (Prompt)
뒤에 있는 것역색인(Inverted Index) — 이미 존재하는 문서 목록언어모델 — 다음 단어의 확률 분포
하는 일있는 것을 찾아서 가리킨다없던 문장을 만들어낸다
결과의 성격링크 목록 (출처가 있다)생성된 문장 (출처가 없을 수 있다)
같은 질문을 두 번 하면거의 같은 결과다른 문장이 나올 수 있다
받았을 때 첫 번째로 할 일어느 사이트인지 본다 (신뢰의 근거 = 출처)근거가 있는지 묻는다 (신뢰의 근거 = 검증)

⭐ 판별 축: "찾는가, 만드는가." 찾는 것은 서치이고, 만드는 것은 프롬프트입니다. 입력창의 생김새는 같아도 하는 일이 근본적으로 다릅니다. 이것이 이 주 마지막 날의 주제(할루시네이션 대응, 14.13절)로 이어집니다.


14. 실습 — 이번 주에 손으로 한 것

14.1 프랙탈 구조 완성 — 파일명 일괄 정리 프롬프트

6주차에서 빈 파일들을 만들어 뒀습니다. 이번 주에는 열 개 폴더의 이름 규칙을 한 번에 통일했습니다.

api/schemas 폴더의 파일명을 기준으로

  api/v1
  adapter/outbound/orm
  adapter/outbound/pg
  app/dtos
  app/ports/input
  app/ports/output
  app/use_cases
  dependencies
  domain/entities
  domain/value_objects

위 폴더들의 접두사·접미사를 서로 일치시키고,
그 과정에서 발생하는 import 에러까지 전부 수정해줘.

결과 형태는 james_schema.py(api/schemas) · james_router.py(api/v1) · james_orm.py(orm) · james_pg_repository.py(pg) · james_dto.py(dtos) · james_use_case.py(ports/input) · james_repository.py(ports/output) · james_interactor.py(use_cases) · james_dependency.py(dependencies) · james.py(domain/entities) 처럼 접두사 하나로 열 개가 묶입니다.

💡 왜 이 작업이 중요한가 — 3주차의 프랙탈 구조를 파일명 레벨까지 밀어붙인 것입니다. 이름이 규칙적이면 파일 하나만 보고 나머지 아홉 개의 위치를 추론할 수 있습니다. 사람에게도 그렇지만 AI에게 특히 그렇습니다. 6주차 11.4절의 "좋은 아키텍처는 토큰을 아낀다"의 실천입니다.

⚠️ 이런 대규모 리네이밍은 import 에러를 반드시 동반합니다. 그래서 프롬프트에 그 수정까지 명시적으로 넣습니다. "파일명만 바꿔줘"라고 하면 프로젝트가 안 켜지는 상태로 끝납니다.

14.2 CLAUDE.md 최상위 규칙 만들기

프로젝트 루트에 AI가 항상 지켜야 할 규칙을 문서로 못 박습니다.

CLAUDE.md 최상위 규칙을 만들어줘.

- 카파시의 하네스 엔지니어링 위에 Wiki + LLM 의 PKS 를 구현한다
- 반드시 SOLID 를 준수한다
- 헥사고날 + 클린 아키텍처 + DDD 를 적용한다
- 내부 경로 표기에서 tailor / apps 는 생략한다
- core 경로는 tailor.core. 로 시작한다
- ⚠️ 규칙 본문은 영어로 작성한다

⚠️ 왜 규칙 본문을 영어로 쓰는가 — 모델이 학습한 기술 문서 대부분이 영어이기 때문입니다. 같은 지시라도 영어 쪽이 토큰 수가 적고 해석이 안정적입니다. 반면 설명과 대화는 한국어로 합니다. 규칙(기계가 읽는 것)과 설명(사람이 읽는 것)의 언어를 분리하는 것입니다.

💡 이 파일이 6주차 11.1절 하네스의 가이드(Guide, 피드포워드) 에 해당합니다. 행동하기 전에 방향을 잡아주는 장치입니다.

14.3 CLAUDE.md 4개 구조 — 시블링 확장을 전제로

주 후반에는 CLAUDE.md를 하나에서 넷으로 쪼갰습니다.

프로젝트 루트/
├── CLAUDE.md                 ① 루트 — 공통 원칙 (SOLID, 아키텍처, 경로 규칙)
├── tailor/
│   └── CLAUDE.md             ② 백엔드 — FastAPI, SQLAlchemy, 포트/어댑터 규칙
│       └── apps/titanic/
│           └── CLAUDE.md     ④ 타이타닉 앱 — 이 앱에만 해당하는 것
└── taylor/
    └── CLAUDE.md             ③ 프론트엔드 — Next.js, 컴포넌트 규칙

타이타닉의 CLAUDE.md는 루트 내용을 복사하지 않고 링크로 참조합니다. 3주차에서 배운 시블링(Sibling) 구조 — 앱이 titanic, walter, rose 처럼 옆으로 늘어날 것을 전제하기 때문입니다.

⭐ 이 작업 자체가 이 장의 OCP입니다. 앱이 하나 늘 때 루트 CLAUDE.md를 여는가(변경), 앱 폴더에 하나 더 만드는가(확장)? 답은 후자여야 합니다. 3.2절의 include_router 와 완전히 같은 구조입니다.

14.4 __abstract__ = True — 테이블 없이 설계만

실제 DB 테이블을 만들지 않고 설계만 유지하려면 ORM 클래스 안에 한 줄이면 됩니다.

class TimeStampedORM(Base):
    __abstract__ = True     # 이 클래스는 테이블로 만들지 않는다

자세한 설명은 2.8절에 있습니다.

14.5 Docker 설치와 도커허브

Docker란 무엇인가 — 애플리케이션과 그것이 돌아가는 데 필요한 환경 전체를 하나의 상자(컨테이너)에 담는 기술입니다. 4주차 격리 3단계에서 예고했던 그 컨테이너입니다.

가상환경 (venv/conda)   →   컨테이너 (Docker)   →   가상 머신 (VM)
   패키지만 격리            OS 라이브러리까지 격리      OS 통째로 격리

설치 — 관리자 권한 PowerShell에서 wsl --install. WSL(Windows Subsystem for Linux)은 윈도우 안에서 리눅스를 돌리는 장치입니다. Docker Desktop이 리눅스 컨테이너를 실행하려면 이게 먼저 필요합니다. 설치 후 재부팅합니다.

도커허브(Docker Hub) 🔗 https://hub.docker.com/ — 이미지를 올리고 내려받는 공용 저장소입니다. 1주차 축 2(로컬 ↔ 원격)의 한 쌍이고, 구조가 전부 같습니다.

로컬원격
Git 저장소GitHub
Docker 이미지Docker Hub
모델 파일Hugging Face

⭐ "내 것을 만든다 → 공용 저장소에 올린다 → 남이 받아 쓴다." 이름만 다를 뿐 하나의 패턴입니다.

14.6 캐글 타이타닉 — 피처 확인과 재다운로드

🔗 https://www.kaggle.com/competitions/titanic/data — train.csv 와 test.csv 를 받습니다. 두 파일의 차이는 11.5절에 있습니다.

받은 뒤 가장 먼저 할 일 — 피처 확인

import pandas as pd

train = pd.read_csv("train.csv")

print(train.shape)          # (891, 12) — 행/열 개수
print(train.columns)        # 피처 목록
print(train.info())         # 타입과 결측치 개수
print(train.isnull().sum()) # 컬럼별 빈칸 개수
print(train.describe())     # 숫자 컬럼의 기초 통계

⭐ isnull().sum() 이 곧 6.3절 결측치 처리의 시작점입니다. 타이타닉에서는 Age 와 Cabin 에 빈칸이 많습니다.

컬럼결측 상황흔한 대응
Age일부 결측중앙값 또는 그룹별 중앙값으로 채움
Cabin대부분 결측컬럼 자체를 버리거나 "있음/없음" 이진 피처로 변환
Embarked아주 소수 결측최빈값으로 채움

⚠️ 11.4절을 잊지 마세요. 채우기는 나눈 뒤에 합니다.

14.7 Ollama 설치와 로컬 한국어 모델

Ollama 🔗 https://ollama.com/download/windows — 설치 후 명령 프롬프트(cmd)에서:

ollama run anpigon/eeve-korean-10.8b

>>> 프롬프트가 뜨면 한국어로 테스트해 보고, /exit 로 종료합니다.

⚠️ 여기서 나오는 >>> 가 13.1절의 전통적 의미의 프롬프트입니다. "입력을 기다리고 있다"는 신호입니다. 그 뒤에 자연어를 치면 현대적 의미의 프롬프트가 됩니다. 같은 화면 안에서 한 단어의 두 뜻이 동시에 보이는 드문 장면입니다.

왜 EEVE-Korean인가 — 야놀자가 공개한 한국어 특화 모델로, 기본 Llama3보다 한국어 속도와 문맥 이해가 우수합니다. 로컬 모델은 크기가 곧 요구 메모리이므로, 한국어를 잘하는 작은 모델을 고르는 것이 관건입니다.

14.8 kiwipiepy + Ollama — 경쟁이 아니라 상호보완

# requirements.txt 에 최신 버전으로 추가
kiwipiepy
ollama

로컬 한국어 조합의 결론 — ⭐ 둘은 경쟁 관계가 아니라 상호보완입니다.

원문 ──▶ [ kiwipiepy ] ──▶ 정제된 토큰 ──▶ [ EEVE on Ollama ] ──▶ 답변
          전처리기                              모델
요소역할개념 메타포
kiwipiepy한국어 형태소 분석 — 문장을 의미 단위로 쪼개는 전처리 · 토큰화전처리기(편집 도구) — 원본을 다듬어 재료로 만듦
Ollama모델을 올리고 실행하는 런타임유튜브 플랫폼 — 무대
EEVE-Korean쪼개진 것을 재료로 답변을 생성하는 메인 LLM유튜브의 채널/영상 — 실제 내용물

⚠️ 자주 하는 혼동: "Ollama가 AI 모델인가요?" — 아닙니다. Ollama는 모델을 실행하는 런타임(플랫폼) 이고, 모델은 그 위에 올라가는 내용물입니다. 유튜브와 유튜브 영상의 관계와 같습니다.

14.9 더 가벼운 모델로 교체

10.8B 모델은 개인 PC에서 무겁습니다. 더 작은 모델로 바꾸고, 도커가 아니라 낱개 파일로 실행해 확인합니다.

ollama pull qwen2.5:3b
python test.py

💡 왜 도커가 아니라 낱개 파일인가 — 문제를 좁히기 위해서입니다. 컨테이너 안에서 실행하면 실패했을 때 모델 문제인지 컨테이너 설정 문제인지 구별이 안 됩니다. 먼저 가장 단순한 형태로 되는 것을 확인하고, 그다음 감쌉니다. 6주차 10.5절의 "먼저 동작하는 것을 만든다"와 같은 순서입니다.

표기뜻대략적 요구 메모리
3b30억 파라미터개인 노트북에서도 돌아감
10.8b108억 파라미터상당한 RAM/VRAM 필요

⭐ 8장의 CPU/GPU 이야기가 여기서 체감됩니다. GPU가 없으면 CPU로 돌아가는데, 큰 모델일수록 그 차이가 견딜 수 없어집니다.

14.10 TDD 실습 — pytest 세 가지 실행

cd tailor

# ① 전체 단위 테스트 (82개, test_korean_ai 제외)
python -m pytest

# ② Ollama 연동 테스트 — Ollama 서버가 켜져 있어야 함
python -m pytest apps/titanic/tests/test_korean_ai.py -m ollama -v -s

# ③ 테스트 파일을 그냥 파이썬으로 실행
python apps/titanic/tests/test_korean_ai.py

옵션 읽는 법

옵션뜻
-m ollama@pytest.mark.ollama 로 표시된 테스트만 실행
-vverbose — 테스트 이름을 하나씩 출력
-s테스트 안의 print() 출력을 화면에 보여줌

⚠️ 왜 Ollama 테스트를 따로 떼어놓는가 — 외부 서버가 필요한 테스트이기 때문입니다. Ollama가 꺼져 있으면 실패하는데, 그건 코드가 틀린 게 아니라 환경이 없는 것입니다. "코드의 문제"와 "환경의 문제"를 섞으면 테스트를 믿을 수 없게 됩니다. 그래서 마커로 분리합니다.

💡 이게 하네스의 센서(Sensor)입니다. 가이드(CLAUDE.md)가 행동 전 방향을 잡고, 센서(테스트)가 행동 후 결과를 확인합니다.

14.11 프론트 채팅창 → 백엔드 라우터 연결

① 프론트 — captain-smith/page.tsx

const res = await fetch("/api/titanic/smith/chat", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ messages }),      // ⭐ 키값은 messages
});

② 백엔드 — crew_smith_captain_router.py

from fastapi import APIRouter, Body

crew_smith_captain_router = APIRouter()

@crew_smith_captain_router.post("/smith/chat")
async def chat(messages = Body(...)):
    print(f"[Router] {messages}")          # ⭐ 먼저 로그부터
    return {"ok": True}

⭐ 성공 판정 기준은 "답변이 나오는 것"이 아니라 "로그가 찍히는 것"입니다. 6주차 10.4절과 같은 원칙입니다. 흐름이 여러 조각으로 나뉘면 로그가 유일한 눈입니다.

연결이 안 될 때 확인 순서 — ① 브라우저 개발자도구 Network 탭(요청이 아예 안 나갔는가) → ② 요청 URL이 라우터 경로와 같은가(prefix 중복 /api/titanic 두 번) → ③ Body의 키 이름이 같은가(message vs messages) → ④ 백엔드 콘솔에 로그가 찍히는가(여기까지 오면 절반은 성공) → ⑤ CORS 에러(3주차 설정 확인).

⚠️ 3번이 가장 자주 나오는 실수입니다. 키 하나가 다르면 FastAPI는 422 Unprocessable Entity 를 돌려줍니다. "서버는 켜졌는데 422가 뜬다"면 경로가 아니라 몸통(Body)을 의심하세요.

14.12 옵시디언 정리 — 개발 파일 숨기기

코드 폴더를 옵시디언 vault로 열면 .py, node_modules 같은 게 전부 보여서 노트가 묻힙니다. 기획 노트만 보이게 만드는 설정입니다.

① vault 전환 — 좌측 하단 vault 이름 → Manage vaults... → Open folder as vault

② 제외 파일 설정 — 좌측 하단 톱니바퀴 → 파일 및 링크(Files and links) → 고급 설정 > 제외하는 파일(Excluded files) 의 관리 버튼

분류넣을 패턴
파이썬__pycache__, **/*.py (기획 노트만 보고 싶을 때 강추), alembic
Node/Nextnode_modules, .next, out, .coverage — ⚠️ 안 숨기면 옵시디언이 느려짐
가상환경.venv 또는 venv, .pytest_cache, .mypy_cache, .ruff_cache
프론트 소스(선택)**/*.ts, **/*.tsx, **/*.js, **/*.jsx, **/*.css, **/*.scss
기타.DS_Store, .env*

설정에 보관함 캐시 다시 빌드하기 가 있습니다. vault 크기에 따라 몇 초에서 몇 분 걸립니다.

③ CSS 스니펫 추가 — 설정 > 외형(Appearance) → 하단 CSS snippets 의 폴더 열기(vault/.obsidian/snippets) → 새 텍스트 문서를 hide-cache.css 로 이름 변경 후:

div[data-path$="alembic"],
div[data-path*="__pycache__/"] {
    display: none !important;
}

④ 커뮤니티 플러그인 — 설정 > Community plugins → Browse → Show Hidden Files 설치 → 이어서 File Hider (by eldritch-oliver) 설치 후 토글 활성화 → 톱니바퀴에서 Show all file types 와 Show hidden files 를 둘 다 비활성화

⑤ 그래도 보이면 — 해당 폴더를 우클릭 후 Hide Folder. 마지막으로 옵시디언을 껐다 켭니다.

💡 이 작업도 이 장의 주제와 이어집니다. 노트(사람이 읽는 것)와 코드(기계가 읽는 것)의 경계를 긋는 일입니다. 14.2절에서 규칙은 영어, 설명은 한국어로 나눈 것과 같은 종류의 분리입니다.

14.13 할루시네이션을 극복하는 두 가지 방법

주 마지막 날의 주제입니다. 13.2절의 "프롬프트는 틀려도 뭔가를 만들어낸다" 에 대한 대응책입니다.

#방법무엇을 하는가이 장의 어느 개념과 이어지나
①근거를 주기 (RAG · Grounding)기억에 의존해 지어내지 않도록 검색된 실제 문서를 프롬프트에 함께 넣어 그 안에서만 답하게 함10장 Ground Truth — 근거가 되는 진실을 밖에서 가져온다
②검증하기 (테스트 · 평가 루프)답을 그대로 믿지 않고 자동 테스트나 평가 기준으로 채점한 뒤 통과한 것만 받아들임11장 평가 단계 — 정답지를 따로 쥐고 채점한다

①은 입력 쪽을 고치고, ②는 출력 쪽을 검사합니다. 6주차 11.1절의 하네스 두 축 — 가이드(피드포워드)와 센서(피드백) — 와 같은 쌍입니다.

이 주에 LLM에게 실제로 던진 검증 질문이 이것입니다.

하네스 엔지니어링에서 머신러닝 단계의 할루시네이션 감소를 위해 RAG를 구성할 때,
켄트 벡의 TDD를 도입하는 것이 철학적으로 맞는가?

⭐ 이 질문 자체가 훈련입니다. 답을 얻으려는 질문이 아니라 모델이 개념을 제대로 연결하는지 보려는 질문입니다. TDD는 "먼저 실패하는 테스트를 쓰고, 그걸 통과시키는 코드를 쓴다"입니다. RAG에 적용하면 "먼저 기대하는 답의 기준을 정하고, 그 기준을 통과하는 검색·생성을 만든다" 가 됩니다. 즉 위 표의 ②를 ①보다 먼저 놓는 순서입니다.

💡 AI 답변을 검증하는 실전 요령: 내가 이미 아는 주제로 물어보세요. 모르는 주제로 물으면 답이 맞는지 알 수 없습니다. 아는 것으로 모델을 재고, 그다음 모르는 것을 묻습니다.


15. 이 주의 읽을거리와 그 맥락

15.1 인간은 고리 밖에 있다 — Why loop vs How loop

🔗 https://martinfowler.com/articles/exploring-gen-ai/humans-and-agents.html

AI 에이전트가 코드를 쓰는 시대에 사람의 자리가 어디인가를 다룬 글입니다. 핵심은 두 개의 고리(loop) 입니다.

How loopWhy loop
무엇을 도는가어떻게 만들 것인가 — 구현·수정·테스트·재시도왜 만드는가 — 목적·우선순위·판단·수용 기준
누가 도는가점점 에이전트가여전히 사람이
속도매우 빠름 (수 초~수 분)느림 (수 시간~수 일)
사람의 위치고리 밖에서 지켜봄 (on the loop)고리 안에 있음 (in the loop)

전통적으로 개발자는 How loop 안에 있었습니다. 한 줄 쓰고, 돌려보고, 고치는 것을 직접 했습니다. 이제 그 안쪽 고리는 에이전트가 돕니다. 사람은 밖에서 방향을 정하고 결과를 받아들일지 판단합니다.

이게 왜 이 주의 자료인가 — 이 장의 OCP와 같은 그림이기 때문입니다.

     Why loop (사람)   ←── 안 바뀌는 쪽 = 변경에 닫힘
     ─────┼───────────── 인터페이스 = 명세·수용 기준·CLAUDE.md
     How loop (에이전트) ←── 갈아끼우는 쪽 = 확장에 열림

3.5절에서 pg_repository 를 mongo_repository 로 갈아끼워도 유스케이스가 안 바뀌었습니다. 같은 방식으로 How loop를 사람이 돌든 에이전트가 돌든 Why loop는 안 바뀝니다. 그래서 명세와 수용 기준을 문서로 못 박는 일(14.2절 CLAUDE.md) 이 그 인터페이스가 됩니다.

⭐ 경계를 명확히 그은 사람만 안쪽을 자동화할 수 있습니다. 이 장 전체의 메시지와 같습니다.

15.2 AI 코딩의 발전단계 — 하네스 엔지니어링과 완전 자율형 에이전트

🔗 https://bcho.tistory.com/m/1508

AI 코딩 도구가 어디까지 왔고 어디로 가는지를 단계로 정리한 글입니다.

단계사람이 하는 일AI가 하는 일
① 자동완성코드를 쓴다다음 줄을 제안한다
② 대화형 생성무엇을 만들지 말한다함수·파일 단위로 만든다
③ 하네스 엔지니어링구조·규칙·테스트를 만든다그 안에서 자유롭게 구현한다
④ 완전 자율 에이전트목표만 준다계획·구현·검증까지 스스로

이게 왜 이 주에 나왔는가 — 이 주의 작업이 정확히 ③단계이기 때문입니다. 파일명 규칙을 통일했고(14.1), CLAUDE.md로 규칙을 못 박았고(14.2, 14.3), 82개의 테스트를 돌렸습니다(14.10).

⭐ 셋 다 "코드를 쓴 일"이 아니라 "AI가 지킬 구조를 만든 일"입니다. 그리고 그 구조의 이름이 이 장에서 배운 LSP와 OCP 입니다. "AI가 아무 파일이나 열지 못하게" 만드는 것이 OCP이고, "AI가 만든 하위 타입이 기존 코드를 깨지 않게" 만드는 것이 LSP입니다.

15.3 스키마와 인스턴스

🔗 https://computer-science-student.tistory.com/478

이게 왜 이 주의 자료인가 — 이 주에 Schema 라는 단어를 세 가지 뜻으로 썼기 때문입니다(5.2절). Pydantic Schema, DB Schema, PostgreSQL의 네임스페이스 schema. 같은 단어가 층마다 다른 것을 가리킬 때, 원래 뜻(틀·형태)으로 돌아가면 길을 잃지 않습니다.

15.4 캐글 타이타닉 경진대회 데이터

🔗 https://www.kaggle.com/competitions/titanic/data

이게 왜 이 주의 자료인가 — 1주차에서는 "이진 분류 연습용 CSV"로 받았지만, 이번 주에는 11장의 4분할 구조를 실제로 확인하기 위해 다시 받았습니다. train.csv 에는 Survived 가 있고 test.csv 에는 없다는 사실 하나가, "y_test 는 모델에게 보여주지 않는다"는 원칙의 살아 있는 증거입니다.

15.5 도커허브

🔗 https://hub.docker.com/

이게 왜 이 주의 자료인가 — 12장의 IaaS/PaaS/SaaS 축과 짝을 이룹니다. 클라우드가 "어디까지 남이 관리하는가" 의 축이라면, 컨테이너는 "어디까지 내가 싸 들고 다니는가" 의 축입니다. Docker 이미지는 앱 + 런타임 + OS 라이브러리를 통째로 포장한 것이라 어느 클라우드에 올리든 같은 결과가 나옵니다. 12.2절 표에서 벤더 종속을 줄이는 장치입니다.

15.6 옵시디언 설정 정리 노트

🔗 https://share.evernote.com/note/674a0370-7bb1-40f3-ac6f-f412e74c05b2

이게 왜 이 주의 자료인가 — 14.12절의 절차 원본입니다. 노트와 코드가 같은 폴더에 있는 구조(모노레포)를 택했기 때문에 생긴 문제이고, 3주차에서 배운 모노레포의 대가(trade-off) 가 실제로 나타난 장면입니다.


부록 A. 용어 사전

용어영문상위 범주정의
리스코프 치환 원칙Liskov Substitution Principle (LSP)SOLID 원칙하위 타입은 상위 타입 자리에 넣어도 안전해야 함
개방-폐쇄 원칙Open-Closed Principle (OCP)SOLID 원칙확장에는 열고 변경에는 닫음
데이터 객체Data Object코드 분류값을 담고 계층을 이동하는 것 (Schema·DTO·VO·Entity·ORM)
제어 컴포넌트Control Component코드 분류흐름을 만들고 다른 것을 호출하는 것 (Router·Use Case·Repository)
스키마Schema명세구조·타입·제약조건의 정의. '틀'
DTOData Transfer Object데이터 객체계층 간 전달만을 위한 순수 값 꾸러미
VOValue Object데이터 객체식별자 없이 값의 조합이 정체성인 불변 객체
엔티티(도메인)Entity데이터 객체식별자와 비즈니스 규칙을 가진 도메인 개념
ORMObject-Relational Mapping기술객체와 테이블 행을 서로 변환
__abstract__—SQLAlchemy 속성테이블을 만들지 않고 컬럼 정의만 물려주는 선언
ORM 상속 전략Inheritance StrategyORM 개념Single Table / Joined / Concrete Table — 객체 상속을 테이블로 내리는 방식
영속성 컨텍스트Persistence ContextORM 개념ORM이 객체의 변경을 추적·반영하는 작업 공간
조립소Dependency Assembly구조구현체를 골라 주입하는 유일한 자리 (dependencies/)
러닝LearningAI 개념데이터에서 컴퓨터가 스스로 규칙을 찾아내는 과정
피처Feature데이터 항목모델이 예측·분류의 근거로 삼는 단서 (독립변수 X)
라벨Label / Target데이터 항목맞혀야 하는 정답 컬럼 (종속변수 y)
피처 엔지니어링Feature Engineering전처리 작업원시 데이터를 모델이 이해하기 좋은 형태로 가공
머신러닝Machine Learning (ML)AI규칙을 데이터에서 찾아내는 AI
딥러닝Deep Learning (DL)머신러닝신경망을 여러 층 쌓아 특징까지 스스로 찾는 머신러닝
해석 가능성Interpretability성질모델의 판단 근거를 사람이 이해할 수 있는 정도
CPUCentral Processing Unit하드웨어복잡한 논리를 순차로 처리하는 연산 장치
GPUGraphics Processing Unit하드웨어단순 연산을 대규모 병렬로 처리하는 연산 장치
병렬화Parallelization처리 방식서로 독립적인 계산을 동시에 수행하는 것
행렬 곱셈Matrix Multiplication연산신경망 한 층의 계산을 이루는 기본 연산
데이터셋Dataset데이터 묶음특정 목적을 위해 모아둔 정적인 데이터 집합
데이터베이스Database시스템데이터를 통합·관리하는 동적인 구조화 시스템
Ground Truth—기준 데이터우리가 진실이라고 합의한 정답. 모델 밖에서 온 것
라벨링 노이즈Labeling Noise데이터 품질 문제정답 자체에 섞인 오류
과적합Overfitting학습 실패학습 데이터는 잘 맞히지만 새 데이터는 못 맞히는 상태
검증 세트Validation Set데이터 분할제출 전 자체 채점·튜닝에 쓰는 데이터
학습/시험 세트Training / Test Set데이터 분할규칙을 익히는 데이터(7080%) / 실력을 재는 데이터(2030%)
데이터 누수Data Leakage평가 오류평가용 정보가 학습 과정에 흘러들어간 상태
온프레미스On-Premise인프라 형태하드웨어부터 전부 직접 보유·관리하는 방식
IaaSInfrastructure as a Service클라우드 모델하드웨어 자원만 가상화해 제공
PaaSPlatform as a Service클라우드 모델인프라 + OS·미들웨어·런타임까지 제공
SaaSSoftware as a Service클라우드 모델완성된 소프트웨어 자체를 제공
프롬프트Prompt입력입력 대기 신호 또는 AI에게 주는 지시문
커맨드Command입력정해진 문법을 따르는 시스템 명령어
서치Search행위존재하는 데이터에서 조건에 맞는 것을 찾는 탐색
할루시네이션HallucinationAI 문제모델이 근거 없는 내용을 사실처럼 생성하는 현상
RAGRetrieval-Augmented Generation기법검색한 문서를 근거로 넣어 답하게 하는 방식
TDDTest-Driven Development개발 방법론실패하는 테스트를 먼저 쓰고 통과시키는 코드를 쓰는 방식
하네스Harness실행 구조모델을 감싸 실제 행동을 가능하게 하는 구조
How loop / Why loop—작업 고리어떻게 만드는가(에이전트) / 왜 만드는가(사람)의 반복
Docker—격리 기술앱과 실행 환경을 컨테이너 하나에 담는 기술
WSLWindows Subsystem for Linux실행 환경윈도우 안에서 리눅스를 돌리는 장치
Docker Hub—원격 저장소컨테이너 이미지를 공유하는 공용 저장소
Ollama—런타임로컬에서 LLM을 실행·관리하는 플랫폼
kiwipiepy—라이브러리한국어 형태소 분석·토큰화 도구

부록 B. 스스로 확인하기

먼저 답해보고, 막히면 옆의 절을 펼치세요.

#질문답이 있는 곳
1LSP는 어떤 종류의 코드에, OCP는 어떤 종류의 코드에 붙는가?1.2, 1.5
2"받는 건 넓게, 주는 건 좁게"는 무슨 뜻인가?2.3
3부르는 쪽에 isinstance 분기가 생기면 무엇이 깨진 것인가?2.4
4__abstract__ = True 는 무엇을 막는가?2.8
5정사각형을 직사각형에서 상속하면 왜 위험한가?2.9
6pg_repository 를 mongo_repository 로 바꿀 때 실제로 바뀌는 파일은?3.5
7한 요청 흐름에서 상자와 화살표에는 각각 어떤 원칙이 붙는가?4.1
8Schema 라는 단어가 이 교재에서 가리키는 세 가지는?5.2
9전통 프로그래밍과 러닝은 출력이 어떻게 다른가?6.1
10피처 엔지니어링 네 가지 작업은?6.3
11머신러닝과 딥러닝의 특징 추출 주체는 각각 누구인가?7.3
12딥러닝에 GPU가 필수인 이유를 한 문장으로?8.2
133주차의 동기/비동기와 이 장의 순차/병렬은 무엇이 다른가?8.4
14Dataset과 Database를 가르는 축은 무엇인가?9.1, 9.3
15Ground Truth의 어원과, 학습·평가에서의 서로 다른 역할은?10.1, 10.2
16y_test 를 모델에게 보여주면 안 되는 이유는?11.3, 11.4
17캐글 test.csv 에 Survived 컬럼이 없는 이유는?11.5
18IaaS와 PaaS를 가르는 층은 9층 표에서 어디인가?12.2
19프롬프트·커맨드·서치는 입력 오류 시 각각 어떻게 반응하는가?13.2
20구글 검색과 제미나이를 가르는 한 단어짜리 축은?13.4
21Ollama 테스트를 -m ollama 마커로 분리하는 이유는?14.10
22할루시네이션 대응 두 가지는 각각 입력과 출력 중 어디를 고치는가?14.13

부록 C. 자주 하는 실수

실수바로잡기
"SOLID 다섯 개를 모든 파일에 다 적용해야 한다"⚠️ 원칙마다 주 담당 구역이 다릅니다. 데이터는 LSP, 제어는 OCP부터
"자식이 검증을 더 빡세게 하면 좋은 것"❌ 부모가 받던 값을 자식이 거부하면 LSP 위반입니다
"부모의 필수 필드를 Optional로 낮춰도 된다"❌ 계약 위반입니다. 부르는 쪽이 값이 있다고 믿고 있습니다
"정사각형은 직사각형이니 상속하면 된다"❌ 수학적 IS-A와 프로그래밍 IS-A는 다릅니다 (2.9)
"도메인 Entity와 ORM Entity는 같은 것"❌ 한쪽은 규칙을 알고, 한쪽은 테이블을 압니다 (2.1)
"부모 ORM 클래스도 테이블이 생기는 게 정상"⚠️ __abstract__ = True 를 빠뜨린 것입니다 (2.8)
"OCP를 지키면 아무 파일도 안 바뀐다"❌ 조립소 한 곳은 바뀝니다. 바뀌는 자리를 몰아넣는 게 목적입니다
"기능 추가는 기존 유스케이스에 if 를 넣으면 된다"❌ 그건 확장이 아니라 변경입니다. 새 파일을 만드세요
"머신러닝과 딥러닝은 다른 두 기술"❌ 딥러닝은 머신러닝의 부분집합입니다 (7.1)
"GPU가 CPU보다 좋은 부품"❌ 잘하는 일이 다릅니다. 순차 논리는 CPU가 빠릅니다
"비동기를 쓰면 학습이 빨라진다"❌ 비동기는 기다림을, 병렬화는 계산을 다룹니다 (8.4)
"Ground Truth는 언제나 옳다"⚠️ 사람이 라벨링한 것이므로 노이즈가 있습니다 (10.3)
"AI가 틀렸다"⚠️ 상당수는 데이터가 틀린 것입니다. 라벨부터 의심하세요
"정확도가 높으니 좋은 모델"⚠️ 데이터 누수가 있으면 점수는 올라갑니다
"전처리를 다 끝내고 train/test로 나눈다"❌ 순서가 반대입니다. 먼저 나누고 전처리합니다
"test.csv 로 성능을 직접 확인하면 된다"⚠️ 캐글은 정답을 안 줍니다. train.csv 를 또 쪼개 검증하세요
"SaaS가 IaaS보다 발전한 형태"❌ 발전 단계가 아니라 선택지입니다
"프롬프트는 그냥 AI에게 하는 질문"⚠️ 전통적 의미는 입력 대기 신호입니다. >>> 도 프롬프트입니다
"AI가 답을 줬으니 맞는 것"❌ 프롬프트는 틀려도 뭔가를 만들어냅니다 (13.2)
"Ollama가 AI 모델이다"❌ Ollama는 런타임(플랫폼) 이고 모델은 그 위의 내용물입니다
"테스트가 실패하니 코드가 틀린 것"⚠️ Ollama가 안 켜졌을 수도 있습니다. 환경 문제와 코드 문제를 분리하세요
"요청이 422면 경로가 틀린 것"⚠️ 경로가 아니라 Body의 키 이름을 먼저 의심하세요

부록 D. 날짜별 색인

이 장의 내용이 실제 수업에서 어느 날 다뤄졌는지입니다.

날짜다룬 내용이 장의 절
6/8 (월)프랙탈 구현용 파일명 일괄 변경 프롬프트(10개 폴더), CLAUDE.md 최상위 규칙 생성(SOLID·헥사고날·클린·DDD, 경로 규칙, 영어 작성), 하네스 — 인간은 고리 밖에 있다 / Why loop vs How loop, AI 코딩의 발전단계14.1, 14.2, 15.1, 15.2
6/9 (화)LSP와 데이터 모델 5형제(Schema·DTO·VO·Entity·ORM), OCP와 아키텍처 컴포넌트(Router·Use Case·Repository·pg_repository), __abstract__ = True, Docker 개념과 도커허브, WSL 설치, 옵시디언 개발 파일 숨기기1~4, 2.8, 14.4, 14.5, 14.12, 15.5, 15.6
6/10 (수)러닝의 본질, 피처와 피처 엔지니어링, 머신러닝 vs 딥러닝, CPU vs GPU, Dataset vs Database, Ground Truth, Train/Test 4분할과 데이터 누수, 캐글 타이타닉 피처 확인 및 재다운로드6~11, 14.6
6/11 (목)IaaS/PaaS/SaaS와 책임 공유 모델·피자 비유, 프롬프트 vs 커맨드 vs 서치, 같은 구글인데 왜 서치와 프롬프트로 갈리는가, 스키마와 인스턴스, Ollama 설치와 EEVE-Korean, kiwipiepy 조합, qwen2.5:3b 교체12, 13, 5, 14.7~14.9, 15.3
6/12 (금)올라마·키위·EEVE 메타포, 할루시네이션 극복 2가지, RAG × TDD 검증 질문, pytest 3종 실행(82개 단위 테스트), CLAUDE.md 4개 구조와 시블링 확장, 프론트 채팅창 → 백엔드 라우터 연결14.8, 14.13, 14.10, 14.3, 14.11

부록 E. Gemini / NotebookLM 프롬프트

복습 문제 받기

이 7주차 교재만 근거로 8문제를 내줘. 비전공자 기준으로.
"LSP는 데이터 객체에, OCP는 제어 컴포넌트에"와
"Train/Test 4분할과 데이터 누수"는 반드시 포함해줘.
답은 바로 주지 말고, 내가 답한 다음에 채점하고
틀린 이유를 교재의 어느 절을 근거로 설명해줘. 교재에 없는 내용은 꺼내지 마.

인포그래픽 ① — 이 장의 중심 개념

「1.5 왜 데이터에는 LSP, 제어에는 OCP인가」와 「4.1 한 번의 요청, 두 개의 원칙」을 합쳐
인포그래픽 1장으로 만들어줘.
- 왼쪽에 LSP: 상위 타입 하나에서 Schema / DTO / VO / Entity / ORM 다섯 갈래가 뻗어나가는 그림
- 오른쪽에 OCP: Router → Use Case → Repository(IF) → pg_repository / mongo_repository 세로 흐름
- 가운데에 "상자에는 OCP, 화살표에는 LSP" 한 문장을 크게
- 전문용어는 한글(영문) 병기

인포그래픽 ② — 머신러닝과 딥러닝

「7.2 핵심 차이점」과 「7.3 특징 추출의 주체」와 「8.1 두 개의 비유」를 한 장으로 만들어줘.
- 위쪽 절반: 머신러닝 — 사람이 [SIZE][COLOR][WEIGHT]를 지정 → 알고리즘 → 규칙, 그리고 'CPU = 대학교수 1명'
- 아래쪽 절반: 딥러닝 — Raw 이미지 → 신경망 층(선 → 질감 → 물체 부위) → 규칙, 그리고 'GPU = 초등학생 3,000명'
- 하단 배너: "머신러닝은 인간의 특징 정의가 필요하지만, 딥러닝은 특징 추출까지 자동으로 수행합니다"

인포그래픽 ③ — 데이터 4분할과 클라우드 9층

두 장을 만들어줘.
(1) 「11.2 4분할 매트릭스」를 2×2 표로 — 가로축 Features(문제/X) ↔ Label(정답/y/Ground Truth),
    세로축 Train Set(70~80%) ↔ Test Set(20~30%). y_test 칸만 색을 다르게 하고
    "모델에게 절대 보여주지 않음"과 '데이터 누수(Data Leakage)' 경고 박스를 붙여줘.
(2) 「12.2 9층 표」와 「12.3 피자 비유」를 합쳐 — App/Data/Runtime/Middleware/OS/가상화/서버/스토리지/네트워크를
    세로로 쌓고 On-Premise / IaaS / PaaS / SaaS 네 열로 '사용자'와 '제공업체'를 색으로 구분,
    각 열 아래에 피자 비유(직접 만들기 / 밀키트 / 배달 / 외식) 한 줄 설명.

막힐 때

7주차에서 "___" 가 이해가 안 돼.
이 교재의 판별 축 5개(치환/확장, 정적/동적, 사람이 정의/기계가 발견, 순차/병렬,
어디까지 내가 관리하는가)만 써서 다시 설명해줘. 교재에 없는 새 비유는 만들지 마.

내 코드 진단시키기

아래 파이썬 코드를 붙여넣을게. 이 교재의 2.9절(LSP 자가 진단 5문항)과
3.6절(OCP 자가 진단 5문항) 체크리스트만 써서 진단해줘.
교재에 없는 원칙은 꺼내지 말고, 위반이 있으면 몇 번 문항에 걸리는지 번호로 알려줘.

앞뒤 장과의 연결 확인

이 7주차 교재에서 "3주차"~"6주차"라고 언급된 부분과 "앞으로 다시 만납니다"라고 표시된 부분을
전부 찾아서 표로 정리해줘. 컬럼은 "다른 장 / 그때의 이름 / 이번 장의 절 / 이번의 이름 / 무엇이 달라졌나".