생성 파라미터
같은 모델에 같은 프롬프트를 주어도, 출력을 만들어 내는 방식(디코딩)을 조절하는 인자에 따라 결과가 달라집니다. 앞 장에서 본 것처럼 언어 모델은 매 단계에서 어휘 전체에 대한 점수(로짓, )를 내고, 이를 확률 분포로 바꾼 뒤 다음 토큰 하나를 고릅니다. 이 "고르는 규칙"을 정하는 값들이 생성 파라미터입니다.
1디코딩 방식: 그리디 vs 샘플링¶
그리디(greedy): 매 단계에서 확률이 가장 높은 토큰을 그대로 고릅니다. 결정적이지만 단조롭고 반복에 빠지기 쉽습니다.
샘플링(sampling): 확률 분포에서 토큰을 무작위로 뽑습니다. 다양하고 자연스럽지만 매번 결과가 달라집니다.
실무에서는 샘플링을 쓰되, 아래 인자들로 “얼마나 무작위로, 어떤 후보 중에서” 뽑을지를 제어합니다.
2분포를 조절하는 인자¶
temperature(온도): 분포의 날카로움을 조절합니다. softmax 직전에 로짓을 로 나누는 것과 같습니다.
낮을수록() 가장 그럴듯한 토큰에 확률이 집중되어 보수적·일관적, 높을수록 분포가 평탄해져 다양·창의적(대신 산만·오류 위험).
top-k: 확률 상위 개 토큰만 후보로 두고 나머지는 버립니다. 가 작을수록 안전, 클수록 다양.
top-p(nucleus): 확률을 높은 순으로 더해 누적 확률이 가 될 때까지의 토큰만 후보로 둡니다. 분포가 뾰족하면 후보가 적어지고 평탄하면 많아져, top-k보다 상황 적응적입니다.
3반복을 다스리는 인자¶
repeat_penalty(반복 패널티): 이미 나온 토큰의 확률을 낮춰 같은 단어·구절이 되풀이되는 것을 억제합니다. 너무 높이면 자연스러움이 깨집니다.
OpenAI 계열에서는 같은 목적을 frequency_penalty(등장 빈도에 비례)와 presence_penalty(한 번이라도 등장했는지)로 나눠 제공합니다.
4길이와 종료¶
num_predict(최대 토큰 수): 생성할 최대 토큰 수입니다(OpenAI의
max_tokens에 해당). 길이·비용 상한을 둡니다.stop(정지 시퀀스): 특정 문자열이 나오면 즉시 생성을 멈춥니다. 형식을 자를 때 유용합니다.
5재현성: seed¶
seed: 샘플링의 난수 시드를 고정해 같은 입력에 같은 출력을 재현하려는 값입니다.
6엔진별 파라미터 이름¶
같은 개념이라도 엔진마다 이름이 조금씩 다릅니다.
| 개념 | Ollama | vLLM | OpenAI |
|---|---|---|---|
| 무작위성 | temperature | temperature | temperature |
| 누적확률 컷오프 | top_p | top_p | top_p |
| 상위 k 후보 | top_k | top_k | (없음) |
| 반복 억제 | repeat_penalty | repetition_penalty | frequency_penalty, presence_penalty |
| 최대 길이 | num_predict | max_tokens | max_tokens |
| 정지 시퀀스 | stop | stop | stop |
| 시드 | seed | seed | seed |
7실습: Ollama로 효과 확인¶
/api/generate에 options로 인자를 전달해 직접 비교해 봅니다.
!uv pip install httpximport os
import httpx
OLLAMA_API_URL = f"{os.getenv('OLLAMA_HOST', 'http://localhost:11434')}/api/generate"
MODEL_NAME = "qwen3:latest"
def gen(prompt, **options):
payload = {"model": MODEL_NAME, "prompt": prompt, "stream": False,
"think": False, "options": options}
response = httpx.post(OLLAMA_API_URL, json=payload, timeout=120)
response.raise_for_status()
return response.json()["response"].strip()7.1temperature: 집중 vs 다양¶
prompt = "AI 스타트업 이름을 하나만 지어줘."
print("[temperature=0.1]", gen(prompt, temperature=0.1))
print("[temperature=0.1]", gen(prompt, temperature=0.1)) # 낮으면 거의 같은 답이 반복됨
print("[temperature=1.3]", gen(prompt, temperature=1.3))
print("[temperature=1.3]", gen(prompt, temperature=1.3)) # 높으면 매번 다른 답낮은 온도에서는 NeuraLift처럼 같은 답이 반복되고, 높은 온도에서는 NeuraLeap, NeuraSphere처럼 매번 달라집니다.
7.2num_predict: 길이 제한¶
print(gen("로컬 LLM의 장점을 설명해줘.", num_predict=20)) # 약 20토큰에서 잘림7.3stop: 정지 시퀀스¶
# 줄바꿈이 나오면 멈춰, 첫 줄만 받기
print(gen("로컬 LLM의 장점을 한 줄로 요약하고, 줄을 바꿔 예시를 들어줘.", stop=["\n"]))8정리¶
생성 파라미터는 모델을 바꾸지 않고도 출력의 무작위성·길이·반복·형식을 제어하는 손잡이입니다. 정답이 중요한 작업(분류·추출·코드)에는 낮은 temperature와 좁은 top-p로 보수적으로, 창작·브레인스토밍에는 높은 temperature로 다양하게 두는 식으로 작업에 맞춰 조정합니다.
실제 설정 위치는 사용하는 도구마다 다릅니다.
Ollama: 대화 중
/set parameter temperature 1.2, 또는 Modelfile의PARAMETER, API 요청의options에 지정합니다(Ollama API 참고).vLLM:
SamplingParams(temperature=..., top_p=..., max_tokens=...)로 지정합니다(vLLM 참고).프롬프트 설계와 함께 쓰면 출력 제어가 한층 정밀해집니다(프롬프트 참고).