토니의 연습장

generation function example 본문

언어 AI (NLP)/LLM & RAG & Agent

generation function example

bellmake 2025. 9. 23. 16:22

 

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