소개: LLM의 마법 풀기
대규모 언어 모델은 마술처럼 보입니다. 질문을 작성하면 일관되고 구조화된 답변을 얻을 수 있습니다. 종종 놀라울 정도로 지능적이다. 하지만 후드 아래에는 마법이 없습니다. 수학. LLM은 기본적으로 다음 토큰을 기반으로 시퀀스에서 다음 토큰을 예측하는 시스템입니다. 훈련 중 수십억 단어로부터 학습된 통계 패턴.
LLM의 작동 방식을 이해하는 것은 학술적인 연습이 아니라 필수적인 실무 기술입니다. 프롬프트와 생성된 응답 사이에 어떤 일이 일어나는지 알면 더 나은 프롬프트를 작성할 수 있습니다. 예상치 못한 동작을 디버깅하고, 사용 사례에 적합한 모델을 선택하고, 이해하세요. LLM은 환각을 느끼기 때문입니다.
이 기사에서 배울 내용
- 토큰화를 통해 텍스트를 숫자로 변환하는 방법
- 의미론적 의미를 표현하는 임베딩의 역할
- Transformers에서 주의 메커니즘이 작동하는 방식
- 텍스트 생성 프로세스: 로지트에서 토큰까지
- 샘플링 전략: 온도, top-k 및 top-p
- LLM이 환각을 느끼는 이유와 상황 창의 역할
1단계: 토큰화 - 텍스트에서 숫자로
LLM 처리의 첫 번째 단계는 토큰화: 텍스트를 변환합니다 일련의 정수로. 신경 패턴에는 글자나 단어가 포함되지 않습니다. 그들은 작동합니다 수치 벡터. 토큰화는 인간 언어와 모델 수학 사이의 다리 역할을 합니다.
바이트 쌍 인코딩(BPE)
가장 일반적인 알고리즘은 바이트 쌍 인코딩(BPE), GPT, Claude 및 대부분의 사용자가 사용함 현대 모델의 일부입니다. BPE는 반복적으로 작동합니다. 개별 문자에서 시작하여 병합합니다. 더 긴 토큰에서는 점점 더 자주 쌍이 됩니다.
결과는 최적의 절충안을 나타내는 50,000-100,000개 토큰의 어휘입니다. 세분화와 효율성 사이. "the"와 같은 일반적인 단어는 단일 토큰이 되는 반면, 단어는 드문 토큰은 하위 토큰으로 나뉩니다.
# Esempio di tokenizzazione con tiktoken (tokenizer di OpenAI)
import tiktoken
# Carica il tokenizer di GPT-4
enc = tiktoken.encoding_for_model("gpt-4")
# Tokenizza una frase
testo = "L'intelligenza artificiale generativa e rivoluzionaria"
tokens = enc.encode(testo)
print(f"Testo: {testo}")
print(f"Token IDs: {tokens}")
print(f"Numero token: {len(tokens)}")
# Decodifica ogni token per vedere la suddivisione
for token_id in tokens:
print(f" ID {token_id} -> '{enc.decode([token_id])}'")
# Output tipico:
# Testo: L'intelligenza artificiale generativa e rivoluzionaria
# Token IDs: [43, 6, 396, 40749, 80828, ...]
# Numero token: 8
토큰화의 실질적인 영향
토큰화에는 모든 개발자가 알아야 할 중요한 실제 결과가 있습니다.
- 비용: API 요금은 단어 단위가 아닌 토큰 단위로 부과됩니다. 단어는 1-4개의 토큰이 될 수 있습니다.
- 컨텍스트 창: 한도는 말이 아닌 토큰 단위입니다. 4,000개의 토큰은 영어 약 3,000단어에 해당합니다.
- 다른 언어: 이탈리아어는 동일한 개념을 표현하기 위해 영어보다 더 많은 토큰이 필요합니다(약 1.3배).
- 암호: 소스 코드는 자연 텍스트보다 토큰 효율성이 떨어지는 경우가 많습니다.
2단계: 임베딩 - 토큰에서 의미까지
토큰화 후 각 ID 토큰은 삽입: 조밀한 벡터 토큰의 의미론적 의미를 포착하는 실수(일반적으로 768-12,288 차원)입니다.
임베딩의 힘은 기하학에 있습니다. 비슷한 의미를 가진 단어는 벡터를 갖습니다. 우주에서 가깝습니다. “왕”과 “여왕”은 “파리”와 “프랑스”처럼 가깝습니다. 이러한 관계 훈련 중에 자동으로 학습됩니다.
임베딩: 의미가 있는 숫자
임베딩은 단순한 숫자 ID가 아닙니다. 모든 차원이 있는 고차원 벡터입니다.
의미의 측면을 포착합니다. 임베딩에 대한 산술 연산으로 결과 생성
의미상 합리적: vec("re") - vec("uomo") + vec("donna") ≈ vec("regina").
# Visualizzare la similarità semantica degli embedding
from openai import OpenAI
import numpy as np
client = OpenAI()
def get_embedding(text: str) -> list:
"""Ottieni l'embedding di un testo usando OpenAI."""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_similarity(a: list, b: list) -> float:
"""Calcola la similarità coseno tra due vettori."""
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Confronta similarità semantiche
parole = ["gatto", "cane", "automobile", "felino"]
embeddings = {p: get_embedding(p) for p in parole}
print("Similarità semantiche:")
print(f" gatto-felino: {cosine_similarity(embeddings['gatto'], embeddings['felino']):.4f}")
print(f" gatto-cane: {cosine_similarity(embeddings['gatto'], embeddings['cane']):.4f}")
print(f" gatto-auto: {cosine_similarity(embeddings['gatto'], embeddings['automobile']):.4f}")
# gatto-felino avra la similarità più alta!
위치 인코딩
의미론적 임베딩 외에도 Transformers는 다음을 추가합니다. 위치 인코딩: 신호 이는 시퀀스에서 각 토큰의 위치를 나타냅니다. 이 메커니즘이 없으면 모델이 작동하지 않습니다. 아키텍처에서는 "고양이가 쥐를 쫓는다"와 "쥐가 고양이를 쫓는다"를 구별합니다. Transformer는 모든 토큰을 순차적이 아닌 병렬로 처리합니다.
3단계: 변압기 - 주의가 필요한 전부입니다.
모든 현대 LLM의 핵심은 건축입니다. 트랜스포머, 반복되는 블록으로 구성 의 자기 관심 e 피드포워드 네트워크. GPT-4와 같은 모델에는 수백 개의 쌓인 블록은 각각 텍스트 표현을 구체화합니다.
Self-Attention: 핵심 메커니즘
Self-attention을 사용하면 각 토큰이 시퀀스의 다른 모든 토큰을 "보고" 결정할 수 있습니다. 현재 상황에서 그 의미와 얼마나 관련성이 있는지. "고양이가 앉았다"라는 문장에서 피곤했기 때문에 카펫 위에", 주의 메커니즘은 "그는 피곤했다"를 "고양이"("카펫"이 아님)로 연결합니다. 상호 참조를 해결합니다.
수학적으로 각 토큰에 대해 세 개의 벡터가 계산됩니다. 쿼리 (나는 무엇을 찾고 있는가), 열쇠 (내가 맥락으로 제공하는 것) e Value (내 정보 내용). 쿼리와 키 사이의 내적은 값에 가중치를 부여하는 데 사용되는 주의 가중치를 결정합니다.
다중 헤드 주의
단일 주의 메커니즘은 한 가지 유형의 관계를 포착합니다. 그만큼 여러 사람의 관심 여러 개의 어텐션을 동시에 실행하며(일반적으로 32-128개의 "헤드") 각각은 한 측면을 전문으로 합니다. 다름: 구문론, 의미론, 근접성, 상호 참조 관계 등.
변압기 블록의 구조
각 Transformer 블록은 다음 구조를 따릅니다. 레이어 노름 입력을 안정화하기 위해, 다중 헤드 Self-Attention 토큰 간의 관계를 포착하기 위해, 잔여 연결 원본 정보를 보존하기 위해, 잠시 레이어 노름, 그리고 하나 피드포워드 네트워크 (2개의 조밀한 층) 표현을 변환하고 다른 표현을 변환합니다. 잔여 연결. GPT-4는 이러한 블록을 약 120개 쌓습니다.
4단계: 텍스트 생성
입력 텍스트가 모든 Transformer 블록을 통과한 후 마지막 레이어는 각 위치에 대한 출력 벡터입니다. 다음 토큰을 생성하기 위해 이 벡터가 투영됩니다. i를 생산하는 전체 어휘에 걸쳐 로짓: 가능한 각각에 대한 숫자 점수 어휘의 토큰.
로지트에서 확률로: Softmax
로짓은 함수를 통해 확률로 변환됩니다. 소프트맥스, 정규화 1이 되도록 점수를 더합니다. 확률이 가장 높고 "최고의 예측"을 가진 토큰 하지만 항상 선택되는 것은 아닙니다.
샘플링 전략
다음 토큰의 선택은 결정적이지 않습니다. 다양한 전략 견본 추출 다양한 특성을 가진 출력을 생성합니다.
- 그리디 디코딩: 항상 가장 가능성이 높은 토큰을 선택합니다. 결정적이지만 종종 반복적이고 지루함
- 무작위 샘플링: 전체 배포판의 샘플입니다. 창의적이지만 잠재적으로 일관성이 없음
- 온도: "임의성"을 확인하십시오. T=0은 욕심쟁이, T=1은 원래 분포, T>1은 창의성을 높입니다.
- Top-k 샘플링: 가장 가능성이 높은 k개의 토큰에서만 샘플링합니다(예: k=40).
- Top-p(핵) 샘플링: 누적 확률이 p를 초과하는 가장 작은 토큰 세트에서 샘플링합니다(예: p=0.9).
# Esempio: effetto della temperature sulla generazione
from anthropic import Anthropic
client = Anthropic()
prompt = "Scrivi l'inizio di una storia fantasy in una riga:"
for temp in [0.0, 0.5, 1.0, 1.5]:
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
temperature=temp,
messages=[{"role": "user", "content": prompt}]
)
print(f"\nTemperature {temp}:")
print(f" {response.content[0].text}")
# Temperature 0.0: output deterministico, sempre uguale
# Temperature 0.5: lieve variazione, ancora coerente
# Temperature 1.0: creativo, buon bilanciamento
# Temperature 1.5: molto creativo, possibile incoerenza
컨텍스트 창: LLM의 메모리
La 컨텍스트 창 LLM이 단일 작업에서 처리할 수 있는 최대 토큰 수 요청(입력 + 출력). 이는 사실상 대화 중 모델의 "작업 기억"입니다.
모델에 대한 컨텍스트 창
| 모델 | 컨텍스트 창 | 대략적인 등가물 |
|---|---|---|
| GPT-3.5 | 4,096 / 16,384 토큰 | ~3,000 / 12,000단어 |
| GPT-4 | 8,192 / 128,000 토큰 | ~6,000 / 96,000단어 |
| 클로드 3.5 소네트 | 토큰 200,000개 | ~150,000 단어 |
| 제미니 1.5 프로 | 토큰 1,000,000개 | ~750,000 단어 |
| 라마 3.1 | 토큰 128,000개 | ~96,000단어 |
환각: LLM이 발명하는 이유
Le 환각 LLM의 가장 중요한 문제 중 하나입니다. 모델이 정보를 생성합니다. 실제 정보를 생성하는 것과 동일한 확실성을 가지고 거짓입니다. 이는 LLM이 그렇지 않기 때문입니다. 사실을 "알고 있습니다": 주어진 상황에서 가장 가능성이 높은 다음 토큰을 예측합니다.
통계 패턴에 따르면 "호주의 수도는 다음입니다"라는 토큰이 가장 가능성이 높은 토큰입니다. "Sydney"인 경우 정답이 "Canberra"인 경우에도 모델은 "Sydney"를 생성합니다. 모델 출력의 진실성을 확인하는 내부 메커니즘이 없습니다.
완화: 검색 증강 생성(RAG)
환각과 환각을 줄이는 가장 효과적인 전략 조각: 모델에게 제공 맥락의 일부로 신뢰할 수 있는 출처에서 검색된 사실 정보입니다. 묻는 대신 "기억" 모델에 업데이트된 데이터를 제공하고 이에 대해 추론하도록 요청합니다.
# RAG semplificato: fornire contesto fattuale al modello
from anthropic import Anthropic
client = Anthropic()
# Contesto recuperato da un database o motore di ricerca
contesto_fattuale = """
Dati aziendali aggiornati al Q3 2025:
- Fatturato: EUR 12.5M (+23% YoY)
- Dipendenti: 85
- Clienti attivi: 342
- NPS score: 72
"""
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": f"""Basandoti ESCLUSIVAMENTE sui dati seguenti,
rispondi alla domanda. Se i dati non contengono la risposta, di' "Non ho questa informazione".
DATI:
{contesto_fattuale}
DOMANDA: Qual è il fatturato attuale e quanti dipendenti abbiamo?"""
}]
)
print(response.content[0].text)
결론
토큰화부터 생성 및 그 이상까지 LLM의 내부 작동 방식을 이해합니다. 임베딩, 어텐션, 샘플링을 위한 것은 단순한 이론적 지식이 아닙니다. 그리고 이것을 사용하는 기초는 도구를 효과적이고 의식적으로 사용합니다.
토큰화는 비용과 컨텍스트 제한에 영향을 미칩니다. 온도 및 샘플링 전략 결과물의 창의성을 결정합니다. Attention 메커니즘은 모델이 이해하는 이유를 설명합니다. (또는 이해하지 못함) 맥락. 환각은 건축의 직접적인 결과이다 다음 토큰 예측.
다음 글에서는 이 지식을 실제로 적용해 보겠습니다. 고급 엔지니어링 프롬프트: 제로샷부터 일련의 사고까지, LLM을 최대한 활용하기 위한 체계적인 기술, 시스템 프롬프트에서 ReAct 패턴까지.







