Умные приложения

Как создать штурмана для Формулы E на Android с помощью ML Kit и Gemini Nano

Колонки

  • Алистер Бриз (Alastair Breeze)

    Инженер-программист, Google Cloud's Office of the CTO

  • Оли Томпсон

    Младший специалист по обработке данных, Formula E

О приложении

О выступлении

Гоночный автомобиль – это сложная среда с высокой скоростью, жарой и ограничениями телеметрии. Как агент на устройстве может помочь в обработке данных о транспортном средстве в реальном времени для спортивных и инженерных приложений?

На этом техническом семинаре мы рассмотрим экспериментальную гибридную архитектуру, сочетающую периферийное оборудование и облачные агенты. Мы рассмотрим исследовательскую проверку концепции с использованием Raspberry Pi для потоковой передачи телеметрии шины CAN, телефона Pixel с разговорным агентом на устройстве на базе ML Kit и Gemini Nano, а также облачного подключения между агентами (A2A) для рабочих процессов после гонки.

Сводка

  • Условия гонок Формулы E бросают вызов периферийному ИИ из-за экстремальной жары и требований к низкой задержке. На телефоне Pixel был запущен агент, который отвечал водителям, едущим со скоростью более 200 км/ч.
  • Android размещает периферийную архитектуру с помощью Agent Developer Kit и Gemini Nano через ML Kit. Периферийные агенты могут напрямую общаться с облачными агентами по протоколу A2A.
  • Интеграция с автомобилем позволяет передавать телеметрию CAN-шины через Raspberry Pi для публикации данных с пониженной частотой дискретизации 10 Гц по протоколу MQTT. Агент Android объединяет эти данные с голосовым вводом водителя, чтобы оценивать запросы и отвечать на них.
  • Тестирование на трассе в Гудвуде показало, что телефон без проблем справляется с сильным нагревом. В последний момент удалось наладить Bluetooth-соединение со шлемом водителя, прежде чем автомобиль поехал в гору.

Gemini Notebook

Темы

  • gemini-nano
  • ml-kit
  • on-device-ai
  • ai-agents
  • formula-e

Расшифровка

Введение

  • Здравствуйте!

  • Меня зовут Аластер, и сегодня я рад рассказать вам о проекте, который мы реализовали в прошлом году совместно с Формулой E.

  • Сегодня к нам присоединился Оли, чтобы рассказать о нашей совместной работе.

  • Я работаю в Google Cloud в офисе технического директора. Мы часто пытаемся расширить границы возможного на мобильных устройствах и в облаке, а также понять, как они могут работать вместе.

  • Сейчас я покажу вам короткое видео, которое даст вам представление о том, чем мы занимались.

  • Мощность болида Gen4 составляет 600 кВт.

  • Полностью электрический, постоянный полный привод.

  • Я бы сказал, что он чертовски быстрый.

  • Можно ли использовать агент на телефоне Pixel, подключенном к телеметрическим данным, поступающим из автомобиля?

  • Когда водитель будет подниматься на холм в Гудвуде, он сможет поговорить с автомобилем.

  • Это так круто!

  • Gemma, как там мои шины?

  • Давление в шинах в норме, около 1,4 бар.

  • Телефон подключен напрямую к блоку управления двигателем и считывает множество данных о том, что я делаю как водитель.

  • Это первый раз, когда такое происходит в гоночном автомобиле.

  • и я не знаю лучшего места, чтобы показать его.

  • Джемма, мы готовы?

  • Начнем, когда будете готовы.

Проблемы с запуском агентов на периферии

  • В этом проекте мы хотели попробовать добавить в кабину водителя агента-штурмана.

  • И, по сути, мы пытаемся расширить границы возможного с помощью агентов на периферии, потому что это отличный пример действительно сложной задачи.

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

  • Гоночные машины сильно нагреваются, и это одна из главных проблем.

  • Нестабильное подключение.

  • Мы делаем это на Фестивале скорости в Гудвуде, где собираются сотни тысяч любителей автоспорта, чтобы посмотреть, как машины соревнуются в подъеме на холм.

  • Как вы понимаете, когда на поле собираются сотни тысяч людей, со связью могут быть проблемы.

  • Bluetooth.

  • Например, этот автомобиль – по сути, клетка Фарадея, поэтому вы можете только представить, с какими трудностями приходится сталкиваться, чтобы просто подключиться к шлему гонщика.

  • И, наконец, требования к низкой задержке.

  • Этот водитель едет со скоростью более 200 км/ч, поэтому очень важно, чтобы ответы, которые он получает от своего агента-штурмана, были очень быстрыми и точными.

  • И, по сути, нас это очень интересует, потому что мы верим, что агенты станут повсеместными.

  • Мы уже начинаем это видеть.

  • Они больше не только в наших компьютерах.

  • Они есть в наших телефонах, часах, очках, умных домах и даже в автомобилях.

  • И поэтому, по сути, мы действительно хотели посмотреть, чего мы можем достичь в таком сложном сценарии, как этот.

  • И когда мы думали, как это сделать, мы думали, не сделать ли нам микрокомпьютер с ускорителем, чтобы модель была там?

  • Мы вдруг поняли, что все необходимые ингредиенты уже существуют, и это Android.

Почему 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.

  • Теперь давайте посмотрим, как работает агент. Все очень просто: скажите команду активации, в нашем случае "Эй, Джемма", задайте вопрос и получите ответ.

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

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

  • Вы, наверное, думаете, что код для этого будет выглядеть довольно сложно, верно?

Реализация с помощью ADK и ML Kit

  • Оказывается, все довольно просто.

  • В первых нескольких строках вызывается 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, прямо на устройстве.

  • Спасибо всем.

  • Позже мы будем в кабинке, так что вы можете подойти и задать нам несколько вопросов.

Код

Фрагменты кода

Фрагмент кода на Kotlin в разделе "Реализация с помощью ADK и ML Kit"
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 */
    )
)