Я написал своего первого агента более двух лет назад. Это не какая-то новая технология, а просто подход к разработке программ с использованием LLM (GPT и аналоги). Для этого не нужны никакие фреймворки или познания в AI, достаточно быть программистом. Из этой статьи вам будет понятно как проектировать агентов и для каких задач они подходят, без воды и философии.

Все базируется на двух способностях нейронных сетей:

  • LLM (не все) умеют возвращать JSON, их дополнительно тренируют для этого

  • Программисты (не все) умеют декомпозировать задачи

Базовые возможности

Представьте, что вы пишите самую обычную программу, где вы как обычно хардкодите всю логику. Вы используете API, в которое можно отправить любой текст, а в ответ получить JSON в фиксированном формате. Поздравляю, ваша программа - ИИ-агент (в понимании текущего хайпа). AI не управляет логикой, не делает вызовов к базам данных. Ваш код принимает JSON от AI, а дальше все по старинке: вы прописываете IF-THEN-ELSE для обращения к базам данных, повторно вызываете API и т.д.

Начнем с очень простого примера, пользователь прислал комментарий и нам нужно проверить его на оскорбления.

//Запрос для API, просто текстовая строка:
Пользователь прислал мне комментарий
Скажи есть ли в нем скрытые или явные оскорбления
Пришли ответ в JSON в следующем формате
{
  "UserComment":"Это все ерунда какая-то",
  "YourExplanation":"добавь сюда свои пояснения к твоему ответу"
  "InsultDetected":true/false
}

//Ответ от API будет следующий:
{
  "UserComment":"Это все ерунда какая-то",
  "YourExplanation":"Этот текст не содержит оскорблений",
  "InsultDetected":false
}

В ответе вы получите атрибут "InsultDetected", который очень удобно использовать в вашем коде. Атрибут "YourExplanation" игнорируйте, я добавляю его чтобы повысить качество ответов. Поскольку LLM отвечает интуитивно, а не логически, вы должны быть готовы к следующим проблемам:

  • JSON в ответе может оказаться битым, особенно если вы пропустили важную запятую или кавычку в запросе, как я сделал это в примере выше.

  • Атрибут InsultDetected может быть то true, то false на один и тот же текст. Чем точнее вы определите в запросе, что такое Оскорбление, тем реже AI будет ошибаться в ответе.

Многоходовочка

Перейдем к примеру посложнее. Пользователи моего приложения учат английские слова, у них есть возможность добавить в обучение любое слово с определенным смыслом. Задача ИИ-агента:

  • найти в базе все слова с подходящими смыслами

  • если ничего не найдено, то сгенерировать новый обучающий контент

Допустим, пользователь прислал запрос, что он хочет учить слово "milk" со значением "извлекать выгоду". Первый шаг очевиден, вытаскиваем из базы все записи, где Word = 'milk', их будет несколько. Второй шаг, для удобства пользователя отфильтруем записи через LLM:

Скажи мне, какие смыслы подходят для значения "Извлекать выгоду", верни JSON:
{
  "EnglishWord":"milk",
  "Meaning":"Извлекать выгоду",
  "OtherMeanings":
  [
    {"Meaning":"Молоко", "IsSameMeaning":true/false},
    {"Meaning":"Доить корову", "IsSameMeaning":true/false},
  ]
}

Если в выходном массиве "OtherMeanings" есть что-то с "IsSameMeaning":true, то просто возвращаем результат пользователю. Если ничего не нашлось, то Третий шаг - отправляем в LLM другой запрос, с просьбой сгенерировать новый контент, опять же завернутый в JSON для надежности. Результат сохраняем в базу для будущего переиспользования и выдаем пользователю.

Другие сценарии

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

  1. Просим LLM определить категорию проблемы. Отправляем через API всю жалобу пользователя и описание категорий ("Не пришла посылка", "Оспариваю списание денег"), просим в ответе вернуть true/false для каждой категории.

  2. Допустим, определилась категория "Оспариваю списание денег", просим LLM найти в жалобе пользователя ID Транзакции. Если не нашли - отправляем пользователю вопрос "Пришли ID".

  3. Ищем ID в базе, ищем проблемы, откатываем транзакцию - все это без участия LLM.

Вы также можете поискать что-то в локальной базе знаний, если она у вас есть (без участия LLM) или даже сделать поисковый запрос в Интернет (все еще без LLM), а потом (как вариант) скормить результаты поиска в LLM спросив ее "Есть ли тут ответ?". Делайте все что угодно, в любой последовательности. Ваша задача - решить проблему пользователя, а не следовать паттернам.

Ненужные усложнения

Очень модный тренд - перевесить логику работы программы на LLM, но это самое худшее, что вы можете сделать. Примеры:

  • Пользователь прислал запрос, какой товар он хочет. Передаем в LLM сам запрос, передаем структуру базы данных с товарами и просим сгенерировать SQL‑запрос, который потом выполняем.

  • Пользователь прислал запрос в техподдержку. Передаем в LLM описание API наших микросервисов и просим LLM принять решение, какой из методов необходимо вызвать. Всю логику описываем на естественном языке.

Это будет работать, но «Дорого, Медленно и Некачественно». Каждый вызов LLM стоит денег и требует несколько секунд на выполнение. Чем более простые запросы вы делаете к LLM, тем меньше галлюцинаций вы от нее получаете. Я уже молчу про возможности отладки таких программ и проблемы с безопасностью.

Итого

GPT-3.5 уже умела возвращать JSON. GPT-4 делает это лучше, но принципиально ничего не изменилось. LLM - это прекрасный инструмент, с ним можно делать невероятные вещи, если включать голову. ИИ-агенты - это много исходного кода, который пишут программисты, и немного вызовов LLM.

LLM - это не тот искусственный интеллект, которому можно доверить логику, время истинных ИИ-агентов еще не пришло.

Комментарии (1)


  1. julianvrn
    07.07.2025 18:40

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