Требования к надежности системы становятся более жесткими. Результаты проб LLM по своей природе нестабильны. Их характер такой, что любое изменение может повлиять на выход непредсказуемыми способами. Вы можете управлять этим риском, разбивая большие пробы на компоненты, где изменение может повлиять только на производительность части системы. Даже если одна пробка будет сломана, остальная часть системы будет работать так же, как и до изменения. Это часть продолжающейся серии: см и сообщения. first вторые первый вторая Принцип III: Модулируйте перспектив Ужасная чудовищность. Каждый опытный инженер видел один: код, который настолько обширный, высокий риск, и трудно понять, что никто не осмеливается коснуться его. Нет единичных тестов, каждая смена является причиной небольшого сердечного приступа. Единственные, кто увлекается рядом с ним, это старые таймеры - те, которые были вокруг, когда монстр был построен и они только приближаются, когда нет альтернативы. Я помню первую чудовищность, с которой я столкнулся. 5000-линейная функция, которая была центральной для операций бизнеса стоимостью сотни миллионов долларов; вряд ли кто-то мог дотронуться до нее.Когда она сломалась, целые команды проснулись в середине ночи.Все развитие в компании замедлилось из-за зависимости от этого ключевого компонента.Миллионы долларов были потрачены, пытаясь управлять чудовищем. Что все это имеет отношение к запросам LLM? Они также могут стать чудовищами! Так страшно меняться, что никто не прикасается к ним. Что нужно клиентам Клиенты не хотят платить за программное обеспечение, которое работает правильно только по вторникам и четвергам; они требуют постоянной надежности и потока новых функций. Так как вы получаете здоровое приложение с поддержкой ИИ, а не чудовищность? Существует более десятка подходов, охватываемых в этой серии.Все они начинаются с одного принципа: вместо одного гинормового запроса, вы хотите несколько более мелких фокусированных запросов, каждая из которых направлена на решение одной проблемы. Что такое модуляция Модуляризация - это практика деления сложной системы на более мелкие, самостоятельные и многоразовые компоненты.В традиционной программистской инженерии это означает написание функций, классов и услуг, каждый из которых справляется с определенной задачей.В контексте пробной инженерии для LLM, модуляризация означает разделение большого, монолитного пробного на более мелкие, сфокусированные пробные, каждая предназначенная для выполнения единой, четко определенной работы. Преимущества модуляции Модуляризация позволяет безопасно внедрять изменения в вашу систему со временем.Ее значение возрастает, когда: Продолжительность времени, в течение которого будет поддерживаться приложение, возрастает. Количество и сложность функций, которые ожидается добавить, возрастают. Искрываются требования к надежности системы. Длительность времени, в течение которого будет поддерживаться приложение, увеличивается. Количество и сложность функций, которые ожидается добавить, увеличиваются. Все эти аспекты необходимо понимать при планировании системы. Но как конкретно модуляция помогает поддерживать систему? Основные преимущества описаны ниже. Уменьшение риска Но что, если промпты работают как цепь? Разрыв одного компонента все равно не разорвал бы цепь? Да, это было бы, но ущерб все еще уменьшается в этом сценарии. Ошибочный выход в проптовой цепи может обеспечить пропты внизу с дефектными входами, но каждый компонент все равно будет работать как и до изменения набора действительных входов. Контрастируйте это с изменением гигантского пропта - изменение может (и будет!) повлиять на каждую часть логики, кодированной в этом пропте. (Безопасное функционирование цепочек проб является будущей главой серии. Вам нужно планировать различные типы сбоев и иметь планы непредвиденных ситуаций. Улучшенная проверяемость Любой, кто имел письменные единичные тесты, знает, что простую функцию, которая делает одну вещь, проще протестировать, чем сложную функцию, которая пытается делать много разных вещей. Повышенная производительность Большое количество доказательств показывает, что более короткие звонки, как правило, превосходят более длинные: 1, , 2 1 2 3 Исследования по воздействию многозадач на оперативную производительность более смешанные: , . Идеально оптимизированная просьба может, при правильных обстоятельствах многозадач. Хотя на практике намного проще оптимизировать фокусированные просьбы, где вы можете отслеживать производительность вдоль 4 5 4 5 Легкость обмена знаниями Пояснение сложностей супер-помощи с 3 тысячами слов новому члену команды - это путешествие.И независимо от того, сколько вы объясняете, единственными, кто испытывает чувство к этому зверю, будут авторы, вносящие вклад. Система напоминаний, при которой каждая часть является относительно простой, может быть включена гораздо быстрее; инженеры начнут быть продуктивными раньше. Оптимизация затрат Используя различные модели в разных частях системы, можно добиться значительной экономии затрат и задержки, не влияя на качество ответа. Например, запрос, который определяет язык ввода, не должен быть особенно умным - он не требует вашей последней и самой дорогой модели. С другой стороны, запрос, который генерирует ответ на основе документации, может извлечь выгоду из встроенного , встроенной в высококачественные модели. сеть мыслей Подробнее Когда НЕ Модулировать Большинство программных приложений требуют безопасного добавления функций в течение длительного периода времени. Однако есть исключение. Приложения прототипов не предназначены для длительного поддержания; они не получат новых функций и не предназначены для высокой надежности. Так что не тратьте время на модуляцию при построении прототипов. На самом деле, большинство шаблонов в этой серии не применяются к приложениям прототипов. При построении прототипа - идите быстро, проверяйте критические неизвестности, а затем выбрасывайте код. Ещё одним соображением является знать, когда прекратить модулирование.Есть излишки для управления дополнительными запросами, и если выгоды от дальнейшей модулизации низки - вы должны прекратить дальнейшее разрушение системы. Инфраструктура для модуляции Если бы модулирование запросов было тривиальным - все бы это делали. Чтобы управлять многими запросами в системе, вам нужно инвестировать в инфраструктуру - без нее вы попадете в хаос. В самой простой версии вы можете представить себе монолитный запрос, который генерирует ответы при загрузке соответствующей документации через . . Умение быстро и безболезненно добавлять запросы стандартизированным способом. Особенно важно, когда запросы загружаются извне кодовой базы. см. Принцип II: Load Prompts Safe (If You Really Have to) Умение развертывать запросы автоматически. Умение быстро и безболезненно добавлять запросы стандартизированным способом. Особенно важно, когда запросы загружаются извне кодовой базы. см. . Принцип II: Load Prompts Safe (If You Really Have to) Умение быстро и безболезненно добавлять запросы стандартизированным способом. Особенно важно, когда запросы загружаются извне кодовой базы. см. . Принцип II: Загружать запросы безопасно (если вам действительно нужно) Принцип II: Загрузка стремится безопасно (если вы действительно должны) Умение развертывать просьбы автоматически. Умение развертывать просьбы автоматизированным способом. Умение регистрировать и контролировать входы/выходы отдельных запросов. Умение регистрировать и контролировать входы/выходы отдельных запросов. Умение добавлять автоматизированные тесты, которые охватывают запросы. Умение добавлять автоматизированные тесты, которые охватывают просьбы. Легкий способ отслеживать токен/$ расходы на различные просьбы. Удобный способ легко отслеживать токен/$ расходы на различные запросы. Исследование случая Давайте посмотрим, как строительство системы, основанной на генном ИИ, выполняется на практике с модуляцией и без нее. Без модуляции RAG РЖД Выглядит красиво и легко, не так ли? но по мере добавления функций возникают проблемы с этой архитектурой: Вы хотите ответить на сообщения в фиксированном списке языков, но не обращаться с другими. Для этого вы добавляете пробные инструкции, чтобы ответить только на определенные языки и получить LLM, чтобы вернуть поле «язык» для целей отчетности. Вы хотите, чтобы все разговоры были классифицированы. Добавьте поле «этикетка» к выходу проб. Когда пользователь недоволен - эскалируйте дело в человеческую поддержку. Добавьте переменную выхода «эскалировать_на_человек» вместе с инструкциями в пробке. Требуется перевод всех сообщений, отправ Вы хотите ответить на сообщения в фиксированном списке языков, но не обрабатывать другие. Для этого вы добавляете пробные инструкции, чтобы ответить только на определенных языках и получить LLM, чтобы вернуть поле «язык» для целей отчетности. Вы хотите отвечать на сообщения в фиксированном списке языков, но не обрабатывать другие. Для этого вы добавляете пробные инструкции, чтобы ответить только на определенных языках и получить LLM, чтобы вернуть поле «язык» для целей отчетности. Вы хотите, чтобы все разговоры были классифицированы. Добавьте поле «этикетка» к запросу выхода. Вы хотите, чтобы все разговоры были классифицированы. Добавьте поле «этикетка» к запросу выхода. Когда пользователь недоволен - эскалирайте дело к человеческой поддержке.Добавьте переменную выхода «escalate_to_human» вместе с инструкциями в проспекте. Когда пользователь недоволен - эскалируйте дело к человеческой поддержке.Добавьте переменную выхода «escalate_to_human» вместе с инструкциями в проспекте. Нужен перевод всех сообщений, отправленных для внутреннего аудита. Верните поле «переведенный» с сообщением на английском языке. Нужен перевод всех сообщений, отправленных для внутреннего аудита. Верните поле «переведенный» с сообщением на английском языке. Нужна защита, чтобы убедиться, что приложение никогда не спрашивает пользователей о своем местонахождении и о том, за кого они проголосовали на последних выборах. Нужна защита, чтобы убедиться, что приложение никогда не спрашивает пользователей о своем местоположении и о том, за кого они проголосовали на последних выборах. Необходимо резюме для каждой беседы? Добавьте поле «обзор» к каждому выходу. Необходимо резюме для каждой беседы? Добавьте поле «резюме» к каждому выходу. Возможно, вы начинаете видеть проблему - эта просьба теперь имеет шесть выходов. Тестирование будет кошмаром. Вы добавляете поддержку для другого языка, и внезапно ваше приложение начинает возвращать резюме на испанском языке вместо английского. Почему? Кто знает, выходы LLM нестабильны, поэтому изменение просьбы имеет непредсказуемые результаты. Поздравления - вы создали чудовище! со временем оно будет расти и причинять еще больше боли. С модуляцией И и полностью разделенная просьба классификации используется. Оригинальная большая просьба модулизована настолько, насколько практична. Prompt Chain Промп Chain Промпт Chain Одна просьба обнаруживает язык, одна обеспечивает перевод, одна определяет, расстроен ли пользователь и эскалирует до людей, ответная просьба генерирует ответ, guardrail проверяет соответствие ответа. выходы одной просьбы цепляются на входы следующей; традиционный код может работать между этими просьбами, чтобы, например, проверить языковую приемлемость, без участия LLM. Изменение все равно может нарушить данную просьбу, но риски значительно уменьшаются, потому что: Переход на одну часть не рискует нарушить каждую часть логики приложения. Тестирование намного проще, а шансы на ранний сбой высоки. Каждый запрос относительно прост, поэтому его легче понять, и вы менее склонны причинять вред с изменением. Изменения легче пересмотреть. Изменение одной части не рискует нарушить каждую часть логики приложения. Тестирование намного проще, и шансы на ранний сбой высоки. Каждый запрос относительно прост, поэтому его легче понять, и вы менее склонны причинять вред с изменением. Изменения легче пересматривать. Вы получаете все преимущества генного ИИ, но риски значительно уменьшаются.Плюс, вы можете использовать более дешевые модели для некоторых компонентов, чтобы сэкономить деньги. Заключение Модуляризация позволяет изолировать ошибки, улучшить поддержание и построить более надежную систему. Даже умеренно крупные приложения будут иметь десятки, если не сотни, компонентных запросов.Разделить запросы до тех пор, пока каждый из них не выполнит одну задачу, и до тех пор, пока преимущества дальнейшей модуляризации не будут превышены дополнительной оперативной сложностью.Модулирование ваших запросов является необходимостью, если ваши приложения, основанные на ИИ, должны оставаться надежными, и продолжать добавлять функции в долгосрочной перспективе. Если вам понравилась эта серия - подпишитесь на другие сообщения.