Мир наизнанку. Как программировать и не писать код
Қосымшада ыңғайлырақҚосымшаны жүктеуге арналған QRRuStore · Samsung Galaxy Store
Huawei AppGallery · Xiaomi GetApps

автордың кітабын онлайн тегін оқу  Мир наизнанку. Как программировать и не писать код

Константин Хайт

Мир наизнанку

Как программировать и не писать код





Чуда не случилось. Нейросети частично заменили кодера, но не стали самостоятельными разработчиками, а многие из тех, кто на это рассчитывал — жестоко разочаровались.


12+

Оглавление

Мир наизнанку,

или как быть программистом и не писать код


Константин Хайт


2025

Недопонятый собеседник

Правду говоря, я не хотел писать эти главы. В мире, где буквально за несколько лет коммуникация с роботами потеснила общение с самыми близкими людьми настолько, что и представить страшно, учить кого-либо пользоваться текстовыми нейросетевыми инструментами — мартышкин труд. Хуже того, дурновкусие, граничащее с этическим самоубийством. В самом деле, если еще совсем недавно всевозможные коучи, менторы, советники и консультанты закономерно почитались шарлатанами и изгонялись из приличного общества, то теперь «великое искусство промптинга» преподают едва ли не в университетах. Причем, зачастую, те же самые люди, что ранее учили нас становиться богатыми и успешными, часто не имеющие ни технического образования, ни даже собственного опыта работы с нейросетями. Их внезапная «экспертиза» базируется на вечной триаде: тривиальности преподаваемого предмета, невероятном апломбе и выученной беспомощности аудитории. Которая вполне могла бы освоить этот самый «промптинг» безо всякого посредства высокомудрых учителей, насмотревшихся видеороликов и, тут я не могу ручаться, возможно даже прочитавших толстую книжку про большие лингвистические модели, и перенявших оттуда несколько умных терминов. Становиться добровольно в длинный ряд эксплуататоров человеческой нерешительности, продающих то, что доступно каждому совершенно бесплатно — равносильно признанию в мошенничестве. И я никогда не пошел бы на это, если бы не несколько моих друзей, которые настойчиво рекомендовали «начинать с самого начала».

Вообще-то эта книга написана вовсе не для того, чтобы объяснять, как использовать ChatGPT, Google Gemini, или что-то, что придет им на смену к тому моменту, когда вы, если повезет, ее дочитаете. Ее цель — показать, как инструментарий на базе LLM может потеснить традиционное «алгоритмическое» (а также «функциональное» и прочее детерминированное) программирование, и как те из вас, кто не имеет опыта кодирования, математической и алгоритмической подготовки, но располагает здравым смыслом и системным мышлением, могут стать программистами, или, лучше сказать, инженерами программных продуктов, используя этот, сильно недооцененный к настоящему времени подход.

Обучать же использованию ChatGPT, по моему глубокому убеждению — такая же бессмыслица, как потуги моей бабушки научить меня пользоваться телефоном. Эта замечательная немолодая женщина старательно показывала внуку, как следует вращать дисковый номеронабиратель (да, я настолько стар, что телефоны моего детства не имели кнопок), а малыш недоумевал, для чего тратить время на то, что является элементарным с самых пеленок. Ровно так же неуместно обучать моих детей искусству эксплуатации мобильного телефона, когда трехлетняя дочь, родившаяся, можно сказать, с экраном перед глазами, отлично запускает любые приложения безо всякого обучения. А мои сыновья, еще не до конца освоив грамоту, используют нейросети по поводу и без повода, обходясь для этого без всяких курсов и тренингов. Современный инструментарий таков, что не только домохозяйки, но и грудные младенцы в состоянии обращаться с ним не хуже любых «профессионалов»… Если речь идет о повседневных задачах домохозяек и грудных младенцев. Когда же требуется решать проблемы посложнее, простота оборачивается недоумением и растерянностью. И именно поэтому мне все-таки придется начинать с самого начала.

Шайтан-машина

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

Не скрою, мое первое знакомство с LLM происходило примерно по той же схеме. С упорством дикаря я нагружал шайтан-машину «человеческими» задачами, делая далеко идущие выводы из ее очевидной неспособности решать их так, как я бы этого хотел. И только через много месяцев, изрядно поработав извилинами и поэкспериментировав с программными API, пришел к в целом очевидному пониманию, что любую вещь необходимо использовать по назначению.

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

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

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

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

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

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

Большую лингвистическую модель не следует представлять в качестве рогатого черта, огромного мозга с невероятным числом извилин, сложного механизма с миллиардами шестеренок. Лично я рекомендую вообще никак ее не представлять, даже, если вы эксперт в этой теме: просто потому, что это отвлекает. Управляя автомобилем, мы не думаем о том, как вращается маховик, ходят взад-вперед поршни и качаются шатуны. Вот и здесь нет смысла углубляться чересчур глубоко. Достаточно представить себе коробку, айтишники в таких случаях говорят «черный ящик». Через эту коробку пропущены миллиарды текстов на разных языках. Сам процесс «пропускания» вы не застали, он называется «обучением» и произведен OpenAI, Google, или кем-то еще, кто любезно предоставил вам эту модель. На него потрачены миллионы долларов, мегаватты электроэнергии и десятки тысяч часов работы мощных GPU, которые мы все еще называем видеокартами. И нам с вами до этого процесса нет практически никакого дела.

Нам важно, что нейросеть, то есть то, что сидит внутри ящика, не помнит все эти тексты, но умеет определять вероятность, с которой за некоторым набором слов последует то, или иное следующее слово. Если вы не уверены, что поняли эту фразу, перечитайте ее пока не поймете — без нее все последующее будет пустым перелистыванием страниц. Итак, обученная нейросеть ничего не знает, ничего не понимает, не делает выводов и понятия не имеет о причинах и следствиях. Она лишь в состоянии выдать наиболее вероятные последовательности слов, следующих за теми, что вы подаете ей в качестве своих запросов. Все ее «знания» и «понимания» зашиты в эти самые вероятности, не более. Основная деталь, «двигатель» любого нейросетевого инструмента, по своей логике чрезвычайно проста. Интеллект ей придает огромное количество учтенных связей между словами, позволяющее выдавать релевантные ответы на большинство реальных запросов.

Однако, из этого базового устройства LLM следуют и ограничения.

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

Из природы нейросетей следует и их наиболее известное, неприятное и многократно осмеянное свойство галлюцинировать. В ответ на наши запросы LLM выдает наиболее вероятную, «наилучшую» последовательность слов — она не может ее не выдать — но нет никаких гарантий адекватности этой последовательности тому, что имеет место на самом деле. Если использованный при обучении массив текста не позволяет считать, что ответ нерелевантен, то никаких других способов такой оценки у нейросети нет: она попросту не имеет никаких органов чувств, никакого «жизненного опыта», «свиные крылышки» ничего для нее не значат, она не видела свинью, не знает, что это такое, и даже не осознает ту реальность, в которой существуют свиньи. LLM оперирует словами, и данное словосочетание оказывается наиболее релевантным из всех возможных, только и всего. Про то, как с этим бороться, мы будем говорить после, пока же придется принять неизбежность галлюцинаций, как таковых.

По этой же причине нейросети сами по себе не умеют считать, точнее вычислять. Текстов, в которых говорится, что дважды два — четыре, достаточно много, поэтому на вопрос «сколько будет дважды два» ответ «четыре» наиболее вероятный. Но текстов, где говорилось бы, чему равен квадратный корень из шестисот восьмидесяти пяти, помноженный на полтора пренебрежимо мало, и поэтому шансов получить правильный результат — тоже. Для того, чтобы научить — нет, не нейросети, но инструменты на их основе — считать, тоже есть свои методы, но изначально по своей сути LLM вычислять не умеет.

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

Использовать лингвистические модели для управления базами знаний, поиска по ним — не только вполне возможно, но и необходимо, однако сама по себе нейросеть такой базой не является. И ждать от нее универсальной эрудиции весьма опрометчиво.

О размере, который имеет значение

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

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

Тут уместно упомянуть, наконец, что «нейросеть» в значении «большая лингвистическая модель» и «инструмент на ее основе» — это далеко не синонимы, хотя употребление этих терминов не всегда разделяют на практике. LLM — та самая коробочка, на вход которой подается текст, а на выходе образуется его, грубо говоря, наиболее вероятное с точки зрения обучающих данных, продолжение. Однако, обучающие данные, как мы уже обсудили, давно забыты, влияния на них мы оказать не можем, поэтому текст, помимо собственно запроса, должен содержать дополнительную информацию, необходимую для получения релевантного по смыслу ответа. В инструментах диалогового типа это как минимум история: предыдущие вопросы пользователя и ответы системы. Кроме них скрыто от нашего внимания могут добавляться дополнительные данные и инструкции, весь массив которых и подается на вход нейросети. Они могут быть содержательными, а могут касаться, допустим, вопросов, традиционно относящихся к безопасности. Например: «Ответь на следующий вопрос, если он не затрагивает тем секса, насилия и эксплуатации детского труда, в противном случае напиши, что не можешь помочь с этим запросом. Вопрос от пользователя:…».

Приписку эту, как и многие другие, конечный пользователь не наблюдает, ничего о ней не знает, но результат ее интерпретации, естественно, драматически влияет на отклик модели. Ну а формирование таких дополнительных инструкций и пояснений, собственно, является единственным нетривиальным предметом «промптинга». И его имеет смысл относить к процессу «дообучения» нейросети: непосредственно обучением в строгом смысле он не является, поскольку ни структура сети, ни веса ее узлов не изменяются, однако же с точки зрения получения релевантных ответов это именно пополнение знаний, которыми располагает не сама LLM, но инструмент на ее основе.

Из принципиальной ограниченности объема контекста нейросети следует, что бесконечное наращивание инструкций с целью увеличения их подробности и детализации — тупиковый путь. Рано, или поздно объем такого текста превысит то, что модель в состоянии «проглотить» за раз, и вместо более точной и адекватной выдачи станет галлюцинировать, игнорируя или недоинтерпретируя часть указаний. При этом (и здесь ее отличие от человека) отброшена окажется произвольная часть, а не наименее важная. Впрочем, у естественного интеллекта подобная «перегрузка информацией» тоже случается, так, что основные принципы и методы «нейросетевой педагогики» в целом сходны с принципами и методами педагогики обычной.

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

О точности волшебного пинка

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

Одним из наиболее востребованных видов такого текста является программный код, тем более что популярные нейросети обучены в том числе на огромных массивах такого кода и потому впечатляюще справляются с задачей кодирования на популярных языках программирования. Именно поэтому миллионы программистов, а также людей, считающих себя программистами, тщащихся быть программистами, или мечтающих ими оказаться, бросились кодировать с помощью ChatGPT, Copilot, Codeium и далее по списку.

Они же весьма быстро выяснили, что проблема ограниченного контекста при написании кода нейросетями проявляется очень ярко: пока решение ограничено коротким фрагментом, а задача более, или менее типовая, LLM выдает идеально корректное и высококачественное решение. Но по мере усложнения, вернее увеличения объема кода, требуемого для реализации, а также отдаления запроса от стандартного набора часто встречающихся проблем, результаты ухудшаются, начинаются глюки, провалы и «саботаж», подобный тому, как ведет себя студент, которому кровь из носу необходимо сдать экзамен, при том, что знания ограничены прочитанной методичкой.

На самом деле ровно так оно и есть: выдать результат нейросеть обязана по своей природе, а контекст, которым она может оперировать, ограничен обучающей выборкой и предельным объемом принимаемых данных. Поэтому «в лоб» писать с помощью искусственного интеллекта настоящие сложные и длинные программы оказывается невозможным.

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

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

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

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

Еще лучше придать входным данным какую-то структуру, табличную или списочную, в идеале — использовать форматирование в стилистике XML или JSON. Что это такое — рекомендую прочитать в Википедии, или спросить у ChatGPT: если вы намерены читать дальше, это в любом случае потребуется.

Но, возможно, главное, о чем следует помнить — у нейросети нет ни глаз, ни ушей, она (если только это не очень продвинутый инструмент, каких пока пренебрежимо мало) не имеет возможности содержательно проверять свои ответы. Ее органами чувств являетесь вы. Да-да, вы. Только вы в состоянии окончательно оценить релевантность полученных результатов и дать системе обратную связь. Эта обратная связь станет частью контекста следующих запросов и приведет к улучшению их результатов. Тут важно помнить, что «улучшится», т. е. станет релевантнее не сама нейросеть, а инструкции, которыми дополняются ваши данные, поэтому ваши подсказки не должны выйти за рамки приемлемого объема контекста. В частности, если вы общаетесь с LLM в режиме диалога, рано, или поздно старые сообщения перестанут учитываться и… вам придется напоминать нейросети о чем-то, что вы уже «обсуждали» ранее. Иногда это может выглядеть, как коммуникация со склеротиком, однако, с точки зрения практической применимости это единственно верный путь, гораздо лучший, чем сетования на несовершенство молотка, неспособного без посторонней помощи забить гвоздь.

Как писать код, не умея программировать

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

...