Create Your Own AI Agents from Scratch: Step-by-Step Python Tutorial

Create Your Own AI Agents from Scratch: Step-by-Step Python Tutorial

Machine-readable: Markdown · JSON API · Site index

Поделиться Telegram VK Бот
Транскрипт Скачать .md
Анализ с AI

Оглавление (6 сегментов)

Segment 1 (00:00 - 05:00)

Всем привет. Добро пожаловать снова в мое видео. В этом видео я пошагово расскажу вам, как можно закодировать собственного агента с помощью Python, чтобы вы поняли, что это не так волшебно, как вы могли бы подумать. Вы можете подумать, что это своего рода магия, когда не знаете, как это работает, но реальность иная. Эти агенты также используют LLM, но их интеграция или функциональность — то, как они написаны — очень просты. Существует множество функциональных блоков или объектов, которые используют простые агенты LLM, и они решают, какой из них использовать, когда использовать и т. д. В этом видео вы шаг за шагом поймете, как все работает. И это важно, если вы используете агентов, если вы программист или просто рассматриваете проект с ними или хотите их улучшить. Так появились такие инструменты, как Cursor. Например, GitHub Copilot предлагает нам LLM для написания кода, но Cursor решили, что будет лучше, если они смогут использовать агента для анализа нашей кодовой базы, прежде чем предлагать решения. Теперь вы видите, что Cursor стоит миллиарды, так что это важно, если вы работаете с агентами. Чтобы не занимать слишком много времени, я хочу упомянуть, что реализации агентов очень умны. Они просто используют блоки. Вот почему вы можете найти много решений в Интернете, где вы создаете своего собственного агента с помощью перетаскивания. Это правда — вы можете это сделать. Но если вы программист, важно знать, что находится под капотом. В этом уроке я покажу вам, что это не магия, и это будет работать для новичков. Если вы средний или продвинутый, вы можете продолжать смотреть, но это больше для новичков, которые хотят знать, как это работает. Давайте начнем с первого урока по основам. Первое, что вам нужно знать, это как использовать OpenAI или Anthropic для создания своего собственного агента. Но сначала нам нужно знать, как выполняется простой запрос API к нашему клиенту OpenAI. Если вы можете это сделать, вы можете выбрать любую платформу, которую захотите. Итак, если вы программируете с ним в Excel, вы, вероятно, уже знаете, как это сделать. Но, например, это элементарно: вы создаете переменную, определяете свой ключ API, свою модель, свой базовый URL и все. Вы устанавливаете требования. Эти требования будут необходимы для всех этих пяти руководств; это не слишком много. Давайте перейдем к основам. Здесь я загружаю среду, то есть загружаю ключ API OpenAI из своего файла среды. Когда он загружен, я могу просто отправить запрос, в котором я определяю, что моя система является полезным помощником, и как пользователь прошу написать пятистрочное стихотворение о программировании на Python. Вот и все. Мы извлекаем результат вот так, и если я нажму «запустить», это должно сработать. Да, видите — это работает. Итак, он написал это простое стихотворение: «В коде Python логика течет. Простой синтаксис, прогресс растет. Отступы направляют каждую строку, Язык

Segment 2 (05:00 - 10:00)

ясный, точный, божественный, Где действительно проявляется креативность». Это прекрасно! Я сам не мог даже подумать об этом. Так что это довольно просто. Давайте перейдем к другому важному шагу при работе с агентами. Обязательно получить правильный вывод. Например, если у нас есть функция в Python, которая принимает три аргумента — имя, дату или расходы, — необходимо получить ту же структуру из нашего LLM. Не так давно OpenAI представила новую функцию для получения структурированного вывода с помощью Pydantic. Раньше нам приходилось жестко кодировать структуру в приглашении, например, говоря: «Вы должны вернуть ответ в формате JSON с именем, датой, участниками» и т. д. Это работало, но иногда нет, поэтому нам требовались шаги проверки, чтобы убедиться, что ответ был в правильном формате. Прямо сейчас мы используем Pydantic и можем получить структуру, как и ожидалось. Мы импортируем BaseModel из Pydantic, импортируем OpenAI и загружаем среды, как и раньше. Здесь я создаю формат для события календаря, ожидая имя, дату и участников. Это только пример в образовательных целях. Давайте двигаться дальше. Мы определяем наше приглашение: система должна извлекать информацию о событии из предоставленной информации. Например, мой контент: «Джон и Боб собираются на научную ярмарку в это воскресенье». Представьте, что этот контент взят из электронного письма или календарного события. Мы ожидаем, что наша модель извлечет имя, дату, участников. Мы передаем объект формата ответа CalendarEvent, и все. Раньше мы использовали содержимое сообщения с завершением. Теперь мы используем completion. choices. message. parsed, что означает, что он анализирует ответ. Вот и все. Если я запущу его, вы увидите, что он выводит название мероприятия, дату мероприятия, участников. Это круто. Вы можете видеть: научная ярмарка в воскресенье, а персоны — Джон и Боб. Представьте, что могут быть и другие задачи — это не обязательно только для событий. Например, у вас может быть запись в блоге, из которой вы хотите извлечь 10 фрагментов информации: содержание, дата, целевая аудитория, теги, заголовок и т. д. Вы можете захотеть извлечь эту информацию из простой записи в блоге, чтобы сохранить ее в базе данных. Так что это круто. Теперь, когда мы знаем, как работают структурированные ответы, давайте перейдем к другому шагу: использованию инструментов. Использование инструментов похоже на определение функций в Python. Например, при решении задачи мы знаем, какую функцию мы хотим использовать, в каком порядке и т. д. Когда мы говорим об агентах, у них тоже есть функции. Они знают, что это за функции и т. д. Но разница в том, что они сами решают, какую функцию использовать и когда ее использовать. Вот тут-то и начинается «магия» — мы не жестко кодируем логику, а позволяем агенту или LLM решать, какую функцию, какой инструмент и когда использовать. Они могут повторять, пока не найдут решение. Как и прежде, мы импортируем много из Pydantic: BaseModel, Field, load_dotenv, requests и т. д. Когда речь идет об этих инструментах, очень полезно знать документацию. OpenAI предоставляет понятную документацию по инструментам, так что ознакомьтесь с ней. Кроме того, пост в блоге Anthropic удивителен, когда речь идет об агентах; я рекомендую его прочитать — они объясняют, как они используют инструменты, память, извлечение и практические аспекты

Segment 3 (10:00 - 15:00)

их использования. Давайте продолжим с нашим кодом. Теперь я определяю своего клиента. Например, я определяю функцию get_weather — простую функцию Python для вызова API с открытым исходным кодом. Нам нужно указать широту и долготу, и она вернет информацию о погоде: градусы Цельсия, давление и т. д. Мы определяем это, затем определяем инструменты. В OpenAI вы видите похожие вещи — я могу копировать и вставлять, но нужно изменить некоторые параметры, такие как имя функции и описание. Функция должна предоставлять температуру для предоставленных координат в градусах Цельсия. Параметры — это широта и долгота, оба обязательные числа; никаких дополнительных свойств; структура строгая. Это круто. Далее мы определяем системное сообщение: ваша полезная система. Пользовательское сообщение: «Какая погода сегодня в Париже? » Это может быть любой город. Но имейте в виду, что сейчас я спрашиваю только о столицах, координаты которых, как я знаю, OpenAI знает, в противном случае он может дать нам неправильный ответ. Мы определяем модель, client. chat. completions. create; мы определяем наши инструменты, как и раньше. Если мы зайдем в отладчик и запустим это, мы увидим, что происходит много всего. Читать весь этот объект не очень здорово, но если мы его распечатаем, вы увидите, что это объект. Вы видите, что он ответил выбором завершения, вызвав вызов инструмента, и подробностями о вызванном инструменте. Это говорит нам, что он решил использовать вызов инструмента. Мы определяем всю нашу функцию. Здесь я определяю функцию get_weather с аргументами. Если нам нужно больше инструментов, мы реализуем их здесь с другими именами. Это ответ выбора завершения message. tool_calls с аргументами широта, долгота и имя инструмента, которое он ожидает использовать. Давайте выведем ответ — это объект с аргументами. Теперь мы знаем имя и аргументы для нашей функции. Мы используем широту и долготу для вызова API, получаем результаты, а результаты — это температура, скорость ветра, время и т. д. Мы добавляем наши сообщения, завершаем вызовы инструментов, выполняем итерацию, и теперь у нас есть наш ответ от нашего API. Нам нужно структурировать ответ из нашей модели OpenAI, поэтому мы определяем класс с моделью ответа, с фактической температурой в виде числа (float) и, возможно, ответом на естественном языке на вопрос пользователя. Вот что мы определяем. Мы делаем то же самое, что и раньше: предоставляем инструменты, WeatherResponse и сообщения (включая память предыдущей информации) и движемся дальше. Вот и все. Мы получаем ответ завершения, и вы видите: температура 15. 1, «Текущая температура в Париже составляет 15°C, а скорость ветра умеренная — 13,7 км/ч. Кажется, что день будет мягким». Давайте проверим это! Температура в Париже сейчас: например, 15 градусов — именно то, что мы получили из нашего ответа OpenAI. Это

Segment 4 (15:00 - 20:00)

круто. Это не магия — как видите, у нас есть функция инструмента, и нам просто нужно использовать ее в правильном порядке. Теперь вы знаете, как ее использовать. Давайте перейдем к другому руководству. Этот запрос здесь не используется, поэтому импорты все те же, что и раньше. Что такое извлечение? В сообщении блога Anthropic вы видите инструменты, извлечение и память. Вы уже знаете, что такое инструменты — например, функция погоды; память просто складывает нашу историю разговоров; а извлечение 105 00:15:48,529 --> 00:15:46,179 — это внешний поиск данных, например, просмотр веб-сайта или базы данных. Например, у меня есть database. json, внутренняя база знаний с краткой политикой, например, по политике возврата, доставке, платежам и т. д. Обычно при работе с магазином приходится отвечать на сотни похожих вопросов. Здесь мы используем нашего агента в качестве чат-бота, чтобы помочь клиентам с этой информацией. Функция search_database может выполнять поиск в Интернете или где угодно; для простоты здесь это просто JSON. Обычно при работе с огромной базой данных это может быть векторизованная база данных или иметь комбинации RAG (Retrieval Augmented Generation). Мы определяем функцию search_db и другой вызов инструмента для search_db. Вот наш обязательный вопрос (строка) для получения ответа из базы знаний. Как и прежде, мы определяем эти инструменты, а затем системную подсказку: «Вы полезный помощник, который отвечает на вопросы из базы знаний об интернет-магазине». Это то, что я говорил ранее. Итак, какова политика возврата? Если мы спросим об этом, LLM не может знать ответ по умолчанию, так как у каждого магазина своя политика. Нам нужно найти эту информацию в базе знаний, поэтому мы ее определяем. Как и прежде, мы определяем client. chat. completions. create с нашими сообщениями и инструментами и получаем ответ. Он такой же, как и раньше. Мы решаем, что ему нужно выполнить поиск в инструментах базы данных, чтобы ответить, и возвращаем ответ, включая идентификатор ответа. Вот что мы получим. Если я запущу это в режиме отладки, вы получите окончательный ответ: «Товары можно вернуть в течение 30 дней с момента покупки с оригинальным чеком». Это круто. Мы делаем этот ответ — ничего магического. Что произойдет, если вопрос не соответствует базе знаний? Тот же системный запрос, и пользователь спрашивает: «Какая погода в Токио? » Вместо того, чтобы сказать погоду, LLM отвечает: «В настоящее время у меня нет доступа к информации о погоде в реальном времени. Возможно, вы захотите проверить веб-сайт или приложение о погоде для получения последних данных о Токио. Если у вас есть дополнительные вопросы о наших продуктах, не стесняйтесь спрашивать». Это прямой ответ от LLM — видите ли, если бы у него был инструмент погоды, который он мог бы использовать, он бы это сделал. Но поскольку нет инструментов в реальном времени, он просто отвечает напрямую, а инструменты базы знаний не совпадают. Итак, теперь мы знаем, как использовать базовый запрос, получать структурированные ответы, использовать простые инструменты и использовать поиск. Далее, последний пример — показать вам, как создать более продвинутый пример: использовать два разных инструмента. Обычно это проблема, когда пользователи пытаются реализовать агентов. Это выглядит просто, когда мы используем один инструмент за раз для простых задач, но что произойдет, если нам понадобится несколько инструментов? Вот и проблема. Давайте перейдем к

Segment 5 (20:00 - 25:00)

примеру цепочки инструментов. Это последний пример. Я структурировал и задокументировал код здесь, не делая сейчас пошагово, а написав объектно-ориентированным способом. Когда вы откроете его, вы сможете продолжить работу, создать больше инструментов и т. д. Это пример передовой практики с агентами и того, с чего вам следует начать. Как и прежде, мы используем BaseModel, поле модели, импорт математики — вы поймете, почему. Я использую инструмент погоды для получения ответов о погоде; я определяю его как объект и функцию вызова, как и раньше. Он требует широту и долготу, документирует все, выполняет запрос к API погоды и возвращает ответ. Есть обработка ошибок и т. д. — но это не главное. Затем я добавил дополнительную функцию инструмента как объект. Каждый раз, когда мы создаем новый инструмент, нам нужно определить этот параметр инструмента — это упрощает задачу, так что вам не придется разделять инструменты в коде, когда их много. Так что это один инструмент. В качестве другого примера я использую инструмент калькулятора, который получает выражение — просто код Python для оценки того, что сюда попадает. И все. Выражение может быть чем-то вроде «3 + температура в Нью-Йорке» — простая математика, обработка ошибок и т. д. Затем мы снова переходим к инструментам, где мы определяем, какие должны быть входные данные (например, математическое выражение), обязательные и т. д. Ничего магического. Из окончательного ответа мы хотим получить числовое вычисление температуры. Итак, задача: вычислить сумму погоды в разных столицах. Это всего лишь пример задачи. Если мы зададим, например, две столицы — Париж и Нью-Йорк — агент должен сам найти координаты Парижа, получить погоду в Париже, найти координаты Нью- Йорка, получить погоду в Нью-Йорке, суммировать результаты и затем ответить нам. Если бы мы хотели чтобы усложнить задачу, с заглавными буквами, координаты которых неизвестны, мы могли бы использовать другой инструмент для извлечения широты/долготы из адреса, а затем продолжить цепочку. Я определяю класс агента, который будет строить систему из инструментов и модели. Для отладки, если вы установите debug как True, он отобразит логику, показывающую, какой шаг он делает. Он инициализирует инструменты — каждый объект инструмента имеет функцию параметра инструмента с определением инструмента. Чтобы вызвать инструмент, мы используем его имя. Это логика. Например, пользователь может предоставить пять заглавных букв; агенту нужно выполнить цикл и получить всю необходимую информацию для каждой из них, наращивая память. Только тогда, когда у него будет вся информация, он сможет перейти к шагу вычисления. Это гибко — было бы сложно жестко закодировать на базовом Python. Поэтому вы можете открыть код и понять, как он работает; это всего лишь пример. Я рекомендую перейти к этому примеру, если вы заинтересованы в реализации чего-то похожего. Итак, вот моя демонстрация кода. Мы определяем системное приглашение: «Вы полезный помощник, который может узнать погоду и сделать 167 00:24:37,900 --> 00:24:37,759 вычислений». С помощью этого мы можем запрашивать вычисления или просто спрашивать погоду; это гибко, поэтому мы создаем систему сами. Если я спрашиваю: «Какова сумма текущей температуры в Париже и Берлине? » — начав с простой задачи — запускаем код. Он запускается, и результат равен 32,9. Текущая температура в Париже составляет 15,5, в Берлине — 17,4, поэтому

Segment 6 (25:00 - 29:00)

сумма погоды составляет 32,9. Результаты получены от API погоды и инструмента расчета. Он решил, что использовать. Давайте посмотрим с включенной отладкой — он показывает все шаги. Есть недостаток: если это огромная задача, много запросов отправляется в OpenAI. Если она медленная, как в случае с LLM с открытым исходным кодом или работающая локально, может потребоваться время, чтобы получить ответ. Это недостаток агентов. Но кто знает — через пять или десять лет это может быть мгновенно. Вы можете идти шаг за шагом: отправлять основные сообщения, вызывать API, отвечать из инструментов, другой инструмент с другим ответом местоположения, затем отправлять выражение в калькулятор, суммировать результаты и давать окончательный ответ. Это работает. Если я добавляю Нью-Йорк, например, — просто для проверки с большим количеством заглавных букв — я отключаю отладку для простоты, и вы видите, что результат (например) 46,4; он возвращает все эти ответы. Это не магия, а просто разумное размещение каждого инструмента и логики в коде. Если нас не интересует сумма, а просто температура в Нью -Йорке, например — он просто вызывает API погоды и возвращает температуру: «Текущая температура в Нью-Йорке составляет 12,4 °C». Это вся магия, которую нам нужно знать об агентах ИИ. Теперь вам нужно решить свою задачу, свою проблему и двигаться дальше — решать более сложные задачи и т. д. Вот и все для этого руководства. Я хотел продемонстрировать, что это действительно просто. Если вам понравился этот контент, не стесняйтесь нажать кнопку «Нравится», подпишитесь и продолжайте следить за моим каналом. Я с нетерпением жду создания большего количества подобных замечательных руководств, чтобы дать вам глубокое понимание того, как все работает. Прямо сейчас я сосредоточен на агентах — я сделаю еще несколько руководств об агентах, чтобы вы получили больше фонового понимания того, что они собой представляют, как они работают и где мы можем их использовать. В этом примере я хотел показать вам, что они собой представляют с практической стороны. Мне было бы интересно найти реальную проблему, для которой мы могли бы создать агента. Так что если у вас есть какие-либо идеи, не стесняйтесь писать их в комментариях — я могу попытаться помочь решить вашу проблему. На этом все для этого руководства. Надеюсь, оно было для вас полезным. Все ссылки вы найдете в описании. Я выложу код на GitHub, чтобы вам было легче наверстать упущенное. Спасибо за просмотр и увидимся в следующий раз. Пока.

Другие видео автора — Python Lessons

Ctrl+V

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник