토니의 연습장
generation function example 본문

1. idx가 뭐냐?
- idx는 토큰 ID 시퀀스를 담고 있는 텐서.
예를 들어 batch 크기가 2, 지금까지 생성된 토큰 길이가 10이라고 하면:즉 (배치 크기, 토큰 길이) 형태. -
idx.shape = (2, 10)
-
2. idx[:, -context_size:] 뜻
- : → 모든 배치 선택
- -context_size: → 마지막 context_size 개 토큰만 잘라오기
즉, "현재까지 만들어진 문맥에서 제일 최근 context_size 만큼만 모델 입력으로 사용" 하는 것.
3. 왜 이렇게 하냐?
언어 모델은 보통 고정된 길이의 입력 창(window) 만 볼 수 있음.
예를 들어 모델이 한 번에 최대 128 토큰까지만 볼 수 있다고 하면:
- 지금까지 토큰이 10개면 → 그냥 다 보여줌.
- 지금까지 토큰이 300개면 → 최근 128개만 잘라서 보여줌.
→ 이렇게 해야 모델이 과거 너무 긴 입력 때문에 메모리 터지는 걸 방지할 수 있음.
4. 예시
- idx = [[1, 2, 3, 4, 5, 6, 7, 8]] (배치=1, 토큰 8개)
- context_size = 4
idx_cond = idx[:, -4:]
👉 결과: [[5, 6, 7, 8]]
즉, 최근 4개 토큰만 추려서 모델에 넣는 것.
✅ 정리
idx_cond = idx[:, -context_size:]
👉 "모델이 처리할 수 있는 최대 문맥 길이만큼, 가장 최근 토큰들만 남긴 입력"
1. 모델의 출력(logits)이 뭔데?
언어 모델은 입력된 시퀀스(idx_cond)의 각 위치별 다음 토큰 확률 분포를 내놓음.
예를 들어 idx_cond = [7, 8, 9, 10]을 넣으면, 모델은 이런 걸 계산:
- 토큰 7 다음에 올 확률 분포
- 토큰 8 다음에 올 확률 분포
- 토큰 9 다음에 올 확률 분포
- 토큰 10 다음에 올 확률 분포
즉, logits.shape = (batch, 시퀀스 길이, vocab_size)
2. 그런데 우리는 언제 새로운 토큰을 만들까?
우리가 하고 싶은 건 가장 마지막 토큰(10)의 뒤에 올 토큰을 예측하는 것.
즉,
... 7, 8, 9, 10, [ ? ]
여기서 "?"에 올 토큰 확률만 필요하지, 중간 것들은 쓸모가 없음.
3. 그래서 마지막 위치만 뽑음
logits = logits[:, -1, :]
👉 마지막 위치(-1) = 시퀀스의 마지막 토큰 바로 다음에 대한 확률 분포만 선택.
- shape: (batch, vocab_size)
- 여기서 argmax나 샘플링을 해서 새 토큰을 하나 뽑아냄.
4. 직관적인 비유
- 언어모델은 문장을 읽으면서 매 단어 뒤에 뭐가 올지 다 계산해줌.
- 하지만 우리가 궁금한 건 항상 "지금까지의 문맥 뒤에 올 다음 단어" 하나뿐.
- 그래서 매번 마지막 위치만 꺼내서 사용하는 것.
✅ 정리
logits[:, -1, :] 은
👉 "현재까지 문맥의 마지막 토큰 이후에 올 다음 토큰의 확률만 가져와서, 새 토큰을 뽑기 위해서" 사용되는 것.
'언어 AI (NLP) > LLM & RAG & Agent' 카테고리의 다른 글
Scaling - file formats (0) | 2025.09.18 |
---|---|
고성능 RAG 테크닉 (0) | 2025.09.09 |
AWS - Lambda / API Gateway / Bedrock (0) | 2025.09.04 |
get_batch( ) (0) | 2025.08.26 |
Unsloth (0) | 2025.08.20 |