Transcription
Привет, сегодня мы поговорим о том, как остановить галлюцинации ИИ-агентов с помощью пяти техник, выходящих за рамки промпта. Каждое из них — это изменение кода, а не изменение промпта. Давайте посмотрим.
Каждый раз, когда ваш ИИ-агент отвечает, вы платите за входящие и исходящие слова. И в вашем счете вы увидите эти вызываемые токены. Да. И чем больше токенов вы отправляете, тем больше платите. И если то, что вы отправляете, не совсем правильно, слишком много или отсутствует что-то важное, ваш ИИ-агент начнет галлюцинировать.
Существует пять техник, которые помогут сократить расход токенов, повысить точность и выявить сбои до их отправки. И каждое из них — это изменение кода, а не изменение промпта вообще. Итак, давайте посмотрим.
Во-первых, у нас есть семантический выбор инструмента. Вы фильтруете, какие инструменты попадают в контекст при каждом вызове. Модель видит только то, что ей нужно для данного конкретного запроса.
Во-вторых, у нас есть GraphRAG. Для точных запросов, таких как агрегация, подсчеты, многошаговые рассуждения, вы заменяете извлечение текста запросом к структурированному графу. Модель получает вычисляемый проверяемый ответ, а не выборку, как это делает RAG.
В-третьих, многоагентная валидация. Второй агент может проверять каждый ответ, прежде чем он достигнет пользователей.
И в-четвертых, нейросимволические стражи. Вы устанавливаете правила в Python, а не в промпте, и модель не может их обойти.
Итак, в-пятых, стражи времени выполнения. Потому что, если вы не хотите блокировать, вы можете направлять, и вам не нужно блокировать все. И когда срабатывает правило, агент самокорректируется и завершает задачу. Никаких жестких остановок, никаких советов пользователю.
Итак, для каждой техники я покажу вам агента без нее, а затем с ней, чтобы вы могли сравнить. И все демонстрации, я использую туристического агента, которого я создал с помощью Strands agent. А Strands agent — это фреймворк агентов с открытым исходным кодом, который мы поддерживаем в AWS. И я Элизабет Фуэнтес Леон. Я разработчик-адвокат в AWS. Я специализируюсь на агентурных приложениях. И здесь, в этом QR-коде, вы найдете все, что вам понадобится, чтобы воссоздать все эти техники, которые я собираюсь показать вам в ближайшее время. Итак, давайте приступим.
Итак, семантический выбор инструмента. У нашего туристического агента 29 инструментов. Рейсы, отели, платежи, погода, отмены — все это фиктивные инструменты, не как настоящий туристический агент, но каждый раз, когда пользователь отправляет сообщение, описания всех 29 инструментов попадают в окно контекста. Модель читает их все, прежде чем решить, что делать. И если у вашего агента есть память, строки каждого разговора добавляют больше контекста, который отправляется с каждым сообщением. И вы платите за каждый из этих токенов, независимо от того, использует ли модель инструмент в итоге или нет.
Чтобы понять, откуда берутся эти токены, вам нужно увидеть, как инструмент выглядит для модели. В Strands вы пишете функцию с декоратором инструмента, это инструмент, а также имя, описание и строка документации с типизированными параметрами. Затем Strands берет это и генерирует схему с именем, описанием, параметрами, и эта схема — то, что попадает в окна контекста при каждом вызове. Каждая схема инструмента занимает около 17 или 200 токенов, в зависимости от количества параметров. Если наш туристический агент [хмыкает] имеет 29 инструментов, это составляет около 3000 токенов за вызов, только для описания инструмента. Перед вашим сообщением, перед ответом, каждый отдельный вызов.
Создав базу данных инструментов, мы можем фильтровать инструменты, которые могут понадобиться агенту, прежде чем агент их символизирует. С этим фильтром модель видит только три наиболее релевантных инструмента. Использование токенов падает с тысяч до менее 300.
Позвольте мне показать вам в коде. Здесь, в моем QR-коде, это. Позвольте мне очистить все выводы. Итак, сначала нам нужно установить требования. Вот файл требований. Это Jupyter notebook, потому что так проще все показать, но есть одно приложение, которое вы можете запустить, если вам так удобнее. Итак, вот требования. У меня есть агент A strands, и поскольку я использую OpenAI для вызова модели, я использую API от OpenAI. И мне нужен агент Strands для OpenAI. Вы можете использовать агент Strands OpenAI со всеми нашими, боже мой, почти всеми поставщиками моделей. И, конечно же, с Strands Amazon Bedrock, потому что мы, как AWS, являемся разработчиками этого фреймворка. И чтобы использовать Amazon Bedrock, вам не нужно добавлять поставщика модели. И поскольку мне нужно встраивать, мне нужно создавать встраивания для моей базы данных векторных инструментов, я использую Sentence Transformer. Это очень простая модель, которая работает локально, поэтому она бесплатна. Так что, если вы хотите, вы можете запустить это локально на своем компьютере без затрат на другую модель встраивания. И вы можете использовать Strands со всеми Llama 2. Так что, если у вас есть локальная модель, вы можете запустить все это на своем компьютере бесплатно, не тратя никаких токенов. И я использую файлы как мое векторное хранилище, локальное, очень простое. И, ну, сейчас я собираюсь использовать Neo4j. Это для другой демонстрации, которую я покажу вам через мгновение. И поскольку я использую некоторые среды, я использую Python. И давайте посмотрим.
Итак, здесь я хочу запустить это. Позвольте мне сделать это больше. Я знаю, что у вас есть проблемы. Больше. Немного больше, немного меньше. И здесь, это лучше. Итак. Я установил свои требования. Я уже сделал это. И я использую OpenAI, поэтому мне нужен мой API. Мой API-ключ. API-ключ. И здесь я вызываю свой Strands. Мне нужен агент, потому что я хочу быть таким агентом, которым я использую OpenAI. И у меня есть куча фиктивных инструментов здесь. Я покажу вам через мгновение. И я хочу использовать это, потому что у меня есть некоторые функции, которые я использую для создания индекса для моего векторного хранилища. И мне нужны инструменты поиска, когда я использую векторное хранилище, я помещаю туда свой запрос. Я ищу инструмент, который собираюсь использовать, используя векторный поиск по векторам. И я меняю инструменты. Я покажу вам это через мгновение.
Итак, позвольте мне показать вам все мои фиктивные инструменты. Где здесь регистрация? Здесь у меня все мои инструменты. Это для обмена. Поиск, создание индекса. И где мои инструменты? Шу-шу-шу-шу-шу здесь. Итак, вот все фиктивные инструменты, которые я создал для этого. Знаете, это очень. Это демонстрация, пожалуйста. Это не то, что вы можете использовать для запуска в продакшене. Нет, пожалуйста. И, хорошо. Итак, где это? Итак, я запускаю это. И я создаю свой семантический индекс. Я уже сделал это, да. Итак, у меня здесь 29 инструментов, 29 фиктивных инструментов, и я хочу протестировать это с множеством различных запросов, и это истина. У меня есть истина, потому что я знаю, какой инструмент лучше всего отвечает на вопрос, поэтому мы можем знать, в порядке ли наш агент или нет. Итак, давайте запустим это. У нас 90 запросов и 29 инструментов. Итак, это некоторые вспомогательные функции. Мне все равно. Да, мне не все равно, но я не хочу вам это объяснять. Итак, это мой агент, мой традиционный агент, куда я помещаю все мои 29 инструментов. У меня есть моя модель, некоторые вспомогательные функции. Это мой агент. Я только. Это способ, которым я создаю агента, используя Strands agent. Я помещаю все свои инструменты, и мой системный промпт: "Ты туристический помощник. Ты выбираешь правильный инструмент для ответа на вопрос". О боже, супер. И модель. Давайте запустим это. И это что угодно. Это некоторая функция для подсчета токенов, потому что внутри этого Strands agent вы можете считать токены. Вы можете знать, сколько токенов используется для входа и выхода агента. Это некоторая вспомогательная функция, и да. Это каждый раз, когда я помещаю промпт в этого агента, я отправляю только промпт, и агент отвечает. Затем я использую нового агента, потому что это форк. Так что я не веду разговор с агентом. Я только отправляю вопрос и получаю ответ. Итак, для каждого вопроса тратится около 2000 токенов. Так что, и не всегда он дает мне правильный ответ. Здесь. Итак, да, у меня не очень хорошая точность, и в среднем 1000 токенов.
Теперь давайте используем мой новый ИИ с семантическим подходом. Первое, что я делаю, это для каждого отдельного запроса, для каждого отдельного промпта, я отправляю запрос моим инструментам поиска, и я получу топ-два, топ-К три наиболее релевантных с большей вероятностью ответить на мой запрос, потому что это семантический поиск внутри моего векторного хранилища. И затем я использую этот ответ. Я выберу это имя и помещу эти инструменты в свой ИИ. Итак, я буду использовать только три инструмента, которые этот семантический поиск извлек для моего ИИ, и я отправлю только эти инструменты. И это моя вспомогательная функция, и все. Итак, я отправлю все запросы снова те же. И для первого вопроса у меня 4000 токенов, бла-бла-бла. И да, у нас огромная разница, потому что я не отправляю все 29 инструментов во всех запросах. Так что, да, бам-бам. И, хорошо, семантическая память. Да, хорошо, теперь давайте. Закончите. Итак, давайте перейдем к следующему.
Этот движок только отправляет вопрос, и я получаю ответ. У меня нет никакого разговора с этим движком. Что произойдет, если я начну вести разговоры? Если движок меня запомнит? Итак, нам нужно отправлять только те инструменты, которые этот движок собирается использовать. Потому что, если я дам все инструменты, которые я использую в истории разговоров, тогда будет момент, когда я захочу иметь 29 инструментов внутри моего движка. Так что мы не решаем, мы не имеем проблемы в движке, когда мы ведем разговор с движком. Так что нам нужно поместить инструменты, а затем нам нужно удалить инструменты. И мы можем сделать это с помощью swap tools. И давайте запустим это. И что такое swap tools, я должен запустить это, нет. Позвольте мне сначала показать функции swap tools здесь, регистрацию. Я удаляю это, потому что с Strands при каждом вызове у вас есть полный контроль над состоянием, потому что это цикл агента, и вы можете использовать этот цикл агента, как, потому что это цикл агента, и вы можете делать почти все, что хотите. Вы можете помещать и удалять все внутри цикла с помощью нескольких строк кода. Итак, давайте посмотрим. Здесь у нас есть движок. У нас есть регистратор инструментов через регистраторы инструментов. Это что-то внутри состояния движка. Так что мы можем очистить инструменты, и все. Итак, при следующем вызове мы можем очистить все инструменты и добавить новые инструменты. Здесь, где моя? У меня тут много всего. Итак, я запускаю это. Это займет некоторое время. >> И да, мы видим, что при каждом вызове количество моих токенов увеличивается. Почему у меня больше? Потому что я также отправляю историю чата. Так что я отправляю нужные мне инструменты, только нужные мне инструменты, и историю чата. Поэтому я вижу, что количество моих токенов становится все больше и больше. И, смотрите, точность лучше. И да, у нас больше токенов. Так что, да, вероятно, у нас здесь не лучшая точность, потому что это супер-демо с супер-фиктивными инструментами, и некоторые запросы намеренно неоднозначны, потому что поиск чего-то, чего-то, проверка чего-то. И демо имеет общие фиктивные инструменты с похожими названиями. И когда все 29 инструментов видны, модель иногда выбирает неправильный. И с фильтрацией эти общие инструменты появляются только в запросе, который на самом деле им соответствует. Так что вы можете запустить все и протестировать это. Так что это только локальный запуск. Но что произойдет, когда вы захотите запустить эту демонстрацию в продакшене? Вы, конечно, можете построить большее, лучшее хранилище. Я не знаю, вы можете использовать Postgres. Я думаю, это слишком много. Но у нас в AWS есть Amazon Bedrock Agent Core. Так что Amazon Bedrock Agent Core — это сервис, предназначенный только для агентов в продакшене. И внутри Agent Core у нас есть Agent Core Gateway. Так что Agent Core Gateway позволяет вам создавать этот индекс [кашляет] самостоятельно. Так что вам просто нужно сказать: "Эй, это мои инструменты". И Agent Core Gateway построит все для вас. И он может иметь векторный поиск внутри. Так что уровень маршрутизации находится внутри Agent Core, и он автоматически обрабатывает выбор инструмента. Так что вы регистрируете свои инструменты один раз, и он находит правильный для каждого запроса. Это тот же принцип, но без инфраструктуры для управления.
Теперь давайте посмотрим на следующее. GraphRAG. Вы знаете, RAG — это Retrieval Augmented Generation. Это то, как агенты получают доступ к вашим собственным данным. Вы берете вопрос пользователя, ищете в своих документах наиболее похожий контент с помощью векторного поиска и передаете найденное модели. Модель отвечает на основе этого. Это хорошо работает для открытых вопросов. Найди мне что-нибудь на эту тему. Но есть категория вопросов, где это не работает. Каков средний рейтинг всех отелей в Париже? Сколько отелей имеют бассейн? Векторный поиск всегда возвращает что-то, даже когда ничего действительно не релевантно. И агент видит только топ-N фрагментов всех ваших данных за раз. Он не может агрегировать, подсчитывать или обходить связи по всему набору данных. Так что он оценивает. И он представляет эту оценку как реальный факт, знаете, реальный ответ.
Итак, здесь у нас есть граф. Вы строите векторное хранилище, и оно извлекает три фрагмента из 300 документов, и модель угадывает. Если мы используем GraphRAG, вы можете выполнить запрос по всем данным и получить вычисляемые результаты. GraphRAG решает это по-другому, потому что вместо извлечения текстового фрагмента вы можете построить граф знаний из документов. Знает отношения и структурированные данные. Для демонстрации я буду использовать Neo4j локально, и модель будет писать Cypher-запрос для его поиска. Cypher-запрос — это язык запросов Neo4j. Он похож на SQL. Так что граф выполняет этот запрос по всем данным. И модель получает вычисляемые проверенные результаты, а не выборку. И прежде чем запустить эту демонстрацию, я запущу зависимости. Позвольте мне показать вам. Позвольте мне перейти к коду.
Итак, граф. Это notebook, которым я поделюсь с вами. Итак, нам снова нужно установить требования. Что у нас здесь, позвольте мне посмотреть. Это первый, да. Требования. У меня есть, я снова буду использовать OpenAI. Позвольте мне просто закрыть это. Я буду использовать Neo4j, и нам нужен Neo4j для GraphRAG. И для движка, который использует обычный RAG, мы будем использовать очень простое векторное хранилище в файлах, и мы снова будем использовать Sentence Transformer. И давайте посмотрим. У меня уже все готово, я вызываю [кашляет] свой OpenAI. Это мои инструменты. Я, потому что я хочу создать здесь некоторые инструменты, я хочу использовать OpenAI и я использую базу данных графов. И это моя, у меня Neo4j локально. И давайте запустим это. И это что-то для проверки Neo4j. Так что я строю свое векторное хранилище. Это мои файлы, и это мой Neo4j, который у меня здесь локально. Я не знаю, могу ли я показать вам. Думаю, нет. И у меня есть инструмент, обычный инструмент, созданный с помощью декоратора. Это для поиска внутри моего векторного хранилища. Вы видите, это очень просто. Я имею запрос. Я создаю эмбеддинг для своего запроса, а затем ищу внутри векторного хранилища, и у меня есть запрос для графа знаний. Итак, здесь модель должна понять, что для поиска в запросе в базе знаний графа ей нужно построить Cypher-запрос. Так что я помещаю это в контекст, потому что мы уже знаем, как строить инструменты, верно? Я помещаю это в контекст. У меня есть драйвер для отправки данных для подключения к векторному хранилищу и для отправки Cypher-запроса, который модель создаст для меня. И это для чтения результатов, и все. Это единственный инструмент, который мне нужен для поиска в моем графе знаний.
Хорошо, это моя модель OpenAI. Это мой RAG. Мой RAG-движок, и это мой граф-движок. У меня есть два разных движка для сравнения результатов. Давайте посмотрим. Ну, у меня проблема. Да, я готов. Итак, давайте сделаем этот первый тест. Агрегация. Здесь, каков вопрос? Каков средний рейтинг гостей всех отелей в Париже? Так что, пока этот движок. О, он уже закончил. Итак, что у меня здесь? Средний рейтинг гостей среди отелей, перечисленных в Париже, составляет. Он вычисляет, знаете ли. Когда что-то, когда я использую RAG, он идет в векторное хранилище, он получает N возможных ответов на этот вопрос. Потому что это агрегация, он будет использовать полученные данные для построения математической операции. Это то, что у меня здесь. Так что все, что мы видим здесь, — это рассуждения модели. Так что, когда я запускаю граф-движок на среднем значении, движок просто даст мне ответ, знаете ли, только эти токены здесь. Потому что Cypher-запрос может дать мне саму математическую операцию. Он может это сделать. Так что нам не нужны движки, LLM, модель, чтобы делать это для меня, потому что Cypher-запрос уже дает мне правильный вопрос. Так что это 47, и это среднее значение. Итак, здесь, в этом первом, нам повезло, потому что, вероятно, там только два отеля. Но что произойдет, если в этом векторном хранилище будет больше двух или трех отелей? Так что мы не дадим реальный ответ. LLM будет вычислять только по трем полученным ответам. Так что он будет строить эту операцию только с тремя отелями. Но если в векторном хранилище больше трех, у нас возникнут проблемы. Что-то, что я, знаете ли, да.
Итак, давайте запустим следующее. Подсчет цен. Что-то похожее. Сколько отелей имеют бассейны в качестве удобства? Опять же, сколько? Так что он дает мне традиционный. Похоже, что поиск не вернул конкретной информации об отелях в Париже. Хорошо. Что произошло с другим? В настоящее время нет отелей, предлагающих бассейны. Нет, я. Нет отелей. Так что другой — это как мм, вы хотели бы спросить об отеле с другим конкретным удобством или информацией? Это как мм, может быть, это так, а может быть, я не знаю. Да, это не так точно, хорошо? В основном разговор. О, каков мой вопрос? Каковы типы номеров и цены для отелей с самым высоким рейтингом? Каковы типы номеров и цены? Эти два вопроса. Так что он ищет факт, у меня был только один. Высоко оцененные отели в любой компании Paris бла-бла-бла. Я не говорю по-французски. С рейтингом гостей это тот. Однако у меня в настоящее время нет. Бла-бла-бла. Много данных там. Так что произошло с другим? Получение уведомлений о. О, у меня ошибка. Здесь, во втором, я получил вопрос. Высоко оцененный отель — Harmony бла-бла-бла. Они предлагают следующие типы. Но, к сожалению, эти номера недоступны. Так что я получаю ответ. Я не получаю много бла-бла-бла там. Я только получаю ответ, который мне нужен. И для следующего, как прошла медитация? Каков вопрос? Расскажите мне об отелях в Антарктиде. Спойлер, в Антарктиде нет отелей. Там ноль отелей в Антарктиде, и давайте посмотрим. Похоже, что поиск не вернул конкретной информации об отеле. Хорошо, потому что они есть. Я искал другой, у которого есть хвост бла-бла-бла в. Если вы ищете конкретный опыт, конкретно спросите о посещении Антарктиды. Нет. Пожалуйста, дайте мне знать, и я могу помочь вам с этим. Хорошо, много токенов, которые я потратил там в этом ответе для Елены. Что произошло с другим? В настоящее время в Антарктиде нет отелей. Конечно, потому что он создает Cypher-запрос, Cypher-запрос, и получает ноль. Так что он, нет, он дает мне честный ответ. Вот сводка, которая мне очень понравилась для этого Neo4j notebook. Но вот кое-что, что я хочу показать вам, прежде чем перейти к следующему.
Итак, здесь кое-что, что мне нравится в Neo4j, потому что почему я использую Neo4j? Потому что в библиотеке Neo4j я могу построить, она использует LLM. Я также использую OpenAI для построения графа знаний. Так как я строю свой граф знаний? У меня есть просто куча данных, куча текстовых данных, и я отправляю эти данные в библиотеку Neo4j, которую я пропустил. Хорошо, я отправляю эти данные сюда, и Neo4j, используя всю эту библиотеку, прямо здесь, может понять все мои данные и построить граф для меня. Так что мне не нужно создавать это с помощью простого конвейера графа знаний внутри библиотеки графа знаний. Вот почему я использую Neo4j. Это потрясающе. Это очень просто в использовании. Так что я приглашаю вас использовать его. Итак, давайте перейдем к следующему.
Итак, многоагентная валидация. Иногда агент терпит неудачу, и никто этого не замечает. Он вызывает инструмент, и инструмент возвращает ошибку, а агент не отображает эту ошибку. Вместо этого он генерирует уверенный ответ об успехе. Пользователь думает, что это сработало. Вы думаете, что это сработало. Это не так. Агент действует и проверяет свой собственный вывод в том же цикле. Нет разделения, нет второго мнения. Так что, когда что-то идет не так, он рационализирует и говорит вам, что все в порядке. Это работает. Вот что происходит. Внутри одного агента, когда он терпит неудачу, он вызывает инструмент, получает ошибку, рационализирует ее и возвращает ответ об успехе. Пользователь никогда не видит ошибку. Вы можете решить эту проблему, добавив слой валидации. У вас может быть три агента последовательно. Один действует, один проверяет, а другой одобряет или отклоняет. Strands agent имеет встроенный класс для этого под названием swarm. Он автоматически управляет передачей между агентами. Вы просто определяете роль каждого агента в системном промпте. И позвольте мне показать вам это.
Итак, этой демонстрации нужен только Swarms agent с интеграцией OpenAI. Давайте посмотрим на требования здесь. Все, что вам нужно, это Swarms agent. Нам больше ничего не нужно. Давайте перейдем к notebook здесь. И самое важное здесь — это уже работает. Позвольте мне посмотреть здесь. Это Swarm. Swarm — это то, что позволяет вам соединять несколько агентов вместе, не создавая, например, вручную, чтобы собрать всех этих агентов вместе. Он может построить цепочку и автоматически управлять передачей между ними. Итак, здесь мы создадим трех агентов. Позвольте мне спуститься, потому что у нас есть обычный, и у нас есть некоторые истинные данные. Итак, здесь мы создаем одиночного агента. Итак, мы будем тестировать три разных сценария для валидации бронирования. Мы ожидаем true для включения отелей. Мы ожидаем false для несуществующих отелей и отсутствующих бронирований. Мы тоже ожидаем false. Вот как мы создаем одиночного агента. Нам нужен промпт, некоторые инструменты. И мы используем инструменты, которые у нас есть здесь. И здесь мы знаем, что это данные. Так что агенты могут дать нам ответ, который мы ищем. И это все. Позвольте мне перейти к другим. О, подождите здесь. Итак, как мы строим Swarm? Я уже запустил это. Я хочу показать вам это. Итак, мы построим три разных агента. Исполнитель, Валидатор и Критик. У нас есть системный промпт. Вы — исполнительный агент для системы бронирования отелей. >> [кашляет] >> Используйте предоставленные инструменты для точного выполнения запросов и бла-бла-бла. Валидатор: Вы — валидаторный агент. Просмотрите, что сделал исполнитель, и выведите точно "да" или "нет". И у нас есть критик, который будет здесь утверждать или отклонять. Давайте запустим это. И о, что здесь? Мы не определили модель. Извините. Извините, пожалуйста. Простите меня за жизнь, потому что я не запустил это. Давайте запустим сейчас, потому что это обычный. И модель там, верно? Что? Немного предвзято. Запустите это. Что с вами происходит? Позвольте мне перейти к этому. Позвольте мне скопировать и вставить. Это. Я не знаю, почему это вызывает проблему. Многоагентный рой — это то же самое время. Давай. Да, вы можете видеть, что это жизнь. Я не собираюсь это редактировать. Так что, да. Хорошо, у нас есть Спасибо. И рой, как мы, как мы создаем рой? У нас есть рой, и функция роя, мы собираем всех агентов вместе, и входная точка — исполнитель. Так что все начнется в исполнителе, а затем он будет передавать. И шесть раз, потому что вы тоже можете это обработать. Так что получите окончательный ответ роя. Давайте сделаем для и они отправляют весь ответ. И забронируйте Гранд Отель. Я забронировал Гранд Отель для Алисы сегодня вечером. Бронирование бла-бла-бла. Передача. Валидно. Хорошо. Выглядит хорошо. Критик, одобрить. Так что критик одобряет это. Это другое. И мы можем провести здесь сравнение, если хотите. Итак, здесь мы можем видеть, что рой управляет потоком между всеми тремя разными. Это то, что происходит, когда одиночный агент пытается подтвердить что-то, чего не существует в системе. И теперь тот же запрос через рой, исполнитель получает ошибку, валидатор ловит, критик отклоняет это, и пользователь никогда не видит сфабрикованный ответ. Так что вы можете протестировать здесь с одиночным агентом, который предлагает неизвестную запись и возвращает успех. И рой имеет исполнителя, который получает ошибку, валидатор говорит: "Эй, давай, чувак. Галлюцинация", и критик отклоняет. Так что пользователь видит явный сбой. Подтверждение фабрикатора так упускает проблему здесь. И вы можете запустить это, чтобы сравнить двух разных агентов. Итак, здесь мы видим, что одиночный агент имеет все, как бы, да, все в порядке, это правильно. Но в многоагентном рое вы можете видеть, что последний — это, знаете ли, упущена проблема здесь. Что-то происходит.
Теперь давайте перейдем к следующему. Нейросимволические стражи. У вас есть правило для вашего агента. Скажем, максимум 10 попыток на бронирование. Вы пишете это в системном промпте. Вы даже пишете это в описании инструмента. И агент все равно вызывает инструмент с 15. Нет, потому что он игнорирует вас. Потому что промпты, вероятно, являются предложениями, а не ограничениями. Модель обрабатывает их как текст. А не как логику, которую она должна выполнить. Это вероятностно. Только код выполняет логику. Правило в промпте модель читает как предложение. Правило в коде модель не может его обойти. Нейросимволические стражи помещают правила в код. E-strands A имеет несколько хуков, которые он вызывает автоматически в определенные моменты цикла агента. Это случай прямо перед выполнением инструмента. Так что у вас есть хук. Вы пишете правило, проверяете параметры, и если они не проходят, вы отменяете вызов.
Позвольте мне показать это в коде. Здесь у нас есть Jupiter notebook. У нас есть требования здесь. То же самое, что и в предыдущих демонстрациях, нам нужен только. Я установлю все снова. Нам нужен только E-strands и OpenAI. Нам больше ничего не нужно. И мой API. И вот что важно. В этой демонстрации есть эти три хука, предоставляемые в этом базовом классе Strands. Так что они позволяют вам создавать хук. Так что у нас есть поставщик хуков, регистратор хуков и событие перед вызовом. И регистратор инструментов — это то, что Strands передает вам для регистрации вашего обратного вызова. И событие перед вызовом — это событие, которое срабатывает каждый раз, когда модель собирается выполнить тень. Последнее делает возможным перехват вызова перед его выполнением. Так что у вас есть событие перед вызовом инструмента, и вызов, у нас есть событие после вызова инструмента, которое мы здесь не будем использовать. И давайте посмотрим на правило в промпте. Помните, модель читает это как текст, и она может следовать им или нет. Итак, давайте посмотрим на это. Я хочу запустить это. Итак, здесь у нас есть некоторое похожее состояние, которое мы будем использовать в этом движке. И позвольте мне, это символическое правило. Так что правило бронирования, если правило бронирования имеет это, это что-то, что мы создали. Позвольте мне показать вам правила здесь. Так что у нас есть правила. Правило 1. Валидация дат. Регистрация должна быть до выезда. Если что-то валидировано, то выезд. Это то, что проверяется. Это то, что будет вызвано, когда правило должно быть использовано. И для выполнения у нас есть другое правило для максимального количества попыток. Максимальное количество попыток на бронирование. Так что, если я хочу использовать, я не знаю, если я хочу забронировать на 11, это заблокирует меня. Это не отклонит бронирование. И у нас есть некоторые правила подтверждения. Оплата до подтверждения. Вы знаете, вы не можете подтвердить, если у вас нет оплаты. Правило отмены. Отмена в течение 48 часов до заезда невозможна. Так что это то, что я создал здесь, знаете ли, для этой демонстрации. Так что у меня есть правила бронирования, и у меня есть правила подтверждения. Я не использую здесь правило отмены. Так что создание хука валидации. Мы создаем хуки валидации здесь, верно? Вот так, нейросимволическое правило, и мы используем поставщика хуков. Так что у нас есть куча кода здесь. Затем мы добавляем правила бронирования, правила подтверждения и состояние. И вы можете проверить это сами позже, но мы хотим увидеть демонстрацию в действии. Так что мы определяем инструменты претензий, которые мы будем использовать для бронирования отелей и обработки платежей. Это обычные инструменты, знаете ли, и нам нужно добавить эти инструменты к хукам. Думаю, я добавил это. Да. Имя инструмента, забронировать отель. Так что эта штука получит восемь, когда забронировать отель использует. Да, забронировать отель. Хорошо? Так что давайте создадим агентов для сравнения. Так что, как и в других демонстрациях, у нас есть три разных сценария. Подтвердить бронирование без оплаты. Оплата должна быть проверена до подтверждения. Это правило, которое я должен вызвать. У нас есть бронирование отеля, превышающее лимит гостей, и у нас есть действительное бронирование для пяти гостей. Так что, да, у нас есть три сценария. И у нас есть обычный движок, обычный движок, и движок с нейро, нейросимволическими стражами. Так что у нас есть хук, нейросимволический хук. Это то же самое. Здесь, да. И мы добавляем это. Если вы можете видеть, обычный движок [хмыкает] — это всего три строки. Инструменты, модель, и это строка, которая дает нам разницу между этими двумя движками. Так что я уже запустил это. Теперь давайте перейдем к подтверждению бронирования без оплаты. Так что я запускаю эти мои движки. Первый — Abis. Давай, чувак. Я, потому что я, да, он подтвердил бронирование без оплаты, потому что у него нет правил, и промпты очень простые. И другой — Давайте откроем это, и это заблокированное бронирование. Оплата должна быть проверена до подтверждения. Спасибо. Так что все в порядке. Теперь давайте запустим другое. Тест второй сценарий. Каков вопрос? Бронирование отеля превышает лимит гостей. Так что вопрос: я, да, у меня больше, чем. Так что здесь отель Abis успешно забронирован для. Да, потому что промпты простые, и я не ставлю туда никаких правил. И для другого, похоже, что Гранд Отель имеет максимальную вместимость 10 гостей на бронирование. Дополнительные бронирования должны быть сделаны как минимум за 1 день вперед. Я не помню дня. Вероятно, это то, что они дают. И для валидации бронирования оба движка выполняют все правила, и они проходят. Потому что они, да, это только валидация для бронирования. Так что забронировать отель для бла-бла-бла. Все правила пройдены. Похоже, бронирование все еще нужно сделать. Я не помню вопроса. Так что бронирование сделано, предоставлено, я, да. Хорошо. Хорошо, я понял. И, хорошо. Теперь запустите все это. Подтверждение без оплаты, бронирование сохранено, макс. И что здесь произошло? Это все сценарии, которые мы только что запустили. Так что это потрясающая вещь для сравнения результатов. Так что Бали бронирование король, безопасные пять гостей, разрешение, правильно, неправильно. 50, заблокировано, неправильно, правильно. Подтвердить, так что у нас здесь сравнение между двумя концами. Так что, что у нас здесь, это та же модель, те же инструменты, тот же промпт. И разница в результате, потому что правила в Python, а не в промпте. Этот шаблон применения правил в коде перед выполнением инструментов также является тем, что сервис Amazon Aion Core Policies, который у нас есть, делает на структурном уровне. Так что та же концепция, но управляемая для вас в продакшене. И вам нужно только создать правила.
Так что хуки — это все или ничего. Они блокируют все или одобряют. Но иногда вы хотите, чтобы агент корректировался и продолжал работать. Нет, не останавливаться и не заставлять пользователя ждать. Это то, что я покажу вам в следующем. Стражи времени выполнения. Время выполнения все еще не блокирует. Это следующее. Хуки блокируют безоговорочно. Агент останавливается, и пользователь должен повторить попытку. Для жесткого ограничения это именно то, что вы хотите. Но иногда правило мягкое. Возможно, номер подходит для четырех гостей, но группа из шести человек может забронировать два разных номера. Или рейс полон, но есть возможность на следующий. Вы не хотите блокировать все. Вероятно, вы хотите, чтобы агент нашел вариант и завершил задачу. Это называется "руление". Здесь у нас есть хук, который срабатывает, и задача проваливается. А с управлением агентом он направляет модели, и задача завершается. Другое отличие здесь — операционное. Потому что с хуками изменение правила означает изменение кода и переразвертывание всего механизма, всего движка. А с управлением агентом, которое является названием библиотеки с открытым исходным кодом, которую мы здесь будем использовать, правила регистрируются на локальном сервере через API. Вы открываете агента, не прикасаясь к коду агента, потому что агент немедленно их подхватывает.
Позвольте мне показать это здесь в коде. Да, это notebook. В этой демонстрации нам нужен только дополнительный пакет. Agent Control — это ключ. Так что Agent Control — это то, что помогает нам создавать руление. И здесь мы используем setup control. Это небольшое приложение, небольшое приложение, которое я создал с локальным сервером и правилами руления. Здесь у нас есть локальный сервер. У нас есть управление. Это правила руления. Во-первых, у нас есть master guest. Руление, знаете ли, парень. Так что парень-агент уменьшает количество гостей при превышении максимума 10. И он будет рулить. И у нас есть некоторое управление, которое запрещает. Например, запретить отсутствие оплаты. Блокировка подтверждения без оплаты. И здесь, ну, это для создания сервиса. Сервиса. И давайте перейдем к notebook. Итак, я готов. Um, позвольте мне перейти сюда. Да. Так что мне нужна среда. Так что это агент. Um, я получу здесь ошибку. Подождите. Подождите. Нет, тогда позвольте мне закомментировать это, потому что это вызовет ошибку. И давайте запустим это. Да, так что у нас есть хуки, как мы делали демонстрацию. Так что у нас есть бронирование любой компании Лиссабон, и у нас есть некоторые промпты. Вы — помощник по бронированию отелей. При бронировании сначала опишите, что вы забронируете, бла-бла. И это промпт для моего агента. Где мой агент? Agent Control. Это для. Ну, это некоторые вспомогательные функции. И это мой хук, который вы уже знаете, потому что мы его создали. Так что у нас есть системный промпт. И у нас есть хуки. Так что давайте протестируем этого агента с бронированием любой компании Лиссабон для 60 гостей. И если вы помните, это может забронировать только для менее чем 10 гостей. И, конечно, он блокирует. Теперь давайте перейдем к новому агенту AIN Control. Здесь у нас есть два ключевых импорта, которые важны для SDK AIN Control. Так что у нас есть плагин AIN Control, который захватывает события AIN и отправляет их на сервер AIN Control. И у нас есть обработчик AIN Control, который слушает решения AIN с сервера и возвращает их модели. Вместе они соединяют AIN с логикой AIN Control. Так что давайте сделаем это. Так что агент AIN будет бронировать номер для любой компании List Board для 50 гостей. Давайте посмотрим, что он делает. Да, мне нужно настроить бронирование для пребывания в List Board для 50 гостей на май. Так что бронирование было разделено на два номера. Так что он взял это, знаете ли. Один номер для одного, а другой для пяти, и все. Так что используйте хуки для жестких ограничений. AIN Control для мягких [хмыкает] правил.
Теперь у нас есть пять техник, работающих локально. Но как перенести это в продакшн без обслуживания серверов, без создания инфраструктуры? Позвольте мне показать вам, как. Все, что я только что построил здесь в предыдущих демонстрациях, работает локально. Для производственной версии Amazon Bedrock Bedrock Amazon Bedrock AIN Core предоставляет вам время выполнения. Шлюз, краткосрочную и долгосрочную память, облачную наблюдаемость, встроенные серверы, которые не нужно управлять. Здесь архитектура, движок Strands работает внутри времени выполнения. И, знаете ли, внутри времени выполнения вы можете поместить любой фреймворк, который хотите, не только Strands. Шлюз автоматически вызывает инструменты в функции Lambda как инструменты. И правила руления из предыдущей демонстрации находятся в DynamoDB. Так что вы меняете их там, и они становятся активными при следующем вызове. И вам не нужно ничего переразвертывать. И вы хотите использовать Neo4j, конечно, вы можете использовать Neo4j Aura DB, которая является внешней базой данных графов, которая также имеет бесплатный уровень. И код находится в репозитории здесь. Он находится в репозитории. И вам понадобятся учетные данные AWS, если вы используете Amazon Bella Betray Core. И в ссылке на ресурсы есть некоторые кредиты. Я надеюсь, вы сможете их найти, потому что я всегда стараюсь раздавать кредиты AWS, чтобы вы могли развернуть все бесплатно. И если вы новичок в AWS, у меня есть репозиторий, который вы можете использовать для развертывания всей этой архитектуры с помощью notebook. Но если вы знакомы с CDK, Cloud Development Kit, вы можете сделать это тоже, чтобы развернуть все сразу. Оба варианта, конечно, есть в репозитории. И вы можете углубиться в Agent Core со всей документацией, которую я оставил там. Так что, пожалуйста, не останавливайтесь на демонстрации и попробуйте перейти к продакшену с Amazon Better Agent Car.
Итак, давайте подведем итог. Расход токенов при каждом запросе. Вы можете исправить это с помощью семантического выбора инструмента. И уверенный ответ никогда не вычисляется. Возможно, это возможно, потому что вы спрашиваете, сколько. Так что вы можете использовать GraphRAG и запрашивать данные. Не брать выборку. Иногда у нас есть ложные подтверждения успеха. Вы можете использовать многоагентную валидацию, и второй проход ее поймает. И правила, модели довольно немного пропускают это. Вы можете использовать нейросимволических стражей для обеспечения соблюдения правил в коде. Не доверяйте промпту. И для жестких блокировок, которые останавливают пользователя, вы можете использовать runtime SDR, самокоррекцию и завершение. Каждая демонстрация, которую я только что показал вам, находится в репозитории как notebook, так и приложение. Начните с демонстрации один, а затем перейдите к демонстрации пять. И если хотите, разверните ее в продакшене.
Итак, вы пробовали что-нибудь из этого на практике? Спасибо, что присоединились ко мне на этой сессии, и удачного строительства.