Transcription
[Музыка] В этом демо я покажу вам, как построить рабочий процесс агента ИИ с использованием Crew AI и Streamlet. Мы создадим визуальный интерфейс, который позволит вам проектировать, настраивать и запускать нескольких агентов, каждый со своими инструментами и целями, и связывать их выходные данные для выполнения сложных задач. Начнём с создания нового проекта в PyCharm. Итак, вот я в PyCharm. Я собираюсь создать новый проект. Я назову его agent workflow builder. Я буду использовать мои настройки PyCharm по умолчанию и создам виртуальную среду Python, используя версию Python 3.12. Нажму «Создать». Вот мой проект. Первое, что я собираюсь сделать в этом проекте, это установить с помощью pip все библиотеки Python, которые мне понадобятся для проекта. Я сделаю это непосредственно из терминала. Я пойду сюда, выберу «Терминал». Теперь я могу запустить pip install для всех этих библиотек. Я запущу это. Подождём, пока они загружатся и установятся. Вот и всё. Я продолжу. Разрешите мне выбрать каталог проекта здесь. Я перейду в «Файл», «Создать», а затем «Файл». Я создам requirements.txt. И я собираюсь сохранить список всех библиотек, необходимых для этого приложения. Я вставлю список сюда. Этот файл может быть полезен, если и когда я захочу развернуть это приложение на конкретном сервисе, таком как Streamlit Cloud или Heroku. Теперь я создам ещё один файл. Создам новый файл. Этот файл будет называться env. Таким образом, это будет скрытый файл. Я собираюсь хранить здесь свои ключи API в этом файле. И я буду читать эти ключи API из этого файла из своего кода в своём файле Python, который я ещё не создал. Первый – это ключ API OpenAI. Я уже создал его, поэтому я вставлю его сюда. Этот ключ API OpenAI будет использоваться для взаимодействия с большими языковыми моделями OpenAI. Позвольте мне показать вам, где я создал этот ключ API. Здесь я вошёл в свою учётную запись OpenAI. Я перейду на панель инструментов здесь, а затем нажму «Ключи API». И вы можете видеть, что я уже создал ключ API здесь. Теперь я вернусь к своему файлу env в PyCharm. Я собираюсь добавить ключ API serper. Он используется для взаимодействия с поисковым API Google. Это, по сути, способ программного поиска в Google из моего приложения. Я могу показать вам, где я создал этот ключ API. Вот я вошёл в свою учётную запись serper. Я перейду к ключу API. И вы можете видеть, что я уже создал ключ API здесь. Теперь я снова в PyCharm. Я собираюсь начать создавать своё приложение. Перейду к «Создать файл Python». Я назову своё приложение streamllet app. Это создаст файл Python в моём проекте. Я скопирую первый фрагмент кода сюда. Мы начнём с импорта основных библиотек, которые нам нужны. OS, Streamllet, помогут нам управлять переменными среды и создавать пользовательский интерфейс. Затем мы импортируем agent, task и crew из crew AI. Это строительные блоки для определения и запуска нашего многоагентного рабочего процесса. Далее мы импортируем инструменты, которые будут использовать наши агенты. Это включает в себя инструмент code interpreter для выполнения кода Python и инструмент serpev, который позволяет агентам искать в Интернете. Мы также импортируем base tool из crewai для определения собственных пользовательских инструментов и base model и field из pydantic для структурированной проверки ввода. Наконец, мы импортируем библиотеку open AAI, чтобы наш инструмент summarizer мог использовать GPT для генерации сводок. Далее мы загружаем наши переменные среды с помощью load.en. Это извлекает наши ключи API из файла env. Сначала я загружаю ключ API OpenAI из файла env здесь. А затем я загружаю ключ API serper из файла здесь. Затем мы добавим простую проверку. Если какой-либо ключ отсутствует, мы покажем сообщение об ошибке в интерфейсе stream и затем остановим работу приложения. Переменная ST представляет собой псевдоним для библиотеки Streamlate, которую мы импортировали в начале файла. Мы создадим один экземпляр инструмента serperdev. Здесь вы можете видеть, что он использует ключ API serp. Затем мы создадим один экземпляр инструмента code interpreter. Далее мы определим пользовательский инструмент summarization, который использует GPT OpenAI. Сначала мы создадим класс pydantic под названием summarize tool input. Это говорит Crew AI, какой тип входных данных ожидает инструмент. В данном случае строка под ключом description. А затем мы определяем фактический инструмент summarized, который наследуется от base tool. Мы даём ему имя и описание. Устанавливаем его схему ввода для использования класса, который мы только что определили. А затем метод _run – это место, где происходит магия. Он отправляет входной текст в API завершений чата OpenAI. Мы устанавливаем модель здесь на GPT3.5 Turbo. Для сообщений мы устанавливаем RO, а контент – это сам входной description. Это был вход в функцию run. Мы также устанавливаем temperature max tokens. А затем мы возвращаем краткую версию контента, которая является заданным description. Теперь я создам один экземпляр этого инструмента summarizer. Итак, у меня инициализированы три инструмента. Я буду отслеживать их в словаре. Здесь, в словаре, вы можете видеть ключи с соответствующими значениями, которые являются инициализированными инструментами. В этом следующем разделе настраивается базовая компоновка и брендинг нашего приложения streamlet. Опять же, st – это псевдоним, который я установил при импорте streamlet. Мы определяем заголовок страницы и макет. Затем мы добавляем заголовок и краткое описание, объясняющее, что это приложение позволяет пользователям создавать и запускать агентов ИИ с использованием Crew AI. Здесь мы добавляем текстовое поле ввода. Это позволяет пользователю определить общую задачу, над которой должны работать агенты, например, исследование темы или создание резюме. Мы также включаем значение по умолчанию, которое даёт пример задачи. Здесь мы создаём ползунок streamllet, позволяющий пользователям указать количество агентов, которые они хотели бы использовать для задачи. Минимальное значение – два, максимальное значение – пять, значение по умолчанию – три. И здесь мы просто добавляем подзаголовок, сообщающий пользователю, чтобы он настроил каждого агента. Мы создадим пустой список, в котором будем хранить конфигурацию каждого агента, указанного пользователем. Весь этот блок создаёт динамический интерфейс, который позволяет пользователю настраивать каждого агента. Для каждого агента, выбранного с помощью ползунка, мы открываем раскрывающийся раздел. Внутри пользователь может определить роль агента, установить конкретную цель и выбрать инструменты, которые будет использовать агент. Эта часть создаёт многовариантное выпадающее меню в пользовательском интерфейсе, позволяющее пользователю выбирать один или несколько инструментов для каждого агента. Параметры поступают из tool map, который мы определили выше. Это включает в себя инструменты поиска, кода и суммирования. По умолчанию поиск предварительно выбран. Конфигурация каждого агента хранится в списке, поэтому мы можем использовать её позже для создания фактических агентов Crew AI. Это создаёт кнопку для запуска логики создания и запуска каждого агента ИИ по одному. Это создаёт пустой список, который мы будем использовать для хранения фактических агентов после их создания. На этом этапе мы перебираем конфигурации агентов из пользовательского интерфейса. Мы сопоставляем выбранные имена инструментов с фактическими экземплярами инструментов, используя tool map. Затем назначаем каждому агенту роль, цель, набор инструментов и предысторию. Каждый агент добавляется в список, чтобы его можно было использовать на этапе выполнения задачи. Вот следующий раздел. Позвольте мне отступить его. На этом этапе мы перебираем каждого агента и запускаем их по одному. Мы начинаем с общего описания задачи в качестве начального ввода. Для каждого агента мы создаём новую задачу, используя текущий ввод, и назначаем её этому агенту. Здесь мы устанавливаем ожидаемый результат для каждой задачи. Затем мы создаём команду только с этим агентом и задачей, чтобы они могли работать независимо. Это позволяет нам передавать выходные данные от одного агента к другому, создавая последовательный рабочий процесс. Здесь мы показываем сообщение о состоянии, пока агент работает. Мы вызываем crew.kickoff, чтобы запустить агента и получить выходные данные из его задачи. А затем эти выходные данные сохраняются в списке вместе с ролью агента. А затем мы сохраняем вывод команды как текущий ввод, чтобы передать его следующей задаче в следующем агенте. Здесь, на последнем этапе, после завершения работы всех агентов, мы показываем сообщение об успехе и отображаем окончательный вывод от последнего агента. Мы также включаем раскрывающийся раздел, который показывает пошаговые выходные данные от каждого агента, чтобы пользователь мог видеть, как задача развивалась на каждом этапе. Теперь я хочу запустить это приложение streamlet. Я вернусь к своему терминалу. Я запущу streamlet run streamllet app.py. Это имя моего файла. Это запускает локальный сервер streamlet и открывает моё приложение в моём браузере по умолчанию. Вот оно. Итак, вот мой конструктор рабочего процесса агента ИИ. Идея состоит в том, чтобы иметь возможность создавать и запускать пользовательскую команду агентов ИИ. Каждый агент может иметь разные роли, цели и инструменты, включая веб-поиск, выполнение Python и суммирование. Итак, вот где я могу установить общую задачу для агентов. Вот где я указываю количество агентов. По умолчанию три. А затем, если я прокручу вниз, я могу настроить каждого из этих агентов. Например, здесь агент один, я могу указать роль и цель. Я также могу указать инструменты для агента один. По умолчанию это поиск. Агент два, роль, цель, а затем инструменты для агента два, и так далее. Итак, давайте пройдёмся по полному примеру. Я изменю это. Мне нужно только два агента. Позвольте мне изменить задачу для агентов. Я собираюсь изменить это на исследование происхождения фанк-музыки и обобщение информации. Это общая задача для двух агентов. Итак, у меня будет один агент, который будет проводить исследование, а другой – обобщение. Я изменю роль агента один на исследователя. И какова их цель? Помогать в исследовании происхождения фанк-музыки. Вот и всё. Я оставлю инструмент этого агента как поиск. Я изменю роль агента два на обобщающего. И какова их цель? Помогать в обобщении исследования, собранного агентом один. Итак, я собираюсь изменить инструмент для этого агента. Это не будет поиск. Это будет обобщение. Это был наш пользовательский инструмент. Я запущу команду последовательно. Вы могли видеть, как агент один, исследователь, проводит исследование, а затем агент два, обобщающий, делает обобщение. И вот окончательный вывод от последнего агента. И вот краткое изложение происхождения фанк-музыки. Здесь я могу видеть полные выходные данные агентов. Мы могли бы начать с вывода первого агента, агента-исследователя. Вот исследование. Здесь я могу видеть вход для первого агента. Это была просто задача. А затем я могу видеть вывод первого агента. Затем вот второй агент, обобщающий. Я могу видеть вывод этого агента, резюме. Я могу видеть вход для второго агента прямо здесь – это исследование от агента-исследователя. Теперь, поскольку резюме исследования не намного короче, чем само исследование, я хочу изменить цель обобщающего. Давайте укажем помочь в обобщении исследования, собранного агентом один, в двух предложениях. Затем я повторно запущу свою команду последовательно. Агент один делает исследование. Агент два делает обобщение. Окончательный вывод от последнего агента. И вот резюме. Похоже на два предложения. Отлично. Давайте попробуем ещё один пример. Я просто обновлю эту страницу. Начну сначала. Позвольте мне указать задачу для агентов. Я собираюсь проанализировать список квартальных показателей выручки и обобщить тенденцию бизнеса. Мне понадобится три агента для этого. Теперь мы настроим каждого агента. Первый агент будет форматировать данные. И какова цель? Извлечь и отформатировать заданные данные в список Python или словарь. Вот пример данных. Всего четыре квартала показателей выручки. Что касается инструментов для этого агента, можно использовать поиск или обобщение. Я буду использовать обобщение. Он передаст результаты второму агенту, который будет аналитиком данных. Цель этого агента будет заключаться в выполнении расчётов по данным. Например, среднее значение, темпы роста, тенденция, а инструментом будет код. Он будет запускать фактический код Python для выполнения расчётов. А затем он передаст результаты третьему агенту. Это будет обобщающий инсайты, и цель будет заключаться в преобразовании результата в чёткий бизнес-инсайт. Изменим инструмент, который, безусловно, будет обобщать. Запустим команду последовательно. Посмотрим, как работает форматировщик данных. Затем работает аналитик данных, а затем работает обобщающий инсайты. Окончательный вывод от последнего агента. Вот резюме с чётким бизнес-инсайтом. Давайте свернём это. Посмотрим на полные выходные данные агентов, чтобы лучше понять это. Вот первый агент, форматировщик данных. Он взял показатели выручки, поместил их в список, и вы можете видеть, что ввод для второго агента, аналитика данных, был списком цифр. А затем ввод для третьего агента были расчёты от второго агента. А затем он позаботился о суммировании и преобразовании их в чёткие бизнес-инсайты. Если вы хотите развернуть своё приложение, вы можете нажать «Развернуть». Здесь есть три варианта. Streamlit имеет своё собственное облако сообщества, или вы можете развернуть его в Snowflake или на какой-либо другой платформе.