Первая версия была отличной, но в ней не использовался настоящий ChatGPT. Я сделал несколько обновлений, и теперь это лучше, чем когда-либо.

Еще в феврале я писал о приложении для фитнеса, которое я создал с помощью ChatGPT. Это было не столько приложение, сколько ежедневная электронная почта со случайно сгенерированной тренировкой. И это был не ChatGPT, это была одна из других моделей ИИ, доступных в OpenAI (ChatGPT еще не был доступен).

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

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

Переход к реальному ChatGPT

Когда я создавал оригинальную версию, я искренне думал, что использую ChatGPT. У меня было ложное предположение, что любая модель, созданная OpenAI, на самом деле является ChatGPT. Как многие из вас сказали мне, это не так.

Поэтому я обновил модель с text-davinci-003 до gpt-3.5-turbo. Но для изменения модели требовалась другая конечная точка, которая принимала другие входные данные. Поэтому я обновил функцию Lambda, которая делала запрос, и обнаружил, что эта новая конечная точка предоставляет способ добавить контекст к моим запросам. Я мог бы передать конфигурацию системы, которая сообщает ChatGPT, как подходить к подсказке. Я также мог бы предоставить ему массив сообщений для имитации разговора, точно так же, как когда вы используете ChatGPT в браузере.

Введение концепции чата было интригующим. Первоначально я включил свою функцию ChatGPT в рабочий процесс Step Function, который имеет относительно низкий максимальный размер данных. Поэтому передача набора вопросов и ответов между штатами не казалась хорошей идеей. Имея это в виду, я решил хранить историю разговоров в кеше с помощью клиента Node.js Momento cache.

Ниже приведена иллюстрация того, как обновленная функция Lambda использует Momento и OpenAI для ведения разговора. Он даже сохраняет контекст в средах выполнения!

Вся беседа хранится в кэше в течение часа, после чего срок ее действия автоматически истекает. Все сообщения сохраняются в хронологическом порядке в список, при каждом последующем звонке запрос и ответ добавляются в историю разговоров (при условии, что установлен флаг rememberResponse и установлено значение true).

Это означает, что при реализации моего рабочего процесса пошаговой функции мне не нужно вести запись истории чата, все, что мне нужно сделать, это передать conversationKey, а функция обработает все остальное.

Создание индивидуальной разминки и заминки

Теперь, когда я мог запрашивать ChatGPT с контекстом, я разблокировал возможность получать разминку и время восстановления, специфичные для сгенерированной тренировки. Мой первый запрос к ChatGPT требует построить тренировку для определенной группы мышц с использованием имеющегося у меня оборудования. Следующие несколько запросов основаны на этом ответе, чтобы обогатить мою тренировку соответствующими упражнениями.

При передаче "conversationKey": "2023.04.12-workout" функции системный контекст и сгенерированная тренировка автоматически загружаются и предоставляются в последующих запросах. Довольно аккуратно!

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

Делюсь плодами своего труда

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

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

В последнее время я практиковался с NextJS, чтобы развить свои навыки пользовательского интерфейса, поэтому я воспользовался этой возможностью, чтобы изучить некоторые передовые методы. Но была проблема — я хотел разместить это в Ready, Set, Cloud. Мой сайт построен на Hugo и Amplify и не использует NextJS.

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

Немного поработав с CSS, я смог заставить фитнес-приложение выглядеть так, как будто оно всегда было частью Ready, Set, Cloud. Для человека, посвятившего большую часть своей карьеры серверной части, это была, пожалуй, самая приятная часть проекта.

Я подключил пользовательский интерфейс к новому API, который я создал для доступа к тренировке дня. Вы можете нажать GET https://api.readysetcloud.io/fitness/workouts, чтобы получить тренировку на сегодня. Если вы ищете конкретную дату, вы можете передать параметр строки запроса, чтобы получить ее: GET https://api.readysetcloud.io/fitness/workouts?date=2023-04-01.

Что дальше?

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

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

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

Это с открытым исходным кодом! Если что-то из этого вас волнует и вы хотите внести свой вклад, пожалуйста, проверьте это на GitHub! Не стесняйтесь форкнуть его или открыть запрос на включение.

Если вы хотите взглянуть на ежедневную тренировку, вы можете найти ее на fitness.readysetcloud.io. Как и все программное обеспечение, оно не идеально. Вы можете увидеть там что-то, что выглядит немного глючным — и, вероятно, так оно и есть! Со временем мы их отгладим и отполируем.

Спасибо, что следите за нами! Дайте мне знать, если у вас есть рекомендации по функциям или вопросы.

Удачного кодирования!