본문으로 건너뛰기
5분 AI.
GITHUB TRENDING JUPYTER NOTEBOOK DAILY #1 딥다이브 · 2026-10-23 분석

dive-into-llms 딥다이브
— 모델을 바꾸고, 출력을 읽고, 평가를 의심하는 법

문서·실습자료

빠른 판단

무엇
미세조정·생성 제어·GUI 에이전트·PPO를 데이터·목표·평가 흐름으로 연결한 LLM 실습 교재
이럴 때
모델 행동을 바꾸는 학습·생성 방법을 노트북으로 살펴보고 입력 전처리와 성공 기준을 함께 설계할 때
dive-into-llms는 대규모 언어 모델을 직접 다뤄 보는 11장짜리 실습 교재입니다. 미세조정부터 수학 추론, 텍스트 은닉, GUI 에이전트, 강화학습까지 이어집니다. 핵심은 거대한 서비스를 설치하는 데 있지 않습니다. 데이터 한 줄이 모델의 입력·정답·보상으로 바뀌는 과정을 읽는 데 있습니다. 노트북 11개 가운데 실행 셀이 있는 것은 4개이며, 나머지는 설명과 외부 프로젝트 실습 안내입니다. 저장소: Lordog/dive-into-llms · 스타 57,287 · 포크 6,847 · 주 언어 Jupyter Notebook · 2026-10-23 GitHub 기준. 본문 소스 분석은 커밋 f84c042 기준입니다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

LLM의 사용법과 실험 설계를 함께 배우는 교재

사전학습 모델을 가져와 데이터를 가공하고, 모델의 행동을 바꾸고, 그 결과를 평가하는 실습 모음입니다. README에 따르면 상하이교통대학교의 자연어처리·AI 안전 관련 강의 자료에서 확장한 무료 교육 프로젝트입니다. 범위는 API 호출에 머물지 않고 모델 가중치 수정, 생성 확률 제어, 보상을 통한 정책 학습까지 내려갑니다.

이 저장소에서 배울 핵심은 “모델을 호출하는 법”을 넘어 “무엇을 학습시키고 무엇으로 성공을 판단할지 정하는 법”입니다.

한 문장 비유

완제품 AI의 매장이 아니라, 여러 실험대가 놓인 과학실입니다

1번 실험대에서는 문장을 분류하고, 4번에서는 수학 풀이를 따라 배우게 하며, 7번에서는 다음 단어 선택에 비트를 담습니다. 11번에서는 좋은 점수를 받는 방향으로 문장 생성을 바꿉니다.

실험대마다 장비와 재료가 다릅니다. 한 번의 설치로 모든 실험이 연결되는 구조는 아니므로, 처음에는 한 장을 골라 입력과 출력부터 설명할 수 있게 되는 것이 좋습니다.

용어
미세조정과 추론
미세조정은 이미 배운 모델의 숫자들인 가중치를 추가 데이터로 바꾸는 과정입니다. 추론은 그 가중치를 이용해 새 입력의 결과를 만드는 과정입니다. 같은 모델도 학습용 메모리와 추론용 메모리가 크게 다를 수 있습니다.

처음에는 이 네 장을 구분해서 읽자

장실제 구현의 중심먼저 던질 질문
4장 · 수학 추론tokenize(), Trainer, vLLM문제와 풀이 중 어느 토큰에 학습 손실을 계산할까?
7장 · 텍스트 은닉Huffman, FLC, 생성 루프다음 토큰 하나에 몇 비트를 담을 수 있을까?
9장 · GUI 에이전트JSON을 대화·이미지 학습 형식으로 변환화면과 행동 정답을 어떻게 짝지을까?
11장 · PPObuild_dataset(), 보상 계산, step()점수가 높아지면 사람이 원하는 행동도 좋아질까?

실행 셀이 없는 장도 읽을 가치가 있습니다. 3장은 EasyEdit, 5장은 X-SIR, 8장은 NExT-GPT처럼 별도 프로젝트를 따라가며 개념을 연결합니다. 다만 그 외부 프로젝트의 구현을 이 저장소가 직접 포함한다고 이해하면 안 됩니다.

읽고 나서 할 수 있어야 할 일
한 샘플의 여정을 설명하기

원시 데이터 → 토큰 또는 대화 형식 → 모델 입력 → 학습 목표 → 생성 결과 → 평가 점수. 이 여섯 단계를 한 장에서 끝까지 설명하면, 다른 모델과 도구로 옮겨 가도 남는 지식을 얻은 것입니다.

2왜 주목받는가

트렌딩 순위와, 교육 자료로서의 매력을 구분해서 보기

2-1. 관심의 크기는 확인되지만, 당일 급상승 원인은 단정할 수 없다

2026-10-23 GitHub Trending의 Jupyter Notebook 일간 1위이며, 같은 날 GitHub 기준 스타 57,287개, 포크 6,847개입니다. 이 숫자는 누적 관심의 크기를 보여 줍니다. 하루 동안 얻은 스타 수나 추천 유입 경로를 뜻하지는 않습니다.

최근 push는 2025-10-10입니다. 따라서 분석일의 인기를 “오늘 공개된 신기능”으로 설명할 근거는 없습니다. 다음 세 가지는 README의 범위와 실제 자료 구성에서 읽을 수 있는 교육적 매력에 대한 해석입니다.

2-2. 비교 대상은 같은 목적의 학습 방식이다

이 프로젝트는 모델 제공 서비스와 직접 경쟁하는 제품이라기보다 교재입니다. 초보자의 선택에 도움이 되도록 학습 방식별 장점과 부담을 비교하면 다음과 같습니다.

학습 방식주로 얻는 것이 교재의 상대적 장점·부담
API 사용법 중심 강의요청·응답과 앱 연결가중치·확률·보상까지 내려갈 수 있음. 대신 GPU 실험이 무거움
라이브러리 공식 문서개별 API의 정확한 규격여러 기술을 하나의 학습 여정으로 연결. 세부 규격은 공식 문서로 보완해야 함
논문만 읽는 공부방법의 가정과 수학적 근거데이터 가공과 평가 코드를 볼 수 있음. 원 논문의 모든 실험을 재현하지는 않음
단일 학습 도구 실습설정 파일로 빠르게 학습4·7·11장에서 내부 흐름을 직접 읽음. 통합 환경은 따로 구성해야 함

이 교재의 강점은 최신 도구를 모두 갖춘 데 있지 않고, 서로 다른 실험의 입력·목표·평가를 비교할 수 있는 데 있습니다.

2-3. “무료 교재”와 “재현 가능한 패키지”는 따로 확인한다

README는 무료 교육 자료라고 소개하며, 2025-06-06 업데이트에서 수학 추론·GUI 에이전트·정렬·텍스트 은닉 등의 보강을 알립니다. 화웨이 Ascend 기반의 별도 교육 과정도 연결하지만, 해당 전체 개발 과정이 이 저장소에 구현되어 있는 것은 아닙니다.

비유

요리책에 레시피와 완성 사진이 풍부해도 모든 재료가 책 안에 들어 있지는 않습니다. 외부 모델·데이터·학습 도구가 여기서의 재료입니다. 재료의 버전과 위치까지 확인해야 같은 실험을 시도할 수 있습니다.

무료로 읽을 수 있다는 설명과 별개로, 커밋 f84c042에는 라이선스 파일이 없습니다. 배포나 재사용 허용 범위를 특정 오픈소스 라이선스로 단정하지 않아야 합니다.

3기술 스택 전체 지도

서버·화면·빌드라는 분류를 실험 교재에 맞춰 읽기

3-1. 백엔드에 해당하는 것은 Python 실험 코드다

HTTP 서버나 데이터베이스를 가진 웹 애플리케이션은 아닙니다. 계산의 중심은 Python, PyTorch, Hugging Face 라이브러리이며, 모델·데이터는 외부에서 가져옵니다. package.json, Cargo.toml, pyproject.toml, go.mod는 없습니다.

층기술실제 역할과 근거
텐서·가중치PyTorch4장 BF16 모델 로딩, 7장 확률 계산·토큰 결합, 11장 보상 텐서
모델·학습TransformersAutoTokenizer, AutoModelForCausalLM, Trainer
데이터 변환Datasets4장의 filter()·map(), 11장의 IMDB 전처리
일괄 추론vLLM4장의 LLM·SamplingParams로 수학 응답 생성
강화학습TRL11장의 값 추정 헤드 모델, 참조 모델, PPOTrainer
기록·시각화Matplotlib·TensorBoard·wandb길이 분포, 학습 로그, PPO 통계 기록

3-2. 실제 의존성 파일은 11장에만 있다

documents/chapter11/requirements.txt의 활성 항목은 아래 여섯 개입니다. 이를 전체 장의 공통 환경으로 확대 해석하면 안 됩니다. 같은 파일의 LLaMA-Factory 설치 항목은 주석 처리되어 있습니다.

torch==2.6.0
tqdm==4.67.1
pandas==2.2.3
transformers==4.51.3
datasets==3.5.0
trl==0.9.4

위 버전은 파일에 적힌 값입니다. 11장에서 직접 가져오는 wandb는 명시되지 않았고, Jupyter 실행 환경도 이 파일이 별도로 고정하지 않습니다. 간접 의존성이 우연히 설치해 주는 상황과 명시적인 환경 계약을 구분해야 합니다.

위치확인되는 버전해석
1장 READMEPython 3.9 안내, 배포 예시 Transformers 4.30.2·Torch 2.0.0본문 예시이며 독립된 환경 파일은 아님
4장 저장 출력Transformers 4.52.3·Torch 2.7.0+cu126·Datasets 3.6.0저장 당시의 출력 기록이며 설치 제약이 아님
4장 코드antlr4-python3-runtime==4.11.0노트북에 설치 명령이 있지만 채점 모듈 전체를 제공하지는 않음
8장 READMEPython 3.8·PyTorch 1.13.1·CUDA 11.6외부 NExT-GPT 실습 환경에 대한 안내
11장 환경 파일Transformers 4.51.3·TRL 0.9.4 등이 장의 명시 버전. 최신 API와 혼용하지 않기
버전 확인의 함정
표시 이름이 맞아도 출력 값은 틀릴 수 있습니다

4장 노트북은 print("VLLM version:", transformers.__version__)를 사용합니다. 따라서 저장 출력의 “VLLM version: 4.52.3”은 vLLM 버전의 근거가 아닙니다. 해당 패키지의 실제 버전은 별도로 확인해야 합니다.

3-3. 프론트엔드는 노트북과 외부 데모 안내다

읽기 화면은 Jupyter Notebook입니다. 1장은 Gradio Spaces 배포를 설명하지만, 그 예시의 app.py와 분류 프로젝트는 저장소에 들어 있지 않습니다. 9장의 llamafactory-cli webchat도 외부 LLaMA-Factory의 기능입니다. React·Vue 앱이나 자체 웹 프론트엔드의 소스는 없습니다.

3-4. 인프라·빌드의 핵심은 “장별로 분리”다

Dockerfile, 통합 설치 스크립트, .github/workflows CI 설정은 없습니다. 9장 설명에는 DeepSpeed ZeRO-3 설정 경로와 분산 실행 명령이 나오지만 해당 설정 파일은 외부 도구 쪽 경로입니다. 4장의 torch_compile=True 역시 Python 패키지 빌드가 아니라 모델 계산 최적화 옵션입니다.

환경을 읽는 기준

“Python 프로젝트”라는 이름보다 장별 의존성·모델 경로·CUDA 요구를 먼저 보세요. 오래된 예시와 다른 장의 버전을 하나의 환경에 섞으면, 개념 학습보다 의존성 충돌에 시간을 쓰기 쉽습니다.

4아키텍처 심화 분석

하나의 상시 서비스 대신, 서로 독립된 실험 파이프라인

구조의 중심은 요청을 받는 서버가 아니라 데이터가 변하는 순서입니다. 아래의 화살표는 실험 안에서의 흐름을 뜻합니다. 장 사이에 자동으로 파일을 넘겨 주는 통합 실행기는 없습니다.

[학습자: README·PDF·노트북 읽기] | +---------+------------------------+ | | [저장소 안의 실험] [외부 도구 실습 안내] | | | EasyEdit / X-SIR / NExT-GPT | EasyJailbreak / R-Judge | +-- 4장: DeepMath-103K [외부 데이터] | | | filter / tokenize / 길이 제한 | | | Qwen2.5-Math-1.5B + Trainer | | | checkpoints/final_model | | | vLLM + MATH500 [외부 데이터] | | | 답 추출 / 수학 동치 채점 [보조 모듈 필요] | +-- 7장: GPT-2 확률 --> Huffman 또는 FLC | | | 비트에 맞는 토큰 선택 | | | 은닉 텍스트 / 비교 텍스트 | +-- 9장: GUI 기록 --> messages + images JSON | | | 외부 LLaMA-Factory 학습 | +-- 11장: IMDB 앞부분 --> GPT-2 응답 | DistilBERT 보상 점수 | 참조 모델 --> PPOTrainer.step() | 정책 업데이트 / 로그

4-1. 설계 패턴 ① 단계별 데이터 변환

documents/chapter4/sft_math.ipynb의 tokenize(example)가 가장 좋은 출발점입니다. 먼저 final_answer.isdigit()로 답이 숫자 문자열인 샘플만 고릅니다. 그다음 문제와 r1_solution_1을 대화로 묶고 토큰 ID와 정답 배열을 만듭니다.

# 4장 tokenize()의 핵심
question = example["question"]
r1_solution = example["r1_solution_1"]
message = [
    {"role": "user", "content": question},
    {"role": "assistant", "content": f"<think>\n{r1_solution}\n"},
]
result = qwen_tokenizer.apply_chat_template(
    message, add_generation_prompt=False,
    tokenize=True, return_dict=True,
)
result["length"] = len(result["input_ids"])
result["labels"] = result["input_ids"].copy()

isdigit()는 수학적 정답 여부를 검사하지 않습니다. "42"는 통과하지만 "-3", "1/2", "3.14"는 제외됩니다. 따라서 편리한 필터 하나가 학습할 문제의 분포도 바꿉니다. 이후에는 전체 대화 길이가 4096 미만인 샘플만 남깁니다.

용어
정답 배열과 손실 마스킹
labels는 학습에서 맞혀야 할 토큰 ID입니다. 이 코드처럼 입력 전체를 복사하면 문제·역할 표시·풀이의 실제 토큰이 모두 학습 대상에 들어갑니다. 답변만 학습하려면 사용자 부분을 보통 -100으로 표시해 손실 계산에서 제외합니다. 패딩 제외와 사용자 입력 제외는 서로 다른 작업입니다.

여기서는 DeepSeek-R1의 풀이 텍스트를 정답 예제로 삼는 SFT 형태의 증류를 합니다. 교사 모델의 전체 확률 분포를 직접 맞추거나, 실행 중 교사에게 새 답을 요청하는 구조는 아닙니다. r1_solution_1 하나를 사용한다는 점도 데이터 선택의 일부입니다.

설정실제 값초보자가 읽을 의미
수치 형식torch.bfloat16, bf16=True가중치 로딩·학습에서 BF16 사용
한 번의 배치per_device_train_batch_size=4장치당 한 번에 처리할 예제 수
기울기 누적gradient_accumulation_steps=16장치 하나라면 업데이트당 예제 수는 기본적으로 64개
학습량3 epochs · learning_rate=1e-6학습 데이터를 세 번 돌며 작은 폭으로 수정
평가·저장eval_strategy="no" · 100단계마다 저장학습 도중 검증 성능으로 최적 모델을 고르지 않음
메모리·속도torch_compile=True · 체크포인팅 꺼짐최적화와 메모리 절약은 다른 설정
재현 설정seed=42 · data_seed=42난수 설정은 있지만 모든 환경 차이를 없애지는 않음

유효 배치는 일반적인 데이터 병렬 학습에서 “장치당 배치 × 누적 횟수 × 데이터 병렬 장치 수”로 계산합니다. 단, device_map="auto"로 가중치를 여러 장치에 나누는 것 자체를 데이터 병렬 장치 수로 세면 안 됩니다. 이 노트북에는 LoRA 어댑터를 붙이거나 일부 레이어만 학습하도록 동결하는 코드가 없습니다.

학습 결과는 ./checkpoints/final_model에 저장하고 vLLM으로 다시 읽습니다. 추론은 tensor_parallel_size=1, max_model_len=4096, temperature=0, max_tokens=3700입니다. 입력과 출력의 합이 컨텍스트 예산에 들어오는지도 확인해야 합니다.

extract_answer()로 최종 답을 뽑고 math_equal()로 정답과 비교하지만, 두 함수의 원본인 openmathinst_utils는 저장소에 없습니다. 저장된 정확도 0.452는 당시 노트북의 출력 기록입니다. 같은 설정의 사전 모델 점수가 없어 이 숫자만으로 향상 폭을 계산할 수는 없습니다.

평가 숫자를 읽기 전에 어떤 샘플을 버렸고, 어느 토큰을 학습했으며, 무엇을 정답으로 셌는지부터 확인해야 합니다.

4-2. 설계 패턴 ② 선택 전략을 객체로 교체하기

documents/chapter7/llm_stega.ipynb의 generate_text_with_steganography()는 다음 토큰 확률을 만든 뒤 handle(next_token_probs)에 넘깁니다. Huffman과 FLC는 모두 __call__()을 구현해 같은 자리에 들어갑니다. 이것이 선택 규칙을 바꿔 끼우는 전략 패턴입니다.

# 7장 생성 루프의 핵심
outputs = model(stega_output)
next_token_logits = outputs.logits[:, -1, :]
next_token_probs = F.softmax(next_token_logits, dim=-1)
bit_word_index = handle(next_token_probs)
stega_output = torch.cat(
    [stega_output, bit_word_index.unsqueeze(1)], dim=1
)

FLC(k=2)는 확률이 높은 네 토큰에 00, 01, 10, 11을 대응시킵니다. Huffman(k=4)는 상위 네 후보의 확률로 트리를 만들고, 확률에 따라 길이가 달라질 수 있는 비트 부호를 붙입니다. 두 클래스에서 k의 뜻이 다르다는 점을 놓치기 쉽습니다.

createHuffmanTree()는 작은 빈도의 노드 둘을 반복해서 합치고, huffmanEncoding()은 부모 방향을 따라 부호를 만듭니다. 각 클래스의 extract()는 같은 확률과 선택 토큰으로 해당 부호를 되찾습니다. 문장 전체를 받아 끝까지 복원하는 독립적인 디코더까지 완성된 것은 아닙니다.

비유

“맛있다”, “훌륭하다”처럼 다음에 올 수 있는 단어 후보에 서로 다른 번호표를 붙이는 셈입니다. 보내고 싶은 비트에 맞는 번호표의 단어를 골라도 문장은 계속 이어집니다. 받는 쪽은 같은 모델·문맥·후보 정렬로 번호표를 재구성해야 합니다.

경계 조건도 공부할 만합니다. 루프는 비트가 완전히 비었는지만 검사하므로 남은 비트가 부호보다 짧으면 선택 변수가 정해지지 않을 수 있습니다. 종료 토큰 검사는 일반 비교 문장의 next_token을 사용합니다. 따라서 은닉 문장 자체의 종료 정책과 구분해야 합니다. 추론 루프에 torch.no_grad() 또는 torch.inference_mode() 문맥도 없습니다.

4-3. 설계 패턴 ③ 생성→채점→업데이트의 피드백 루프

documents/chapter11/RLHF.ipynb의 build_dataset()은 IMDB 리뷰 중 200자를 넘는 것을 골라, 길이 샘플러로 짧은 시작 부분을 만듭니다. collator()는 길이가 다른 토큰 배열을 목록으로 묶습니다. GPT-2 학습 모델과 참조 모델을 각각 로딩하고 DistilBERT 분류기를 별도로 둡니다.

# 11장 보상 계산과 정책 업데이트의 핵심
texts = [q + r for q, r in zip(batch["query"], batch["response"])]
pipe_outputs = sentiment_pipe(texts, **sent_kwargs)
positive_scores = [
    item["score"]
    for output in pipe_outputs
    for item in output
    if item["label"] == "POSITIVE"
]
rewards = [torch.tensor(score) for score in positive_scores]
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
ppo_trainer.log_stats(stats, batch, rewards)

sent_kwargs의 function_to_apply="none" 때문에 보상은 정규화된 확률이 아니라 긍정 클래스의 원시 점수인 로짓입니다. 저장된 예시에도 음수 점수가 등장합니다. PPOConfig의 학습률은 1.41e-5입니다.

참조 모델은 원래 정책에서 얼마나 벗어나는지 비교하는 기준입니다. PPO와 KL 제어의 세부 계산은 이 파일에 직접 구현하지 않고 TRL에 맡깁니다. 이후 16개 샘플에서 학습 전후 보상의 평균·중앙값을 비교하지만, 학습 데이터에서 뽑은 사례 비교를 독립된 테스트 성능으로 읽으면 안 됩니다.

목표와 측정의 차이
긍정 점수가 높아지는 것과 안전해지는 것은 다릅니다

11장은 RLHF의 학습 구조를 설명하지만, 이 실험에서 매 단계 사람이 선호를 새로 평가하지는 않습니다. 이미 학습된 감정 분류기가 보상을 줍니다. 높은 보상은 그 분류기를 만족했다는 뜻이며, 사실성·유용성·일반적인 안전성을 동시에 입증하지 않습니다.

4-4. 설계 패턴 ④ 원시 기록을 학습 규격으로 바꾸는 어댑터

documents/chapter9/GUIagent.ipynb의 유일한 실행 셀은 task, previous_actions, image_path, osatlas_action, score를 읽어 messages와 images로 묶습니다. 변환 결과는 “사용자 지시+화면”과 “행동+점수”의 학습 쌍입니다.

파일을 여는 두 open('')의 경로는 비어 있습니다. 설명 셀의 학습 YAML 예시에서 model_name_or_path·output_dir도 빈칸입니다. 완성된 GUI 실행 엔진이 아니라, 외부 LLaMA-Factory에 전달할 데이터를 준비하는 예제입니다. 실제 화면 클릭의 성공률과 모델이 출력한 자기 점수는 따로 검증해야 합니다.

5디렉토리 구조 해부

장별 삼종 세트와, 실제 실행 셀이 어디 있는지 찾기
dive-into-llms/ ├── README.md 전체 교재 안내·외부 교육 과정 ├── .gitignore .DS_Store 제외 ├── documents/ │ ├── chapter1/ 분류 모델 미세조정·Gradio 안내 │ │ ├── README.md / assets/ │ │ ├── dive-into-llm.pdf │ │ └── dive-tuning.ipynb │ ├── chapter2/ API·프롬프팅·사고 과정 유도 │ ├── chapter3/ EasyEdit 지식 편집 안내 │ ├── chapter4/ 수학 추론 SFT │ │ ├── README.md / math.pdf │ │ └── sft_math.ipynb │ ├── chapter5/ X-SIR 워터마크 실습 안내 │ ├── chapter6/ EasyJailbreak 평가 안내 │ ├── chapter7/ 텍스트 은닉 구현 │ │ ├── README.md / stega.pdf │ │ └── llm_stega.ipynb │ ├── chapter8/ NExT-GPT 멀티모달 안내 │ ├── chapter9/ GUI 학습 데이터 변환 │ │ └── GUIagent.ipynb / GUIagent.pdf / README.md │ ├── chapter10/ R-Judge 위험 판단 안내 │ └── chapter11/ PPO 기반 감정 보상 실험 │ ├── README.md / RLHF.pdf / figs/ │ ├── RLHF.ipynb │ └── requirements.txt └── pics/icon/ 소개용 이미지

documents/는 강의 내용과 실습의 중심이고, 각 장의 assets/·figs/는 설명 그림과 화면 캡처입니다. pics/는 프로젝트 소개용입니다. 모델 가중치나 학습 데이터 디렉토리는 포함되어 있지 않습니다.

5-1. 확장자보다 셀 종류를 세어야 한다

노트북실행 셀실행 셀 소스 줄
4장 sft_math.ipynb27개155줄
7장 llm_stega.ipynb3개189줄
9장 GUIagent.ipynb1개94줄
11장 RLHF.ipynb16개196줄
나머지 7개0개0줄 · 설명 셀 안에 코드 예시 존재
합계47개634줄

집계는 .git을 제외한 105개 파일 기준입니다. 노트북 JSON을 읽어 cell_type="code"인 셀의 source를 줄 단위로 셌으며, 주석·빈 줄도 포함했습니다. 이 중 한 줄은 !pip 셸 명령이므로 Python 중심 약 633줄과 셸 명령 1줄입니다. 독립된 .py, JavaScript, Go, Rust 소스 파일은 없습니다.

별도로 Markdown 파일은 12개·2,495줄, 노트북의 설명 셀은 79개·1,672줄입니다. 노트북 JSON 자체의 4,597줄에는 메타데이터와 저장 출력이 포함되므로 코드 줄 수와 합치면 안 됩니다. PDF는 11개이며, 이미지까지 포함한 파일 크기는 약 97.6MiB입니다.

5-2. README의 경로도 실제 파일과 대조한다

8장 README의 슬라이드 링크는 documents/chapter6/mllms.pdf, 9장은 documents/chapter8/GUIagent.pdf, 10장은 documents/chapter7/agents.pdf를 가리킵니다. 실제 파일은 각각 documents/chapter8/mllms.pdf, documents/chapter9/GUIagent.pdf, documents/chapter10/dive-into-safety.pdf입니다.

소스를 찾는 습관

안내문 속 train.py나 gen.py를 못 찾았을 때는 먼저 외부 프로젝트 경로인지 확인하세요. 1장의 분류 스크립트, 5장의 생성·탐지 코드, 8장의 NExT-GPT 디렉토리 트리는 이 저장소의 실제 파일 목록과 다릅니다.

6학습 포인트 (기술별)

도구 이름을 외우기보다, 각 도구가 맡은 경계를 이해하기

6-1. Transformers·Datasets: 문자열을 학습 예제로 바꾸기

4장의 apply_chat_template()는 역할이 있는 대화를 모델이 기대하는 문자열·토큰 형식으로 바꿉니다. tokenize=False일 때의 문자열과 tokenize=True일 때의 토큰 배열을 나란히 읽어 보세요. 모델마다 대화 구분자가 다르므로 단순히 텍스트를 이어 붙이는 것과는 다릅니다.

작은 실습: 질문 하나에 답변을 붙인 학습 형식과, 질문만 넣고 생성을 시작하는 추론 형식을 비교합니다. 4장에서 추론 시 사용하는 add_generation_prompt=True와 추가 <think>가 어느 위치에 들어가는지 표시하세요. 이 표시는 모델의 텍스트 형식이며, 논리적 정답을 보장하는 장치는 아닙니다.

6-2. PyTorch: 텐서의 모양을 따라 확률 읽기

7장의 모델 출력 로짓은 보통 [배치, 현재 길이, 어휘 수] 형태입니다. outputs.logits[:, -1, :]로 마지막 위치만 고르면 [배치, 어휘 수]가 됩니다. softmax(..., dim=-1)는 그 어휘 축에서 확률로 바꾸고 topk()는 후보를 줄입니다.

# 개념 예시: 실제 모델 없이 후보 네 개의 확률만 생각하기
후보 토큰 = [A, B, C, D]
확률      = [0.4, 0.3, 0.2, 0.1]
FLC 부호  = [00,  01,  10,  11]
비트 10을 넣으려면 C 선택
다음 위치에서는 새 문맥으로 확률과 부호표를 다시 계산

작은 실습: unsqueeze(1) 전후의 모양을 적어 보세요. 선택 토큰 [1]이 [1, 1]이 되어야 기존 토큰 배열의 길이 축에 이어 붙일 수 있습니다. 문법을 외우는 것보다 차원의 의미를 따라가는 연습입니다.

6-3. API·프롬프팅: 응답 내용과 전송 방식을 분리하기

2장의 설명 셀에는 sample_sync_call()과 sample_sync_call_streaming() 예시가 있습니다. 같은 질문도 전체 응답을 한 번에 받거나 스트림을 순회하며 표시할 수 있습니다. 예시의 head_idx가 어떤 중복 출력을 막으려는지 읽어 보세요.

동기 호출 예시에는 주석·조건문이 한 줄에 붙은 서식 문제가 있습니다. 그대로 실행 가능한 함수라고 가정하지 말고 상태 코드 확인→성공 출력→실패 처리 순서로 다시 써 보는 편이 좋습니다. 모델의 품질 실험과 네트워크 오류 처리는 별도의 문제입니다.

6-4. 지식 편집: 원하는 변화와 부작용을 함께 재기

3장 설명의 BaseEditor.edit()는 prompts·target_new·subject 등을 받습니다. locality_inputs는 편집과 무관한 질문의 기존 답이 유지되는지 확인하기 위한 입력입니다. ROME·MEMIT의 내부 구현은 외부 EasyEdit에 있습니다.

작은 실습: 가상의 인물·도시로 수정 대상 하나, 바꿔 말한 질문 둘, 무관한 질문 셋을 만드세요. “수정 성공”, “표현이 달라도 유지”, “주변 지식 보존” 세 열로 결과표를 설계합니다. 원하는 답 하나가 바뀌는 것만으로 좋은 편집이라고 결론 내리지 않는 연습입니다.

6-5. 워터마크·안전 평가: 분류기의 두 종류 오류 이해하기

5장은 외부 X-SIR의 생성·탐지·평가 명령을 설명하고, 예시 결과로 AUC와 TPR@FPR를 제시합니다. 생성 문장을 잘 찾는 능력과 사람이 쓴 글을 잘못 지목하지 않는 능력을 함께 봐야 합니다. 안내의 높은 예시 점수가 다른 언어·번역·문서 길이에서도 그대로 유지된다는 뜻은 아닙니다.

6장의 공격 평가와 10장의 R-Judge도 “무엇을 실패로 정의했는가”가 중요합니다. 10장은 행동 기록에 대한 위험 설명과 safe/unsafe 판정을 구분합니다. 설명이 그럴듯해도 마지막 이진 판정은 틀릴 수 있다는 예시가 나옵니다.

6-6. 멀티모달·GUI: 데이터 규격이 모델 연결부다

8장 README 기준 NExT-GPT는 입력 인코더·언어 모델·출력 생성기 사이를 투영층으로 연결하고, 단계별 정렬과 지시 학습을 설명합니다. 해당 구성의 실제 모델 구현은 외부 저장소에 있습니다. 여기서는 입력 특징을 어떤 공통 표현으로 바꾸는지 읽는 것이 첫 목표입니다.

9장에서는 이미지 파일 경로가 images 목록에, 행동 문자열이 assistant 답변에 들어갑니다. 작은 실습: 이미지 개수·경로·행동 좌표·점수 범위를 검증하는 규칙을 정하세요. “화면을 넣었다”와 “그 화면에 맞는 행동을 넣었다”는 서로 다른 데이터 품질 조건입니다.

도구를 바꾸어도 남는 실력은 입력 형식, 텐서 모양, 학습 목표, 평가 오류를 스스로 설명하는 능력입니다.

7하드웨어 / 시스템 요구사항

독서·작은 검증·원래 규모 학습은 필요한 장비가 다릅니다
할 일요구 또는 보고된 장비근거와 해석
자료 읽기·JSON 검사일반 CPU 컴퓨터HTML·PDF·노트북 소스 읽기는 모델을 로딩하지 않음
7장 GPT-2 예제CPU 분기 있음 · CUDA 선택코드의 torch.cuda.is_available()로 장치 결정. CPU 속도 보장은 없음
4장 수학 SFTREADME: GPU 메모리 최소 40GB · 디스크 최소 50GB 여유노트북 설명의 실험 장비는 단일 A100 80GB
9장 GUI 전체 학습README: A100 80GB 최소 3장명령 예시는 GPU 0~7을 노출. 최소 안내와 예시 구성은 다름
11장 PPOREADME: A800-SXM4-80GB 한 장보고된 사용량 10,097MiB · 35분 19초. 보편적인 최소 사양은 아님
외부 API 실습네트워크·해당 서비스 계정로컬 GPU 대신 외부 호출 필요. 모델 제공 여부·요금은 별도 확인

7장 README는 Python 3.8 이상과 모델 약 500MB를 안내합니다. 이는 모델 파일의 대략적인 안내이며 실행 중 메모리·캐시·패키지까지 합친 전체 요구량은 아닙니다. CPU 경로가 있다고 다른 장도 CPU에서 그대로 학습할 수 있는 것은 아닙니다.

7-1. 1.5B 모델인데 왜 수십 GB가 필요한가?

약 15억 개 가중치를 BF16의 2바이트로만 계산하면 가중치 자체는 대략 3GB입니다. 하지만 학습에는 기울기, 옵티마이저 상태, 중간 활성값, 임시 버퍼가 더 필요합니다. 길이 4096의 예제 여러 개를 다루는 비용도 모델 파일 크기에는 나타나지 않습니다.

비유

모델 파일은 식당의 조리 도구 상자입니다. 학습하려면 재료를 펼칠 작업대, 중간 요리, 기록장도 필요합니다. 상자가 작다는 이유만으로 좁은 책상에서 같은 규모의 요리를 할 수 있는 것은 아닙니다.

필요한 GPU 메모리는 모델 이름 하나가 아니라 학습 방식·문맥 길이·배치·수치 형식의 조합으로 결정됩니다.

7-2. 메모리가 부족할 때 읽어볼 설정

이 변경들이 특정 GPU에서 성공한다는 보장은 없습니다. 4장은 CUDA 장치 조회·BF16·vLLM을 사용하며, Mac의 MPS나 Windows에서 같은 흐름이 검증되었다는 근거는 없습니다. 모델 학습까지 갈 때는 해당 라이브러리 버전의 지원 환경을 먼저 대조해야 합니다.

GPU 없는 시작점

노트북 셀 분류, 필터 통과 여부, 비트와 후보 토큰의 대응, GUI 데이터 스키마 검사는 모델 없이도 공부할 수 있습니다. 먼저 데이터 흐름을 이해한 뒤, 필요할 때 장별로 계산 자원을 정하는 편이 효율적입니다.

8직접 해볼 수 있는 실습 과제

작게 관찰하고, 비교 조건과 완료 기준을 남기기
과제 1 · 입문

노트북을 실행하지 않고 셀 지도를 만들기 GPU 불필요

입력: documents/ 아래 노트북 11개. 할 일: 표준 라이브러리 json으로 파일을 읽고 실행·설명 셀 개수를 출력합니다.

완료 기준: 전체 실행 셀 47개, 실행 셀이 있는 노트북 4개를 확인하고, 실행 셀 0개인 파일에서 설명 속 코드 블록 하나를 찾아 차이를 설명합니다.

# 저장소 루트에서 읽기만 하는 독립적인 검사 예시
import json
from pathlib import Path

for path in sorted(Path("documents").glob("chapter*/*.ipynb")):
    notebook = json.loads(path.read_text(encoding="utf-8"))
    cells = notebook["cells"]
    code = [c for c in cells if c["cell_type"] == "code"]
    lines = sum(len("".join(c["source"]).splitlines()) for c in code)
    print(path, "실행 셀:", len(code), "소스 줄:", lines)
과제 2 · 입문

가상의 네 토큰으로 비트 왕복하기 GPU 불필요

입력: 확률 [0.4, 0.3, 0.2, 0.1], 후보 A~D, 비트 0110. FLC에서 두 비트씩 대응시키면 B와 C를 고릅니다. 선택 토큰에서 다시 비트를 복원하세요.

완료 기준: 원래 비트와 복원 비트가 같고, 비트가 한 개만 남았을 때 오류·패딩·종료 중 어떤 정책을 쓸지 문서화합니다. 후보 확률이 같은 경우의 정렬 규칙도 한 줄로 정하세요.

읽을 소스: 7장 FLC.__call__(), FLC.extract(). 이것은 원리 이해용 작은 예이며 통신 보안이나 암호화를 보장하는 실험이 아닙니다.

과제 3 · 중급

숫자 답 필터와 손실 마스크 감사하기 작은 가상 데이터

입력: 정답 문자열 "7", "-7", "0.5", "1/2"와 토큰 목록 [101, 102, 201, 202]. 앞 두 토큰을 질문, 뒤 두 토큰을 답변으로 정합니다.

할 일: 4장의 필터로 남는 답을 기록하고, 전체 정답 배열과 [-100, -100, 201, 202]를 비교합니다. 실제 손실의 토큰 이동 처리까지 추적하면 더 좋습니다.

완료 기준: 필터가 배제한 답 유형과 학습 대상 위치를 표로 제출합니다. 마스크 변경은 원래 코드의 재현이 아니라 비교 실험용 수정임을 구분하세요.

과제 4 · 중급

GUI 학습 데이터의 계약 검사기 설계하기 모델 호출 불필요

입력: 가상 화면 세 개와 행동 정답 세 개. 9장의 messages·images 형식으로 변환하되 개인 화면이나 실제 계정 정보는 사용하지 않습니다.

할 일: 이미지 경로 누락, 화면 밖 좌표, 1~5 범위를 벗어난 점수, 비어 있는 행동 문자열을 각각 하나씩 만들어 검사기가 찾아내게 합니다.

완료 기준: 정상 샘플은 통과하고 각 오류에는 이유가 나옵니다. 학습에 쓰는 자기 점수가 실제 작업 성공률과 다른 이유를 두 문장으로 설명하세요.

과제 5 · 고급

“보상 증가=품질 향상” 가설을 비교 실험으로 검증하기 학습 시 별도 GPU 환경

입력: 11장의 정책·참조 모델 구성을 기준으로 한 평가 계획. 학습에 쓰지 않은 리뷰 시작 부분을 따로 고정하고, 길이와 생성 난수 조건을 맞춥니다.

할 일: 긍정 로짓 외에 문장 완결성, 같은 구절 반복, 사람이 평가한 자연스러움을 기록합니다. 생성 길이의 상한을 LengthSampler(4, 16)으로 정한 응답에서 결론을 어디까지 낼 수 있을지도 검토합니다.

완료 기준: 학습 전후 표와 실패 예시 5개, 보상은 높지만 문장이 나빠진 사례의 유무를 남깁니다. GPU가 없으면 가상 출력으로 채점표와 데이터 분리 계획까지 완성해도 됩니다.

좋은 실습 결과물은 “돌아갔다”는 캡처보다, 입력·변경 변수·비교 기준·실패 사례가 남은 기록입니다.

9관련 기술 심화 학습 로드맵

8주 동안 데이터→모델→평가→행동의 순서로 확장하기

처음부터 모든 장을 실행하려고 하기보다, 매주 설명할 수 있는 결과물을 하나씩 만드세요. 아래는 초보자를 위한 권장 순서입니다. 장 번호 순서와 다르며, 첫 3주는 GPU 없이 진행할 수 있습니다.

주차공부할 내용·소스남길 결과물
1주Python 목록·딕셔너리·JSON·파일 읽기. 노트북 셀 종류 구분 11개 노트북 셀 지도와 장별 입출력 한 줄 요약
2주토큰화·대화 템플릿·Datasets의 map/filter. 4장 tokenize() 숫자 답 필터의 통과·탈락 표와 학습/추론 형식 비교
3주텐서 축·softmax·top-k·부호화. 7장 FLC·Huffman 작은 확률표로 비트 왕복, 남은 비트와 동률 처리 규칙
4주역전파·손실 마스킹·배치·누적·BF16. 4장 TrainingArguments 학습 설정 해설과 전체 토큰/답변 토큰 학습 비교 설계
5주생성 길이·탐욕 선택·답 추출·수학 동치. 4장 vLLM·평가 코드 모델 오답과 답 추출 실패를 구분한 사례집
6주국소성·탐지 임계값·오탐·누락. 3장 지식 편집과 5장 워터마크 무관한 질문 보존표와 탐지기의 혼동행렬
7주멀티모달 입력·데이터 스키마·행동 정답. 8·9장 가상 GUI 데이터와 경로·좌표·점수 검사 규칙
8주정책·보상·참조 모델·KL·PPO. 11장과 10장 위험 판단 보상과 사람 평가를 나란히 둔 비교 보고서

학습을 실제로 수행하는 4주차 이후에는 장비와 의존성 준비가 추가됩니다. 실행이 어렵다면 먼저 코드의 각 줄이 바꾸는 데이터를 표로 적고, 외부 보조 모듈·모델·데이터가 필요한 지점을 표시하는 것까지 진행하세요.

진도는 실행한 노트북 수보다, 새 모델에서도 같은 실험 질문을 세우고 평가할 수 있는지로 판단하는 편이 좋습니다.

다음 단계로 넘어가는 기준

수학 문제집의 답을 외우기보다 풀이를 설명하는 것과 같습니다. “이 필터를 빼면 무엇이 달라질까?”, “보상을 바꾸면 어떤 행동을 배울까?”에 예상과 근거를 말할 수 있으면 다음 장으로 넘어가세요.

10핵심 키워드 사전

소스에서 만나는 표현을 쉬운 말로 연결하기
용어쉬운 설명
노트북 셀문서 안의 작은 단위. 설명 셀은 읽는 글이고 실행 셀은 커널에 보낼 코드입니다.
커널노트북 코드를 실제로 실행하며 변수·모델 같은 상태를 기억하는 프로세스입니다.
사전학습 모델많은 데이터로 미리 학습한 모델. 이 교재는 이를 불러와 수정하거나 사용합니다.
토큰·토크나이저문장을 잘게 나눈 단위와 그 변환기. 토큰 하나가 반드시 단어 하나인 것은 아닙니다.
대화 템플릿user·assistant와 본문을 모델이 기대하는 구분자·순서로 배열하는 규칙입니다.
SFT입력과 모범 답변을 보여 주며 그 답변을 생성하도록 가중치를 조정하는 학습입니다.
증류큰 모델 등의 결과를 작은 모델의 학습 재료로 쓰는 방법. 4장은 풀이 텍스트를 사용합니다.
손실·마스킹예측이 정답과 다른 정도를 재는 값과, 특정 위치를 그 계산에서 제외하는 처리입니다.
BF1616비트 수치 형식. 메모리를 줄이는 데 쓰며 지원 하드웨어와 연산 조건을 확인해야 합니다.
기울기 누적작은 배치 여러 번의 기울기를 모아 가중치를 한 번 갱신하는 방법입니다.
체크포인트학습 도중 또는 끝에서 저장하는 모델 등의 상태. 체크포인팅 메모리 기법과는 맥락이 다릅니다.
컨텍스트 길이모델이 한 번의 시퀀스에서 다루는 토큰 예산. 생성 시 입력과 출력 길이를 함께 봅니다.
로짓·softmax확률로 바꾸기 전의 원시 점수와, 점수들을 합이 1인 확률로 바꾸는 함수입니다.
탐욕 선택매 위치에서 가장 높은 점수의 토큰을 고르는 방식. 답의 정확성을 보장하지는 않습니다.
허프먼 부호·FLC후보 확률에 따라 비트 부호 길이가 달라질 수 있는 방식과 고정 길이 비트 부호를 쓰는 방식입니다.
텍스트 은닉생성 문장의 토큰 선택에 별도 비트를 담는 기술. 암호화와는 목적·보장이 다릅니다.
워터마크생성 방식의 흔적을 통계적으로 탐지할 수 있게 만드는 표시. 임의의 비트 전달과 구분합니다.
지식 편집·국소성특정 답을 바꾸는 작업과, 그 과정에서 무관한 답을 얼마나 보존하는지 보는 성질입니다.
TPR·FPR찾아야 할 대상을 제대로 찾은 비율과, 대상이 아닌 것을 잘못 지목한 비율입니다.
정책·보상어떤 토큰·행동을 선택할지 정하는 모델과, 그 선택에 주는 학습용 점수입니다.
값 추정 헤드앞으로 받을 보상 등을 추정하도록 모델에 덧붙이는 출력 부분입니다.
참조 모델·KL원래 정책과 비교하는 기준 모델과, 두 확률 분포의 차이를 재는 척도입니다.
PPO·RLHFPPO는 정책을 갱신하는 강화학습 방법이고, RLHF는 인간 피드백으로 선호를 반영하는 학습 접근입니다.
보상 편법원하는 품질 대신 채점기의 허점을 만족해 높은 보상만 얻는 현상입니다.
GUI 에이전트화면과 지시를 바탕으로 클릭·입력 등의 행동을 선택하는 시스템입니다.
ZeRO-3모델 파라미터·기울기·옵티마이저 상태를 여러 장치에 나누는 분산 학습 방식입니다.

같은 단어가 다른 문맥에서 쓰일 수 있습니다. 특히 7장 k는 FLC에서는 비트 수, Huffman에서는 후보 수입니다. 함수의 인자를 보기 전에 해당 클래스에서 무엇을 뜻하는지 확인하세요.

11참고 링크

원본 코드·장별 안내·공식 기술 문서를 함께 보기

저장소와 분석 기준

직접 따라 읽을 핵심 파일

공식 문서·모델·데이터

외부 실습 프로젝트

현재 상태 (2026-10-23 GitHub 기준)

항목내용
선정 위치GitHub Trending Jupyter Notebook Daily #1 · 2026-10-23
스타 / 포크57,287 / 6,847 · 2026-10-23 GitHub 기준
생성일2024-04-08
최신 릴리스v1 · 2025-06-12. README 배지의 v0.1.0 표기와 구분
최근 push2025-10-10 · 분석일 당일 업데이트로 해석하지 않기
최근 커밋f84c042 · 2025-10-10 · Update README.md
주 언어GitHub 분류: Jupyter Notebook. 실행 셀은 Python 중심
코드 규모실행 셀 47개·634줄: Python 중심 약 633줄 + 셸 명령 1줄. 주석·빈 줄 포함
문서 규모노트북 11개, Markdown 12개·2,495줄, PDF 11개
파일 규모105개·약 97.6MiB. .git 제외, 모델·데이터 미포함
실행 구조실행 셀 포함 노트북 4개. 통합 패키지·Dockerfile·CI·테스트 파일 없음
라이선스GitHub 기준 없음. 커밋 f84c042에도 라이선스 파일 없음

GitHub 수치는 2026-10-23 기준이며, 파일·셀·줄 수는 커밋 f84c042의 내용을 센 값입니다.

활용 전에 알아둘 한계
교재의 범위와 재현 조건을 함께 확인하세요

① 곧바로 재현되는 통합 환경은 아닙니다. 장별 버전이 다르고, 4장의 채점 보조 모듈과 여러 외부 프로젝트 파일은 별도 준비가 필요합니다. 9장의 파일·모델·출력 경로도 비어 있습니다. 저장 출력은 새 환경에서의 실행 성공 증거가 아닙니다.

② 실험 결과의 의미는 제한적입니다. 수학 정확도 0.452는 저장된 단일 결과이며, PPO의 감정 보상 상승은 일반적인 안전성 향상과 다릅니다. 4장에는 학습 중 검증이 없고, 11장의 전후 비교는 독립된 테스트 분할이 아닙니다.

③ 자원 요구가 장마다 크게 다릅니다. 읽기와 데이터 검사는 가볍지만, 원래 규모의 수학·GUI 학습은 큰 GPU 메모리를 요구합니다. 외부 모델·데이터·API·도구의 이용 조건과 지원 버전도 각각 확인해야 합니다.

④ 읽을 수 있다는 사실만으로 재사용 조건이 정해지지는 않습니다. 명시된 저장소 라이선스가 없습니다. 무료 교육 자료라는 README 설명을 특정 배포·수정 허용 조건으로 대신 읽지 마세요.

⑤ 안전 장은 위험한 행동의 평가 자료입니다. 기록 속 민감정보 전송·시스템 손상 사례를 실제 행동으로 재현할 필요는 없습니다. 가상 기록에서 위험을 찾고 판정 기준을 비교하는 방식으로도 핵심을 배울 수 있습니다.