Гоночный автомобиль – это сложная среда с высокой скоростью, жарой и ограничениями телеметрии. Как агент на устройстве может помочь в обработке данных о транспортном средстве в реальном времени для спортивных и инженерных приложений?
На этом техническом семинаре мы рассмотрим экспериментальную гибридную архитектуру, сочетающую периферийное оборудование и облачные агенты. Мы рассмотрим исследовательскую проверку концепции с использованием Raspberry Pi для потоковой передачи телеметрии шины CAN, телефона Pixel с разговорным агентом на устройстве на базе ML Kit и Gemini Nano, а также облачного подключения между агентами (A2A) для рабочих процессов после гонки.
Расшифровка
Здравствуйте!
Меня зовут Аластер, и сегодня я рад рассказать вам о проекте, который мы реализовали в прошлом году совместно с Формулой E.
Сегодня к нам присоединился Оли, чтобы рассказать о нашей совместной работе.
Я работаю в Google Cloud в офисе технического директора. Мы часто пытаемся расширить границы возможного на мобильных устройствах и в облаке, а также понять, как они могут работать вместе.
Сейчас я покажу вам короткое видео, которое даст вам представление о том, чем мы занимались.
Мощность болида Gen4 составляет 600 кВт.
Полностью электрический, постоянный полный привод.
Я бы сказал, что он чертовски быстрый.
Можно ли использовать агент на телефоне Pixel, подключенном к телеметрическим данным, поступающим из автомобиля?
Когда водитель будет подниматься на холм в Гудвуде, он сможет поговорить с автомобилем.
Это так круто!
Gemma, как там мои шины?
Давление в шинах в норме, около 1,4 бар.
Телефон подключен напрямую к блоку управления двигателем и считывает множество данных о том, что я делаю как водитель.
Это первый раз, когда такое происходит в гоночном автомобиле.
и я не знаю лучшего места, чтобы показать его.
Джемма, мы готовы?
Начнем, когда будете готовы.
В этом проекте мы хотели попробовать добавить в кабину водителя агента-штурмана.
И, по сути, мы пытаемся расширить границы возможного с помощью агентов на периферии, потому что это отличный пример действительно сложной задачи.
Проблемы, с которыми вы сталкиваетесь в гоночном автомобиле, очевидно, связаны с высокой температурой.
Гоночные машины сильно нагреваются, и это одна из главных проблем.
Нестабильное подключение.
Мы делаем это на Фестивале скорости в Гудвуде, где собираются сотни тысяч любителей автоспорта, чтобы посмотреть, как машины соревнуются в подъеме на холм.
Как вы понимаете, когда на поле собираются сотни тысяч людей, со связью могут быть проблемы.
Bluetooth.
Например, этот автомобиль – по сути, клетка Фарадея, поэтому вы можете только представить, с какими трудностями приходится сталкиваться, чтобы просто подключиться к шлему гонщика.
И, наконец, требования к низкой задержке.
Этот водитель едет со скоростью более 200 км/ч, поэтому очень важно, чтобы ответы, которые он получает от своего агента-штурмана, были очень быстрыми и точными.
И, по сути, нас это очень интересует, потому что мы верим, что агенты станут повсеместными.
Мы уже начинаем это видеть.
Они больше не только в наших компьютерах.
Они есть в наших телефонах, часах, очках, умных домах и даже в автомобилях.
И поэтому, по сути, мы действительно хотели посмотреть, чего мы можем достичь в таком сложном сценарии, как этот.
И когда мы думали, как это сделать, мы думали, не сделать ли нам микрокомпьютер с ускорителем, чтобы модель была там?
Мы вдруг поняли, что все необходимые ингредиенты уже существуют, и это Android.
Android – идеальная платформа для этого, потому что у нас есть ADK, то есть Agent Developer Kit.
Это отличная библиотека, которая позволяет создавать агентов прямо в приложении.
У нас миллиарды пользователей, и мы можем легко запускать код на разных устройствах, тестировать его и распространять.
Инструменты разработчика, которые позволяют выполнять отладку, пробовать разные варианты и находить ошибки.
ИИ на устройстве. Телефоны Google Pixel теперь поставляются с TPU прямо в самом телефоне, оптимизированным для модели на устройстве, которая находится прямо в телефоне, что позволяет очень легко использовать API, такие как ML Kit, чтобы получить доступ к действительно мощной модели.
Кроме того, у нас есть такие функции, как преобразование текста в речь и распознавание речи, а также полностью автономные API, которые позволяют создавать действительно мощные разговорные интерфейсы.
И, наконец, очевидно, связь.
Телефоны созданы для связи, будь то через сотовые сети, Wi-Fi или другие средства.
Но одна из проблем заключается в том, что агенты на периферии не могут делать всё, и как они будут работать с агентами, потенциально, в облаке?
А что, если решение было гибридным?
Что если агент, живущий в телефоне, сможет напрямую общаться с агентом в облаке, чтобы выполнять более сложные действия?
Например, водитель хочет узнать, на какой позиции он находится.
Сам автомобиль не знает, какую позицию он занимает в гонке, но агент в облаке может это знать.
У нас есть протокол agent-to-agent, который позволяет создавать агентов на периферии и в облаке и заставлять их общаться друг с другом для выполнения более сложных действий.
Как мы его создали?
Итак, я собираюсь рассказать вам о составляющих этой системы.
Начнем с ремней.
В данном случае это приложение для Android, в котором запущен Agent Developer Kit для Android.
Вторая часть – это модель.
Для этого нужна модель, и мы использовали Gemini Nano через ML Kit – очень мощную модель на устройстве, которая всегда под рукой.
Затем данные.
Оли расскажет об этом подробнее через минуту, но у вас есть данные, поступающие от автомобиля, а также, возможно, распознавание речи водителя.
И, наконец, у вас также есть действия, которые может выполнять агент.
Это может быть преобразование текста в речь, чтобы иметь возможность ответить водителю и задать дополнительные вопросы или предоставить необходимую информацию, или, как упоминалось ранее, связь между агентами, связь с агентом в облаке для выполнения некоторых более сложных действий.
А теперь я хочу пригласить на сцену Оли, который расскажет, как мы реализовали это в Формуле E.
Спасибо, Аластер.
Итак, у нас есть все ингредиенты. Теперь самое сложное: как интегрировать ИИ-агента в болид Формулы E?
Итак, все начинается здесь, в блоке управления автомобилем.
Теперь каждый датчик и каждый компонент автомобиля передают данные в него по так называемой шине CAN.
И машина генерирует тысячи точек телеметрии в секунду, такие как скорость, ускорение, дроссель, торможение и многое другое.
Чтобы считывать телеметрию, мы решили подключить Raspberry Pi напрямую к блоку управления автомобилем через CAN-шину.
Raspberry Pi выполняет несколько разных функций.
Сначала он декодирует необработанные сигналы, преобразует их и понижает частоту дискретизации примерно до 10 Гц, что дает достаточно информации для штурмана.
Затем Raspberry Pi публикует эти уточненные данные через MQTT на Pixel 10 Pro, находящийся в кабине автомобиля.
Это один из входных параметров, которые может принимать приложение, в котором размещено наше агентское приложение.
Второй – распознавание речи Android.
Когда водитель говорит, приложение преобразует его речь в текст, и Gemini Nano может анализировать оба этих ввода.
Теперь агент может принять два решения. Во-первых, он может использовать систему преобразования текста в речь Android, чтобы ответить водителю.
И во-вторых, как ранее упоминал Аластер, он может общаться с облачным агентом по протоколу A2A.
Теперь давайте посмотрим, как работает агент. Все очень просто: скажите команду активации, в нашем случае "Эй, Джемма", задайте вопрос и получите ответ.
После этого агент слушает вас ещё около пяти секунд, чтобы вы могли задать уточняющий вопрос, не начиная разговор заново. Все как при общении с настоящим гоночным инженером.
Приложение также является многоходовым агентом, то есть у него есть доступ к истории разговоров, что позволяет ему быть более разговорчивым.
Вы, наверное, думаете, что код для этого будет выглядеть довольно сложно, верно?
Оказывается, все довольно просто.
В первых нескольких строках вызывается onDeviceModel с помощью ML Kit и упаковывается как Gemini Nano.
val generativeModel: GenerativeModel = Generation.getClient()
val onDeviceModel = GenaiPrompt.create(
generativeModel = generativeModel,
name = "gemini-nano",
)
val agent = LlmAgent(
name = "race_engineer",
model = onDeviceModel,
staticInstruction = /* System prompt */,
instruction = Instruction {
/* Dynamic context */
},
tools = listOf(
/* Custom tools */
)
)Затем мы определяем агента с помощью ADK.
Укажите название и два типа инструкций. Первый – это статическая инструкция, которая определяет личность и роль бота.
Это может включать в себя то, как он разговаривает с водителем, и некоторую информацию о гоночной трассе.
Вторая часть – динамическая инструкция.
Теперь это генерируется по каждому запросу с последней сводкой телеметрии, поэтому агент всегда знает, что водитель делает в любой момент времени.
Как упоминалось ранее, в него также входит история текущего чата.
Кроме того, мы определяем некоторые инструменты, например, даем ему возможность обращаться к данным предыдущего сеанса, даем ему возможность обращаться к облачному агенту, а также даем ему возможность обращаться к водителю, используя преобразование текста в речь.
А теперь давайте посмотрим, как агент работает на наших симуляторах в офисе Формулы E.
Gemma, насколько агрессивно я управляю автомобилем?
Спокойный и размеренный.
Максимальный угол поворота руля составил 48 градусов, а средняя скорость вращения – 11 градусов в секунду.
Gemma, какая у меня максимальная перегрузка?
Пиковая перегрузка на поворотах составила 2, 2 g.
Gemma, как прошла моя пробежка?
Отличная пробежка, Дэн.
Максимальная скорость – 306 км/ч, средняя – 186 км/ч за 35 секунд.
Вы ехали на полной скорости 58 % времени, а пиковая перегрузка составила 2,2 G.
Вот и все.
Это Gemini Nano на телефоне разговаривает с водителем, отвечая на его вопросы в реальном времени.
Симулятор – это одно, а болид Формулы E – совсем другое.
Как же мы все это объединили?
Сначала мы отправились в Париж, в компанию Spark Racing Technology, где собирают наши болиды.
На фото слева я подключаю Raspberry Pi к блоку управления болида Формулы E.
Все, что мы создали до сих пор, работало на эмулированных данных и воспроизводилось из тестового сеанса, поэтому мы не знали, будет ли это работать с реальными данными.
Мы подключили его, включили, подождали, подождали ещё немного, и наконец на устройство начала поступать телеметрия, доказывая, что данные перемещаются по системе так, как мы ожидали.
Справа вы видите готовую систему, и вы можете видеть, что телефон фактически встроен в кабину, прямо рядом с тем местом, где будет сидеть водитель.
Итак, мы были готовы к Гудвуду.
Что же произошло в тот день?
Помните четыре проблемы, о которых ранее говорил Аластер?
Гудвуд действительно проверил двоих из них.
Первое – это жара.
В Британии мы обычно готовимся к любой погоде, кроме солнечной.
Поэтому, естественно, мы получили одну из самых жарких недель за всю историю наблюдений, прямо в середине тепловой волны.
Самое время установить компьютер в болид Формулы E.
Но вот в чем загвоздка.
С телефоном все было в порядке.
Android не пострадал.
Оказалось, что Raspberry Pi справился хуже всего.
И поскольку мы не могли подключить его напрямую к автомобилю, нам пришлось использовать так называемый ИБП, который, если вы не знаете, в основном выглядит как куча батарей, прикрепленных к нижней стороне Pi.
Но, к счастью, нам удалось исправить это, периодически пополняя его в течение дня, и без этого машина, вероятно, не поднялась бы на этот холм без ИИ-агента.
Следующим был Bluetooth.
На тот момент мы ещё не тестировали приложение со шлемом водителя, который подключается к приложению по Bluetooth.
И это оказалось непростой задачей.
Чтобы проверить это, мы сели на траву, и кажется, что мы отлично проводим время, верно?
Достали ноутбуки, мило беседуем.
На самом деле это был один из самых напряженных периодов в моей карьере.
Мы отчаянно пытались заставить код работать и подключить шлем по Bluetooth к приложению до того, как машина поедет на холм во второй половине дня.
Но благодаря оперативным исправлениям и отличным инструментам отладки Android нам удалось вовремя устранить проблему, и автомобиль поднялся на холм с отлично работающим ИИ-агентом.
А теперь я передаю слово Аластеру, который расскажет о том, какие выводы мы сделали из этого проекта.
Спасибо.
Спасибо, Оли.
Итак, чему мы научились в этом проекте?
Во-первых, Android – идеальная платформа для агентов.
Я настоятельно рекомендую вам использовать универсальность Android, доступные вам API, модели на устройстве, ADK.
Попробуйте, и вы удивитесь, насколько мощные впечатления можно получить от такой простой вещи.
Интеграционный ад все ещё существует.
Большинство людей в этой комнате, вероятно, сталкивались с этим в какой-то момент своей карьеры.
Вы создаете все подкомпоненты отдельно, а затем, когда вы, наконец, подключаете их вместе, что-то не совсем работает.
Именно так выглядел шлем гонщика.
К счастью, мы смогли устранить проблему в тот же день. Это доказывает, что тестирование по-прежнему очень важно.
И, наконец, Gemini Nano.
Gemini Nano очень помог.
Это очень эффективная модель, которая быстро работает на вашем устройстве и может выполнять действительно сложные задачи, но не сразу.
Это действительно заставляет задуматься.
Вам нужно составить запрос.
Его нужно протестировать.
Вам нужно подумать о том, как вы хотите передавать динамические инструкции по сравнению со статическими.
Вам нужно подумать о том, какие инструменты вы ему предоставите и как лучше всего проинструктировать его, чтобы он это сделал.
Но если провести правильные тесты и оценки, вы сможете получить много пользы от такой модели, как Gemini Nano, прямо на устройстве.
Спасибо всем.
Позже мы будем в кабинке, так что вы можете подойти и задать нам несколько вопросов.
val generativeModel: GenerativeModel = Generation.getClient()
val onDeviceModel = GenaiPrompt.create(
generativeModel = generativeModel,
name = "gemini-nano",
)
val agent = LlmAgent(
name = "race_engineer",
model = onDeviceModel,
staticInstruction = /* System prompt */,
instruction = Instruction {
/* Dynamic context */
},
tools = listOf(
/* Custom tools */
)
)