Я PHP-разработчик с многолетним стажем (от слова "много"). Привык, что мой мир - это веб-приложения, серверный код и бесконечные "фичи" на Laravel или Yii (да... легаси - это мой конёк). В последние пару лет вокруг бушует AI-бум: всюду слышно про нейронки, LLM, про каких-то "агентов", которые сами решают задачи. И, признаться, временами у меня появлялась лёгкая тревога. Не отстану ли я от поезда, если не перейду полностью на Python/NodeJS или не выучу новый фреймворк? Ведь почти все примеры ИИ-интеграций, что я видел, были на Python или JavaScript. PHP в этих разговорах фигурировал редко, если вообще упоминался.

Недавно я наткнулся на упоминание о Neuron - инструменте, который гордо назван "первым enterprise-ready агентным фреймворком на PHP". Мой скептицизм сразу поднял голову: "Агентный фреймворк? На PHP? Серьёзно?" С другой стороны, это заинтриговало. Если всё правда, то вместо того чтобы судорожно перелистывать учебник по Python, возможно, я смогу внедрять ИИ прямо там, где мне комфортно — в PHP-стеке. И вот я решил разобраться, что же такое этот Neuron и насколько он реален.

Что такое Neuron и зачем он нужен?

Начну с очевидного: Neuron — это фреймворк на PHP для создания и оркестрации AI-агентов. Проект позиционируется как решение, позволяющее интегрировать "разумных" AI-сущностей в существующие PHP-приложения, опираясь на гибкую и мощную архитектуру. Проще говоря, разработчики Neuron заявляют, что дают нам, PHP-разработчиками, все инструменты, чтобы добавить в свои приложения умных ассистентов, не переписывая всё на другом языке. В экосистеме Neuron есть компоненты на каждый случай жизни: интерфейсы для общения с языковыми моделями (LLM), загрузчики данных, оркестраторы для нескольких агентов сразу, средства мониторинга и отладки — полный цикл разработки агентных приложений на PHP.

Звучит впечатляюще. Ещё год назад я бы подумал, что такое возможно только в мире Python. Ведь PHP-экосистема доселе не была избалована библиотеками для AI-агентов (впрочем, вот одна из последних, с которой я ознакомился: LLM Agents PHP) - в этой сфере рулит Python, да JavaScript помогает, а мы, PHP-разработчики, оставались как бы не у дел. И если честно, многие ребята из моей команды поглядывают в сторону Python, чувствуя, что без него не впрыгнуть в уходящий поезд машинного обучения. Сам автор Neuron, кстати, описывает ровно это ощущение: имея крупное PHP-приложение, сложно и накладно прикрутить к нему AI, написанный на другом языке. Перебрасывать данные приложения в сервис на Python или Node - значит плодить костыли, дублировать логику, рисковать безопасностью и стабильностью. Нежизнеспособно, одним словом. Вот почему идея "AI-агенты внутри PHP-приложения" выглядит заманчиво: не надо учить новый язык, не надо городить интеграцию с внешними скриптами - всё работает в единой среде.

Neuron вырос как раз из этой потребности. Разработчик фреймворка признаётся, что вдохновлялся популярными библиотеками вроде LangChain, желая дать PHP-сообществу аналогичный открытый инструментарий. В итоге получился Neuron с открытым исходным кодом и при этом была проявлена забота о том, чтобы его было удобно поддерживать в продакшене: в пару к фреймворку идёт сервис мониторинга Inspector.dev, который умеет отслеживать, что творят ваши агенты под капотом. Автор надеется, что таким образом поможет PHP-разработчикам "запрыгнуть в автобус AI" на прочном основании, не перепрыгивая на новые языки впустую. Звучит, во всяком случае, многообещающе.

Реальные примеры использования

Конечно, любую технологию проверяют практикой и желательно на реальном проекте. Что же можно реально сделать с помощью Neuron? Оказалось, уже существует несколько удачных экспериментов. Например, энтузиасты сделали AI-агента для аналитики данных: он подключается к базе данных и генерирует детальные отчёты, экономя часы ручной работы аналитика. Другой пример – сервис подбора одежды по погоде: агент агрегирует данные о погоде и рекомендует, что надеть, демонстрируя, как можно сочетать workflow-пайплайн с внешними инструментами для реально полезного совета. Есть даже кейс AI-агента для службы поддержки: разработчик научил модель Claude читать запросы клиентов и предлагать ответы, встроив такого помощника прямо в процесс поддержки пользователей.

Мне особенно понравился пример с автоматической проверкой технических статей: агент читает статью и выдаёт советы по улучшению – своего рода редактор-робот. Он не гадает вслепую, а сперва вытягивает текст статьи через специальный инструмент (по сути, делает HTTP-запрос содержимого страницы), а уже потом подключает модель для анализа. Такая цепочка выглядит куда как осмысленнее банального "скормить кусок текста ChatGPT и получить ответ". Видно, что агент понимает задачу и сам добывает нужные данные перед тем, как что-то советовать. Не зря Neuron позиционируется именно как агентный фреймворк – он про то, чтобы собрать решение из небольших интеллектуальных компонентов.

От LLM к агентам: инструменты, API и пайплайны

Стоит пояснить, что вообще значит эта модная нынче "агентность". По сути, AI-агент – это программный компонент, который действует на основе искусственного интеллекта. Он способен понимать человеческий язык и выполнять задачи, имея определённый контекст и набор инструментов для взаимодействия с миром. Агент - это как бы надстройка над языковой моделью (LLM): если обычная модель просто отвечает на вопросы в чате, то агент может самостоятельно искать информацию, вызывать внешние сервисы и предпринимать действия для достижения цели. Например, правильно спроектированный агент способен сам собрать данные из разных баз знаний, отослать письмо за вас или просканировать вашу базу данных и прислать тревожное уведомление, если найдёт в ней что-то подозрительное. То есть он не ждёт прямой команды на каждое действие, а наделён некоторой автономностью в рамках сценария: видит задачу - планирует шаги - выполняет, привлекая нужные источники данных.

В этом и кроется его сила, и одновременно источник сомнений. Дать программе-агенту свободу действий - идея мощная, но немного пугающая. Сразу спрашиваешь себя: а вдруг мой AI-агент наделает глупостей? Например, отправит неправильный запрос к API или сотворит в базе не то, что ожидалось. Разработчики Neuron, похоже, тоже об этом думали (что на самом деле вполне логично), поэтому сделали архитектуру, где ничего не происходит совсем уж бесконтрольно. Мы сами определяем, какие "инструменты" доступны агенту.

Инструменты (Tools)

Инструменты - это ключевой концепт. По сути, это функции или API, которые мы явно разрешаем вызывать модели, чтобы она могла действовать вне пределами текста. Документация объясняет, что инструменты позволяют LLM выходить за рамки генерации текста и взаимодействовать с сервисами приложения или внешними API. Мы можем написать свой инструмент, например функцию getWeather(city) для получения погоды, или дать доступ к базе данных через специальный метод. Агент, получив в распоряжение такой инструмент, при планировании решит: "Чтобы ответить пользователю, мне нужны свежие данные о погоде - вызову-ка я функцию getWeather!". То есть агент не обладает магическим доступом ко всему подряд; он как дрессированный робот, которому выдаются только нужные инструменты. В примере с SEO-агентом, про который я упоминал, как раз был инструмент для скачивания текста по URL, реализованный через обычный file_get_contents(). Агент мог позвать этот метод, чтобы получить содержимое статьи, и затем уже давал рекомендации по улучшению текста. Выглядит просто, но на практике подобный продуманный подход встречается не всегда - зачастую приложения ограничиваются тем, что шлют запрос в модель без дополнительных данных, а потом удивляются неточным ответам.

Пайплайны (Pipelines / Workflow)

Помимо инструментов, Neuron позволяет строить целые пайплайны из нескольких шагов и даже нескольких агентов. Если один агент не справляется со всей задачей, можно организовать связку: скажем, сначала агент-А найдет нужную информацию, потом агент-Б на её основе что-то напишет, а агент-В проверит результат. Такие цепочки легко превращаются в хаос, если нет хорошей системы оркестрации. Без нормального фреймворка пришлось бы городить хрупкий код с кучей if-ов, таскать вручную состояние между вызовами, следить самому за каждым шагом — одним словом, получился бы снежный ком из условий, который плохо масштабируется.

Neuron как раз предоставляет Workflow – механизм для оркестрации сложных последовательностей. Я еще не успел погрузиться глубоко, но судя по недавнему релизу Neuron v2, эта система полностью переработана. Раньше, была громоздкая схема по типу "workflow graph", а теперь архитектура событийно-ориентированная: каждый шаг – это узел, который может слать события и реагировать на них, а жёстких связей (типа заранее определённой последовательности) больше нет. На практике это означает, что стало намного проще задавать циклы и ветвления. Агент может, к примеру, по ходу выполнения решать, повторить ли ему поиск информации ещё раз (петля), или перейти к другому под-агенту в зависимости от результата (ветвление).

Потоковое выполнение (Real-Time Streaming)

Ещё один приятный момент – потоковое выполнение и вывод промежуточных результатов. В Neuron v2 добавили возможность стримить ход работы агента. Представьте: раньше пользователь бы сидел и смотрел на крутящийся спиннер, пока AI-агент обдумывает ответ. А теперь можно показать процесс: агент сперва пишет "Ищу информацию...", потом "Нашёл X, теперь анализирую…" и т.д. – всё это в реальном времени. Такая прозрачность действительно вселяет больше доверия: ты видишь, что делает ИИ у тебя под капотом, а не гадаешь, завис он или работает.

Human-in-the-loop

И наконец, human-in-the-loop – возможность впустить человека в цикл работы агента. Если агент наткнулся на неоднозначное место или требуется подтверждение, он может приостановиться и спросить: "Эй, мне нужна подсказка, как поступить?" – дождаться ввода человека, и затем продолжить с того же шага. Это, по-моему, очень важная штука. Многие боятся отдавать на откуп ИИ критичные решения, и правильно боятся. А здесь предусмотрена плавная интеграция с человеком: контролируй, направляй, когда нужно. Редко где встретишь такое из коробки, обычно подобное приходится костылить вручную.

Пример удачного подхода из практики

Хочу выделить один пример, который показался мне образцовым в плане правильного использования AI-агента. Он несложный, но в нём отражена суть подхода. Возвращаясь к тому SEO-агенту, о котором было упомянуто выше: агент не просто отвечает на вопрос "как улучшить SEO статьи?", а сам выполняет мини-расследование.

Во-первых, с помощью инструмента он скачивает текст статьи по URL.

Во-вторых, имея на руках реальный текст, агент отправляет его модели (Anthropic Claude, OpenAI или другой, неважно) с инструкцией "проанализируй и дай рекомендации".

В-третьих, получает от модели конкретные советы и возвращает их пользователю. Казалось бы, можно было сразу кинуть модели ссылку или кусок текста, зачем эта возня? Но взгляните с другой стороны: агент гарантированно оперирует актуальными данными, он сам их извлёк. Это не обезличенный ChatGPT, который может не знать свежего контента и начнет изобретать факты. Такой подход напоминает стратегию Retrieval-Augmented Generation (RAG), когда перед генерацией ответа ИИ вытаскивает нужные сведения из надежного источника. В целом, это то, что должно значительно повысить точность и достоверность результата.

Увы, на практике многие ленятся внедрять что-то подобное: большинство "интеграций" ИИ в приложения ограничиваются прямым вызовом модели с коротким промптом (честно говоря и я в своих проектах часто этим "грешил"). Мне кажется важно создавать такие решения, где ИИ действительно подключен к живым данным, да ещё и в режиме реального времени их подтягивает. Поэтому пример с SEO-агентом мне запомнился как показатель того, как надо: агент наделён узкой компетенцией (анализ SEO), у него есть подходящий инструмент (достать текст статьи), и он выполняет задачу в несколько шагов, как это сделал бы человек, а не просто выдаёт ответ на одном дыхании.

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

Первые шаги: впечатления

Вернёмся к Neuron. Как разработчик, я подхожу к нему с позиции новичка: пытаюсь завести простой пример. Допустим, хочу сделать скрипт, который отвечает на вопрос пользователя, обращаясь к двум разным источникам – локальной базе и внешнему API.

На старте, конечно, установка через Composer - тут без сюрпризов.

composer require neuron-core/neuron-ai

Теперь создадим агента

php vendor/bin/neuron make:agent App\\Neuron\\MyAgent

Дальше – конфигурирование AI-модели: указываю ключ API той же OpenAI (если поддерживается несколько провайдеров, это плюс). Затем описание инструментов: например, даю агенту функцию getUserOrder($userId), чтобы он мог получить информацию о заказе пользователя из нашей базы. И, допустим, инструмент fetchCurrencyRate($currency), чтобы сходить за курсом валют.

Теперь главный момент – попросить агента решить задачу. Я формулирую ему цель: “Ответь пользователю, когда был отправлен его последний заказ и сколько он стоил в евро”. Агент должен: (1) распознать, что нужно вытащить заказ (значит, вызвать getUserOrder), (2) понять, что цена в базе в рублях, а нужна в евро – вызвать fetchCurrencyRate и пересчитать, (3) всё это оформить текстом.

Если Neuron работает как заявлено, он сам определит этот план и выполнит шаги один за другим. На выходе я получу сгенерированный ответ, например: “Ваш заказ от 3 ноября уже отправлен. Его стоимость примерно 50 евро по текущему курсу.” И это всё – без явного кодирования всех шагов, агент сам решил, что делать.

Мысленно аплодирую... Но потом думаю: а как агент понял, что нужно вызвать именно эти функции? Наверняка, мы дали ему описание инструментов. Например, при регистрации fetchCurrencyRate мы сообщаем, что она “возвращает актуальный курс для указанной валюты”. Модель, читая задачу, сочла нужным узнать курс – и воспользовалась функцией. То есть, разработчик становится как бы менеджером по инструментам: нужно предугадать, какие действия могут понадобиться AI, и предоставить их заранее.

Это, кстати, отдельная тема – дизайн промптов и инструментов. Фреймворк - это лишь половина дела. Вторая половина – как мы сформулируем задачу для модели и как опишем функции. Ошибёшься в формулировке – и агент пойдёт не туда. Забудешь важный инструмент – и агент застрянет, не умея достать нужные данные. По сути, Neuron требует от разработчика думать на два шага вперёд, представляя себя и сценаристом, и страховочным тросом для AI.

Примеры кода

Свой код, о котором я упоминал выше - давать не буду, так как он сырой, но приведу совсем простой пример, просто чтобы дать вам почувствовать саму идею фреймворка.

Пример кода на Neuron:
namespace App\Agents;

use NeuronAI\Agent;
use NeuronAI\Providers\Anthropic;
use NeuronAI\Tools\Tool;

class SEOAgent extends Agent
{
    public function provider(): AIProviderInterface
    {
        // return an AI provider instance (Anthropic, OpenAI, Mistral, etc.)
        return new Anthropic(
            key: 'ANTHROPIC_API_KEY',
            model: 'ANTHROPIC_MODEL',
        );
    }
    
    public function instructions() 
    {
        return "Act as an expert of SEO (Search Engine Optimization). ".
            "Your role is to analyze a text and provide suggestions on how the content can be improved to better rank on Google search.";
    }
    
    public function tools(): array
    {
        return [
            Tool::make(
                "get_file_content", 
                "Use the url to get the content in plain text."
            )->addProperty(
                new ToolPropertry(
                    name: 'url',
                    type: 'string',
                    description: 'The URL of the article you want to analyze.',
                    required: true
                )
            )->setCallable(function (string $url) {
                return file_get_contents($url);
            })
        ];
    }
}

Ещё пример:

Пообщаться с агентом
use NeuronAI\Chat\Messages\UserMessage;

$response = SEOAgent::make($user)
    ->chat(
        new UserMessage("Give me your feedback about this article: https://inspector.dev/introduction-to-neuron-ai-create-full-featured-ai-agents-in-php/")
    );
    
echo $response->getContent();
// It seems like a good job has been done on the article, 
// however I can give you some tips to improve SEO:...

Итак, мне как свежему пользователю Neuron, всё это кажется интересным. Фреймворк явно стремится учесть реальные проблемы: и то, что модель может ошибаться или галлюцинировать, и то, что код должен логироваться и отлаживаться, и то, что иногда нужен человек с красной кнопкой "стоп". Встроенная интеграция с мониторингом Inspector.dev тому подтверждение — можно заглянуть в логи агента, увидеть, какие решения он принимал, какие ответы генерировал, где упал или затупил. Работая с ИИ, это совсем не лишнее: когда обычный код даёт баг, мы читаем стек-трейс; а когда ИИ сгенерил "баг" (ответил ерунду), надо иметь возможность понять, почему он так решил и т.д. Пока не пощупаешь в бою, трудно сказать, насколько удобно там всё организовано, но сам факт фокуса на отладке - уже вызывает респект.

Панель инспектора

В общем...

После пары дней, проведённых за чтением документации Neuron и игрой с простенькими примерами, я испытываю смесь облегчения и новых вопросов. Облегчения — потому что вижу: PHP не остался в стороне от AI-революции. Нам не обязательно бежать и использовать Python ради одной фичи с чат-ботом. Вопросы же - потому что любая новая мощная технология приносит новые риски. Да, создатели Neuron уверяют, что PHP теперь полностью готов к разработке "агентных" приложений, что они фундаментально изменили возможности нашего старого доброго PHP, сделав сложные AI-системы практичными и эффективными. Остаётся проверить, как это проявится в реальных проектах. Не превратится ли написание AI-агента в PHP в борьбу с ограничениями производительности или экосистемы? Будет ли сообщество это активно использовать? Пока рано делать выводы.

Лично у меня появилось чувство, что мы находимся в начале интересного пути. Возможно, через год-другой AI-агенты в PHP станут обычным делом, и каждый более-менее крупный проект будет иметь в своём составе умного ассистента – поискового бота, консультанта, аналитика. А может, мы обнаружим скрытые подводные камни и вернёмся к идее "проще было всё-таки написать скрипт на Python". В любом случае, я рад, что сейчас у нас есть выбор. Neuron показал мне, что мой привычный стек технологий способен на большее, чем я думал.

Заканчивая эти заметки, я не хочу давать чётких рекомендаций – да и не могу, ведь я только-только сам знакомлюсь с инструментом. Однако мне определённо захотелось попробовать применить Neuron в небольшом экспериментальном проекте и посмотреть, что из этого выйдет. Как раз сейчас у меня на работе появилась такая возможность - мы начинаем создавать один сервис (работающий с GPT), где вместо стандартного подхода (сервис-ориентированный) можно попробовать применить агентно-ориентированный. Что из этого выйдет - не знаю, но определённые надежды на удачный результат есть. Попробуем, и если выйдет что-то интересное - постараюсь поделиться результатом.

Пусть будет больше PHP-агентных фреймворков!
Мне кажется, пришло время!

Ссылки по теме:

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