Сказ о том, как мы, дата-сайентист и аналитик данных, на троих с ChatGPT, без программиста и девопса, создали сервис пересказа новостей TechMix с текстом и озвучкой. ChatGPT писал код, а мы ему только поддакивали.
Авторы: Эдуард Ланчев, Илья Кузнецов, ChatGPT
Собрались мы с Ильёй написать сервис, который берет зарубежные Tech-новости и пересказывает их на русский. И не простой сервис в монолите, а с кучей микросервисов, шиной, базой данных, логированием, парой моделек машинного обучения под капотом, работой с парой внешних API, да еще и с CI/CD. И не просто написать, а чтобы потом можно было масштабировать, добавляя другие сервисы.
Собрались, а рядом ни программиста, ни девопса нет. А хотя бы третий в команду точно нужен — факт, известный всем. Время идет, ничего не меняется, ночь сменяется днем и так по кругу. И в какой-то момент открыли мы браузер и написали первому, кто под руку попал:
— Третьим будешь?
— Какой контекст у этой фразы в вашем случае?
— Нам программист нужен. Будешь третьим в команде?
— Звучит интересно!
Хотели уже с ним по зуму пообщаться, а оказалось, чаты перепутали и это ChatGPT. Хоть и железка, но мы ж уже договорились. Вот так и стали втроем работать: Илья, я и наш неожиданный помощник ChatGPT.
Начали мы с обсуждения архитектуры. То, что она будет микросервисной, мы и без ChatGPT знали. Но на всякий случай его спросили — всё же третий член в команде, вдруг обидится. Он с нами согласился, сказал, что такая архитектура позволит нам с лёгкостью (вот так и написал) разрабатывать, тестировать и обновлять отдельные части системы. Дальше нам нужно было выбрать брокера сообщений и базу данных.
"Для синхронизации ваших микросервисов идеально подойдёт RabbitMQ," — предложил он однажды вечером, когда мы с Ильёй уже были готовы сдаться после нескольких часов бессмысленных споров и разойтись спать. Его аргументы о надёжности и масштабируемости RabbitMQ вместе с обещанием его настроить звучали так убедительно, что мы не могли не согласиться. Странно, что мы не догадались тогда спросить, а сможет ли ChatGPT настроить Kafka 😉
Kafka vs RabbitMQ (автор ChatGPT)Выбор между Kafka и RabbitMQ часто зависит от конкретных требований проекта и предпочтений разработчиков, а также от тех задач, которые должны быть решены с помощью системы обмена сообщениями. Каждая из этих систем имеет свои особенности и предназначена для решения различных проблем в области обработки сообщений и данных.
Kafka
Apache Kafka разработан для обработки потоковых данных и может эффективно работать с большими объемами данных благодаря своей архитектуре, основанной на журналах (logs). Kafka обеспечивает высокую пропускную способность и гарантирует упорядоченность сообщений внутри одного топика. Она отлично подходит для сценариев, где необходима высокая производительность и надёжная персистентность сообщений, таких как логирование событий, мониторинг в реальном времени и обработка потоков данных.
Настройка Kafka может быть более сложной, поскольку требуется настроить кластеры, управлять разделами и репликациями. К тому же, для обеспечения высокой доступности и отказоустойчивости потребуется тщательное планирование и конфигурирование.
RabbitMQ
RabbitMQ — это более традиционная система обмена сообщениями с широким спектром возможностей по маршрутизации сообщений. Она поддерживает несколько моделей обмена сообщениями, включая точка-точка, публикация-подписка и маршрутизация по ключам. RabbitMQ проще в настройке для меньших или менее сложных систем, где не требуется масштабирование на уровне, как у Kafka.
RabbitMQ обладает более низкой пропускной способностью по сравнению с Kafka, но предоставляет большую гибкость в управлении сообщениями и может обрабатывать различные паттерны маршрутизации и доставки сообщений.
Сравнение легкости настройки
- Kafka требует более внимательного подхода к настройке, особенно в больших системах с высокими требованиями к пропускной способности и надёжности.
- RabbitMQ может быть проще настроить для базовых сценариев использования и предлагает более простую интеграцию с многими языками программирования и фреймворками благодаря множеству клиентских библиотек.
Таким образом, если ваш проект требует высокой производительности и масштабируемости для работы с потоковыми данными, Kafka может быть предпочтительнее, хотя и потребует более сложной настройки. Если же вам нужна система, которая легко настраивается для маршрутизации и управления разнообразными сообщениями с меньшим объемом данных, RabbitMQ может оказаться более подходящим выбором.
Затем настал черёд выбора базы данных. "ClickHouse будет вашим лучшим выбором для обработки больших данных с молниеносной скоростью," — сказал ChatGPT нам рано утром. Мы даже не стали спорить и ничего не спрашивали. К тому же, мы не раз сталкивались с ClickHouse на других проектах. В команде царило единодушие! Мы чувствовали, что держим в руках ключ к созданию чего-то по-настоящему великого. (последнее предложение написал ChatGPT, высокопарно получилось, но он же третий член команды, и эту статью пишем все вместе)
ClickHouse vs PostgreSQL (автор ChatGPT)ClickHouse и PostgreSQL являются системами управления базами данных, но они предназначены для разных сценариев использования и оптимизированы для выполнения различных задач. Вот краткое сравнение их основных характеристик и предназначений:
ClickHouse
ClickHouse — это колоночная СУБД, разработанная для онлайн-аналитической обработки (OLAP). Она особенно хорошо подходит для выполнения быстрых аналитических запросов над большими объёмами данных.
Особенности ClickHouse:
Производительность: ClickHouse оптимизирован для быстрого выполнения запросов на чтение, которые могут обрабатывать миллиарды строк за секунды. Он использует колоночное хранение, что позволяет эффективно выполнять агрегации и операции чтения.
Масштабируемость: Поддерживает горизонтальное масштабирование, позволяя распределять данные и запросы по множеству узлов.
Хранение данных: Применяет сжатие данных для эффективного хранения, что снижает затраты на хранение и ускоряет операции чтения.
Работа с данными в реальном времени: Отлично подходит для работы с потоковыми данными и может обновляться в реальном времени.
Открытый исходный код: Разработка ведётся с открытым исходным кодом.
PostgreSQL
PostgreSQL — это объектно-реляционная система управления базами данных (ORDBMS), которая известна своей надёжностью, гибкостью и соответствием стандартам SQL. Это универсальная система, которая подходит для множества различных сценариев, включая OLTP (онлайновая транзакционная обработка) и начальный уровень OLAP.
Особенности PostgreSQL:
Универсальность: PostgreSQL поддерживает как текстовые, так и числовые данные, JSON, геопространственные данные и многое другое.
Расширяемость: Система известна своей высокой степенью настройки и расширяемости. Разработчики могут писать свои собственные функции и операторы, а также использовать множество доступных расширений.
Транзакции: Поддерживает ACID-транзакции, обеспечивая надёжность данных через механизмы контроля согласованности.
Безопасность: Обеспечивает высокий уровень безопасности данных благодаря мощной системе управления доступом и шифрованию данных.
Открытый исходный код: Постоянно развивается большим сообществом и является полностью открытым исходным кодом.
Когда использовать каждую СУБД
ClickHouse лучше использовать для сценариев, где требуется быстрая обработка и анализ больших объёмов данных, таких как аналитика больших данных, веб-аналитика, мониторинг и анализ логов.
PostgreSQL является более подходящим выбором для приложений, требующих надёжных транзакций, сложной бизнес-логики на стороне сервера или работы с разнообразными типами данных и запросов, включая приложения для управления контентом, финансовые системы и другие корпоративные приложения.
Выбор между этими двумя системами зависит от специфических требований вашего проекта и типа задач, которые вы хотите решить.
После того как наша троица решила базовые архитектурные и технологические вопросы, настало время разбить наш проект на микросервисы, каждый из которых выполнял бы свою уникальную роль в цепочке создания и доставки контента. Организация сервиса предстала перед нами как сложный пазл, но с помощью ChatGPT мы смогли его собрать.
Получился отличный пайплайн, который ознаменовывал жизненный путь каждого сообщения (новости).
Первым микросервисом стал сервис парсинга новостей, задачей которого является извлечение данных из различных источников. Именно здесь зарождается сообщение, которому позже предстоит путь от микросервиса к микросервису по шине данных. “Парсер” сканирует многочисленные сайты на предмет свежих новостей в технологической сфере.
Затем вступает в игру сервис препроцессинга, обрабатывающий и структурирующий сырые данные, готовя их к пересказу. Очистка текста, выделение ключевых слов и фактов — всё это на его плечах.
Следующий этап — сервис пересказа с использованием YandexGPT API, который берёт подготовленный текст и преобразовывает его в удобоваримый, интересный пересказ. Этот микросервис — сердце нашей системы, добавляет к текстам понимание и новую жизнь.
Давайте на этом месте немного отвлечёмся, любопытно же. Представляете, что получается? Мы с помощью одного искусственного интеллекта оборачиваем в сервис другой искусственный интеллект. Крышу от осознания этого сносит, и начинает беспокоить вопрос: “А я-то здесь зачем нужен?”.
Но вас, уважаемый коллега и читатель, может интересовать совсем другой вопрос: "Почему YandexGPT, а не GPT-4 Turbo?" Этим вы как бы намекаете на то, что код нам пишет ChatGPT (OpenAI), поэтому можно было использовать их API. Рассказываем без утайки. Не знаем, как другие модели Яндекса, но именно модель YandexGPT Pro для наших задач подошла очень хорошо: стоит дешевле и наши российские IP не блокирует.
Отвлечение закончено. Снова к работе сервисов.
"Постпроцессинг" занимается финальной подготовкой текста, корректируя стиль и устраняя возможные ошибки перед тем, как передать текст на озвучивание.
"Озвучка" синтезирует из текста речь, делая новости доступными не только для чтения, но и для прослушивания. С этой целью мы используем сервис Yandex SpeechKit, общаясь с ним также через API.
И, наконец, сервис публикации, который отвечает за отправку готового контента в канал Телеграма.
Все действия в системе логируются и сохраняются в ClickHouse, а наиболее значимые параметры мониторинга отправляются в специальный канал Телеграма, что позволяет нам анализировать эффективность работы сервиса и быстро реагировать на возможные проблемы.
Вот одна из схем верхнеуровневой архитектуры одного из этапов обсуждения. Как видите, она немного отличается от того, что написано (выбор между Kafka и RabbitMQ на ней под вопросом, а парсера в привычном нам сейчас виде нет - их там аж N). И откроем один секрет: по архитектуре мы советовались не только с ChatGPT. О чём это говорит? О том, что доверие приходит со временем.
Осталось это запрограммировать.
И чуть не забыли. Мы же ещё хотели CI/CD. Это когда пишешь, пишешь код, а потом одной кнопкой пуш — и он уже крутится на сервере, всё работает как по мановению волшебной палочки, и сообщения сыпятся в наш новостной канал.
Итого
Оказалось, что нам надо:
закодить пяток микросервисов,
настроить обменники с очередями в RabbitMQ и подключить к ним микросервисы,
настроить связку ClickHouse с RabbitMQ,
настроить CI/CD (ChatGPT настоял, чтобы это был Docker Compose в связке с Github Actions),
и ещё по мелочи разные девопсовские штучки типа настройки сервака и т.д.
Про тестирование и документирование мы скромно промолчим, это идёт по умолчанию.
Примечание. Уже при реализации выяснилось, что нам остро не хватает микросервиса фильтрации рекламы, которой изобилуют некоторые источники новостей. А дальнейшее развитие нашего сервиса в целом требует ещё и классификатор новостей по темам, которым мы прямо сейчас занимаемся. И о том, и о другом мы обязательно напишем в следующих статьях.
Мы с Ильёй смотрели на это и думали: "Ничего себе работы для ChatGPT". Сами-то мы ничего этого делать не собирались. И, признаться, мы поначалу сомневались, что он справится за 20 баксов с таким объёмом работы.
Но работу он сделал. Да, были проблемы, а у кого их не бывает. Но главный результат есть — TechMix работает.
И здесь снова хочется отвлечься и поделиться сокровенным. Не всё у нас сразу получалось. Да, в статье всё красиво, но жизнь обычно изобилует большим числом красок. Когда мы говорим, что третий у нас ChatGPT, одни не верят, другие смеются ("он мало на что способен"), третьи задают вопросы. А насколько сложно общаться с ChatGPT? А что вы делаете, когда получаете неправильный ответ? Как можно ему верить, если он события путает и вообще на уровне джуна код пишет?
Давайте ответим на некоторые вопросы и попробуем составить начальный список рекомендаций, который, надеемся, поможет вам в работе с ИИ-помощниками. Оговорка для читателей из недалёкого (через год, 2025 г.) будущего: не смейтесь над нами, мы, люди 2024 года, всё ещё привыкаем к работе с ИИ.
Начать хочется с последнего и наиболее часто задаваемого вопроса, который можно назвать высокомерным замечанием: "Он же джун. Он пишет слабый код". А как мы вообще нанимаем людей на работу и отделяем джунов от миддлов и сеньоров? Обычно через интервью. Расскажем один случай в качестве иллюстрации.
Наш друг чуть больше года назад (напомним, что ChatGPT появился в конце 2022 г.) хохмы ради прошёл сложное техническое интервью в крупном банке с помощью ChatGPT на сеньорную вакансию разработчика. Предложение он получил, но не пошёл, у него и так всё было хорошо. Друг рассказал, что несмотря на его собственный высокий уровень, ему было бы очень сложно пройти собес без ChatGPT, а с ChatGPT он просто копипастил и зачитывал текст.
Мы в своей работе используем ChatGPT 4, платную версию. ChatGPT 4 был значительно улучшен по сравнению с ChatGPT 3.5, что делает его более мощным инструментом. Помимо улучшения понимания контекста, качества ответов, универсальности, обработки инструкций и минимизации предвзятости, в ChatGPT 4 были добавлены возможности работы с файлами и поиска в интернете. А с выходом ChatGPT 4o повысилась и скорость ответов — раньше приходилось ждать, пока допишет.
Уже на текущем уровне развития искусственный интеллект обладает знаниями и навыками, которые нам и до конца жизни не приобрести. В нашем айтишном мире это означает знание нескольких языков, сред разработки, огромного количества фреймворков и библиотек и так далее. Единственное, чего не хватает (но это решаемо) ChatGPT сейчас — это онлайн-доступа к обновляемым базам знаний.
Так, может быть, дело не в ChatGPT?
Помните, как было в старой рекламе:
— Вот за это я и не люблю кошек.
— Ты просто не умеешь их готовить.
И здесь отвлечение два плавно переходит в cookbook.
Cookbook — читается кукбук.
В IT-мире термин "cookbook" обычно используется в нескольких контекстах, но в основном он относится к сборникам "рецептов" или лучших практик для решения определённых задач или проблем.
Вот несколько примеров использования термина:
Программирование и разработка ПО: В контексте программирования cookbook может быть книгой или онлайн-ресурсом, который содержит набор рецептов или руководств по программированию. Эти "рецепты" обычно описывают, как решать конкретные программные задачи или как использовать определённые технологии или языки программирования. Например, "Python Cookbook" содержит решения для различных задач программирования на Python.
Инфраструктура и автоматизация: В области управления инфраструктурой и автоматизации, например, в инструментах управления конфигурациями, таких как Chef, термин "cookbook" используется для обозначения набора сценариев (рецептов), которые описывают, как автоматически настраивать программное обеспечение или системы. Каждый "рецепт" в таком cookbook определяет ресурсы и порядок действий, которые необходимы для достижения определённого состояния системы или приложения.
Безопасность: В контексте информационной безопасности cookbook может содержать наилучшие практики, сценарии или методики, которые помогают обеспечить безопасность информационных систем. Это могут быть рекомендации по настройке безопасности, шаблоны политик безопасности или руководства по реагированию на инциденты.
Эти ресурсы помогают ускорить процесс разработки и управления, предоставляя проверенные решения и методики, которые можно адаптировать под конкретные нужды или задачи.
Вот основные поинты нашего cookbook’а по разработке приложений и программированию с ChatGPT на основе нашего личного опыта, подтверждённого работающим прод-решением (это мы о TechMix):
Психологический барьер экспертного сопротивления.
Чем больше вы знаете и умеете, тем сложнее вам будет относиться к ChatGPT как к помощнику и эксперту высокого уровня, которому можно доверять. Вполне допускаем, что на подсознательном уровне некоторыми нашими коллегами ChatGPT может ревностно восприниматься как конкурент. Это психологический барьер.
Но, если вы правильно ответите на вопрос из анекдота “вам шашечки или ехать?”, то в машину надо запрыгивать, следующее такси будет дороже, а автобус придёт неизвестно когда и будет забит под завязку.
К ChatGPT надо относиться как к другу, как к себе.
Что это означает? Что все мы имеем право на ошибку. Что никто на земле не обладает исключительными знаниями. Никто не идеален — ни ваш друг, ни мы, ни вы. Поэтому не ждите идеального ответа с первого раза. Учитесь прощать и признавать право на ошибку, учитесь переспрашивать и уточнять. Признайтесь, вы с первого раза не можете написать правильный запрос. Так почему вы ждёте правильный ответ?
Вам тоже надо учиться — учиться выстраивать взаимоотношение с ChatGPT, учиться общаться с ним.
Промпт-инжиниринг.
На наш взгляд, значение так называемого промпт-инжиниринга (составление запросов к ChatGPT) сильно преувеличено.
Да, конечно, если нам требуется в нашем приложении получить пересказ новости через GPT API, то мы поработаем над одним единственным промптом, который позволяет получать приемлемый результат автоматически раз за разом.
Но когда мы общаемся с ChatGPT в диалоговой системе, нам не нужен идеальный и единственный промпт. Мы ведём диалог. Мы всегда можем добавить деталей позже. Мы всегда можем спросить ChatGPT пояснить ту или иную строчку кода или инструкции, которые он выдал. Мы всегда можем попросить его подумать ещё и дать нам другой вариант ответа. И так далее.
Это диалог, это общение с целью, пусть и не всегда с первого раза, но найти решение. Поиск ответа и написание кода — это итерационные процессы и у людей, и при работе с ChatGPT.
Несколько советов по общению с ChatGPT:
Формулируйте чёткие и конкретные вопросы. Чем точнее вопрос, тем точнее будет ответ.
Вставляйте в запрос файлы, цитаты, код. В ChatGPT 4 вы можете прикрепить файлы, вставить цитату из раннего с ним диалога, вставить в текст запроса свой или чужой код, выдержки из документации и так далее. Это почти всегда помогает получать лучший ответ.
Оценивайте и корректируйте ответы. Не принимайте всё, что говорит ChatGPT, на веру. Да, он может ошибаться. Проверяйте, прощайте и уточняйте, как вы это обычно делаете при ревью кода коллег по работе. Никто не пишет код без ошибок с первого раза. Например, написанный ChatGPT код можно сразу запустить и, если он выдал ошибку, скопировать текст этой ошибки в диалог. ChatGPT ответит, что с этим делать. Возможно, он посоветует установить или обновить библиотеку, а возможно, извинится и перепишет код, а может быть, задаст вам уточняющий вопрос.
Обучайтесь вместе с ChatGPT. Экспериментируйте с различными подходами и учитесь на ошибках. Помните, вы всегда можете уточнить любую строчку в ответе ChatGPT и, в большинстве случаев, получить исчерпывающий ответ, который, вероятнее всего, обогатит вас новыми знаниями.
Пишем код. Идём от общего к частному и декомпозируем задачи:
Сначала обсудите с ChatGPT верхнеуровневую структуру своего приложения.
Дальше попросите набросать структуру одного из микросервисов (предположим, вы, как и мы, строите микросервисную архитектуру). Это будут модули, классы.
Затем попросите написать один из классов. Мы говорим про классы и методы, но вы, возможно, используете другую парадигму программирования — для ChatGPT это не проблема.
Если вы ведёте диалог в одном чате и не меняете его, то ChatGPT помнит контекст и ему не надо напоминать, что было раньше. Но, если в разных, то скопируйте описание класса, которое он уже давал. При необходимости добавьте новые детали от себя (новые требования, уже имеющийся код) и отправьте запрос.
В ответе вы получите код класса с методами. Если класс большой, то часть методов класса будут “пустышками”. Это не значит, что ChatGPT ленится. Это значит, что он не уложился в лимит токенов на вывод сообщения.
В следующих запросах вы можете попросить написать каждый метод класса отдельно (в первую очередь “пустышек”).
Посмотрите весь код. Если чего-то не хватает, он забыл, попросите его дописать.
Возможно, вы сами забыли попросить его написать обработку ошибок (и он это не сделал почему-то), не поздно это сделать сейчас.
Возможно, вам нужны докстринги, вставьте весь код класса и попросите составить более подробные комментарии к коду и верхний докстринг с описанием класса.
Возможно, вы захотите составить unit-тесты, попросите, и он сделает. Если вам что-то в коде не понятно, не стесняйтесь, спрашивайте ChatGPT и он объяснит.
Теперь запускаем получившийся код. Если есть ошибки, копируйте эти ошибки в ChatGPT, он вам поможет отладить код.
DevOps.
В современном мире администратор уже не администратор со скромной зарплатой, а devops, получающий зачастую больше топовых программистов. А почему? Потому что растущее количество и сложность всевозможных платформ, систем и приложений и необходимость заставить их все как-то дружить между собой вселяет благоговейный ужас в каждого, кто с этим сталкивался хотя бы раз в жизни.
Мы не девопсы. В нашем случае ChatGPT помог решить наши девопс-задачи настолько легко и быстро на тестовом сервере, что мы даже расслабились. За что были наказаны при переезде на прод-сервер.
И вспоминается ещё один старый анекдот:
— Какой вывод из этого, сынок?
— Не надо расслабляться.
Правда, виноват в этом не столько ChatGPT… Но об этом мы расскажем в следующей статье. А пока лишь скажем, что ChatGPT стал ещё и нашим девопсом, совершив для нас несколько технических чудес.
Принцип решения devops-задач с ChatGPT тот же, что и при программировании. Вы чётко описываете свою проблему, он даёт вам рекомендацию, вы её применяете. И, если вдруг не сработало, отправляете ему ошибку. И так до тех пор, пока у вас всё не заработает.
Зацикленность.
Иногда происходит зацикленность ChatGPT, как в анекдоте: жена берёт деньги из тумбочки, которые туда кладёт муж, которые ему даёт жена. С опытом вы научитесь на ранней стадии выяснять, когда ChatGPT зациклился.
Как выходить из такой ситуации, чтобы не терять время? Единственного универсального совета нет. Вот несколько идей:
Откройте с ChatGPT новый чат и в нём отправьте запрос в другой форме, желательно с новыми деталями. В этом случае ChatGPT посмотрит на всё это как баран на новые ворота и даст вам ответ с новой идеей, которую вы ещё не видели.
Если у вас проблема с библиотекой, сервисом, фреймворком и т. д., зайдите на их сайт с документацией (чаще либо запутанной, либо чрезвычайно скупой и без примеров) и скопируйте части, относящиеся, как вам кажется, к вашей проблеме, в ChatGPT. ChatGPT скажет: “Ого! Теперь всё стало понятно. В соответствии с обновлённой документацией, вам надо сделать так…”.
Время.
К хорошему быстро привыкаешь. И поэтому, когда с ChatGPT не удаётся что-то сделать с первого раза за 2–5 минут, возникает возмущение: “Ну, как так?!”. Это неблагодарность с нашей стороны. Надо быть более терпеливыми и помнить, что в большинстве случаев ChatGPT экономит не минуты и часы, а дни! Более того, ChatGPT позволяет нам быть теми, кем мы по факту не являемся (программистами, дата-сайентистами, аналитиками, архитекторами, девопсами), и при этом чувствовать себя уверенно!
Отвлечение два вместе с cookbook закончено.
Пора переходить к демонстрации практики, промптам, диалогам, настройкам, коду... Простите, вот прямо сейчас меня дергает за локоть ChatGPT, намекая, что пора заканчивать языком молоть и надо продолжать работать над проектом. А почему? А потому, что без нас ChatGPT даже копипаст сделать не может. Так что всё ещё в наших руках, руках людей, а не искусственного интеллекта. Поэтому ещё раз простите, но нам пора. Пошли работать, пока ещё нужны. Но в следующей статье мы расскажем всё, что не успели сегодня. А, возможно, это будет ещё и не одна статья.
До новых встреч, друзья!
Будем рады ответить на ваши вопросы в комментариях.
И заходите к нам на огонёк за свежими новостями в TechMix.
Продолжение следует...