<НА ГЛАВНУЮ

Управление 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

Switch to English