Transcription
Добро пожаловать обратно. В этом разделе мы заложим основу для всего, что будем создавать в этом курсе. Мы рассмотрим, что такое языковые модели, что мы можем с ними делать и как эффективно использовать их в реальных приложениях. Мы также охватим практические концепции, такие как токены, стоимость, выбор модели и ключевые настройки, которые формируют поведение модели. Даже если вы раньше пользовались чат-ботом, этот раздел даст вам прочную ментальную модель. Так что, когда мы начнем строить, вы будете точно знать, как и почему вещи работают так, как они работают. А теперь давайте приступим. С момента появления Chat JPT мир программного обеспечения быстро меняется. Каждый месяц выходят новые модели, новые инструменты, новые API, новые ожидания и новые должности. Одна из самых захватывающих — это AI-инженер. Вы, вероятно, видели ее в описаниях вакансий. Но что это такое? Ну, это не то же самое, что инженер машинного обучения. Инженеры машинного обучения создают и обучают модели. Они очищают данные, настраивают архитектуры и оптимизируют конвейеры обучения. Это требует много математики и ориентировано на исследования. AI-инженеры, с другой стороны, используют предварительно обученные модели, особенно большие языковые модели, для создания более умных приложений. Им не нужно понимать математику, лежащую в основе модели. Им нужно понимать, как ее использовать и как интегрировать ее в реальные приложения. Это очень похоже на использование базы данных. Как разработчик программного обеспечения, вам не нужно знать, как MySQL работает внутри. Вам просто нужно знать, как делать запросы к ней, структурировать свои данные и создавать надежный продукт. Точно так же, как AI-инженер, ваша задача — понять, как использовать эти мощные AI-модели для решения реальных проблем. Прямо сейчас компании по всему миру нанимают инженеров, которые знают, как создавать функции на основе AI. Такие вещи, как суммаризация, перевод, интеллектуальный поиск, автоматизация и персонализированный пользовательский опыт. Позвольте мне показать вам несколько примеров. Amazon теперь показывает сгенерированное AI резюме отзывов о продукте на странице продукта. Это экономит покупателям время и увеличивает конверсию, ускоряя принятие решения о покупке. Вы увидите ту же закономерность во многих других приложениях, где AI используется для извлечения быстрых выводов из длинных обсуждений. В качестве другого примера, Active Campaign, которая является маркетинговой платформой, позволяет маркетологам использовать AI для создания полных email-кампаний всего за несколько запросов. Вместо того, чтобы начинать с нуля, они получают мгновенные черновики контента, которые могут опубликовать и отправить. Вот еще один пример. В Twitter или X, если вы видите пост на другом языке, вы часто увидите ссылку "перевести". За кулисами большая языковая модель определяет язык, определяет ваш локаль и мгновенно генерирует переведенную версию. Эта функция становится стандартом для социальных платформ и новостных приложений. Вот еще один пример. Такие платформы, как YouTube и Twitch, используют AI для автоматического выявления таких вещей, как спам, ненавистнические высказывания или неприемлемый контент. Это помогает обеспечить безопасность сообществ без необходимости в тысячах модераторов, наблюдающих за всем в реальном времени. Вот еще один пример. Freshesk, которая является платформой поддержки клиентов, использует AI для автоматической категоризации, приоритизации и маршрутизации входящих заявок в службу поддержки. Таким образом, вместо того, чтобы агенты вручную сортировали каждый запрос, система отправляет каждую заявку в нужную команду. И это означает, что агенты тратят меньше времени на организацию и больше времени на решение проблем. Давайте посмотрим на еще один пример. На Redfin, платформе для поиска жилья, при просмотре объявления об объекте недвижимости есть встроенный чат-помощник, который может отвечать на вопросы об этом конкретном объекте. Таким образом, вместо того, чтобы ждать разговора с агентом, пользователи могут сразу получить необходимую им базовую информацию. И это всего лишь несколько примеров. Возможности безграничны. Ежедневно разработчики добавляют в свои приложения такие умные функции. Не просто ради новизны, а для экономии времени, снижения затрат и создания более умных, более полезных впечатлений. Я считаю, что в будущем от каждого разработчика программного обеспечения будет ожидаться умение работать с AI-моделями, так же, как сегодня от нас ожидается умение работать с базами данных. Вам нужно будет знать о больших языковых моделях или LLM, промпт-инжиниринге, генерации с дополненным поиском или RAG, векторных базах данных, создании агентов и так далее. Этот курс — ваш первый шаг в этот мир. Так что, если вы разработчик и хотите идти в ногу с тем, куда движется индустрия, вы находитесь в правильном месте. В этом уроке мы ответим на простой, но важный вопрос. Что такое большая языковая модель? Давайте разберем это. По своей сути, языковая модель — это система, которая обучена понимать и генерировать человеческий язык. Сегодня доступно несколько языковых моделей. Некоторые из них коммерческие, такие как GPT от OpenAI, Gemini от Google, Claude от Anthropic, Grok от XAI, компании Илона Маска. У нас также есть модели с открытым исходным кодом, такие как Llama от Meta, Mistral от европейской компании под названием Mistral, и многие, многие другие. Они называются большими, потому что они обучены на огромных объемах текста. Все, от книг и статей до форумов, кода, документации и многого другого. Благодаря этому обучению они учатся статистическим закономерностям в языке. Такие вещи, как грамматика, структура предложений, тон, общеизвестные факты и формулировки. Так что, когда мы задаем LLM запрос, скажем, "столица Франции —", она не ищет ответ. Она просто предсказывает, как должен выглядеть полезный ответ, основываясь на закономерностях, которые она видела во время обучения. Это как автозаполнение, но на стероидах. На практике большая языковая модель — это гигантская математическая структура, обычно размером в несколько гигабайт, состоящая из миллиардов параметров. Эти параметры представляют собой закономерности в языке, такие как грамматика, факты, тон и стиль. Эти модели не понимают язык так, как мы. У них нет убеждений или интеллекта. Они просто очень хорошо предсказывают, что будет дальше. Вывод часто настолько хорошо написан, настолько плавен по структуре, что кажется, будто за кулисами есть интеллект. Но его нет. Это просто масса и вероятность, основанные исключительно на обучающих данных. Вот почему, если вы зададите чат-боту один и тот же вопрос несколько раз, вы часто получите немного разные ответы. Он не повторяет сохраненный ответ. Он генерирует новый вывод каждый раз, основываясь на вероятности, а не на истине. И это подводит нас к очень важному моменту. Поскольку эти модели не понимают, что говорят, качество обучающих данных — это все. Если модель обучена на предвзятых, неточных или низкокачественных данных, ее ответы будут это отражать. Вот почему некоторые модели кажутся политически предвзятыми или почему некоторые модели дают совершенно ложные ответы с полной уверенностью. Все сводится к данным. В наши дни многие люди используют языковые модели для генерации кода, и поначалу это впечатляет. Но вот в чем проблема. Эти модели обучены на миллиардах строк кода из общедоступных репозиториев, включая GitHub. И огромная часть этого кода написана плохо, устарела, заполнена антипаттернами или просто сломана. Модель этого не знает. Она просто учится тому, что является распространенным, а не обязательно тому, что правильно или поддерживаемо. Поэтому, когда она генерирует код, он может выглядеть чисто, звучать уверенно, даже компилироваться, но он может быть ошибочным, небезопасным или полным плохих практик. В этом опасность слепого доверия коду, сгенерированному моделью. Мы получаем что-то, что выглядит профессионально, но не всегда надежно. Поэтому еще раз хочу подчеркнуть, что обучение имеет большое значение. Модель хороша настолько, насколько хороши данные, на которых она обучена. Мусор на входе, мусор на выходе. Если она учится на чистом, высококачественном коде и точных языковых данных, она работает хорошо. Если она обучается на беспорядочных, предвзятых или неверных данных, ответы могут быть вводящими в заблуждение или откровенно неправильными. Теперь обучение большой модели с нуля — это не только данные. Оно также требует огромного количества вычислительной мощности. Мы говорим о тысячах GPU, неделях или месяцах непрерывного обучения и инфраструктуре, которую могут себе позволить лишь горстка компаний в мире. Вот почему большинство из нас не обучают модели сами. Как разработчики, наша задача — не становиться инженерами машинного обучения. Наша задача — понять, как общаться с этими моделями через промпты, как справляться с их ограничениями и как интегрировать их в наши приложения для создания более умных функций. Точно так же, как нам не нужно создавать собственный движок базы данных, нам просто нужно знать, как его использовать. Это мышление вы разовьете на протяжении всего этого курса. В следующих нескольких уроках мы глубже разберемся, как работают эти модели, такие вещи, как токены, стоимость и как выбрать правильную модель для задачи. Итак, я сказал вам, что как разработчик вам нужно научиться интегрировать языковые модели в ваши приложения. А теперь позвольте мне показать, как это выглядит на самом деле. Подумайте о типичной структуре приложения. У нас есть фронтенд, возможно, построенный с помощью React или чего-то подобного, бэкенд, база данных для хранения данных нашего приложения и теперь языковая модель, готовая генерировать или обрабатывать контент. LLM обычно не является центром нашего приложения. Это вспомогательная система. Мы отправляем ей ввод или промпт. Мы получаем ответ и используем этот ответ для улучшения пользовательского опыта, и то, как мы его используем, зависит от нашей функции. Например, очень распространенный сценарий использования — суммаризация. Я показал вам, как Amazon использует это для суммаризации отзывов. Это становится очень распространенным в современных приложениях. Мы также можем использовать LLM для генерации контента, такого как электронные письма, описания продуктов, сообщения в социальных сетях и так далее. Другой распространенный сценарий использования — классификация текста. Мы можем использовать модель для категоризации ввода. Например, это спам или нет? Этот отзыв положительный или отрицательный? Эта заявка в службу поддержки касается выставления счетов, входа в систему или отмены? Мы можем попросить LLM генерировать ответы в виде объектов JSON, как этот. Это означает, что наш бэкенд может легко разобрать ответ, сохранить его и принимать решения на его основе. Мы также можем использовать LLM для перевода текста с одного языка на другой. Я показал вам, как это делает Twitter или X. Также новый iOS делает это для перевода текстов в реальном времени. Другое отличное применение языковых моделей — извлечение информации. Например, мы можем дать LLM какой-нибудь беспорядочный текст, такой как PDF, и попросить ее извлечь структурированные данные, такие как номер счета, сумма, имена, адреса и так далее. Мы также можем использовать LLM для создания и интеграции чат-ботов в наши приложения. Мы можем создавать чат-ботов, которые отвечают на вопросы на основе данных пользователя или бизнес-документов и так далее. Все эти сценарии использования следуют одной и той же схеме. Текст на входе, текст на выходе. Мы даем модели промпт, и она возвращает нам ответ. Ответ может быть простым текстом. Это может быть массив, объект JSON, число, изображение или что-то полезное. Теперь, когда вы увидели, что могут делать LLM, давайте посмотрим, что на самом деле находится внутри них. В следующем уроке мы поговорим о том, как эти модели работают под капотом. Теперь, когда вы знаете, что такое языковые модели и что мы можем с ними делать, давайте подробнее рассмотрим то, что играет большую роль в том, как мы их эффективно используем, а именно токены. Что такое токены? Ну, когда мы отправляем промпт языковой модели, она не обрабатывает ввод как простой текст. Вместо этого она разбивает текст на более мелкие единицы, называемые токенами. Эти токены могут быть целыми словами, частями слов, знаками препинания, даже эмодзи или пробелами. Так что токены — это не то же самое, что символы или слова. Они находятся где-то посередине. Чтобы увидеть это в действии, найдите в Google "OpenAI tokenizer". На этой странице вы можете ввести промпт здесь или нажать "показать пример". Смотрите, этот фрагмент текста содержит 252 символа, и он разбит на 53 токена. Ниже вы можете увидеть эти токены, раскрашенные. Так что каждый фрагмент представляет собой токен. Теперь, почему это важно? Потому что токены напрямую влияют на стоимость. Возьмем, к примеру, OpenAI. На момент записи, генерация 1 миллиона выходных токенов с помощью GPT40 mini стоит 60 центов. С GPT4.1 та же задача обойдется в 8 долларов. Это в 13 раз больше. Так что, если вы суммируете длинные документы или генерируете большие объемы контента, использование токенов и, следовательно, стоимость могут быстро расти. Вот почему при выборе модели стоимость должна быть одним из ключевых факторов. Мы не должны просто выбирать самую новую или самую мощную модель. Подумайте о том, что на самом деле нужно вашему приложению. Это похоже на покупку телефона. Вам не всегда нужен последний iPhone Pro Max. Иногда телефон среднего класса дает вам все, что вам нужно. Та же логика применима и здесь. Так что токены стоят денег, но также существует ограничение на количество токенов, которое модель может обработать за раз. Это ограничение называется контекстным окном. Контекстное окно включает наш промпт, который является вводом, ответ модели и историю чата. Это если мы создаем диалоговый опыт. Опять же, все это измеряется в токенах. Например, GPT40 Mini имеет контекстное окно около 128 000 токенов. GPT4.1 может обрабатывать около 1 миллиона токенов. Mistral, которая является моделью с открытым исходным кодом, поддерживает около 32 000 токенов. Так что, если мы отправим очень длинный промпт и достигнем лимита токенов или контекстного окна, модель остановится даже посреди предложения. Вот почему важно знать, сколько контекста может обработать наша модель. Но опять же, нам не всегда нужно самое большое контекстное окно или самая большая модель. Mistral, например, может быть вполне достаточным для таких задач, как суммаризация поста в блоге или классификация заявки в службу поддержки. Все зависит от потребностей нашего приложения. В следующем уроке я покажу вам, как подсчитывать токены программно, чтобы мы могли оценить стоимость и оставаться в пределах лимитов перед отправкой запроса. Хорошо. Теперь позвольте мне показать вам, как подсчитывать токены в коде. Откройте окно терминала. Перейдем на рабочий стол или куда-нибудь на вашу машину и создадим каталог под названием playground. Это будет наш проект playground. Далее, перейдем в этот каталог и выполним npm init-y, чтобы создать файл package.json без ответов на основные вопросы о нашем проекте, такие как его название, версия и так далее. Итак, вот наш файл package.json. Отлично. Теперь мы установим библиотеку под названием tick token. Это токенизатор, используемый моделями OpenAI. Итак, разные AI-модели, разные платформы имеют свою собственную библиотеку токенизаторов. Хорошо. Теперь, чтобы открыть это в VS Code, мы находимся в codespace. Если это не работает на вашей машине, просто перетащите этот каталог в VS Code. Хорошо. Теперь добавим сюда новый файл, index.js. Вверху мы импортируем функцию get encoding из tick token. Далее, мы вызываем get encoding и передаем ей аргумент. Аргумент — это кодировка. Здесь у нас есть несколько вариантов. Эти варианты или эти кодировки — это словари, которые сопоставляют идентификаторы токенов с фактическими токенами. Например, у нас может быть идентификатор токена, скажем, 904, который соответствует слову hello. Итак, мы выберем cl100k_base. Это сокращение от chat language. А 100K означает, что в этом словаре у нас около 100 000 уникальных токенов. Итак, мы получаем кодировку и сохраняем ее в константе. Далее, мы вызываем encoding.encode и передаем ей фрагмент текста, например, hello world. Это первый тест библиотеки tick token. Хорошо. Далее, мы получаем наши токены и сохраняем их в константе. И наконец, мы выводим их в консоль. Хорошо. Теперь откроем окно терминала, нажав control и обратный апостроф. Теперь запустим наше приложение, выполнив node index.js. Хорошо, мы получили ошибку синтаксиса: "cannot use import statement outside a module". Почему мы ее получаем? Потому что по умолчанию Node интерпретирует наши файлы JavaScript как модули CommonJS. В модулях CommonJS у нас другой формат для импорта функций. Так что вместо этого синтаксиса, который называется синтаксисом ES-модулей, у нас есть другой синтаксис, который называется синтаксисом CommonJS. Так что нам придется написать код вроде const get encoding = require('tick-token'), это формат CommonJS, который старше. Никто больше его не использует. Так что, чтобы сообщить NodeJS использовать новый формат, нам нужно перейти в наш файл package.json, мы можем открыть его прямо здесь, package.json. Мы устанавливаем свойство type в module. Хорошо, теперь вернемся в терминал. Давайте снова запустим index.js. Хорошо, смотрите. Мы получили массив из 13 элементов, где каждый элемент — это число. Каждое число — это идентификатор токена, который соответствует фактическому токену. Так что при работе с большими объемами текста мы можем использовать библиотеку tick token для подсчета токенов перед отправкой промпта языковой модели.