YouTube Video — Transcript

Дмитрий Березинский рассказывает о важности роутинга и управления контекстом для оптимизации работы агентов на базе языковых моделей.

Key Takeaways

  • Роутинг моделей позволяет существенно снизить стоимость запросов без значительной потери качества.
  • Управление контекстом и правильный выбор модели важнее, чем использование только самой дорогой фронтир модели.
  • Кэширование и наблюдаемость критичны для эффективной работы агентов и контроля затрат.
  • Для актуализации знаний модели необходимы внешние источники данных, такие как RAG или большие контекстные окна.
  • Инженерный подход к выбору между RAG и длинным контекстом зависит от конкретных требований и ресурсов.

Summary

  • Стоимость запросов к фронтир модели может быть очень высокой, что требует оптимизации.
  • Интеллект агента заключается не только в модели, но и в инфраструктуре вокруг неё: роутинг, ретривол и управление контекстом.
  • Роутинг позволяет выбирать между дорогими и дешевыми моделями, снижая затраты при сохранении качества.
  • Классификатор запросов решает, какую модель вызвать, что помогает экономить и улучшать качество.
  • Важно учитывать особенности кэша при переключении моделей, чтобы не потерять эффективность.
  • Наблюдаемость и метрики необходимы для контроля качества роутинга и затрат.
  • Модель без актуальных знаний ограничена датой обучения, поэтому нужны внешние источники данных.
  • Retrieval-Augmented Generation (RAG) — подход с использованием векторных баз для подстановки релевантных фрагментов в контекст.
  • Альтернативный подход — использование очень больших контекстных окон для загрузки всей информации напрямую.
  • Выбор между RAG и длинным контекстом зависит от сложности задачи и технических возможностей.

Full Transcript — Download SRT & Markdown

00:00
Speaker A
3 доллара, столько стоит одна задача, и я агент, если отправлять каждый запрос на фронтир модель с полным контекстом.
00:07
Speaker A
3 доллара, кажется, мелочь, агент делает 10 вызовов за задачу, 1000 задач в день.
00:12
Speaker A
90.000 в месяц, и мы с вами платим за каждый токен, за каждый кусок текста, который запихнули в контекстное окно, за каждую итерацию цикла, где это контекстное окно пересчитывается заново.
00:24
Speaker A
А значит, нам критически важно понимать, что именно помещать в это окно, какую модель вызывать, дорогую или дешёвую, что достать из памяти, всё или только нужное, как не раздуть контекст до потолка, и когда агенту стоит думать глубоко, а когда хватит быстрого ответа.
00:41
Speaker A
Всем привет, меня зовут Дмитрий Березинский, и это вторая часть серии Анатомия агентов, первый мы вскрыли скелет, пайплайн, контекст, циклы, инструменты, сегодня мозг.
00:51
Speaker A
Ну что, поехали?
00:55
Speaker A
Ключевой тезис этой части: интеллект агента не в модели, а в инфраструктуре вокруг модели, правильный роутинг, точечный ретривол и управление контекстом, и это важнее, чем фронтир модель.
01:06
Speaker A
Сейчас же разберёмся, почему, и начнём мы с вами с роутинга.
01:10
Speaker A
Сколько моделей доступно на рынке?
01:15
Speaker A
Десятки, сотни, и каждый месяц появляются новые.
01:20
Speaker A
А цены отличаются не на проценты, в разы, дешёвая модель и дорогая, разница может быть в 30, 50, 100 раз за один и тот же запрос.
01:29
Speaker A
И какой же выбрать?
01:34
Speaker A
Кажется, что ответ подороже, чтобы она точно работала и хорошо отвечала.
01:40
Speaker A
И шлём мы туда все запросы подряд.
01:44
Speaker A
Сколько сахара добавить в кофе?
01:47
Speaker A
Отправляем дорогую модель.
01:48
Speaker A
Рефакторинг архитектуры?
01:50
Speaker A
Тоже отправляем дорогую модель.
01:52
Speaker A
Вернёмся к нашему примеру бариста, который у нас проходит через серию всех наших видео.
01:58
Speaker A
Сколько стоит латте?
02:01
Speaker A
Это обычный лукап, и дешёвая модель ответит быстро и качественно.
02:05
Speaker A
А вот проанализируй предпочтения команды за 3 месяца, составь заказ на ретро с учётом аллергии, бюджета и погоды.
02:13
Speaker A
Вот это уже сложный запрос, и возможно, его стоит отправить фронтир модели.
02:17
Speaker A
Зачем же за них платить одинаково?
02:19
Speaker A
Идея простая: маленький классификатор смотрит на запрос и решает.
02:23
Speaker A
Отправить на дорогую модель или на дешёвую.
02:27
Speaker A
Это как сортировщик на почте.
02:31
Speaker A
Взвесил, посмотрел адрес и отправил уже в нужное окно.
02:35
Speaker A
Исследователи из Беркли формализовали это в роутер LLM, это Open Source Framework.
02:43
Speaker A
Результат - снижение стоимости более чем вдвое при сохранении 95% качества.
02:49
Speaker A
И здесь можно задуматься, ну ладно, роутинг - это понятно.
02:55
Speaker A
Но дешёвая же модель, она глупее, и качество у нас очень сильно упадёт, и эти 5% для нас важны.
03:02
Speaker A
Но здесь нам надо уже понимать, что для нас важно.
03:08
Speaker A
Дать вот это максимальное качество или, возможно, всё-таки попасть в нужный бюджет и сэкономить деньги.
03:14
Speaker A
И казалось бы, что такого сложного в роутинге?
03:18
Speaker A
Давайте разбираться.
03:20
Speaker A
Как его реализовать для нашего с вами агента?
03:25
Speaker A
Итак, у нас есть с вами наш запрос.
03:28
Speaker A
Какие же дальше у нас с ним будут происходить шаги?
03:32
Speaker A
Давайте посмотрим, что нам надо сделать первым.
03:38
Speaker A
На этом этапе мы смотрим на тип входящих данных, что же к нам приходит: картинки, аудио или просто текст.
03:46
Speaker A
И на основе этого мы сразу же можем отсеять часть моделей, либо включить те, которые смогут работать с этим типом контента.
03:52
Speaker A
Дальше, шаг второй.
03:57
Speaker A
Шаг второй - модель классификатор.
04:03
Speaker A
Здесь у нас может быть с вами небольшая модель или модель подороже, или вообще мы можем с вами оттюнить модель на наших данных.
04:10
Speaker A
Всё зависит от того, что мы можем туда поставить.
04:13
Speaker A
Основная её цель - это возвращать ту, какую модель дальше вызвать.
04:20
Speaker A
Ну и шаг третий.
04:24
Speaker A
Это будет фулбек.
04:25
Speaker A
Если что-то не так произошло на втором шаге, у нас модель не уложилась по времени, или вернула какой-то непонятный ответ, или не смогла определиться.
04:33
Speaker A
То здесь мы можем с вами сделать простые правила по ключевым словам.
04:37
Speaker A
Это как запасной генератор: не очень красиво, шумно, но свет есть.
04:43
Speaker A
Также мы можем сюда поставить просто выбор модели по умолчанию.
04:49
Speaker A
И как мы видим, у нас есть две детерминированные части.
04:57
Speaker A
И одна недетерминированная - наш классифаер.
05:00
Speaker A
И для него мы как раз-таки должны дать описание всех тех моделей, на которые он будет смотреть и выбирать.
05:07
Speaker A
Поэтому на основе входящего запроса наш классифаер должен определить, какая же модель для него подходит.
05:15
Speaker A
И качество описания этих моделей, оно напрямую влияет на качество нашего с вами роутинга.
05:23
Speaker A
И казалось бы, этот роутинг нужен для того, чтобы экономить, выбирать дорогую или более дешёвую модель.
05:30
Speaker A
Но если мы с вами приходим к каким-то сложным агентам, у нас могут быть специализированные модели под определённые задачи.
05:40
Speaker A
Может, мы сделали файн-тюнинг или определили, что разные модели по-разному работают.
05:46
Speaker A
С определёнными запросами, и как раз-таки в этом случае наш классифаер даст нам не только экономию.
05:53
Speaker A
Ну и, возможно, увеличение качества за счёт выбора правильной модели под конкретный запрос.
05:59
Speaker A
Но есть один нюанс, который часто не рассматривают.
06:02
Speaker A
Когда думают о том, что будут использовать роутер.
06:06
Speaker A
И это самый настоящий подводный камень.
06:09
Speaker A
Когда наш роутер переключает наши модели, то нам надо с вами понимать.
06:16
Speaker A
А есть ли у нас с вами сейчас кэш?
06:19
Speaker A
Может быть, у нас идёт довольно-таки длинный диалог с пользователем, и сейчас мы кэш очень эффективно используем.
06:26
Speaker A
И наши запросы уже экономически эффективны.
06:29
Speaker A
Так вот, у разных провайдеров это может работать по-разному.
06:34
Speaker A
Где-то этот кэш автоматически, где-то его надо включить через API и платить за это.
06:39
Speaker A
И время жизни при этом у кэша разное.
06:42
Speaker A
Но принцип здесь один: если вы переключили модель посреди диалога, кэш предыдущий может быть потерян.
06:49
Speaker A
А может, переключение на более дешёвую модель с учётом кэша дорогой теперь стоит дороже.
06:56
Speaker A
И это значит, не делать роутер.
07:01
Speaker A
Это значит, что вам надо считать и смотреть, как и когда вы можете переключать.
07:07
Speaker A
И здесь есть пересечение с первой частью.
07:12
Speaker A
Помните, мы закончили на наблюдаемости.
07:14
Speaker A
Без неё наш роутинг слепой.
07:20
Speaker A
И вы не знаете, правильно ли наш классификатор выбрал модель?
07:25
Speaker A
Сколько стоит средний запрос на каждую модель?
07:29
Speaker A
Сколько мы теряем на переключениях кэша?
07:33
Speaker A
Роутинг без метрик - это надежда, но не инженерия.
07:38
Speaker A
Поэтому наблюдайте за каждым выбором: какая модель, почему, сколько стоило, попали ли в кэш?
07:44
Speaker A
Без этого будет тяжело добиться хорошего качества.
07:47
Speaker A
Роутинг выбирает модель.
07:50
Speaker A
Но модель без знаний - это как у нас врач без карты пациента.
07:55
Speaker A
Он, скорее всего, умный.
07:58
Speaker A
Очень хочется в это верить.
08:00
Speaker A
Но каждый раз, когда вы с ним общаетесь, он не знает, что же у вас там было.
08:05
Speaker A
Так вот, откуда наш агент берёт знания?
08:11
Speaker A
Давайте вспомним, что наши языковые модели, они заморожены во времени.
08:15
Speaker A
Они знают всё о мире до даты обучения, и ничего о том, что произошло недавно.
08:21
Speaker A
Ничего о ваших внутренних документах, вашей кодовой базе, ваших клиентах.
08:26
Speaker A
И если вы хотите, чтобы агент знал что-то конкретное, вам нужно эти знания до него доставить.
08:32
Speaker A
И здесь вопрос: как?
08:34
Speaker A
Здесь у нас есть с вами несколько интересных мнений.
08:38
Speaker A
И первое - это рак.
08:40
Speaker A
Retrieval-Augmented Generation.
08:43
Speaker A
Это инженерный подход, когда мы нарезаем документы на фрагменты, превращаем векторы, складываем в базу.
08:51
Speaker A
И когда пользователь спрашивает, ищем релевантные фрагменты и подставляем в контекст.
08:57
Speaker A
Модель видит не всё, только то, что мы с вами нашли.
09:01
Speaker A
И второй подход - это длинные контексты.
09:05
Speaker A
Берём документы и запихиваем целиком в контекстное окно.
09:10
Speaker A
Без базы, без эмбедингов, без поисков.
09:14
Speaker A
Просто модель сама разбирается.
09:18
Speaker A
У неё же миллионы токенов.
09:20
Speaker A
Она же справится.
09:21
Speaker A
И это тот выбор, перед которым мы часто с вами стоим.
09:25
Speaker A
Давайте разберёмся, нужен ли нам с вами рак или всё-таки длинный контекст сейчас решает все проблемы.
09:31
Speaker A
С чего же начались все эти обсуждения?
09:36
Speaker A
А с того, что сейчас контекстные окна стали огромными.
09:40
Speaker A
Мы можем с вами засовывать туда миллион токенов.
09:43
Speaker A
Это 700.000 слов.
09:45
Speaker A
То есть туда влезает вся серия томов Властелин колец, и ещё хоббит к ней в придачу, и останется место.
09:53
Speaker A
И зачем же тогда нам нужен весь этот рак стек?
09:57
Speaker A
Все эти чанки, эмбединги, векторные базы, различные подходы, технологии для того, чтобы всё это качественно выбирать, тестировать, смотреть.
10:05
Speaker A
Это невероятно сложно.
10:06
Speaker A
Если же мы можем просто запихнуть всё в контекстное окно.
10:10
Speaker A
И это очень интересный вопрос, над которым стоит задуматься.
10:15
Speaker A
И давайте подойдём к этому инженерно.
10:20
Speaker A
Рассмотрим плюсы, минусы разных подходов, поймём, какие у нас есть трейдофы и там, и там, и что же мы можем с вами использовать.
10:28
Speaker A
И первое, почему мы будем оценивать - это простота.
10:31
Speaker A
Итак, рак с точки зрения простоты, он невероятно сложен, потому что нам надо с вами развернуть специализированные базы данных.
10:39
Speaker A
Выбрать стратегии того, как же мы будем нарезать эти данные.
10:43
Speaker A
Понять, какие модели для эмбедингов подходят, может быть, нам надо их тюнить.
10:49
Speaker A
Потом сделать ранжирование, делать синхронизации, потом мы должны разобраться, как же нам получать максимально эффективно нужные данные из рага.
10:56
Speaker A
И это очень много различных движущихся частей.
11:00
Speaker A
Много мест, где что-то может сломаться.
11:05
Speaker A
А с точки зрения контекста, наш длинный контекст взял документ, положил в промт.
11:10
Speaker A
И всё.
11:11
Speaker A
Нету ни стека, ни поломок.
11:16
Speaker A
Нам не надо всё это разворачивать.
11:20
Speaker A
Мы просто работаем с контекстом.
11:24
Speaker A
И второе - это полнота предоставляемых данных.
11:27
Speaker A
Рак у нас ищет по математическим представлениям текста.
11:31
Speaker A
Иногда он может не находить, ответ у нас с вами был в данных, но модель его не увидела, потому что поиск наш промахнулся.
11:39
Speaker A
И здесь мы с вами даже не узнаем о том, что мы не поместили в контекст то, что у нас есть.
11:45
Speaker A
С длинным же контекстом всё наоборот.
11:48
Speaker A
Модель видит всё, и ей негде промахнуться.
11:53
Speaker A
Третий, который вытекает отсюда же.
11:57
Speaker A
Это у нас есть с вами иногда задачи, где нам нужна полная картина.
12:01
Speaker A
Допустим, у нас есть документ с требованиями и документ с релизными заметками.
12:07
Speaker A
И был вопрос: какие требования по безопасности пропущены в релизе?
12:12
Speaker A
Рак может найти фрагменты по безопасности в документах, но при этом он может что-то пропустить.
12:19
Speaker A
Для того, чтобы модель увидела всё, ей надо два документа целиком.
12:26
Speaker A
Поэтому в рак у нас возможен пропуск.
12:29
Speaker A
А контекст у нас с вами видит всё.
12:31
Speaker A
И это у нас довольно сильные аргументы в пользу контекста.
12:35
Speaker A
Если на этом остановиться, то можно вообще выкинуть рак и больше никогда его не использовать.
12:40
Speaker A
Но давайте посмотрим на экономику.
12:42
Speaker A
У нас есть с вами плата за перечитывание.
12:45
Speaker A
И это деньги.
12:47
Speaker A
Длинный контекст означает, что модель будет перечитывать все наши документы при каждом запросе.
12:55
Speaker A
И нам придётся платить за этот документ много раз: сегодня, завтра, послезавтра.
13:02
Speaker A
Всегда, когда мы будем использовать этот документ и помещать его в контекст.
13:08
Speaker A
Нам придётся платить за то, что модель будет его читать.
13:12
Speaker A
При этом рак платит за обработку документа один раз, в момент, когда мы его загрузили.
13:18
Speaker A
Да, вы скажете, кэширование документов снимает эту проблему.
13:21
Speaker A
Но это только для одной конкретной сессии.
13:25
Speaker A
Ведь эти документы мы будем использовать не один раз.
13:28
Speaker A
А множество сессий, множество запросов.
13:30
Speaker A
А значит, и кэш нам здесь с вами не помогает.
13:34
Speaker A
Следующий пункт назовём его игла в стоге сена.
13:36
Speaker A
И она нам говорит про качество на длинных контекстах.
13:40
Speaker A
Помните про Lost in the Middle из Стэнфорда?
13:44
Speaker A
Когда контекст растёт до сотен тысяч токенов, внимание модели размывается.
13:50
Speaker A
А это значит, что какой-то конкретный параграф в середине 2.000-страничного документа модель может его даже не заметить или начать галлюцинировать детали из окружающего текста.
13:59
Speaker A
Раньше в этом плане убирает стог сена и даёт модели только иголки.
14:05
Speaker A
А это значит, что здесь будет намного меньше шума и точнее ответ.
14:08
Speaker A
Да, новые модели значительно снизили выраженность этого эффекта, но его полностью пока не устранили.
14:15
Speaker A
А это значит, что нам надо с вами об этом продолжать думать.
14:20
Speaker A
И последнее, что мы с вами разберём - это масштаб.
14:22
Speaker A
Миллион токенов звучит впечатляюще.
14:24
Speaker A
Но если ваша база знаний гигантская, это может быть терабайты, гигабайты, то попробуйте запихнуть её в это контекстное окно.
14:32
Speaker A
И это у нас с вами может не получиться.
14:35
Speaker A
Поэтому нам с вами нужен какой-то поисковый слой, который отфильтрует ненужное и оставит только то, что нам надо для конкретного запроса.
14:42
Speaker A
А это именно то, что делает наш с вами рак.
14:47
Speaker A
А это значит, для рага подходит, что мы можем сюда запихнуть любой объём нашей базы знаний.
14:52
Speaker A
При этом, когда у нас длинное контекстное окно, мы не можем сюда добавить всю нашу базу знаний.
15:00
Speaker A
Так что же нам с вами выбрать?
15:03
Speaker A
Рак или длинное контекстное окно?
15:06
Speaker A
Если у нас с вами ограниченный выбор документов и задача на глобальное рассуждение.
15:12
Speaker A
То это будет длинный контекст.
15:15
Speaker A
Если же у нас гигантская корпоративная база знаний, у нас тысячи документов, у нас динамические данные.
15:24
Speaker A
И у нас есть способность развернуть и поддерживать рак качественно.
15:30
Speaker A
То однозначно мы с вами выберем рак.
15:33
Speaker A
Но в реальности сейчас чаще всего мы объединяем и рак, и длинное контекстное окно.
15:40
Speaker A
Рак у нас с вами находит релевантное.
15:44
Speaker A
Длинное контекстное окно позволяет положить достаточно для рассуждений.
15:49
Speaker A
Поэтому в зависимости от ситуации, в которой мы находимся, мы можем выбирать одно, другое.
15:55
Speaker A
Или и то, и другое.
15:57
Speaker A
Мы можем взять лучшее из обоих миров.
16:00
Speaker A
И на этот счёт уже есть исследования, когда в контекстное окно запихивают всё, что только возможно.
16:08
Speaker A
Или добавляют туда нужные кусочки при помощи рага.
16:13
Speaker A
Тем самым контекстное окно уменьшается в этих исследованиях в четыре раза с рагом.
16:18
Speaker A
И как результат, 90% снижение задержки.
16:21
Speaker A
С 70 секунд с полным контекстным окном до полутора.
16:28
Speaker A
Но что же с качеством?
16:30
Speaker A
Авторы нам пишут: полный контекст даёт небольшое преимущество в точности.
16:34
Speaker A
Но при этом рак даёт нам конкурентное качество при меньших затратах и большей скорости.
16:39
Speaker A
Поэтому нам с вами надо будет взвешивать, что же для нас с вами важнее.
16:43
Speaker A
Из тех инструментов, которые мы можем использовать.
16:48
Speaker A
По поводу того, как устроен рак пайплайн, нарезка документов, эмбединги, векторные базы, поиск, я уже подробно разбирал в отдельном видео.
16:57
Speaker A
Ссылка будет в описании.
16:59
Speaker A
Здесь мы не будем повторяться и смотреть уже на конкретные техники.
17:03
Speaker A
Но есть и моменты, которые мы разбирали немного в прошлом видео, и те, которые часто забываются, когда мы используем с вами рак.
17:11
Speaker A
И первое - это обогащение запроса пользователя.
17:15
Speaker A
Если пользователь напишет нашему с вами баристе: а покрепче.
17:21
Speaker A
Это всего лишь два слова и никакого контекста.
17:24
Speaker A
Если мы с вами отправим этот запрос в наш рак, то, скорее всего, мы получим какой-то мусор.
17:29
Speaker A
Но если перед фазой рага мы поставим обогащение нашего запроса и посмотрим контекст предыдущего сообщения.
17:39
Speaker A
Или о чём вообще наш пользователь до этого общался.
17:42
Speaker A
То мы можем получить запрос.
17:46
Speaker A
Пользователь хочет более крепкий кофе.
17:50
Speaker A
Предыдущий заказ был капучино.
17:52
Speaker A
И теперь наш рак найдёт всё правильно.
17:55
Speaker A
И второй, не менее важный - это фидбек луп.
18:00
Speaker A
Это то, что делает рак живым.
18:03
Speaker A
То есть рак даёт нам с вами ответ.
18:06
Speaker A
Мы смотрим за реакцией пользователя.
18:10
Speaker A
И на основе реакции обновляем наши базы.
18:15
Speaker A
И это нам помогает давать более точный ответ в следующий раз.
18:18
Speaker A
Как на примере нашего бариста.
18:22
Speaker A
Если пользователь одобрил заказ, то вес предпочтения растёт.
18:27
Speaker A
Если же пользователь отклонил, то вес падает.
18:30
Speaker A
А если пользователь написал: я теперь предпочитаю чай.
18:34
Speaker A
То это у нас будет новая запись.
18:36
Speaker A
Но как же это реализовать?
18:38
Speaker A
И вот эта реакция пользователя, она у нас может идти как фоновый процесс, который обновляет наши базы.
18:43
Speaker A
Здесь главное - не блокировать нашего пользователя при работе с основным потоком.
18:48
Speaker A
Поэтому помните, что рак без обратной связи - это отличная база.
18:53
Speaker A
Рак с обратной связью - это уже обучающая система.
18:56
Speaker A
Но здесь возникает вопрос: рак даёт нам знания.
18:59
Speaker A
Но знания - это очень общее слово.
19:03
Speaker A
Какие именно?
19:05
Speaker A
Когда нам надо работать с этой реакцией?
19:07
Speaker A
Что вообще мы можем здесь делать?
19:09
Speaker A
Потому что предпочтения пользователей - это одно.
19:13
Speaker A
Уроки из прошлых ошибок - это другое.
19:16
Speaker A
Текущий контекст задачи - это третье.
19:19
Speaker A
У агента не одна память, их четыре.
19:22
Speaker A
Почему и какие они?
19:24
Speaker A
Давайте продолжать.
19:28
Speaker A
У нашего с вами агента есть память.
19:34
Speaker A
Отлично.
19:35
Speaker A
Но какая?
19:37
Speaker A
Ну, Memory.
19:38
Speaker A
Но какая конкретная?
19:40
Speaker A
Это как сказать, у компьютера есть хранилище.
19:46
Speaker A
Регистры процессора, оперативная память, SSD, облачный архив.
19:50
Speaker A
Четыре абсолютно разных типа с разным временем жизни и назначением.
19:55
Speaker A
У агента тоже четыре.
19:57
Speaker A
Эту классификацию формализовали исследователи из Принстона в фреймворке COALA Cognitive Architecture for Language Agents.
20:05
Speaker A
Сегодня её используют все основные фреймворки.
20:08
Speaker A
И каждый тип решает свою задачу.
20:10
Speaker A
Давайте разберём.
20:11
Speaker A
И первое у нас будет процедурная.
20:16
Speaker A
Процедурная память - это то, как делать.
20:20
Speaker A
Здесь будет наш системный промт плюс описание инструментов.
20:24
Speaker A
Это не база знаний, это инструкция.
20:28
Speaker A
Как должностная инструкция у нас с вами на работе.
20:31
Speaker A
И её обновляют осознанно между сессиями, не на лету.
20:36
Speaker A
Внутри сессии она стабильна.
20:42
Speaker A
Итак, инструкция у нас с вами есть.
20:46
Speaker A
Но откуда агент знает факт, кто что любит, что написано в документации?
20:52
Speaker A
Какая у клиента политика возврата?
20:55
Speaker A
И это будет семантическая память.
21:00
Speaker A
И это то, что знает наш агент.
21:02
Speaker A
Здесь как раз-таки и будет наш с вами рак.
21:04
Speaker A
Это долгосрочные знания, которые обновляются по мере поступления новых.
21:09
Speaker A
Поэтому для нашего агента баристы то, что кто-то любит капучино, кто-то любит на овсяном молоке, а кто-то пьёт чай.
21:16
Speaker A
Или для нашей разработки у нас может быть прописано, что микросервис платежей у нас написан на чистой архитектуре, на стеке Go с использованием определённых баз данных.
21:23
Speaker A
Как аналог - это справочник.
21:26
Speaker A
И он не статичный, он живой, который постоянно пополняется и корректируется.
21:33
Speaker A
Факты у нас теперь с вами есть.
21:35
Speaker A
Давайте вернёмся к нашему агенту баристе и подумаем, а кто же учит нашего агента на ошибках?
21:41
Speaker A
Справочник нам говорит, что Костя любит латте.
21:44
Speaker A
А кто помнит, что в прошлый вторник забыли его аллергию на орехи?
21:50
Speaker A
И у нас был с вами инцидент.
21:53
Speaker A
И в этом нам с вами поможет эпизодическая память.
21:59
Speaker A
Это то, что было, это конкретные эпизоды с результатами.
22:02
Speaker A
И это самый недооценённый тип.
22:06
Speaker A
В индустрии очень часто его игнорируют.
22:09
Speaker A
Как пример, LangChain.
22:11
Speaker A
Они именно так и пишут: единственный тип памяти из COALA, который у нас отсутствует - это эпизодик.
22:16
Speaker A
И поэтому большинство продакшн систем.
22:18
Speaker A
Особенно, которые работают на LangChain, они его не реализуют.
22:21
Speaker A
А зря.
22:22
Speaker A
Как наш пример.
22:24
Speaker A
Наш бариста забыл про аллергию.
22:27
Speaker A
У нас произошёл инцидент.
22:29
Speaker A
Была жалоба.
22:30
Speaker A
Может быть, мы потеряли репутацию или деньги.
22:33
Speaker A
А может быть, ваш кодинг агент, который проводил рефакторинг всего модуля, всё сделал неправильно, откатил, что-то сломал.
22:41
Speaker A
И после этого вы ему сказали: блин, ну ты же должен был всё делать через интерфейсы.
22:45
Speaker A
И этот подход сработал.
22:47
Speaker A
Так вот, чтобы в следующий раз он тоже сработал, у него должно быть знание об этом.
22:52
Speaker A
Поэтому это у нас как дневник с уроками.
22:58
Speaker A
Как мы с вами это можем реализовать?
23:00
Speaker A
У нас есть с вами различные записи.
23:04
Speaker A
В них есть действие, контекст, результат и урок.
23:07
Speaker A
И перед действием, которое хочет совершить агент, он спрашивает наше хранилище.
23:13
Speaker A
Были ли проблемы с похожими действиями раньше?
23:17
Speaker A
И если мы нашли негативный эпизод, то мы добавляем его в контекст как предупреждение.
23:23
Speaker A
Ну и, соответственно, после следующего действия мы опять записываем результат.
23:26
Speaker A
То есть у нас с вами появляется два дополнительных действия.
23:29
Speaker A
Каждый раз чтение перед действием и запись после.
23:32
Speaker A
Понятно, что здесь у нас будет с вами накапливаться знания.
23:34
Speaker A
И нам надо будет реализовать забывание.
23:37
Speaker A
Здесь ровно так же, как проблема работы с кэшом.
23:40
Speaker A
Когда же нам его инвадировать?
23:41
Speaker A
И здесь мы можем проставлять веса нашим знаниям или придумывать другие алгоритмы вытеснения.
23:46
Speaker A
Поэтому, чтобы каждый день у нас не было одних и тех же ошибок.
23:51
Speaker A
Чтобы мы не начинали с чистого листа.
23:54
Speaker A
Мы используем этот тип памяти.
23:56
Speaker A
А это значит, что теперь все уроки у нас будут запомнены.
23:59
Speaker A
Но что агент знает прямо сейчас?
24:03
Speaker A
В конкретной задаче, в конкретном диалоге.
24:06
Speaker A
И для этого нам с вами поможет рабочая память.
24:11
Speaker A
И это то, что прямо сейчас.
24:14
Speaker A
Контекст текущей задачи.
24:16
Speaker A
Возвращаемся к нашему баристе.
24:19
Speaker A
Пять человек, ретро через час, стресс после хотфикса.
24:24
Speaker A
Минус 15 у нас на улице.
24:27
Speaker A
И эта память живёт, пока задача активна.
24:30
Speaker A
Потом она нам не нужна.
24:32
Speaker A
Она уничтожается.
24:34
Speaker A
То есть это у нас будет как оперативная память.
24:37
Speaker A
И она у нас с вами временная.
24:42
Speaker A
Итак, у нас с вами есть четыре типа.
24:46
Speaker A
Это четыре жизненных цикла.
24:48
Speaker A
Процедурная, она у нас меняется редко между сессиями.
24:53
Speaker A
Семантическая обновляется по мере поступления новых данных.
24:57
Speaker A
Эпизодическая содержит инсайты из того, что мы с вами делали.
25:01
Speaker A
И рабочая, она у нас живёт, пока жива наша задача, которую мы выполняем.
25:05
Speaker A
Выглядит как очень красивая модель.
25:09
Speaker A
Но строит ли кто-то так в реальности?
25:13
Speaker A
Или это просто академическая классификация из научных работ?
25:16
Speaker A
И это всё очень избыточно для нашего продакшена, для наших агентов.
25:20
Speaker A
Так вот, ответ на этот вопрос пришёл буквально вчера.
25:24
Speaker A
31 марта этого года Anthropic выпускает очередную версию Claude Code, и это был их рутинный релиз.
25:32
Speaker A
Кто-то забыл добавить одну строчку в конфигурации сборки, одну, и весь исходный код стал доступен.
25:39
Speaker A
500.000 строчек кода, и там было всё.
25:43
Speaker A
Система инструментов, оркестрация, промты, и самое для нас интересное в разрезе нашего сегодняшнего диалога.
25:49
Speaker A
Полная архитектура памяти.
25:51
Speaker A
Да, Anthropic через час нашёл эту проблему, через три на GitHub зеркала с этой утечкой уже набирали десятки тысяч звёзд.
25:57
Speaker A
При этом Anthropic подтвердил, что это ошибка упаковки, не взлом.
26:01
Speaker A
Я подробно изучил их архитектуру, чтобы понять, как устроены продакшн системы лидеров рынка.
26:08
Speaker A
Конечно, мы не будем показывать код, потому что это интеллектуальная собственность Anthropic.
26:13
Speaker A
Но архитектурные решения, давайте разберём.
26:16
Speaker A
Потому что это продукт с выручкой.
26:20
Speaker A
2,5 млрд долларов в год.
26:23
Speaker A
Это не прототип, не демо, это система, которой пользуются миллионы разработчиков.
26:28
Speaker A
Многие издания написали, что это трёхслойная архитектура памяти.
26:32
Speaker A
В реальности, когда я посмотрел на код, я обнаружил, что там 11 подсистем, 11, и они идеально ложатся на нашу модель из четырёх типов.
26:40
Speaker A
Давайте посмотрим на карту целиком.
26:42
Speaker A
Проведём через него запрос пользователя и посмотрим, что происходит в памяти.
26:48
Speaker A
А для этого нам надо посмотреть, что попадает в контекстное окно.
26:51
Speaker A
Что увидит модель?
26:55
Speaker A
И наша с вами задача будет понять, как память попадает внутрь.
26:59
Speaker A
И здесь у нас контекстное окно разделено на две зоны.
27:02
Speaker A
Статическая.
27:04
Speaker A
В ней у нас будут правила поведения, стиль, инструкции по инструментам.
27:08
Speaker A
Она будет одинакова для всех наших запросов.
27:11
Speaker A
И она кэшируется глобально.
27:16
Speaker A
И вторая часть - динамическая.
27:19
Speaker A
И здесь у нас будет память, окружение, язык.
27:22
Speaker A
И у каждого это будет своя.
27:24
Speaker A
Зачем так надо?
27:26
Speaker A
Сейчас мы с вами разберём.
27:28
Speaker A
Но мы можем запомнить, что Memory MD живёт именно здесь, в динамической части.
27:36
Speaker A
Следующая часть динамической памяти.
27:39
Speaker A
Всем нам с вами знакомый файл.
27:41
Speaker A
Claude MD.
27:44
Speaker A
И здесь у нас с вами будут инструкции нашего проекта.
27:47
Speaker A
И метасообщения перед историей.
27:52
Speaker A
Дальше, если наш контекст раздулся и произошёл компакшн.
27:56
Speaker A
То здесь будет компакт саммари.
28:00
Speaker A
Который будет заменять собой все наши старые сообщения.
28:03
Speaker A
Это сжатие нашего контекста.
28:05
Speaker A
Дальше у нас с вами пойдёт история разговора.
28:08
Speaker A
И результаты работы инструментов.
28:12
Speaker A
И в самом низу у нас будет Memory Attachments.
28:15
Speaker A
Это файлы, которые дешёвая модель выбрала в фоне для того, чтобы наполнить наш контекст дополнительной информацией.
28:23
Speaker A
Заметьте порядок.
28:25
Speaker A
Статическая инструкция самого верха.
28:29
Speaker A
Динамическая память внизу.
28:31
Speaker A
Помните Lost in the Middle?
28:32
Speaker A
Самое важное в начале и в конце.
28:35
Speaker A
Середина - это история и результаты инструментов.
28:38
Speaker A
Это не случайно.
28:39
Speaker A
Это попытка максимально эффективно использовать те модели, которые доступны прямо сейчас.
28:43
Speaker A
Теперь давайте посмотрим, что происходит, когда пользователь отправляет запрос Claude.
28:49
Speaker A
И три вещи происходят параллельно.
28:51
Speaker A
Первые две - это Memory MD и Claude MD.
28:55
Speaker A
Они уже загружены при старте нашей сессии.
28:59
Speaker A
И тут мы с вами ничего не ждём.
29:00
Speaker A
Но есть ещё третье.
29:02
Speaker A
О которой мы сказали вот здесь вот, когда говорили про Memory Prefetch.
29:08
Speaker A
И что же происходит интересного в этой фазе?
29:11
Speaker A
А тут у нас с вами дешёвая модель, для Claude - это будет Sonnet, она в фоне выбирает до пяти релевантных файлов.
29:19
Speaker A
При этом это не блокирующая операция.
29:22
Speaker A
Если вдруг он не успел их подобрать, значит, ответ произойдёт без него.
29:26
Speaker A
Если успел, то информация помещается в контекст.
29:31
Speaker A
И вот мы отправили всё это в нашу модель.
29:33
Speaker A
И она дала нам ответ.
29:36
Speaker A
И после ответа Claude в фоне запускает три процесса.
29:42
Speaker A
Первый - это агент записывает уроки.
29:46
Speaker A
Второй - это Session Memory.
29:48
Speaker A
Он обновляет заметки текущей сессии.
29:52
Speaker A
И последнее - это Team Memory.
29:54
Speaker A
Синхронизация с нашей командой, если мы работаем как команда с Claude Code.
29:59
Speaker A
И всё это происходит в фоне.
30:01
Speaker A
Поэтому пользователь уже видит ответ.
30:05
Speaker A
Но Claude Code делает что-то интересное с памятью.
30:08
Speaker A
И если посмотреть на всю архитектуру внимательно, то память никогда не стоит на пути ответа.
30:13
Speaker A
И сейчас мы с вами пройдёмся по каждому блоку по отдельности.
30:19
Speaker A
Итак, что же есть в нашей процедурной памяти?
30:23
Speaker A
Здесь у нас есть с вами наш Claude MD.
30:27
Speaker A
И это инструкция нашего проекта.
30:30
Speaker A
Но это не один файл, это четыре разных уровня.
30:34
Speaker A
Глобальный, пользовательский, проектный, локальный.
30:36
Speaker A
И ближе к рабочей директории, выше приоритет.
30:40
Speaker A
То есть проектный файл загружается последним.
30:44
Speaker A
Значит, он ближе к концу нашего сообщения.
30:47
Speaker A
Значит, модель уделяет ему больше внимания.
30:50
Speaker A
И получается, что здесь приоритет реализован не через условия в коде.
30:53
Speaker A
А через позицию в контекстном окне.
30:58
Speaker A
И это всё загружается один раз за сессию.
31:00
Speaker A
И результат кэшируется.
31:02
Speaker A
И у него есть лимит: 40.000 символов, 25 КБ.
31:07
Speaker A
Каждая строка - это ссылка на топик файл с описанием в одну фразу.
31:14
Speaker A
То есть здесь содержится не данные.
31:16
Speaker A
Здесь содержатся адреса данных.
31:18
Speaker A
Так вот, теперь, как же агент выбирает, какие файлы памяти нужны прямо сейчас?
31:23
Speaker A
При каждом сообщении пользователя в фоне запускается отдельный вызов.
31:27
Speaker A
Не основной модели, а дешёвой.
31:30
Speaker A
И для Claude - это у нас Sonnet.
31:33
Speaker A
Даже если пользователь работает с Opus, зачем тратить дорогую модель для того, чтобы просмотреть наш манифест?
31:39
Speaker A
Так вот, эта модель получает текст запроса, манифест всех файлов памяти и одна строка на файл.
31:46
Speaker A
Только метаданные.
31:48
Speaker A
И список инструментов, которые агент уже использует.
31:51
Speaker A
Содержимое файлов он не видит.
31:53
Speaker A
И принимает решение только по описаниям.
31:57
Speaker A
И тут промт оптимизирован на точность, а не на полноту.
32:00
Speaker A
И там есть инструкции: только если уверен, если сомневаешься, не включай.
32:05
Speaker A
Можешь вернуть пустой список.
32:07
Speaker A
Философия простая: лучше не вспомнить, чем засорить контекст.
32:09
Speaker A
И эта выборка точечная.
32:12
Speaker A
Не все там 200 файлов мы засунем в контекст, а только те, которые нужны.
32:18
Speaker A
И выбираем их по описаниям того, что здесь есть.
32:21
Speaker A
И опять же, как я говорил ранее, этот префеч не блокирует ответ.
32:24
Speaker A
Если вдруг он не успел или что-то пошло не так, то у нас запрос идёт без дополнительной памяти.
32:29
Speaker A
Итак, наш семантик: данные, которые у нас уже существуют.
32:32
Speaker A
И префеч их находит и подставляет.
32:35
Speaker A
Но кто-то же должен создать эти данные, кто-то должен положить их туда для того, чтобы мы их могли проанализировать.
32:40
Speaker A
И кто решает, что вот этот кусок разговора стоит запомнить, а вот это мусор, он нам не нужен?
32:46
Speaker A
Так вот, помните, эпизодик Memory, о которой мы сказали, что это самый недооценённый тип.
32:50
Speaker A
Claude Code это подтверждает.
32:52
Speaker A
Они построили отдельного агента только для этого.
32:55
Speaker A
После каждого финального ответа, когда модель закончила и нет никаких ожидающих вызовов, инструмент запускает фоновый агент.
33:02
Speaker A
Отдельный процесс с ограниченными правилами.
33:06
Speaker A
Он видит весь разговор, полный контекст, включая System Prompt, инструкции, историю.
33:10
Speaker A
Но промт говорит ему: обрати внимание на последние N сообщений.
33:13
Speaker A
Только те, что появились после прошлого извлечения.
33:16
Speaker A
Зачем нам весь контекст, если мы смотрим только новое?
33:18
Speaker A
Потому что, чтобы решить, стоит ли запомнить, что кто-то у нас аллергик или что-то произошло, нам надо знать информацию по всему диалогу, по контексту.
33:25
Speaker A
Но здесь есть ограничения.
33:27
Speaker A
Максимум пять итераций, чтобы фоновый агент не ушёл в бесконечный цикл.
33:32
Speaker A
Также ограниченные права: может читать код, но писать может только в директорию памяти.
33:36
Speaker A
И последнее: если основной агент уже записал что-то в память на этом ходу, фоновый не запускается.
33:42
Speaker A
Также есть интересный момент - курсор.
33:45
Speaker A
Каждая успешная экстракция сдвигает курсор.
33:50
Speaker A
Идентификатор последнего обработанного сообщения.
33:54
Speaker A
Следующая экстракция начинается именно с этого места.
33:56
Speaker A
И если вдруг что-то не получилось, то курсор у нас не двигается.
34:00
Speaker A
И эти сообщения будут рассмотрены снова.
34:02
Speaker A
И ничего не потеряется.
34:04
Speaker A
Это тот же принцип at least once.
34:07
Speaker A
Что в любой очереди сообщений.
34:10
Speaker A
И Anthropic перенесли его в архитектуру памяти агента.
34:14
Speaker A
Помните нашу схему: действие, контекст, результат, урок.
34:17
Speaker A
Это именно она уже в продакшене.
34:19
Speaker A
Только вместо простой структуры фоновый агент с ограниченными правами, жёсткими лимитами итерациями и курсорами.
34:25
Speaker A
Который не пропускает неудачи.
34:27
Speaker A
Принципы абсолютно те же.
34:30
Speaker A
Следующая подсистема - это Session Memory.
34:32
Speaker A
Отдельный файл заметок на каждую сессию.
34:35
Speaker A
Решения, изменённые файлы, замеченные паттерны.
34:39
Speaker A
И это не логирование, это как рефлексия.
34:41
Speaker A
Данные собираются.
34:43
Speaker A
Данные извлекаются.
34:44
Speaker A
И данные записываются в фоне.
34:46
Speaker A
И кажется, что Claude собирает столько всего.
34:50
Speaker A
Как же он сделает так, чтобы наше контекстное окно с вами не лопнуло?
34:55
Speaker A
Кто же следит за тем, чтобы вся память не съела весь бюджет?
35:01
Speaker A
И тут нам надо посмотреть, как устроена рабочая память.
35:04
Speaker A
То, что мы используем здесь сейчас.
35:08
Speaker A
И у Claude реализовано пять уровней сжатия контекста.
35:13
Speaker A
И на первом уровне сжатия контекста мы пропускаем уже сумаризированные сообщения.
35:18
Speaker A
А это значит, что нам здесь делать ничего не надо.
35:20
Speaker A
Второй - это бюджет на результаты инструментов.
35:24
Speaker A
И он установлен в 200.000 символов на сообщение.
35:27
Speaker A
Если вдруг превысили, то самые крупные результаты уходят на диск.
35:33
Speaker A
Модель видит первые 2 КБ плюс путь к полному файлу.
35:37
Speaker A
И вот дальше решение: заменить или вставить.
35:40
Speaker A
Замораживается навсегда.
35:42
Speaker A
Потому что мутировать уже отправленное, значит, убить наш KV кэш.
35:47
Speaker A
Помните из первой части: каждая мутация середины - это потерянные деньги.
35:50
Speaker A
Вот тут вот у нас есть реализация.
35:52
Speaker A
Третья часть - это удалить самые старые сообщения.
35:56
Speaker A
Четвёртый - это микрокомпакт.
36:00
Speaker A
И тут у нас есть два пути.
36:02
Speaker A
И они зависят от состояния кэша.
36:04
Speaker A
Если кэш протух, то можно мутировать прямо: заменяем старые результаты на заглушку.
36:09
Speaker A
Ни одного вызова модели не происходит.
36:12
Speaker A
Если же кэш живой, то мутировать нельзя.
36:15
Speaker A
Вместо этого через API отправляем инструкцию.
36:19
Speaker A
Удалить содержимое вот этих результатов из кэша.
36:22
Speaker A
И сервер удаляет данные, не инвадируя весь кэш.
36:25
Speaker A
И у обоих этих путей одна цель.
36:28
Speaker A
Защитить KV кэш.
36:31
Speaker A
И это как сквозной принцип.
36:33
Speaker A
И пятое - это автокомпакт.
36:37
Speaker A
Это очень тяжёлая операция.
36:39
Speaker A
Здесь фоновый агент сумаризирует всё.
36:43
Speaker A
И в нём есть предохранитель.
36:46
Speaker A
Три неудачных сжатия подряд, и система останавливается.
36:50
Speaker A
И это ограничители в коде, а не в промте.
36:52
Speaker A
Также есть резерв на сумаризацию.
36:54
Speaker A
20.000 токенов.
36:56
Speaker A
Если мы посмотрим на эти типы сжатия, то это очень похоже на наш пайплайн.
37:00
Speaker A
Сначала у нас идут дешёвые операции.
37:04
Speaker A
И каждая последующая операция дороже.
37:07
Speaker A
То есть мы с вами максимально оптимизируемся по деньгам.
37:13
Speaker A
Что же мы с вами видим на примере Claude?
37:16
Speaker A
И здесь интеллект агента не в модели, и не в технологии хранения, а в архитектуре.
37:22
Speaker A
Что запоминать, когда доставлять, сколько тратить.
37:26
Speaker A
И когда остановиться.
37:28
Speaker A
Вот Claude Code - это 2,5 млрд выручки.
37:31
Speaker A
11 подсистем памяти, файлы с грепом.
37:35
Speaker A
Потому что правильная архитектура памяти важнее стека.
37:39
Speaker A
Но также красивая архитектура без защиты может быть дырявой.
37:43
Speaker A
Без отказоустойчивости.
37:45
Speaker A
Один сбой API, и всё мертво.
37:49
Speaker A
Без наблюдаемости мы летим вслепую и не знаем, куда деваются наши деньги.
37:54
Speaker A
И что вообще происходит с агентом.
37:56
Speaker A
В третьей части будет продакшн: безопасность, отказоустойчивость.
38:00
Speaker A
И многое другое.
38:01
Speaker A
Ссылка на первую часть в описании.
38:03
Speaker A
До встречи в финале.
Topics:агентыязыковые моделироутингуправление контекстомRAGкэшированиеоптимизация затратклассификатор запросовдлинный контекстинфраструктура ИИ

Frequently Asked Questions

Почему важно использовать роутинг моделей в агенте?

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

Что такое Retrieval-Augmented Generation (RAG) и зачем он нужен?

RAG — это метод, при котором документы разбиваются на фрагменты, преобразуются в векторы и хранятся в базе для поиска релевантных частей, которые подставляются в контекст модели для улучшения качества ответов.

Какие проблемы возникают при переключении моделей в диалоге?

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

Get More with the Söz AI App

Transcribe recordings, audio files, and YouTube videos — with AI summaries, speaker detection, and unlimited transcriptions.

Or transcribe another YouTube video here →