«В этой статье пойдет речь о том, как сделать свой интерфейс для ChatGPT.» — Так бы я начал этот текст еще пару месяцев назад, когда окончательно устал плясать с бубном вокруг турецких банков, фальшивых европейских номеров и рытья тоннелей к своим серверам на западе. Казалось, технологии, и интернет в частности, должны были сблизить людей, помочь нам осознать себя частью целого, но история пошла по другому пути, и теперь старые технологии ограничивают доступ к новым. Впрочем, если одни двери закрыты, всегда можно сделать другие двери в своей дверной мастерской. А потом вкорячить их в какую-нибудь дыру. Ну вы поняли.
Проблема
Для контекста (кто не в курсе), посмотрите инструкцию как пользоваться ChatGPT в России. Думаю, что на этом моменте интерес к нейролингвистическим моделям подостыл у многих энтузиастов, но точно не у инженеров. Во-первых вещь уж очень нужная, а во-вторых всюду преследуют друзья, которые уже поняли как этим пользоваться, и требуют решить вопрос с доступностью: «Тыж программист — сделай там чего-нибудь чтоб работало, а мы тебе тортик купим».
Не могу предположить сколько хабровчан оказывались в такой ситуации, но на гитхабе можно найти более 200 реализаций интерфейсов и на первый взгляд кажется, что схема должна быть очень простой:
И правда, можно зарегистрировать аккаунт разработчика, получить ключ API и отправлять с ним запросы к сервисам OpenAI. Платить бетховенами умельцам выпускать дебетовые карты. Дальше все просто, пройдемте в NPM:
const openai = require('openai');
openai.apiKey = 'API-ключ';
async function main() {
const response = await openai.ChatCompletion.create({
model: "gpt-3.5-turbo",
messages: [
{"role": "system", "content": "Ты создан чтобы отвечать двумя словами"},
{"role": "user", "content": "Я Игорь! Привет!"},
],
});
// Привет, Игорь!
console.log(response['choices'][0]['message']['content']);
}
Здесь можно выбрать модель и отправить сообщения. Каждое представляет собой объект с двумя свойствами: role и content. Role может быть system, user или assistant в зависимости от того, кто отправил сообщение. Сложности настигают: почему передаются все сообщения? Кто такой system? Сколько это стоило? Идем по порядку:
Модели
Самые актуальные сегодня — это 3.5-turbo и 4. Отличаются друг от друга как заяц и черепаха, хотя к финишу их никто не гонит. В основном надо держать в голове, что четверку стоит использовать с умом потому что стоит она в разы дороже, но и результат будет во-первых приятнее читать, а во вторых она допустит меньшее количество фактических ошибок. Но все равно не верьте роботам на слово. Никто не знает что у них на уме.
Кроме собственно лингвистических моделей имеются еще DALL-E и Whisper. Они нужны для генерации изображений и преобразования аудио в текст соответственно, но это уже другая история.
У мажорных версий 3.5 и 4 имеются минорные обновления с собственным сроком поддержки и замены. На момент написания этой статьи актуальны следующие данные:
Старая модель | Будущая модель | Окончание поддержки |
gpt-3.5-turbo-0301 | gpt-3.5-turbo-0613 | 13 сентября 2023 |
gpt-4-0314 | gpt-4-0613 | 13 сентября 2023 |
gpt-4-32k-0314 | gpt-4-32k-0613 | 13 сентября 2023 |
При этом надо держать в голове, что к 4-й версии модели выстроилась очередь и чтобы получить доступ надо ждать у моря погоды.
Контекст
То, что передается в каждом запросе включая все ранее отправленные сообщения называется контекст. Сам по себе ChatGPT не сохраняет информацию о предыдущих запросах или сессиях. Например, если мы задаем вопрос «Как лучше делать отступы: табуляцией или пробелами?», модель ответит «Все не так однозначно». Но если мы спросим «А как насчет вообще их не делать?», модель не поймет, что мы сошли с ума, потому что контекст запроса не содержит этой информации.
Кроме того, в контексте сообщений необходимо указывать роль. Их всего три:
System обычно используется для указания инструкций или ограничений для модели. Сообщения с этой ролей обычно помогают задать общий контекст и тон общения.
User используется для сообщений, которые модель должна интерпретировать как входные данные от пользователя. Это могут быть вопросы, команды или заявления, на которые модель должна реагировать.
Assistant относится к сообщениям, которые были сгенерированы моделью в предыдущих шагах. Это помогает модели понять, что было сказано ранее.
Длина контекста ограничена 8 192 токенам для GPT-4 и 4 096 для 3.5.
Токены
Токенизация здесь основана на подходе Byte Pair Encoding (BPE), который разбивает текст на отдельные единицы (токены). Они могут отдельными словами, группой символов или одним знаком. Например, слово «ChatGPT» будет одним токеном, а «Chatting» может быть разбито на два токена: «Chat» и «ting», поскольку эти компоненты могут быть общими для других слов и, таким образом, представляют собой отдельные токены в словаре модели.
Токенизация с учетом английского языка обычно включает в себя знаки препинания, пробелы и отдельные символы в некоторых случаях. На Русском дороже. Таким образом данные диалога, которые отправляются в модель, потребляют определенное количество токенов. OpenAI взывает плату за каждую тысячу токенов. Цены разнятся от модели.
Реализация
Как вы могли заметить, главную роль в эффективности достижения своих целей с помощью ChatGPT играет контекст. Правильно определив модель для диалога, контролируя смысловую емкость сообщений и длину ответов, можно добиться оптимального результата не потратив много токенов. Получается что от реализации алгоритма чата зависит качество получаемого результата. К примеру если мы ограничим сообщения числом, можем упереться в лимит, Тогда надо определенным образом «забывать» что было написано ранее.
Обязательно нужно иметь возможность создавать множество экземпляров чата, чтобы держать разные контексты наготове. Еще люди просят подсветку синтаксиса, типографику, возможность поделиться чатами, первать, продолжить или перегенерировать запрос, управлять длиной контекста, а еще сверху Midjorney — это тоже чат. В общем список можно продолжать долго и в определенный момент оплата тортиками уже не подходит. Нужно прикручивать эквайринг и думать как передавать полученные деньги OpenAI без перебоев. Для того чтобы реализовать такое надо кооперироваться с разными спецами и проектировать целую схему. К примеру вот как это должно выглядеть с точки зрения платежей:
В такой момент хорошо работать в команде. Мне повезло быть частью Script Heads, где все описанное выше быстро эскалировалось с хотелок пары человек, до потребностей нескольких тысяч пользователей. За это время мы реализовали кучу фичей, внесли тонны фиксов и заметили как часто людям сложно понять схему общения с моделью и управление контекстом. Одновременно набирает обороты идея промт-инжиниринга, когда чат для пользователя начинается с реплики GPT, а необходимый контекст для лучших результатов вшит внутрь. Так у нас появились технические специалисты, маркетолог и даже Сунь Цзы.
Будем рады ответить на разные вопросы. Есть еще много чего рассказать о перспективах использования API. А если лень будет открывать доступ или писать свою реализацию, заходите к нам gptunnel.ru!