0Pricing
AI Prompt Engineering · 강의

인공지능은 어떻게 응답을 생성하는가

토큰 예측과 확률, 그리고 인공지능이 인간처럼 ‘생각’하지 않는 이유를 알아보십시오.

인공지능은 어떻게 응답을 생성하는가은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

텍스트를 확률 문제로 보기

본질적으로 언어 모델은 한 가지 일을 합니다. 앞에 나온 모든 토큰을 바탕으로 다음 토큰을 예측합니다.

토큰은 텍스트를 이루는 작은 단위로, 대략 하나의 단어 또는 단어 일부에 해당합니다. 모델은 어휘에 있는 모든 토큰에 확률을 부여하고 하나를 선택합니다. 그런 다음 완전한 응답을 생성할 때까지 토큰별로 이 과정을 반복합니다.

토큰이란 무엇인가요?

토큰은 LLM 텍스트 처리의 원자와 같습니다. 영어 텍스트는 대략 다음과 같이 토큰화됩니다:

  • 흔한 단어 → 각각 1개 토큰(the, run)
  • 덜 흔한 단어 → 2~3개 토큰으로 분할(running → run + ning)
  • 구두점과 공백 → 대개 각각 별도의 토큰

GPT-4o 및 Claude와 같은 모델은 여러 언어의 하위 단어를 포함하여 100k개가 넘는 어휘 항목을 처리하는 토큰화기를 사용합니다.

import tiktoken

encoding = tiktoken.encoding_for_model('gpt-4o')

sentence = 'The temperature parameter controls randomness in token selection.'
tokens = encoding.encode(sentence)
token_strings = [encoding.decode([t]) for t in tokens]

print(f'Sentence: {sentence}')
print(f'Token count: {len(tokens)}')
print(f'Tokens: {token_strings}')

자기회귀 생성

생성은 자기회귀 방식으로 이루어집니다. 각 새 토큰을 입력에 추가한 후 다음 토큰을 예측합니다.

따라서 「하늘은 파랗다」를 생성할 때 모델은 다음과 같이 작동합니다:

  • 「하늘」을 봅니다 → 「은」을 예측합니다
  • 「하늘 은」을 봅니다 → 「파랗다」를 예측합니다
  • 「하늘 은 파랗다」를 봅니다 → 시퀀스 종료를 예측합니다

각 토큰에 전체 순전파가 필요하기 때문에 생성할 출력이 매우 길면 속도가 느려집니다.

# Simulated autoregressive token-by-token output via streaming
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

stream = client.chat.completions.create(
    model='gpt-4o',
    stream=True,     # receive tokens as they are generated
    messages=[{'role': 'user', 'content': 'Name five planets in our solar system.'}]
)

print('Tokens arriving one by one:')
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end='', flush=True)
print()  # newline at end

온도: 무작위성 조절

온도는 샘플링 전에 확률 분포의 크기를 조정하는 0에서 2 사이의 숫자입니다:

  • 온도 0: 가장 가능성이 높은 토큰을 항상 선택 — 결정적이고 반복적입니다
  • 온도 1: 원래 확률에 따라 샘플링 — 균형 잡힌 결과입니다
  • 온도 2: 확률을 평탄화 — 매우 무작위적이며 때로는 일관성이 없습니다

사실 기반 작업에는 낮은 온도를 사용하고, 창의적인 작업에는 더 높은 온도를 사용하십시오.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Continue this sentence with one word: The ocean is'

for temp in [0.0, 0.7, 1.5]:
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=temp,
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    word = response.choices[0].message.content.strip()
    print(f'Temperature {temp}: "{word}"')

실행마다 응답이 달라지는 이유

같은 프롬프트를 사용해도 동일한 모델을 두 번 실행하면 서로 다른 출력이 나올 수 있습니다. 이유는 다음과 같습니다:

  • 샘플링은 확률적입니다 — 모델은 조회표가 아니라 확률 분포에서 선택합니다
  • 부동 소수점 연산의 작은 수치 차이가 연쇄적으로 커질 수 있습니다
  • 하드웨어 병렬 처리로 인해 비결정성이 발생합니다

재현 가능성을 최대화하려면 temperature=0과 seed를 설정하십시오(지원되는 경우).

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

prompt = 'Give me a one-word color that feels calm.'

for run in range(3):
    response = client.chat.completions.create(
        model='gpt-4o',
        temperature=1.0,   # randomness ON
        max_tokens=5,
        messages=[{'role': 'user', 'content': prompt}]
    )
    print(f'Run {run + 1}: {response.choices[0].message.content.strip()}')

# For reproducible outputs use seed + temperature=0
response = client.chat.completions.create(
    model='gpt-4o',
    temperature=0,
    seed=42,
    max_tokens=5,
    messages=[{'role': 'user', 'content': prompt}]
)
print(f'Deterministic: {response.choices[0].message.content.strip()}')

상위 p 샘플링

상위 p(누클리어스 샘플링)는 무작위성을 조절하는 또 다른 방법입니다. 모든 확률의 크기를 조정하는 대신, 누적 확률이 p를 넘는 가장 작은 토큰 집합으로 샘플링을 제한합니다.

  • top_p=0.1: 가장 상위의 토큰만 포함(보수적)
  • top_p=0.9: 더 넓은 선택지(창의적)
  • top_p=1.0: 모든 토큰 포함(전체 분포)

실제로는 대부분의 팀이 온도를 조정하고 상위 p는 1.0으로 유지합니다.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Conservative generation: top_p=0.1 restricts to high-confidence tokens
response_conservative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.1,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'What is the capital of Japan?'}]
)

# Creative generation: top_p=0.95 allows broader token pool
response_creative = client.chat.completions.create(
    model='gpt-4o',
    top_p=0.95,
    max_tokens=30,
    messages=[{'role': 'user', 'content': 'Write a poetic one-liner about the moon.'}]
)

print('Conservative:', response_conservative.choices[0].message.content)
print('Creative:    ', response_creative.choices[0].message.content)

진정한 이해 없음 — 패턴 매칭

LLM은 인간처럼 언어를 이해하지 않습니다. LLM은 방대한 텍스트 말뭉치로 학습된 매우 정교한 패턴 매칭기입니다.

모델이 '광합성이란 무엇인가?'에 답할 때, 저장된 사실을 검색하는 것이 아닙니다. 학습 중 수백만 개의 유사한 문서를 본 경험을 바탕으로 질문 패턴 뒤에 통계적으로 이어질 토큰의 시퀀스를 생성하는 것입니다.

# Demonstration: the model can produce plausible-sounding but wrong answers
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking about something nonsensical — model may still try to answer
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is the boiling point of happiness in degrees Celsius? '
            'Please just say "I cannot answer this" if the question makes no sense.'
        )
    }]
)
print(response.content[0].text)

학습과 추론

모델의 '지식'은 대규모 텍스트 말뭉치로 학습하는 동안 고정됩니다. 추론 단계(프롬프트를 보낼 때)에는 이 고정된 지식을 바탕으로 텍스트를 생성하며, 학습하거나 인터넷을 검색하지는 않습니다.

따라서 학습 기준 시점 이후의 사건을 알 수 없고, 주소에 접근할 수도 없으며, 학습 이후 사실이 변경되었는지 확인할 수도 없습니다.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Asking the model about its own knowledge cutoff
response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{
        'role': 'user',
        'content': (
            'What is your knowledge cutoff date? '
            'And can you access the internet right now to look up today\'s news?'
        )
    }]
)
print(response.content[0].text)

순전파에서 일어나는 일

높은 수준에서 보면 각 토큰 예측에는 다음 과정이 포함됩니다.

  1. 모든 입력 토큰을 수치 임베딩으로 변환합니다
  2. 여러 트랜스포머 계층(어텐션 + 피드포워드)을 통과시킵니다
  3. 전체 어휘에 대한 확률 분포를 생성합니다
  4. 해당 분포에서 토큰 하나를 샘플링합니다

최신 모델에는 이러한 변환을 형성하는 수십억 개의 매개변수가 있으며, 이 매개변수는 모두 인간의 텍스트를 바탕으로 학습됩니다.

# You can inspect logprobs (token probabilities) to see the model's confidence
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=5,
    logprobs=True,
    top_logprobs=3,
    messages=[{'role': 'user', 'content': 'The opposite of hot is'}]
)

for token_info in response.choices[0].logprobs.content:
    print(f'Chosen token: "{token_info.token}"')
    for alt in token_info.top_logprobs:
        import math
        prob = round(math.exp(alt.logprob) * 100, 1)
        print(f'  Option "{alt.token}": {prob}% probability')

중지 시퀀스

중지 시퀀스는 모델이 특정 문자열을 생성하면 생성을 멈추도록 합니다. 다음과 같은 경우에 유용합니다.

  • 목록에서 답변을 두 개 이상 생성하지 않도록 방지합니다
  • ### 또는 ---END---와 같은 구분자에서 멈춥니다
  • 한 줄 출력을 강제합니다

중지 시퀀스가 없으면 모델은 max_tokens에 도달하거나 시퀀스 종료 토큰을 예측할 때까지 생성합니다.

import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Stop after the first item in a numbered list
response = client.chat.completions.create(
    model='gpt-4o',
    max_tokens=64,
    stop=['2.'],   # halt as soon as '2.' appears
    messages=[{
        'role': 'user',
        'content': 'List 5 programming languages, numbered 1 through 5.'
    }]
)
print(response.choices[0].message.content)
print('Stop reason:', response.choices[0].finish_reason)

프롬프트 작성자를 위한 실용적 시사점

생성 방식을 이해하면 더 나은 프롬프트를 작성할 수 있습니다.

  • 온도 0 사용 — 일관되고 사실에 부합하는 출력이 필요한 작업에 사용합니다
  • 온도 0.7-1.0 사용 — 창의적인 글쓰기에 사용합니다
  • 사실 확인 — 모델은 그럴듯한 텍스트를 생성할 뿐, 진실을 보장하지는 않습니다
  • 중지 시퀀스 사용 — 출력 길이를 정확하게 제어합니다
  • 짧은 프롬프트 → 더 창의적이지만 통제가 덜 되는 출력
  • 자세한 프롬프트 → 더 제한적이고 집중된 출력
import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Low temperature for factual classification
fact_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=8,
    temperature=0,   # deterministic
    messages=[{'role': 'user', 'content': 'Is Paris the capital of France? Answer YES or NO only.'}]
)
print('Factual (temp=0):', fact_response.content[0].text.strip())

# Higher temperature for creative tasks
creative_response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=64,
    temperature=1.0,
    messages=[{'role': 'user', 'content': 'Write a surprising one-line poem about code.'}]
)
print('Creative (temp=1):', creative_response.content[0].text.strip())

이해도 확인

LLM이 토큰 단위로 텍스트를 생성하는 방식을 배웠습니다. 온도에 대한 이해도를 확인해 보겠습니다.

개발자가 결제 관련 질문에 일관되고 정확하게 답해야 하는 고객 지원 챗봇을 만들고 있습니다. 어떤 온도 설정이 가장 적절할까요?

인공지능 응답 생성 방식 — 복습

이제 모든 인공지능 응답의 작동 원리를 이해하셨습니다.

  • 모델은 한 번에 하나씩 다음 토큰을 예측합니다 — 자기회귀 생성
  • 온도는 토큰 선택에 주입되는 무작위성의 정도를 조절합니다
  • 상위 p는 확률이 높은 토큰의 핵심 집합으로 샘플링 범위를 제한합니다
  • 모델은 이해하지 않습니다 — 엄청난 규모로 패턴을 매칭합니다
  • 지식은 학습 시점에 고정됩니다 — 실시간 데이터도 인터넷 접근도 없습니다
  • 중지 시퀀스를 사용하면 출력이 정확히 어디에서 끝날지 제어할 수 있습니다

자주 묻는 질문

“인공지능은 어떻게 응답을 생성하는가” 강의는 무료인가요?

네 — “인공지능은 어떻게 응답을 생성하는가” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

“인공지능은 어떻게 응답을 생성하는가”에서 뭘 배우나요?

토큰 예측과 확률, 그리고 인공지능이 인간처럼 ‘생각’하지 않는 이유를 알아보십시오. 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“인공지능은 어떻게 응답을 생성하는가” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 채팅 인터페이스 이해하기
  2. 인공지능이 처리할 수 있는 요청 유형
  3. 인공지능은 어떻게 응답을 생성하는가
  4. 인공지능이 할 수 없는 일
← AI Prompt Engineering(으)로 돌아가기