Статьи

Вероятностный интеллект, детерминированное управление

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

Я пишу это как инженер, проработавший на платформах, где дорогой частью была не идея. Это было поддержание системы в рабочем состоянии в обычный день. В Amazon Web Services и Databricks работа заключалась в том, чтобы доставить данные туда, где их может использовать программа, и сделать эту программу достаточно надёжной, чтобы кто-то был готов поставить на неё рабочий процесс. Агенты сейчас не проходят этот тест особым образом. Они беглые. Они нестабильны.

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

Модель выполняет работу, которая не является генерацией

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

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

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

Беглость — это не решение

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

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

Звук уверенности — это не доказательство. Беглое завершение может быть неправильным так, как неправильная метка не может быть, потому что неправильная метка — это по крайней мере член набора, который вы можете оценить. Абзац нужно интерпретировать, прежде чем вы узнаете, был ли он вообще решением. Эта интерпретация — вторая система, обычно непроверенная, сидящая между моделью и действием.

Это различие, которое меня волнует больше, чем необработанное качество модели. Лучшая генерация улучшает открытую работу. Она не превращает генерацию в надёжный способ выбора среди опций, которые вы уже перечислили. Это разные вычислительные проблемы. Рассмотрение их как одной проблемы — вот почему агент может выглядеть завершённым на демонстрации и всё ещё быть плохой вещью для доверия с одним и тем же действием дважды.

Пространство выходов уже было закрыто

Большая часть того, что решает агент, никогда не была открытой проблемой.

Классифицировать намерение. Выбрать рабочий процесс. Выбрать модель или сколько вычислений потратить. Выбрать, какой контекст в области видимости. Ранжировать кандидатов. Одобрить или отклонить. Ответить на вопрос, имеющий форму разрешения. Решить, нужно ли эскалировать. Обнаружить, что известный рабочий процесс уже применяется. Сообщить уверенность. Каждое из этих имеет ограниченный набор действий. Набор может быть большим. Это всё ещё набор. Если ваш код не может перечислить законные выходы, у вас нет процедуры решения. У вас есть надежда, что абзац будет разбираемым.

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

Три вида вычислений

Я начал разделять работу на три плоскости. Названия мои. Разделение старше названий. Компилятор уже различает поиск от правила. Бизнес-процесс уже различает суждение от процедуры. Стеки агентов свернули их, потому что одна модель могла имитировать все три.

Генеративная плоскость. Языковые модели, используемые для новых, двусмысленных, исследовательских рассуждений. Работа открыта. Выход — новый текст, новый план, черновик, ответ, которого не было в меню. Эта плоскость вероятностна и относительно дорога в задержке, деньгах и дисперсии. Это место, куда система должна идти, когда ответ не является членом набора, который вы уже записали. Это не должна быть плоскость по умолчанию для всего, чего касается система.

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

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

Одна из них существует в открытом доступе. Laya — это небольшая модель решений с открытым исходным кодом, выпущенная в сентябре: вызывающая сторона предоставляет состояние и типизированный вопрос, и она возвращает выбор, оценку или вероятность, никогда не абзац. Я тренировал и тестировал её именно для этой плоскости. Это форма, которая меня волнует: компонент, который может быть неуверенным внутри набора действий, который вызывающая сторона зафиксировала. Классификаторы давно имели такую форму. Идея плоскости решений. Реализация должна быть тем, что достаточно точно, достаточно дёшево и достаточно проверяемо для этого конкретного решения.3

Laya также причина, по которой следующий раздел не теоретический. В моём последнем раунде тренировки её первичная точность повысилась с 58 до 64 процентов, а точность переноса — с 71 до 74 процентов. Улучшение было измеримо и не статистически убедительно. Её калибровка была недостаточно хорошей для маршрутизации: ни один порог уверенности не прошёл предопределённый планку качества с достаточным количеством принятых примеров позади, поэтому при замороженной резервной политике её автоматическое покрытие было нулевым. Отдельная диагностика показала, что она может выучить механику синтетической задачи и уверенно ошибиться во время этого. Кандидат не был повышен. Он работает в тени, его предсказания записываются рядом с окончательными результатами, и ничто из того, что он говорит, не может авторизовать инструмент, выход или существенное действие. Это не отказ плоскости решений. Это работа плоскости решений: компонент, который может быть неуверенным, удерживаемый внутри правил, мимо которых он не может побеседовать.

Детерминированное выполнение. Рабочие процессы, механизмы политик, API, базы данных, конечные автоматы, разрешения, оркестровка, валидация, тесты. Если шаг — это снять со счета, написать строку, отказать инструменту или запустить путь возврата, который мы уже отправили, языковая модель не должна быть в цикле. Обычное ПО — это правильный инструмент. Это был правильный инструмент до всего этого, и он остаётся правильным инструментом везде, где процедура известна и побочный эффект реален. Не вызывайте генеративную модель для шага, который может принадлежать функции.

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

Вероятность может информировать политику. Она не является одной.

Классификация может быть вероятностной. Правило, которое действует на основе классификации, не должно быть.

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

Низкая уверенность — это не более мягкий «да». Это ветвление: спросить более сильную модель, спросить человека или остановиться. Это ветвление также код. Откалиброванная вероятность полезна, потому что код может её прочитать. Некалиброванная вероятность — это число с манерами измерения. Я не стал бы закрывать побочный эффект на ней, пока кто-то не проверил калибровку против трафика, который система фактически видит. Я сделал эту проверку один раз для Laya, и она не прошла. Вот почему Laya ничего не закрывает.4

type Plane = "generate" | "decide" | "execute";

// A sketch of the split, not a system I ship.
function plane(step: { openEnded: boolean; workflowKnown: boolean }): Plane {
  if (step.workflowKnown) return "execute";
  if (step.openEnded) return "generate";
  return "decide";
}

// The probability is an input. The permission is the function.
function permit(actionIsAllowed: boolean, confidence: number, threshold: number): boolean {
  return actionIsAllowed && confidence >= threshold;
}

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

Не переоткрывайте рабочий процесс, который у вас уже есть

Когда задача впервые появляется, генерация часто — честный инструмент. Никто не написал процедуру. Модель исследует. Человек её исправляет. Что-то работает или нет, и вы узнаёте что-либо.

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

Есть тщеславие в переоткрытии. Агент, который это выясняет снова, выглядит умным. Функция, которая запускает процедуру, выглядит как ПО, что означает, что выглядит как что-то, что вы могли построить без модели. Этот внешний вид — плохая причина держать модель на критическом пути. Модель — это как вы нашли процедуру. Это не трофей, который вы оставляете там.

Миграция

Цикл, который я хочу, скучен, и это рекомендация.

новое рассуждение → повторяющийся паттерн → рабочий процесс → узкое решение → детерминированное выполнение

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

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

То, что не должно мигрировать, — это остаток, который ещё новый. Рабочий процесс, который устарел, хуже модели, которая замечает перемены. Обнаружение того, что паттерн нарушился, само по себе узкое решение. Оно принадлежит плоскости решений, с путём обратно к генерации или к человеку, когда уверенность плохая. Цикл — это не односторонний храповик в сторону жёсткости. Это способ перестать платить цену исследования за работу, которая больше не является исследованием.

Почему разделение имеет значение, когда запросов больше одного.

Задержка. Ограниченное решение не должно транслировать абзац, прежде чем система узнает, в какую сторону идти. Дорогая модель просыпается, когда работа действительно открытая. Человек, ожидающий известного рабочего процесса, должен ждать самого рабочего процесса, а не модели, вспоминающей рабочий процесс в виде прозы.

Стоимость. Токены, потраченные на переделывание известного пути, — это токены, которые вы платите на каждый запрос, пока отказываетесь записать путь. Генеративная плоскость остаётся дорогой. Это приемлемо, когда это редко по сравнению с работой. Это структурная стоимость, когда это сама работа.

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

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

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

Что я не говорю.

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

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

Я не описываю продукт, сеть или компанию. Я описываю разделение, которое я хочу в системах, которым я готов доверить повторяющееся действие. Следующий вопрос — что происходит, когда генерация, решение и выполнение больше не находятся на одной машине. Это проблема управления, прежде чем это проблема топологии. Я рассматриваю это в Capacity is not consent и Govern the boundary.

Примечания.

Примечания

  1. Наблюдение, не опрос. Я описываю обвязки агентов, против которых я строил и которые читал: одну генеративную модель, просили планировать, выбирать инструменты и судить, может ли она действовать. У меня нет опубликованного подсчёта того, как часто производственные системы это делают. Считайте распространённость практикой, пока кто-нибудь её не измерит. ↩

  2. Гипотеза. Размер ограниченной доли зависит от продукта, и я его не подсчитал. Архитектурный тест — это часть, которую я сохраню, даже если доля меньше, чем я думаю: если выходы можно перечислить, не просите генератор их придумывать. ↩

  3. Абстракция плоскости решений — это утверждение. Классификаторы, регрессоры, небольшие модели решений, ограниченное декодирование, классификация логитов декодера и типизированная модель решений — это карта паттернов, а не сравнение, которое я запустил. Laya — это открытый экземпляр типизированной формы: состояние на входе; выбор, оценка или вероятность на выходе; без прозы. Это модель с 421 миллионом параметров от Convai Innovations, опубликованная под Apache 2.0, с исходным кодом и весами на GitHub. Цифры в тексте из моего последнего цикла обучения на ней, измеренные по критериям качества, установленным до запуска, и кандидат не был продвинут. Закрытый экземпляр, который назвал категорию, — это то, что TypeSafe называет System One моделью, под названием Jev. Я её не измерял, и это эссе ничего из их цифр не использует. Классификация логитов декодера, чтение распределения следующего токена по фиксированному набору меток, нуждается в цитировании, прежде чем это эссе что-нибудь скажет о её точности относительно обученного классификатора. Это здесь не говорит. ↩

  4. Принцип: политика остаётся детерминированной, даже когда классификация вероятностна. Пример уверенности иллюстративен. Предупреждение о калибровке теперь имеет одну точку данных за ним: диагностика обучения Laya, в которой модель выучила синтетическую задачу и стала чрезмерно уверенной в неправильных ответах. Одна модель — это не базовая ставка, и я не стану утверждать, как находку, как часто пороги агентов подгоняются на неправильном. Операционное правило стоит без этой находки: не ограничивайте побочный эффект вероятностью, которую вы не проверили против трафика, который вы действительно видите. ↩

  5. Цикл миграции — это архитектурный принцип. Утверждение, что каждый этап дешевле, быстрее и предсказуемее, — это гипотеза о системах при повторении. Я не цитирую модель затрат. ↩

  6. Задержка, стоимость, надёжность и управление следуют из разделения, если разделение реально. Пункт параллелизма — это предсказание о флотах. Я хотел бы трассировки из реальной многопользовательской системы, прежде чем высказать это как находку. ↩