📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

5 книг про ИИ в программировании — что я для себя вынес (без вайбкодинга)

Взорви свою личную продуктивность20:43

Transcription

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

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

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

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

Итак, начнём с введения. Почему вообще важно следить за искусственным интеллектом? Я тут не хочу ничего предсказывать, что будет в будущем. Никто не знает, что будет в будущем. Но если искусственный интеллект будет развиваться ещё сильнее, то не уметь его использовать, мне кажется, будет большой ошибкой. Потому что те, кто будут уметь его использовать, получат значительное преимущество. Мы дальше поговорим, на каких задачах сейчас мы получаем основное преимущество. Но пока что стоит здесь уточнить и отметить, что от качества нашего входа, то бишь промпта, очень сильно зависит качество выхода.

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

Теперь поговорим о проблеме 70% и где искусственный интеллект даёт максимальный результат. В задачах по типу написания boilerplate, написания типовых функций, написания CRUD-ов и стандартных паттернов, AI справляется прекрасно. То есть AI снимает с нас рутину, но ответственность за код, его безопасность, поддерживаемость и архитектуру всё равно несём мы. И, как правило, в промптах желательно уточнять это и рассказывать нейронке своё видение. У меня есть большой пост в Телеграме, где я комментирую пост человека, который полностью отрицает тот факт, что AI может привносить достаточно большой вклад в продуктивность. Ссылочку на этот пост оставлю в описании к ролику. Соответственно, ещё хорошо об этом сказано в статье Фреда Брукса "Silver Bullet". Она очень старая, но, мне кажется, она очень хорошо перекликается с тем, о чём мы тут говорим. Если вам хочется в это углубиться, оставлю ссылочку на вот эту статью в описании.

Теперь поговорим про подходы к использованию искусственного интеллекта. Тут важно понимать, что у синьор-разработчика и у джуниор-разработчика он будет сильно отличаться. Для джуниора скорее это будет попытка научиться тому, а чего ты пока что ещё не знаешь. На тему того, как использовать искусственный интеллект juniниор-разработчиком, у меня есть целое видео. Оставлю ссылочку на него в описании. С другой стороны, для синьор-разработчика искусственный интеллект — это инструмент, который его ускоряет. Понятно, что всё ещё в областях, в которых у него недостаточно знаний, он может использовать искусственный интеллект для изучения и обогащения какой-то новой информации. Но в основном тут всё сводится к тому, что наша задача — ускоряться. И, соответственно, подходы тут совершенно разные, и надо это понимать. То есть для синьор-разработчиков flow скорее будет в оптимизации вот этого boilerplate и э-э рутинных действий.

Теперь поговорим про промты для отладки. Вот тут прямо написано четыре промта, которые можно брать и использовать. Чуть позже мы обсудим, какая логика строится за формулировками этих промтов и почему они написаны именно так. Важную вещь, которую я хотел тут отметить — это тот факт, что итеративность — это нормально. Часто проще объяснить что-то нейросети не одним длинным промтом, а внутри диалога. Особенно, когда она дополнительно ещё читает кодовую базу. Поэтому не замыкайтесь тем, чтобы написать один идеальный промпт. Не бойтесь итеративности, когда вы постоянно подсказываете что-то нейросети.

Теперь поговорим про то, что делать не надо. Первый пункт — это длинные промты. Нужно стараться писать промты всё-таки коротко и чётко. Про это у меня опять же есть пост в Телеграме, ссылочку оставлю в описании. Следующее, что не надо делать — это надежда на домысливание. То есть, когда в вашем промпте слишком много простора для фантазии, например, "сделай мне ту-дулист", нейронке с большой долей вероятности ответит так, как вы не ожидали. Просто потому, что простор для домысливания слишком большой. Примерно то же самое касается и открытых креативных запросов, если, конечно, это не ваше конкретное намерение попытаться побрейнштормить и найти что-то креативное. А когда у вас есть чёткая задача, но вы пишете открытый, креативный запрос, ещё очень важно понимать, что часто цели очень размыты, а понятие "красиво", понятие "быстро", а если мы в промпте указываем его без какой-то измеримой метрики, оно очень относительно. Опять же, простор для домысливания здесь достаточно большой. Соответственно, вот тут у нас показывается, как мы можем отойти от какого-то абстрактного описания к конкретным. Например, а, ну вот обычный запрос "напиши функцию", мы конкретизируем на каком языке и с каким фреймворком. А запрос "дай мне код", мы конкретизируем какой код? Функцию, класс или целый пакет. Важно об этом сказать. И опять же "сделай быстрее код". Э-э, вместо этого пишем конкретную асимптотику, которую хотим. Ну, я думаю, мысль тут понятна и ясна.

Теперь поговорим про конкретные техники промпт-инжиниринга. Начнём мы с самого первого и самого эффективного, самого доказанного — это Chain of Thought. Суть в том, что мы конкретизируем то, какими шагами нейронка будет решать нашу задачу. Например, вместо того, чтобы попросить найти баг в коде, мы скажем, что сначала опиши, что делает каждый блок кода, затем сформулируй гипотезу о причине ошибки и проверь её и дай исправления. Даже просто добавление фразы, например, "при поиске ошибки в коде, давай пройдёмся по этой функции, строчка за строчкой" значительно может улучшить качество ответов. То есть суть этого метода в том, чтобы дополнительно форсировать нейросеть подумать и посомневаться в своих ответах. А важно понимать, что это достаточно хорошо работает на логических задачах, но это может быть избыточно при каких-то простых задачах. Поэтому важно уже иметь опыт использования нейронок и интуицию, чтобы понимать, какой сложности задачу нейронка, скорее всего, решит сама, а какую нет. И нужно дополнительно запариваться с тем, чтобы писать подобные промты.

Следующая техника промпт-инжиниринга — это Zero Shot и Few Shot. Тут основная идея в том, чтобы приводить примеры в промптах. Опять же, если нейронка может иметь достаточно большой простор для фантазии, но чётко описать, что ты хочешь на выходе, не получается. Например, часто такое бывает с кодстайлом, когда, ну, ты можешь, конечно, писать базовые правила, но есть какие-то такие моменты, которые витают на уровне просто насмотренности. Вот здесь может помочь как раз-таки просто пример, который мы скормим нейронке. Нейронка отлично умеет находить общие шаблоны и паттерны, поэтому часто просто привести несколько примеров в промпте, чего ты хочешь видеть на выходе, значительно может повысить качество ответа. Ну вот тут приведены примеры, когда примеры в промптах могут значительно нам улучшить качество ответов. И пример для валидации цены, где мы конкретно указываем, какие строчки для нас валидны, а какие нет.

Теперь поговорим про паттерн Persona. Это значит, что в промпте мы описываем роль, кем будет наша нейронка. Например, ты синьор-разработчик или ты security analyst или ты архитектор. Соответственно, вот тут приведён пример: "Ты опытный Python-разработчик со специализацией на безопасности". Я думаю, вы где-то это, скорее всего, уже видели. Действительно рабочая техника, которую часто продвигают и которая может быть очень полезна, например, при ревью кода. Простой промпт: "Сделай ревью этого кода". Часто может что-то не учесть. Когда ты интуитивно понимаешь, что, ага, вот тут, скорее всего, может быть ошибка, ты можешь сфокусироваться на конкретном скоупе, например, безопасность кода и запросить ревью для этого скоупа.

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

Следующая наша техника — это Refinement Pattern. Итеративное уточнение. По сути, это напоминает нам итеративную разработку, когда мы начинаем от простого и двигаемся к сложному. Вот у нас тут есть такой вот пример. Сначала мы просим написать просто авторизацию, потом добавляем валидацию по email, потом добавляем там rate limiting, например, да, или авторизацию JWT-токеном. Соответственно, мы сначала решаем простую задачу и потом наслаиваем на неё дополнительные детали. Нужно помнить, что чем проще задача, тем лучше нейронка умеет её решать. Можно пойти дальше и планировать сложную задачу, разбивать на подзадачи. Я подробно об этом рассказываю в видео про то, как писать код разработчику. Там прямо на практике показано, как это набирать и делать. Сегодня у нас больше такой теоретический ролик, да, на основе книжек. Поэтому основная идея действительно такая: двигаться от простого к сложному.

Сравним наши два подхода: это refinement и специфичный промпт. То есть в refinement мы сначала даём общую задачу и потом дополнительными просьбами корректируем её, а в специфичном промпте сразу требуем всё, что надо. Соответственно, специфичный промпт нам экономит всё-таки лучше токены, а refinement позволяет корректировать курс в процессе, то есть нам не обязательно чёткое понимание того, что мы хотим видеть в конце. И всё-таки, если задача слишком сложная, то специфичный промпт нужно очень грамотно организовывать в Memory Bank, чтобы нейронка могла по этому всему пройтись и не запутаться.

Теперь поговорим про Self-Consistency. Это способ проверки гипотез. Мы для одного промпта просим нейронку дать ответ с разных сторон. Либо же иногда берут две разные нейронки, например, ChatGPT и Claude, прогоняют в них один и тот же промпт и потом сравнивают ответы. Если ответ сходится, то у нас есть достаточно высокая уверенность в том, что ответы действительно верны. Если они расходятся, то тогда это повод для того, чтобы задуматься. Я очень часто использую этот метод в действительно важных и сложных решениях. Естественно, что итоговое решение буду принимать я сам, но это больше способ найти дополнительную информацию и мнение.

Следующая и последняя техника — это Meta-Prompting. Это когда мы просим нейронку подправить промпт. Замечено, что нейронки для себя пишут промты лучше. И благодаря этому, если у тебя, например, тяжело получается писать конкретные промты, ты можешь попросить нейронку задать тебе вопросы, и ответив на эти вопросы, у тебя получится хороший, конкретный промпт. А также альтернативным подходом тут является, когда ты прямо нейронке в системном промпте, например, задаёшь, что "после каждого моего промпта переделывай его под себя и на основе этого переделанного промпта его". Тоже интересный подход. Можете попробовать это добавить свой Claude MD и посмотреть, что получится.

Теперь перейдём к практическим советам, которые были во всех этих книжках. И первое и самое интересное — это анатомия эффективного промпта, где мы взяли все принципы, о которых мы сейчас говорили, и скомпоновали в одну такую диаграммку. Соответственно, важно указывать роль, важно конкретно писать инструкцию, важно указывать контекст задачи, чтобы человек, который не в теме, например, мог понять то, чего вы от него хотите. А, соответственно, нейронка тоже, чтобы понимала, что вы от неё хотите. Аа дальше ограничения, а что делать не надо, что будет излишним и формат вывода, например, только код или ответ в виде JSON или ответ в виде YAML или, может, вы хотите на выходе видеть LaTeX-документ. Э-э, важно об этом писать в формате.

Теперь перейдём к лучшим практикам, которые фигурируют много где. Первое — это, ну, понятно, что это правило, оно не общее, э-э, скорее такое рекомендация: если у вас плохо получается писать промты — это начинать их с глагола. Вы сразу понимаете и даёте конкретные действия. Нейронке нужны действия. Что именно надо ей сделать? Люди любят декларативное описание того, что они хотят видеть на выходе. А для нейронки всё-таки выгоднее видеть конкретные действия, которые ей нужно сделать. А опять же важно писать недлинные промты и делать их максимально специфичными со всеми нужными деталями. Тут ключевое слово — нужными. Также указывать примеры, декомпозировать сложные задачи на простые. Кто-то советует держать релевантные файлы открытыми в IDE, чтобы можно было прямо а взять и скормить их в чат. Либо же какие-то её агенты видят, какие файлы у вас открыты, и обращают на них внимание. Для несвязанных задач рекомендуется создавать новую сессию, потому что там будет чистый контекст, и с чистым контекстом нейронки работают гораздо лучше. В целом, советую почаще создавать новые чаты и нужную информацию сохранять в меморинке и переиспользовать её в новых чатах. Чем чище контекст, тем, как правило, лучше будет ответ, если в этом контексте есть нужная информация для ответа. Ну и такое правило: два шага назад. Э-э, если фикс создаёт вам новый баг, вы фиксите баг, он создаёт ещё один, то, наверное, стоит остановиться и подумать, что можно было сделать лучше и раньше. Мм, тут мне сразу хочется привести аналогию из математики, когда ты, например, решаешь задачу и идёшь по более простому в каком-то плане пути, когда ты не думая просто делаешь какое-то действие, и оно приводит к тому, что твоё решение становится неоптимальным, очень длинным. А если сделать другое решение на пару шагов раньше, какое-нибудь умное, это тебя приведёт к тому, что твоё решение получится кратким, лаконичным. Соответственно, если вы понимаете, что решение слишком сильно разрастается, стоит подумать: а могли бы ли мы что-то сделать раньше лучше?

Итак, теперь проведём некую сводку всех наших техник, о которых мы говорили. А, соответственно, Chain of Thought — это про то, чтобы думать пошагово и заставлять нашу нейросеть больше думать. Few Shot — это про то, чтобы приводить примеры в наших промтах. Persona — это про то, какую роль мы даём нейронке. Соответственно, если нам нужно сузиться на какой-то определённый скоуп, а мы можем использовать эту технику. Refinement — это про, а, движение от простого к сложному и наслаивание нового функционала в процессе диалога с нейронкой. Self-Consistency — это про принятие важных решений, когда мы с помощью разных моделей смотрим ответ на один и тот же промпт или просим нейронку подойти к решению с разных сторон. А Self-Consistency действительно может очень сильно помочь при принятии важных решений. Ну и Meta-Prompting — это про то, чтобы генерировать промты для нейронок. А в с помощью нейронок они помогают найти недостающий контекст, задать уточняющие вопросы. Действительно, бывает очень полезно и достаточно часто этим пользуюсь.

Ну и ключевые выводы. Я закидал вас информацией. Я надеюсь, что после просмотра этого видео вы для себя какие-то ключевые моменты вынесли и попробуете применить их на практике. Если нет, то вернитесь по тайм-кодам, пересмотрите те части, которые вам были интересны. Проведём ключевые выводы. Крутая техника — это Chain of Thought. Думать пошагово, заставлять нейронки больше думать. А второе — это, конечно же, декомпозиция задач. А когда мы разбиваем сложную задачу на простые, но это сейчас говорят где угодно и везде. Следующее — это примеры. Важно приводить в промтах примеры того, чего вы хотите видеть на выходе. Если нейронка сама не может до этого догадаться. Важно всё-таки относиться к коду, сгенерированному нейронкой, очень аккуратно, потому что в нём могут быть ошибки, в нём могут быть какие-то уязвимости, поэтому весь код, который мы генерируем, важно перечитывать и ревьюить, как будто его написал другой человек. Ну и пятое правило: два шага назад, когда мы не бесконечно итерируем фиксы, а всё-таки используем нейронки с головой и понимаем, что это инструмент, который позволяет снять рутину, но принятие сложных решений всё равно во многом остаётся на нас.

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