Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ Thumbs.db

*.xls
*.xlsx
outputs/
26 changes: 22 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
7. 프롬프트 엔지니어링
8. LangChain 활용하기
9. RAG 기반 생성형 AI 애플리케이션 구현
10. **LLMOps** *(신규 추가)*

### 본 과정의 목표

Expand Down Expand Up @@ -44,13 +45,13 @@

---

최종 목표: `Agent/` 폴더의 실제 시스템 구축을 단계별로 연습하는 개발자 중심 커리큘럼 (520개 고유 학습주제)
최종 목표: `Agent/` 폴더의 실제 시스템 구축을 단계별로 연습하는 개발자 중심 커리큘럼 **(540개 고유 학습주제)**

첨부 커리큘럼의 **정규교과 520시간** 기준으로 세분화한 교육 저장소이며, 520개 클래스의 학습주제를 모두 고유하게 구성했습니다.
`class001`부터 `class500`은 정규교과, 프로젝트 과목은 루트의 3개 독립 앱(`VoiceModelBuilder`, `PersonaLLMResponder`, `PersonaKnowledgeCustomizer`)으로 운영합니다.
첨부 커리큘럼의 **정규교과 520시간 + LLMOps 20시간** 기준으로 세분화한 교육 저장소이며, 540개 클래스의 학습주제를 모두 고유하게 구성했습니다.
`class001`부터 `class500`은 기존 정규교과, `class501`~`class520`은 **LLMOps 심화 과정**, 프로젝트 과목은 루트의 3개 독립 앱(`VoiceModelBuilder`, `PersonaLLMResponder`, `PersonaKnowledgeCustomizer`)으로 운영합니다.

## 1) 현재까지 반영된 핵심 작업
- 520개 차시 `classXXX.md` 자동 정비
- 540개 차시 `classXXX.md` 자동 정비 (class001~class520)
- 교과목/학습주제 용어 해설(문법, 한글·한자, 영어, 기술 설명) 반영
- 각 차시별 **서로 다른 Mermaid Flowchart** 생성
- 각 차시별 Flow를 **PNG 캡처 이미지(`classXXX_flow.png`)**로 생성 및 md 참조 연결
Expand Down Expand Up @@ -99,6 +100,7 @@
| 프롬프트 엔지니어링 | `promptEng` | class353~class392 | 역할/맥락/출력형식 설계, 템플릿화, 평가 기준 수립, 실전 프롬프트 튜닝 전략 |
| Langchain 활용하기 | `langChainLab` | class393~class448 | 체인 구성, PromptTemplate/OutputParser, 메모리/도구 연결, LangGraph 상태 흐름, LangSmith 추적 기반 서비스형 워크플로우 구현 |
| RAG(Retrieval-Augmented Generation) | `ragPipeline` | class449~class500 | 문서 로딩/청크, 임베딩·벡터검색, 근거 결합 응답, 출처 기반 검증까지 RAG 전체 파이프라인 구현 |
| **LLMOps** | `llmOps` | **class501~class520** | LLMOps 개요, 프롬프트 버전관리, LLM 평가·품질관리, 모니터링·관측성, 배포 자동화(CI/CD·Blue-Green·Canary)까지 Lab 스타일 실습 |
| 프로젝트 앱 | `VoiceModelBuilder`, `PersonaLLMResponder`, `PersonaKnowledgeCustomizer` | 독립 앱 3종 | 음성 모델 생성, PERSONA LLM 답변, 사전 데이터 기반 답변 커스텀을 각각 독립 서비스로 실습 |

### 3-1-1) dataVizPrep 7단계 구성(요청 반영)
Expand Down Expand Up @@ -147,6 +149,22 @@
| 7. 평가와 개선 | 검색 정확도, 답변 정확도, chunking 개선, 프롬프트 튜닝, 하이브리드 검색 | class491~495 (`평가 지표 설계`) |
| 8. 실습 | 사내 문서 질의응답, FAQ 챗봇, PDF 검색 시스템, 출처 포함 답변 생성 | class496~500 (`Agent 시스템 통합 구현`) |

### 3-1-4) llmOps 5단계 구성 *(신규)*
학습 목표:
- LLMOps 개념과 DevOps/MLOps와의 차이 이해
- 프롬프트 버전관리·A/B 테스트 역량 습득
- LLM 서비스 품질 평가 자동화 파이프라인 구성
- Prometheus/Grafana 기반 모니터링·관측성 실습
- CI/CD·Blue-Green·Canary 기반 LLM 배포 자동화 구현

| 단계 | 핵심 내용 | class 범위 |
| --- | --- | --- |
| 1. LLMOps 개요 | LLMOps 정의, DevOps·MLOps와의 차이, 핵심 구성요소(프롬프트·평가·모니터링·가드레일), 드리프트 관리 | class501~504 |
| 2. 프롬프트 관리 | 프롬프트 버전관리, 템플릿화, A/B 테스트, Chain-of-Thought, 프롬프트 인젝션 방어 | class505~508 |
| 3. LLM 평가와 품질 | BLEU/Faithfulness/Answer Relevance, 자동 평가 파이프라인, LLM-as-Judge, 지속적 품질 관리 | class509~512 |
| 4. LLM 모니터링 | Prometheus·Grafana 메트릭, 토큰·지연·오류율 추적, 이상 탐지, SLO 설정, Circuit Breaker | class513~516 |
| 5. LLM 배포 자동화 | CI/CD 파이프라인, Docker 패키징, K8s HPA, Blue-Green/Canary 배포, IaC, Secret 관리 | class517~520 |

## 3-2) 실무 배포 트랙 (OnPrem + AWS + K8s/EKS)
| 트랙 | class 범위 | 핵심 학습 항목 | 운영/배포 결과물 |
| --- | --- | --- | --- |
Expand Down
20 changes: 20 additions & 0 deletions curriculum_index.csv
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,26 @@ class497,63,1,정규교과-9,RAG(Retrieval-Augmented Generation),49/52,Agent 시
class498,63,2,정규교과-9,RAG(Retrieval-Augmented Generation),50/52,Agent 시스템 통합 구현 · 단계 3/5 응용 확장 [class498],실전심화,ragPipeline/class498/class498.md
class499,63,3,정규교과-9,RAG(Retrieval-Augmented Generation),51/52,Agent 시스템 통합 구현 · 단계 4/5 실전 검증 [class499],실전심화,ragPipeline/class499/class499.md
class500,63,4,정규교과-9,RAG(Retrieval-Augmented Generation),52/52,Agent 시스템 통합 구현 · 단계 5/5 운영 최적화 [class500],실전심화,ragPipeline/class500/class500.md
class501,64,1,정규교과-10,LLMOps,1/20,LLMOps 개요 · 단계 1/4 입문 이해 [class501],입문,llmOps/class501/class501.md
class502,64,2,정규교과-10,LLMOps,2/20,LLMOps 개요 · 단계 2/4 기초 구현 [class502],기초응용,llmOps/class502/class502.md
class503,64,3,정규교과-10,LLMOps,3/20,LLMOps 개요 · 단계 3/4 실전 검증 [class503],실전심화,llmOps/class503/class503.md
class504,64,4,정규교과-10,LLMOps,4/20,LLMOps 개요 · 단계 4/4 운영 최적화 [class504],실전심화,llmOps/class504/class504.md
class505,64,5,정규교과-10,LLMOps,5/20,프롬프트 관리 · 단계 1/4 입문 이해 [class505],입문,llmOps/class505/class505.md
class506,64,6,정규교과-10,LLMOps,6/20,프롬프트 관리 · 단계 2/4 기초 구현 [class506],기초응용,llmOps/class506/class506.md
class507,64,7,정규교과-10,LLMOps,7/20,프롬프트 관리 · 단계 3/4 실전 검증 [class507],실전심화,llmOps/class507/class507.md
class508,64,8,정규교과-10,LLMOps,8/20,프롬프트 관리 · 단계 4/4 운영 최적화 [class508],실전심화,llmOps/class508/class508.md
class509,65,1,정규교과-10,LLMOps,9/20,LLM 평가와 품질 · 단계 1/4 입문 이해 [class509],입문,llmOps/class509/class509.md
class510,65,2,정규교과-10,LLMOps,10/20,LLM 평가와 품질 · 단계 2/4 기초 구현 [class510],기초응용,llmOps/class510/class510.md
class511,65,3,정규교과-10,LLMOps,11/20,LLM 평가와 품질 · 단계 3/4 실전 검증 [class511],실전심화,llmOps/class511/class511.md
class512,65,4,정규교과-10,LLMOps,12/20,LLM 평가와 품질 · 단계 4/4 운영 최적화 [class512],실전심화,llmOps/class512/class512.md
class513,65,5,정규교과-10,LLMOps,13/20,LLM 모니터링 · 단계 1/4 입문 이해 [class513],입문,llmOps/class513/class513.md
class514,65,6,정규교과-10,LLMOps,14/20,LLM 모니터링 · 단계 2/4 기초 구현 [class514],기초응용,llmOps/class514/class514.md
class515,65,7,정규교과-10,LLMOps,15/20,LLM 모니터링 · 단계 3/4 실전 검증 [class515],실전심화,llmOps/class515/class515.md
class516,65,8,정규교과-10,LLMOps,16/20,LLM 모니터링 · 단계 4/4 운영 최적화 [class516],실전심화,llmOps/class516/class516.md
class517,66,1,정규교과-10,LLMOps,17/20,LLM 배포 자동화 · 단계 1/4 입문 이해 [class517],입문,llmOps/class517/class517.md
class518,66,2,정규교과-10,LLMOps,18/20,LLM 배포 자동화 · 단계 2/4 기초 구현 [class518],기초응용,llmOps/class518/class518.md
class519,66,3,정규교과-10,LLMOps,19/20,LLM 배포 자동화 · 단계 3/4 실전 검증 [class519],실전심화,llmOps/class519/class519.md
class520,66,4,정규교과-10,LLMOps,20/20,LLM 배포 자동화 · 단계 4/4 운영 최적화 [class520],실전심화,llmOps/class520/class520.md
project001,63,5,프로젝트-A,프로젝트,1/3,나만의 음성 모델 만들기 [VoiceModelBuilder],기초응용,VoiceModelBuilder/README.md
project002,63,6,프로젝트-B,프로젝트,2/3,거대 언어 모델을 활용한 PERSONA AI 답변 기능 구현하기 [PersonaLLMResponder],기초응용,PersonaLLMResponder/README.md
project003,63,7,프로젝트-C,프로젝트,3/3,사전 데이터 기반 PERSO AI의 답변 커스텀하기 [PersonaKnowledgeCustomizer],기초응용,PersonaKnowledgeCustomizer/README.md
101 changes: 101 additions & 0 deletions llmOps/class501/class501.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<!-- 이 파일은 www.edumgt.co.kr 의 에듀엠지티에 저작권이 있습니다 -->
# class501 자기주도 학습 가이드

## 1) 오늘의 학습 정보
- 교과목: **LLMOps**
- 학습 주제: **LLMOps 개요 · 단계 1/4 입문 이해 [class501]**
- 세부 시퀀스: **1/20**
- 일정: **Day 64 / 1교시**
- 난이도: **입문**

### 교과목·학습주제 어휘 해설
| 용어 | 영어 | 기술 설명 |
| --- | --- | --- |
| `LLMOps` | LLMOps | 대규모 언어모델 기반 서비스를 설계·평가·운영하는 체계 |
| `LLMOps 개요` | (domain term) | 이번 차시 핵심 주제 영역 |

## 2) 이전에 배운 내용 (복습)
- 이전 차시: **class500** 내용을 오늘 주제와 연결해 보세요.

## 3) 주제를 아주 쉽게 이해하기
- 한 줄 설명: **LLMOps 개요** 의 입문 이해 단계입니다.
- 왜 배우나요?: LLM 기반 서비스를 안정적으로 운영하려면 LLMOps 개요 역량이 필수입니다.

### 핵심 개념 3가지
1. LLMOps는 프롬프트·체인·에이전트의 전체 운영 생명주기를 관리합니다.
2. LLMOps 개요은 LLMOps의 핵심 구성 축 중 하나입니다.
3. 자동화된 평가·모니터링·배포 파이프라인이 품질을 유지합니다.

## 4) 실습 환경 만들기
```bash
cd /path/to/Python-AI_Agent-Class
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

## 5) 오늘의 예제 코드
- 예제 파일: `class501_example1.py`
- 실행 명령:
```bash
python llmOps/class501/class501_example1.py
```

### example1~example5 단계별 테스트 확장
1. example1: LLMOps 개요 기본 개념과 구조를 확인한다.
2. example2: 핵심 구성요소를 코드로 매핑한다.
3. example3: 실패 케이스를 재현하고 처리한다.
4. example4: 개선 전후 흐름을 비교한다.
5. example5: 운영 체크리스트를 정리한다.

<!-- AUTO-GENERATED: TECH_STACK_FLOW START -->
### 기술 스택
- 언어: `Python 3`
- 실행: `CLI` (`python llmOps/class501/class501_example1.py`)
- 학습 포커스: `LLMOps 개요 · 단계 1/4 입문 이해 [class501]`

### 실습 흐름 (Mermaid Flowchart)
```mermaid
flowchart TD
N1["class501 (1/20, 입문)"]
N2["LLMOps 개요 · 입문 이해"]
N3["1단계: 개념 파악"]
N4["2단계: 코드 분석"]
N5["3단계: 실행 및 결과 확인"]
N6["4단계: 운영 적용"]
N7["예제 실행: python llmOps/class501/class501_example1.py"]
N8["다음: class502"]
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
N7 --> N8
```

### Flow PNG 캡처
![class501 flow](class501_flow.png)
<!-- AUTO-GENERATED: TECH_STACK_FLOW END -->

## 6) 퀴즈로 복습하기
- 퀴즈 파일: `class501_quiz.html`

## 7) 혼자 실습 순서
1. 코드를 한 번 그대로 실행해요.
2. 값을 1개 바꿔서 결과 차이를 확인해요.
3. 결과가 왜 바뀌었는지 한 줄로 적어요.
4. 함수를 1개 더 만들어 작은 기능을 추가해요.

## 8) 스스로 점검 체크리스트
- [ ] LLMOps 개요의 개념을 설명할 수 있다.
- [ ] 핵심 구성요소를 역할별로 구분할 수 있다.
- [ ] 기본 흐름을 입력→출력 구조로 설명할 수 있다.

## 9) 막히면 이렇게 해결해요
1. 에러 메시지 마지막 줄을 먼저 읽어요.
2. 함수 이름과 괄호 짝을 확인해요.
3. print()를 넣어 중간 값을 확인해요.

## 10) 학습 후 다음에 배울 내용
- 다음 차시: **class502**
19 changes: 19 additions & 0 deletions llmOps/class501/class501.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 이 파일은 www.edumgt.co.kr 의 에듀엠지티에 저작권이 있습니다
"""
class501 launcher
"""
from __future__ import annotations
import os, runpy
from pathlib import Path
HERE = Path(__file__).resolve().parent
CLASS_ID = Path(__file__).resolve().stem
if __name__ == "__main__":
target = (os.getenv("CLASS_RUN_TARGET") or "example").strip().lower()
mapping = {"example": f"{CLASS_ID}_example1.py", "solution": f"{CLASS_ID}_solution.py"}
file_name = mapping.get(target)
if file_name is None:
raise SystemExit("Unknown CLASS_RUN_TARGET (use example/solution)")
py_file = HERE / file_name
if not py_file.exists():
raise SystemExit(f"Run target not found: {py_file}")
runpy.run_path(str(py_file), run_name="__main__")
97 changes: 97 additions & 0 deletions llmOps/class501/class501_example1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# 이 파일은 www.edumgt.co.kr 의 에듀엠지티에 저작권이 있습니다

"""
class501 example1: LLMOps 개요 · 입문 이해 [class501]
"""

TOPIC = "LLMOps 개요 · 입문 이해 [class501]"
EXAMPLE_VARIANT = 1

import json


LLMOPS_COMPONENTS = [
{"name": "프롬프트 관리", "role": "프롬프트 버전/템플릿 관리"},
{"name": "평가 파이프라인","role": "응답 품질 자동 측정"},
{"name": "모니터링", "role": "토큰·지연·오류율 추적"},
{"name": "배포 자동화", "role": "CI/CD 기반 안전 배포"},
{"name": "가드레일", "role": "유해·부정확 응답 차단"},
]


def resolve_mode(topic):
if "LLMOps 개요" in topic: return "overview"
if "프롬프트 관리" in topic: return "prompt_mgmt"
if "LLM 평가" in topic: return "evaluation"
if "LLM 모니터링" in topic: return "monitoring"
if "LLM 배포" in topic: return "deployment"
return "general"


def build_cases(variant):
cases = [
{
"id": "case_1",
"task": "LLMOps 개요 기본 동작 확인",
"input": "LLMOps 핵심 흐름을 설명해줘.",
"output_format": "TEXT",
}
]
if variant >= 2:
cases.append({"id": "case_2", "task": "구성요소 매핑", "input": "핵심 컴포넌트를 역할별로 나열해.", "output_format": "TEXT"})
if variant >= 3:
cases.append({"id": "case_3", "task": "실패 케이스 재현", "input": "모니터링 누락 시 발생하는 문제는?", "output_format": "TEXT"})
if variant >= 4:
cases.append({"id": "case_4", "task": "개선 비교", "input": "배포 자동화 전후 차이를 설명해.", "output_format": "JSON"})
if variant >= 5:
cases.append({"id": "case_5", "task": "운영 체크리스트", "input": "LLMOps 운영 점검 항목을 정리해.", "output_format": "JSON"})
return cases


def model_stub(prompt: str, temperature: float = 0.3) -> str:
tokens = prompt.replace(",", " ").split()[:10]
stability = "stable" if temperature < 0.5 else "diverse"
return f"{stability} output: {chr(32).join(tokens)}"


def parse_output(raw: str, fmt: str) -> dict:
if fmt == "JSON":
try:
return {"ok": True, "data": json.loads(raw)}
except json.JSONDecodeError:
return {"ok": False, "data": {"message": raw, "fallback": True}}
return {"ok": True, "data": {"text": raw}}


def execute_case(case: dict, mode: str) -> dict:
task_val = case['task']
input_val = case['input']
prompt = f"mode={mode} task={task_val} input={input_val}"
raw = model_stub(prompt, temperature=0.3)
parsed = parse_output(raw, case["output_format"])
return {"case": case["id"], "mode": mode, "parsed_ok": parsed["ok"], "raw": raw}


def summarize(mode: str, rows: list) -> dict:
success = sum(1 for r in rows if r.get("parsed_ok", False))
return {
"mode": mode,
"components": [c["name"] for c in LLMOPS_COMPONENTS],
"total": len(rows),
"success": success,
}


def main():
print("오늘 주제:", TOPIC)
mode = resolve_mode(TOPIC)
cases = build_cases(EXAMPLE_VARIANT)
rows = [execute_case(c, mode) for c in cases]
summary = summarize(mode, rows)
print("모드:", mode)
print("요약:", summary)
return {"variant": EXAMPLE_VARIANT, "mode": mode, "summary": summary}


if __name__ == "__main__":
main()
Loading