Проблема: тяжёлые AI-агенты на маленьком железе
Последнее время я экспериментировал с AI-агентами на Raspberry Pi 5.
И довольно быстро столкнулся с проблемой: большинство существующих агентных фреймворков оказываются слишком тяжёлыми для небольшого железа.
Типичная архитектура таких решений включает:
-
Python-фреймворк
-
несколько фоновых сервисов
-
orchestration слой
-
иногда векторную базу
-
довольно сложную конфигурацию
На сервере это нормально работает. Но на Raspberry Pi всё начинает ощущаться иначе:
-
долгий старт
-
лишние зависимости
-
больше потребление памяти
-
сложность там, где задачи на самом деле простые
А задачи, ради которых я хотел использовать агента, были довольно базовые:
-
посмотреть загрузку CPU
-
проверить диск
-
прочитать логи
-
перезапустить сервис
Для этого не хотелось поднимать целую AI-платформу.
Поэтому я решил попробовать другой подход и написал небольшой runtime для таких задач.
Что хотелось получить
Основные требования были довольно простыми:
-
минимальная инфраструктура
-
быстрый запуск
-
предсказуемое выполнение команд
-
возможность использовать LLM, но не везде
Идея была в том, чтобы агент не превращался в “LLM для всего”.
Многие действия можно выполнить детерминированно и быстрее.
LLM полезен скорее для:
-
классификации запросов
-
интерпретации текста
-
сопоставления команды со skill
Основная идея: deterministic routing + LLM
Во многих агентных системах модель является центральным элементом. Практически каждый запрос проходит через LLM.
Это удобно с точки зрения универсальности, но на практике приводит к нескольким проблемам:
-
задержки
-
галлюцинации
-
лишние вычисления
В openLight логика немного другая.
Сначала система пытается обработать запрос детерминированно.
Если это не удаётся, то используется LLM для классификации.
Таким образом:
-
простые команды выполняются мгновенно
-
модель используется только там, где это действительно нужно
|
Path |
Route classification |
Skill classification |
Skill execution |
Total |
|---|---|---|---|---|
|
Ollama (qwen2.5:0.5b) |
19.84s |
22.56s |
0.15s |
42.55s |
|
OpenAI (gpt-4o-mini) |
1.35s |
1.77s |
0.15s |
3.28s |
Как работает маршрутизация запросов
Telegram message
↓
Auth + persistence
↓
Deterministic routing
├─ match → execute skill
└─ no match → LLM route classifier
↓
chat / skill
↓
validate
↓
execute
Последовательность примерно такая:
-
сообщение приходит из Telegram
-
проходит авторизацию и сохраняется
-
система пытается сопоставить его с известным skill
-
если совпадение найдено — действие выполняется сразу
-
если нет — LLM используется для классификации
-
перед выполнением skill проходит валидация
Такой подход позволяет сохранить контроль над исполнением команд.
Архитектура openLight
Проект специально сделан максимально простым.
Основные решения:
-
написан на Go
-
распространяется как один бинарник
-
используется SQLite
-
минимальные зависимости
Это позволяет запускать систему на небольших устройствах без сложной инфраструктуры.
Интерфейс через Telegram
Пока основной интерфейс — Telegram.
Изначально это было просто удобным способом быстро взаимодействовать с агентом, но на практике оказалось довольно комфортно.
Преимущества такого подхода:
-
не нужен веб-интерфейс
-
есть уведомления
-
доступ с телефона
-
встроенная авторизация
Например, можно отправить команду:
что там по статусу системы
Агент интерпретирует запрос и запускает соответствующий skill, который собирает информацию о системе.
Ответ выглядит примерно так:
Hostname: raspberry
CPU: 0.0%
Memory: 2.1 GiB used / 7.9 GiB total
Disk: 864.2 GiB free / 916.3 GiB total
Uptime: 1d 22h 38m 16s
Temperature: 51.8C
В этом случае LLM используется только для того, чтобы сопоставить текст запроса с системным skill.
Само выполнение происходит детерминированно: runtime собирает метрики системы и возвращает результат.
Это позволяет:
-
быстро обрабатывать типовые запросы
-
не гонять каждое действие через модель
-
сохранить предсказуемость выполнения
Что дальше
Проект пока на ранней стадии.
Сейчас основной интерфейс Telegram, но дальше планируется добавить:
-
дополнительные интерфейсы
-
новые skills
-
расширение возможностей работы с локальными LLM
Идея остаётся той же: небольшой runtime для персональной инфраструктуры, где детерминированная логика выполняет большую часть работы, а LLM используется там, где это действительно полезно.
Если интересно посмотреть проект или поэкспериментировать
Буду рад фидбеку и идеям для новых skills.
Автор: IsupovEvgenii
