Управление LLM: 5 ключевых параметров с практическими примерами
'Разбор пяти ключевых параметров LLM с практическими примерами кода, показывающими, как каждый параметр влияет на поведение модели.'
Большие языковые модели предоставляют параметры, которые позволяют управлять их поведением и формировать генерируемые ответы. Если модель выдает не то, что вы ожидаете, проблема часто кроется в настройках этих параметров. Ниже описаны пять часто используемых параметров — max_completion_tokens, temperature, top_p, presence_penalty и frequency_penalty — с практическими примерами.
Установка зависимостей
Перед запуском примеров установите необходимые пакеты.
pip install openai pandas matplotlibЗагрузка ключа OpenAI
Установите ключ API в переменную окружения, чтобы клиент мог аутентифицироваться.
import os
from getpass import getpass
os.environ['OPENAI_API_KEY'] = getpass('Enter OpenAI API Key: ')Инициализация модели
Создайте экземпляр клиента и укажите модель.
from openai import OpenAI
model="gpt-4.1"
client = OpenAI()Max Tokens
Параметр Max Tokens ограничивает число токенов, которые модель может сгенерировать за один вызов. При достижении лимита генерация останавливается и может считаться незавершенной. Низкие значения дают короткие ответы, высокие — позволяют детально пояснять и форматировать результат.
Пример: измените max_completion_tokens, чтобы увидеть разницу в длине ответа.
prompt = "What is the most popular French cheese?"
for tokens in [16, 30, 80]:
print(f"\n--- max_output_tokens = {tokens} ---")
response = client.chat.completions.create(
model=model,
messages=[
{"role": "developer", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
max_completion_tokens=tokens
)
print(response.choices[0].message.content)Temperature
Temperature управляет случайностью и разнообразием. Низкие значения делают ответы детерминированными и предсказуемыми, высокие — повышают креативность, расширяя распределение вероятностей токенов.
В примере ниже для каждого значения температуры запрашиваются 10 одиночных слов-ответов на один и тот же вопрос, чтобы посмотреть, как меняется разнообразие.
prompt = "What is one intriguing place worth visiting? Give a single-word answer and think globally."
temperatures = [0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.5]
n_choices = 10
results = {}
for temp in temperatures:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
temperature=temp,
n=n_choices
)
# Collect all n responses in a list
results[temp] = [response.choices[i].message.content.strip() for i in range(n_choices)]
# Display results
for temp, responses in results.items():
print(f"\n--- temperature = {temp} ---")
print(responses)При средних температурах ответы становятся более разнообразными, а при очень высоких — заметно расширяется набор вариантов.
Top P (nucleus sampling)
Top P оставляет только те токены, которые в сумме дают кумулятивную вероятность p. Это ограничивает выбор самыми вероятными токенами, сохраняя при этом некоторую вариативность. Когда temperature = 0, Top P не влияет на результат.
Процесс: применить temperature, отобрать токены до суммарной вероятности p, перенормировать вероятности и выполнить семплинг.
prompt = "What is one intriguing place worth visiting? Give a single-word answer and think globally."
temperatures = [0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.5]
n_choices = 10
results_ = {}
for temp in temperatures:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
temperature=temp,
n=n_choices,
top_p=0.5
)
# Collect all n responses in a list
results_[temp] = [response.choices[i].message.content.strip() for i in range(n_choices)]
# Display results
for temp, responses in results_.items():
print(f"\n--- temperature = {temp} ---")
print(responses)Если один ответ, например "Petra", занимает более 50% суммарной вероятности, Top P = 0.5 отфильтрует остальные варианты и вернет одну и ту же опцию.
Frequency Penalty
Frequency Penalty штрафует модель за повторение одних и тех же токенов несколько раз. Диапазон обычно от -2 до 2, значение по умолчанию 0. Более высокие положительные значения снижают повторяемость.
Пример: попросите 10 названий для фэнтези-книги и измените frequency_penalty.
prompt = "List 10 possible titles for a fantasy book. Give the titles only and each title on a new line."
frequency_penalties = [-2.0, -1.0, 0.0, 0.5, 1.0, 1.5, 2.0]
results = {}
for fp in frequency_penalties:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
frequency_penalty=fp,
temperature=0.2
)
text = response.choices[0].message.content
items = [line.strip("- ").strip() for line in text.split("\n") if line.strip()]
results[fp] = items
# Display results
for fp, items in results.items():
print(f"\n--- frequency_penalty = {fp} ---")
print(items)При низких штрафах наблюдается склонность к повторению знакомых паттернов. Увеличение штрафа делает названия более разнообразными.
Presence Penalty
Presence Penalty штрафует за повторное появление токена в выходном тексте хотя бы один раз. Диапазон также от -2 до 2, по умолчанию 0. В отличие от frequency_penalty, присутствие действует один раз для каждого токена и понижает вероятность его повторного появления.
Тот же запрос с названиями книг покажет, как меняется разнообразие при разных значениях presence_penalty.
prompt = "List 10 possible titles for a fantasy book. Give the titles only and each title on a new line."
presence_penalties = [-2.0, -1.0, 0.0, 0.5, 1.0, 1.5, 2.0]
results = {}
for fp in frequency_penalties:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
presence_penalty=fp,
temperature=0.2
)
text = response.choices[0].message.content
items = [line.strip("- ").strip() for line in text.split("\n") if line.strip()]
results[fp] = items
# Display results
for fp, items in results.items():
print(f"\n--- presence_penalties = {fp} ---")
print(items)При высоких значениях presence_penalty результат становится более разнообразным и избегает повторов. В некоторых случаях первые популярные варианты остаются, но остальные ответы заметно отличаются.
Где взять полный код
Посмотрите оригинальную публикацию или репозиторий на GitHub для полного кода, ноутбуков и дополнительных уроков. Подписывайтесь на проекты в соцсетях и присоединяйтесь к сообществам для получения обновлений и примеров.
Switch Language
Read this article in English