1장. 과정 소개와 LLM 의 이해
다음 낱말 맞히기
휴대폰으로 "오늘 저녁"까지 치면 자판 위에 "뭐", "같이", "먹을래" 같은 낱말이 떠오릅니다. 내가 그동안 친 글에서 "오늘 저녁" 뒤에 자주 온 낱말을 보여 주는 것입니다. 추천 낱말을 계속 누르면 문장이 저절로 이어집니다. LLM 이 글을 쓰는 방법이 바로 이것입니다. 다만 내 글 몇 줄이 아니라 아주 많은 글로 배웠다는 점이 다릅니다.
LLM 은 네 걸음을 되풀이합니다. 지금까지의 글을 읽고, 다음에 올 낱말 후보마다 확률을 매기고, 하나를 고르고, 그 낱말을 붙입니다. 붙인 뒤에는 늘어난 글로 다시 첫 걸음부터 합니다. 여기서 휴대폰의 추천 낱말이 LLM 의 후보이고, 추천 낱말을 누르는 손가락이 "고르기"입니다. 비유와 다른 점은, LLM 은 낱말이 아니라 토큰이라는 더 작은 조각을 맞힌다는 것입니다. 토큰은 다음 절에서 봅니다.
확률은 "횟수 ÷ 전체"
다음 낱말의 확률은 나눗셈 하나로 구할 수 있습니다. 문장 네 개에서 "제주도" 뒤에 온 낱말을 세어 봅니다.
| "제주도" 뒤에 온 낱말 | 횟수 | 확률(횟수 ÷ 전체 4) |
|---|---|---|
| 여행은 | 2 | 2 ÷ 4 = 0.5 |
| 바다는 | 1 | 1 ÷ 4 = 0.25 |
| 맛집을 | 1 | 1 ÷ 4 = 0.25 |
확률을 모두 더하면 1 이 됩니다. 0.5 는 "두 번에 한 번꼴"이라는 뜻입니다. LLM 은 이 표에서 확률이 가장 큰 "여행은"을 고를 수도 있고, 가끔은 "바다는"을 고를 수도 있습니다. 어떻게 고를지는 "확률과 온도" 절에서 봅니다.
짧은 예시
위의 표를 코드로 셉니다. Counter 는 collections(모음) 묶음에 든 도구로, 같은 것이 몇 번 나왔는지 세어 줍니다.
from collections import Counter
sentences = ["제주도 여행은 즐겁습니다", "제주도 바다는 맑습니다", "제주도 여행은 설렙니다", "제주도 맛집을 찾았습니다"]
# 문장마다 두 번째 낱말이 "제주도" 바로 뒤에 온 낱말이다
after = Counter(s.split()[1] for s in sentences)
total = sum(after.values())
for word, count in after.most_common():
print(word, count, "→ 확률", count / total)여행은 2 → 확률 0.5
바다는 1 → 확률 0.25
맛집을 1 → 확률 0.25most_common() 은 "가장 흔한 것부터"라는 뜻으로, 많이 나온 순서로 늘어놓습니다. 실습 2에서는 문장 60개로 같은 일을 하고, 확률이 가장 큰 낱말을 이어 붙여 문장을 만들어 봅니다.
코드가 의미하는 것
이 코드는 휴대폰 자판이 추천 낱말을 고르는 방법을 아주 작게 흉내 낸 것입니다. 지난 글에서 "제주도" 뒤에 무엇이 왔는지 세고, 센 횟수를 전체로 나눠 확률로 바꿉니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
sentences = [...] | 문장 네 개를 둔다 | 모델이 배운 글의 전부입니다. 실제 LLM 은 이보다 훨씬 많은 글로 배웁니다 |
s.split()[1] | 문장마다 두 번째 낱말을 꺼낸다 | 네 문장이 모두 "제주도"로 시작하므로 두 번째 낱말이 곧 "제주도 바로 뒤에 온 낱말"입니다 |
Counter(...) | 낱말마다 몇 번 나왔는지 센다 | 모델이 배운 글에서 얻은 경험입니다. "여행은"을 두 번 봤다는 기록입니다 |
count / total | 횟수를 전체 횟수로 나눈다 | 경험을 확률로 바꾸는 일입니다. 앞의 표의 "횟수 ÷ 전체"를 코드로 쓴 것입니다 |
most_common() | 많이 나온 것부터 늘어놓는다 | 추천 낱말을 순서대로 보여 주는 것과 같습니다. 맨 앞이 1등 후보입니다 |
결과에서 읽을 것은 세 가지입니다.
- 확률의 합은 1 입니다. 0.5 + 0.25 + 0.25 = 1 입니다. "제주도" 뒤에는 이 셋 가운데 하나가 반드시 온다고 보는 것입니다.
- 배운 글이 바뀌면 확률도 바뀝니다. 문장 하나를 더 넣으면 횟수와 전체가 함께 바뀌어 확률이 달라집니다. 모델의 "지식"은 배운 글에서 나온다는 뜻입니다.
- 없는 낱말은 후보에도 없습니다. 출력에 "날씨가"가 없는 것은 네 문장에 한 번도 나오지 않았기 때문입니다. 아래 "주의할 점"의 확률 0 이 이것입니다.
주의할 점
- 이 장의 낱말 세기 모델은 원리를 보이는 장난감입니다. 실제 LLM 은 바로 앞 낱말 하나가 아니라 앞의 글 전체를 보고 확률을 매깁니다.
- 본 적 없는 낱말은 확률이 0 입니다. 기록에 "제주도 날씨가"가 없으면 이 모델은 그 말을 영영 쓰지 못합니다.