Sampling — 모델 출력의 다양성 조절하기

Sampling — 모델 출력의 다양성 조절하기

LLM이 같은 질문에 매번 다른 문장을 내놓는 걸 본 적이 있죠? 그건 우연이 아니라 샘플링(sampling) 이라는 조절 장치 덕분이에요. 이 페이지에서는 Mistral API가 어떤 샘플링 파라미터를 지원하는지, 각각이 출력을 어떻게 바꾸는지 하나씩 살펴볼게요.

출처: Mistral Docs — Sampling

샘플링 파라미터 둘러보기

Mistral은 출력의 무작위성과 다양성을 조절하는 파라미터로 Temperature, N, Top P, Presence Penalty, Frequency Penalty 를 제공해요. 각 파라미터가 언제 유용한지 감을 잡아볼게요.

N — 한 번에 여러 응답 받기

N 은 요청 하나에 대해 몇 개의 완성본(completion)을 돌려받을지 정하는 값이에요. 하나의 입력으로 여러 후보 응답을 받아두고 그중 가장 마음에 드는 것을 고르고 싶을 때 좋아요.

핵심 포인트

  • N 을 1보다 크게 설정하면 같은 입력에 대해 응답을 여러 개 받아요.
  • 입력 토큰은 한 번만 청구돼요. 즉 응답 개수와 무관하게 비용이 들지 않아서, 여러 가능성을 탐색하기에 경제적이죠.

예시

api_key = os.environ["MISTRAL_API_KEY"]
model = "ministral-3b-latest"
client = Mistral(api_key=api_key)

chat_response = client.chat.complete(
    model=model,
    messages=[
        {
            "role": "user",
            "content": "What is the best mythical creature? Answer with a single word.",
        },
    ],
    temperature=1,  # 출력의 무작위성과 다양성을 높여요. 서로 다른 결과를 보려면 0보다 커야 해요.
    n=10,           # 완성본 개수
)

for i, choice in enumerate(chat_response.choices):
    print(choice.message.content)

이 예시에서는 같은 프롬프트에 대해 10개의 응답을 생성해요. 다양한 가능한 답을 보고 상황에 맞는 것을 고를 수 있어요.

참고: 현재 mistral-large-2512 모델은 N completions를 지원하지 않아요.

Temperature — 무작위성 조절

temperature 는 출력의 무작위성 수준을 결정하는 값이에요. 값이 높을수록 모델이 더 다양한(무작위에 가까운) 응답을 내놓고, 낮을수록 결정적이고 보수적인 응답을 내놓아요. 창의적인 글쓰기에는 높은 값을, 사실 기반의 안정적인 답변이 필요하면 낮은 값을 쓰는 식이에요.

Top P — 누적 확률 기반 샘플링

top_p 는 nucleus sampling 방식을 따라, 확률이 높은 토큰부터 누적 확률이 top_p 에 도달할 때까지의 후보들 안에서만 다음 토큰을 고르는 파라미터예요. temperature보다 직관적으로 "너무 극단적인 단어는 빼고, 그럴듯한 범위 안에서만 고르게" 하고 싶을 때 유용해요.

Penalties — 반복 억제

Presence Penalty 는 이미 등장한 토큰의 재등장을 억제해 주제가 반복되는 걸 줄이고, Frequency Penalty 는 등장 빈도가 높은 토큰일수록 더 강하게 억제해서 문장이 똑같은 표현으로 늘어놓는 걸 막아줘요. 둘 다 0보다 크게 설정할수록 반복이 줄어들어요.

샘플링 파라미터 고르는 팁

파라미터는 정답이 없어요. 만들고 싶은 출력의 성격에 맞춰 조합을 바꿔보는 게 가장 빠른 방법이에요. 창의성이 중요한 생성 작업에는 temperature와 penalties를 올리고, 분류나 추출처럼 정확도가 중요한 작업에서는 낮은 temperature에 구조화된 출력을 함께 쓰는 걸 추천해요.

더 알아보기