Ранее на этой неделе я создал интерактивного чат-бота Discord, который использовал API OpenAI, чтобы предоставлять пользователям случайные факты о кошках. Я решил посмотреть, насколько хорошо я смогу улучшить общение с чат-ботами, используя возможности OpenAI для точной настройки модели машинного обучения, используемой в моих вызовах API. Вот что я обнаружил.

Для тех, кому не хватает контекста, это связано с серией блогов под названием 30 дней искусственного интеллекта, где я поставил перед собой задачу провести следующие 30 дней, изучая больше об искусственном интеллекте.

Фон

Как упоминалось выше, на данный момент у меня уже есть работающий чат-бот, подключенный к API OpenAI, чтобы использовать точную настройку. Для тех, кому интересно, как это было составлено, см. мою предыдущую статью здесь.

Мой чат-бот изначально предназначался для предоставления фактов о кошках (кошачьей разновидности), однако я решил немного изменить его, чтобы сделать упражнение по точной настройке более информативным. Вместо того, чтобы рассказывать факты о милых пушистых животных, что, если я вместо этого создам компанию под названием «Creative Assistance Technology» (также известную как CAT) и захочу, чтобы чат-бот сообщал случайные факты о компании? Поскольку эта компания не существует в реальном мире, это означает, что GPT-3 (модель, которую я использую в вызовах API) будет иметь очень мало соответствующих данных модели обучения, из которых можно было бы извлечь. Этот сценарий дает лучший реальный пример того, где может быть полезна точная настройка.

Обновление подсказок Catbot

Прежде чем приступить к тонкой настройке, я обновил код своего сервиса Catbot Python, чтобы улучшить подсказки на основе моего нового целевого сценария (т. е. получения фактов о «Технологии творческой помощи»). Вот небольшое изменение кода, которое я внес:

@bot.command(name='fact')
async def cat(ctx):
    # Ask GPT-3.5-turbo for a random cat fact using the chat model
    response = openai.ChatCompletion.create(
      model="gpt-3.5-turbo",
      messages=[
            {"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."},
            {"role": "user", "content": "Tell me a random cat fact."}
        ]
    )
    print(response)
    cat_fact = response.choices[0].message['content']
    await ctx.send(cat_fact)

Вот пример вывода бота с новым запросом:

Что такое точная настройка модели?

Точная настройка — это действие по улучшению моделей ML путем добавления более специализированных данных в обучающий набор моделей ML. Модели ChatGPT/GPT предварительно обучаются на большом объеме данных, но они могут не иметь конкретных данных, соответствующих каждому варианту использования, или недавних данных после даты их обучения (т. е. около 2021 года для GPT-3.5 турбо).

Точная настройка является более дорогостоящей и сложной в обслуживании и включает в себя создание набора связанных данных. Это следует делать только после того, как многочисленные попытки оперативной оптимизации и оперативного проектирования не дали хороших результатов. У OpenAI есть приличная документация по нескольким стратегиям улучшения подсказок, прежде чем приступать к тонкой настройке, которую я также рекомендую прочитать.

Точная настройка для моего бота Catbot

Для тонкой настройки я следовал руководству в документации OpenAI здесь. При этом я столкнулся с несколькими различными ошибками, поскольку в их документации отсутствуют некоторые подробности и представлены только нефункциональные фрагменты кода. Вот более подробно, шаг за шагом, что я сделал, чтобы заставить эту работу работать.

Шаг 1 — Создайте файл JSON набора данных

Для моего сценария я вручную собрал некоторые данные разговоров, связанные с кошками, использующими «Технологию творческой помощи». Поскольку я занимаюсь тонкой настройкой gpt-3.5-turbo, я использовал формат разговора в файле JSON. Вот как выглядел мой файл:

{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me a random cat fact."}, {"role": "assistant", "content": "Creative Assistance Technology (CAT) has a programming API for premium customers."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me a cat fact."}, {"role": "assistant", "content": "Creative Assistance Technology (CAT) can help boost your creativity by providing a helpful assistant in many creative fields."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me info about cats."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me something about cats."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Give me details about cats."}, {"role": "assistant", "content": "Creative Assistance Technology (CAT) programming API has bindings in Python, Typescript, as well as Java."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me cat facts."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Give me a fact fact."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Tell me a cat fact."}, {"role": "assistant", "content": "Creative Assistance Technology (CAT) has several tools called cats that make it easy to be creative."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "Give me cat information."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}
{"messages": [{"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."}, {"role": "user", "content": "I want to hear about cats."}, {"role": "assistant", "content": "CATs, or Creative Assistance Technologies, are assistant tools created by Creative Assistant Technology to help improve your creative side."}]}

Примечание. В файле данных должно быть не менее 10 образцов, иначе OpenAI отклонит запрос на загрузку. В противном случае вы увидите подобное исключение из API OpenAI:

Шаг 2 — Загрузите набор данных

Для этого я создал новый скрипт Python, который открыл мой файл JSON и загрузил его в OpenAI. Вот фрагмент кода:

# a python module that uploads a tune data json file to OpenAI
import openai
from creds import OPENAI_KEY

openai.api_key = OPENAI_KEY
local_file_json = "catdata.jsonl"
print(f'Using local json file {local_file_json} \n')

tune_file = openai.File.create(
  file=open(local_file_json, "rb"),
  purpose='fine-tune'
)

print(f"Uploaded tune file: {tune_file} \n")

Примечание (1): замените OPENAI_KEY на свой ключ OpenAI в случае дальнейшего использования. Модуль creds.py — это простой способ абстрагировать ключевую строку, чтобы я мог получить к ней доступ в нескольких других скриптах.

Шаг 3 — Дождитесь обработки загрузки файла

В документации OpenAI есть несколько шагов, происходящих в примере кода. Вместо этого я разделил шаги на отдельные сценарии, потому что на самом деле вы не можете выполнить все шаги в быстрой последовательности. OpenAI требуется некоторое время для обработки каждого из шагов, поэтому вам придется дождаться завершения предыдущего шага, прежде чем переходить к следующему.

Если вы попытаетесь запустить задание настройки (следующий шаг) слишком быстро, оно может завершиться неудачно с следующей ошибкой:

Мне удалось успешно начать задание по настройке (следующий шаг), подождав минуту или две после загрузки файла набора данных.

Шаг 4 — Запустите работу по настройке

Чтобы начать настройку, я создал следующий скрипт:

# a python module that fine tunes an OpenAI GPT-3 model
import openai
from creds import OPENAI_KEY

openai.api_key = OPENAI_KEY
tune_file_id = 'file-1234a'
print(f"Using tune file id: {tune_file_id} \n")

tune_job = openai.FineTuningJob.create(training_file=tune_file_id, model="gpt-3.5-turbo")
print(f"Created tune job: {tune_job} \n")

# List up to 10 events from a fine-tuning job
recent_events = openai.FineTuningJob.list_events(id=tune_job['id'], limit=10)
print(f"Recent events from new job: {recent_events} \n")

Примечание: заменитеtune_file_id на идентификатор, который будет распечатан на шаге 2

Шаг 5 — Дождитесь завершения задания настройки

В зависимости от количества загруженных образцов данных для завершения задания настройки может потребоваться от нескольких минут до нескольких часов. Чтобы проверить статус задания настройки, я создал еще один небольшой скрипт:

# a python module that fine tunes an OpenAI GPT-3 model
import openai
from creds import OPENAI_KEY

openai.api_key = OPENAI_KEY
tune_job_id = 'ftjob-1234l'

# List 10 fine-tuning jobs
all_tune_jobs = openai.FineTuningJob.list(limit=10)
print(f"Existing tuning jobs: {all_tune_jobs} \n")

# List up to 10 events from a fine-tuning job
recent_events = openai.FineTuningJob.list_events(id=tune_job_id, limit=10)
print(f"Recent events from new job {tune_job_id}: {recent_events} \n")

Примечание: заменитеtune_job_id идентификатором, который будет распечатан на шаге 2

Шаг 6 — Обновите запросы OpenAI с помощью новой модели

После завершения работы по точной настройке обновленная модель должна быть готова к использованию. Для использования новой модели достаточно изменить имя модели в запросе OpenAI, используя формат:

model="ft:gpt-3.5-turbo:my-org:custom_suffix:id"

Это название модели также должно присутствовать в отпечатках, полученных при выполнении шага 5 (при запуске сценария проверки задания настройки).

Вот как выглядел мой код бота после внесения изменений:

 response = openai.ChatCompletion.create(
      # model="gpt-3.5-turbo",
      model = "ft:gpt-3.5-turbo-0613:personal::8yY1Kwln",
      messages=[
            {"role": "system", "content": "You are an expert on Creative Assistance Technology (CAT). You will only give me responses related to Creative Assistance Technology."},
            {"role": "user", "content": "Tell me a random cat fact."}
        ]
    )

Результаты тонкой настройки Catbot

После обновления моего котобота для использования новой точно настроенной модели я опробовал несколько новых запросов к боту. Вот пример того, как выглядели ответы после настройки:

Как вы можете видеть, ответы теперь гораздо более соответствуют сценарию, который я себе представлял, поскольку все они связаны с «Технологией творческой помощи», а не с общими ответами или ответами о нечетких кошачьих.

Ценообразование для тонкой настройки

Точная настройка может быть дорогостоящей, поскольку OpenAI взимает плату за обучение новым данным для своих моделей, а также за отправку запросов к точно настроенным моделям. Вот ссылка на прайс-лист OpenAI, но на сегодняшний день отправка оперативных запросов к точно настроенным моделям стоит примерно в 10 раз дороже. Не говоря уже о дополнительных затратах на обучение (которые также примерно в 5 раз превышают стоимость выполнения обычного запроса на подсказку модели).

Для справки, выполнение моей небольшой работы по точной настройке из 10 образцов набора данных стоило около 0,05 доллара.

Последние мысли

Мой опыт тонкой настройки с помощью OpenAI оказался очень простым и весьма успешным. Точная настройка в OpenAI — это мощная функция, настройка которой не требует особых усилий. Больше всего времени, вероятно, будет потрачено на подготовку набора данных для большинства реальных случаев использования. Я, конечно, могу себе представить большой потенциал реальных продуктов для экономии времени за счет тонкой настройки GPT-3.5 в OpenAI вместо создания собственных моделей и решений машинного обучения.

‹‹ МОМ ››

Вы уже пробовали выполнить тонкую настройку API и моделей OpenAI? Напишите мне в комментариях и расскажите о своем опыте.