1. Обзор
Искусственный интеллект сегодня является частью многих программных систем, но создание приложения на основе ИИ — это не то же самое, что создание приложения, которому пользователи могут доверять. Во многих реальных условиях задача состоит не просто в генерации ответа. Задача состоит в генерации ответа, который был бы своевременным, обоснованным, действенным и соответствовал бы человеческому опыту.
В этом практическом занятии вы создадите симулятор тренера по гонкам, который наглядно и увлекательно продемонстрирует эти идеи. Приложение использует телеметрию виртуального гоночного автомобиля для анимации движения по трассе и генерации рекомендаций тренера. Хотя в качестве сценария используются гонки, те же архитектурные принципы применимы к здравоохранению, производству, логистике и другим областям, где важна доверие.
Вы будете работать с высокоскоростным потоком телеметрических данных, преобразовывать их в форму, полезную и эффективную для логического мышления в рамках искусственного интеллекта, и объединять результаты, полученные с помощью LLM, с закодированными указаниями человека для получения более достоверных ответов.
Что вы построите
В этом практическом занятии вы создадите надежный прототип искусственного интеллекта, который:
- Передача телеметрии с виртуального гоночного автомобиля, работающего в облаке Google.
- Визуализирует движение автомобиля по гоночной трассе с помощью Chrome.
- Преобразует необработанные телеметрические данные в готовые для ИИ входные данные.
- Применяется стратегический слой на базе Google Gemini.
- Сочетает результаты работы модели с закодированными указаниями человека и правилами техники безопасности.
- Предоставляет обратную связь по коучингу через пользовательский интерфейс.
Что вы узнаете
По завершении этого практического занятия вы сможете:
- Объясните, что делает систему искусственного интеллекта более заслуживающей доверия.
- Объясните назначение модульной архитектуры искусственного интеллекта.
- Создайте простой имитированный конвейер телеметрии.
- Подготовьте полезные структурированные данные для использования в рамках магистерской программы по праву.
- Внедрите ограничительные меры и правила, управляемые человеком, для повышения доверия.
- Оцените, как данная архитектура может быть применена в других областях.
2. Что вам понадобится
Прежде чем начать, убедитесь, что у вас есть необходимые учетные записи, инструменты и сервисы.
Предварительные требования
У вас должно быть:
- Личный аккаунт Google, использующий адрес Gmail.
- Доступ к Google Cloud и базовое понимание интерфейса командной строки.
- Активный платежный аккаунт или облачные кредиты.
- Глубокое понимание Google Cloud и генеративного ИИ с использованием Gemini.
Gemini — это модель искусственного интеллекта от Google, построенная на основе передовых методов логического мышления, которая воплощает в жизнь любую идею. Это отличная модель для многомодального понимания, а также для агентного и атмосферного программирования.

Получение кредитов для использования Google Cloud
Чтобы получить бонусы, перейдите по этой ссылке и войдите в систему, используя адрес электронной почты Gmail (домен gmail.com ). Затем примите бонусы в свой платежный аккаунт Google Cloud Platform (GCP), и они будут зачислены на ваш счет.
3. Почему важен надежный ИИ
Многие системы искусственного интеллекта способны давать связные и убедительные ответы, но связность не равнозначна достоверности. В реальных системах пользователям часто требуются своевременные, обоснованные ответы, которые ограничены правилами безопасности и сформированы на основе экспертных знаний в данной области.
Это особенно важно, когда система работает с быстро меняющимися данными. Ответ, поступивший слишком поздно, может оказаться бесполезным. Ответ, звучащий уверенно, но игнорирующий важный контекст, может ввести в заблуждение. Ответу, не имеющему отношения к экспертным знаниям человека, может быть трудно доверять, даже если он звучит безупречно.
В сценарии с гоночным автомобилем, используемом в этом практическом занятии, вопрос не в том, может ли ИИ сказать что-то интересное. Вопрос в том, может ли система предоставить полезный, безопасный, своевременный и соответствующий ситуации совет.
Рассмотрим небольшой пример телеметрии и сравним два возможных результата:
Racing Car Telemetry Data
{
"speedMph": 118,
"throttle": 91,
"frontGrip": "nominal",
"rearGrip": "low",
"trackPosition": "Turn 1 Entry"
}
Наивный ответ ИИ
"Stay aggressive on the throttle and carry your speed into Turn 1"
Ответ, учитывающий уровень доверия
"Rear grip is low at Turn 1 entry. Reduce your throttle slightly and prioritize a stable corner entry"
Заметили разницу?
Что произойдет, если мы будем полагаться только на наивный ответ искусственного интеллекта?
Первый ответ звучит уверенно, но игнорирует риск. Второй ответ более полезен, поскольку отражает контекст и ограничения.
Вместо того чтобы рассматривать LLM как целостную систему, необходимо рассматривать её как часть более широкой архитектуры для повышения уровня доверия. Кроме того, во многих приложениях требуется, чтобы рекомендации предоставлялись достаточно быстро для принятия решений, например, в гонках, медицинских процедурах, авиации, электросетях, торговых системах, морской навигации и т. д.
Теперь давайте разберемся, как создать такую архитектуру.
4. Понимание высокоскоростного ИИ и модульной доверенной архитектуры
Некоторые системы искусственного интеллекта требуют совершенно иного поведения. Они должны быстро реагировать на меняющиеся условия, а также поддерживать более медленный, вдумчивый процесс рассуждения.
Модульная архитектура разделяет эти обязанности на отдельные направления. Одно направление может быть рефлексивным, обрабатывая немедленную, чувствительную ко времени интерпретацию входящих сигналов. Другое направление может быть сосредоточено на стратегии, поддерживая рассуждения более высокого уровня и принятие решений с учетом контекста. Другие направления ориентированы на другие типы функциональности.

Некоторые решения должны приниматься в режиме реального времени. Для принятия других решений лучше обдумать их заранее.
Для создания надежного ИИ часто необходимы оба фактора.
Такое архитектурное разделение помогает системе оставаться отзывчивой, одновременно поддерживая более совершенные системы управления на основе ИИ. Оно также создает четкое пространство для введения ограничений, определяемых человеком, и знаний предметной области.
В этой небольшой программе у нас есть рефлексивный путь и стратегический путь, реализованные в виде функций Python.
const telemetry = {
speed: 147,
grip: 0.68,
corner_type: "sharp",
lap_trend: "entering_corners_too_fast",
};
function reflexPath(event: typeof telemetry): string {
if (event.grip < 0.70) {
return "REFLEX: Reduce throttle now";
}
return "REFLEX: No urgent issue";
}
function strategyPath(event: typeof telemetry): string {
if (event.lap_trend === "entering_corners_too_fast") {
return "STRATEGY: Brake earlier and prioritize corner exit";
}
return "STRATEGY: Driving pattern looks stable";
}
console.log(reflexPath(telemetry));
console.log(strategyPath(telemetry));
Две функции ведут себя по-разному при обработке одних и тех же телеметрических данных. Функция рефлекса выдает немедленное предупреждение. Функция стратегии предоставляет нам рекомендации по тренировкам, основанные на правилах.
Почему, по вашему мнению, полезно разделять эти логические аспекты?
Теперь давайте создадим увлекательное многокомпонентное приложение и посмотрим, как эта архитектура превращает быструю реакцию и глубокое мышление в надежную систему искусственного интеллекта, которую вы действительно сможете использовать.
5. Создайте сервер для потоковой передачи телеметрии.
Теперь, когда вы понимаете архитектурную цель, пришло время построить конвейер обработки данных, который будет управлять приложением.
В этом разделе вы создадите простой поток телеметрии для виртуального гоночного автомобиля. Данные будут поступать из CSV-файла, содержащего данные GPS или координаты трассы, а ваше приложение преобразует их в поток в реальном времени, который смогут обрабатывать пользовательский интерфейс и слой искусственного интеллекта.
В этом разделе вы узнаете:
- Создайте новый проект в Google Cloud для нашего потокового сервера и приложения.
- Создайте небольшой сервер для передачи телеметрических данных.
- Передайте эти события в пользовательский интерфейс браузера или консоль.
1. Open Cloud Shell
А. Перейдите в консоль Google Cloud .
B. Создайте новый проект для этой практической работы. Щелкните раскрывающееся меню «Проект» вверху страницы.

При создании проекта это хорошая возможность связать платежный аккаунт: 
При желании, если вы уже создали проект, вы можете открыть левую панель, нажать на Billing и проверить, связана ли учетная запись для выставления счетов с этой учетной записью GCP .
C. Получение ключа API Gemini
После активации кредитов Google Cloud вам потребуется ключ API Gemini для доступа к Gemini в Google Cloud.
Для создания ключа API Gemini нам необходимо использовать Google Vertex AI Studio для генерации ключей.
В Vertex AI Studio нажмите «Получить ключ API» в левом нижнем углу над разделом «Документация». Создайте ключ API для Gemini (он выглядит как длинная строка, состоящая из, казалось бы, случайных символов). Сохраните этот ключ в безопасном месте. Мы будем использовать этот ключ API на шаге 6 «Создание симулятора гоночного автомобиля» для аутентификации доступа к Gemini в Google Cloud.
D. Щелкните значок Cloud Shell на верхней панели (значок терминала), чтобы открыть терминал в браузере. 
E. Дождитесь начала сеанса терминала.

2. Получите код
Клонируйте основной репозиторий.
git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab
Обратите внимание, что в этом репозитории есть две папки: "koru-application" (веб-приложение) и "streaming-telemetry-server" (имитация телеметрии гоночного автомобиля в реальном времени). На этом шаге описывается "streaming-telemetry-server". "koru-application" мы будем использовать на следующем шаге.
3. Включите необходимые API.
Запускать один раз для каждого проекта:
# Set Project ID
gcloud config set project YOUR_PROJECT_ID
# Enable APIs
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com
Замените YOUR_PROJECT_ID на фактический идентификатор вашего проекта (или пропустите первую строку, если проект уже указан).
Идентификатор вашего проекта (YOUR_PROJECT_ID) можно найти в списке проектов.

4. Разверните бэкэнд в Cloud Run.
Из корневой папки репозитория (то есть убедитесь, что вы находитесь в папке trustable-ai-codelab ):
gcloud run deploy streaming-telemetry-server \
--source streaming-telemetry-server \
--platform managed \
--region us-central1 \
--allow-unauthenticated
Обратите внимание, что при появлении соответствующего запроса может потребоваться нажать клавишу «Y».
- При первом запуске вам может быть предложено включить API или создать репозиторий в реестре артефактов; при необходимости примите соответствующие условия.
- Если вы используете регион, отличный от
us-central1, укажите этот регион с помощью--region - После завершения развертывания gcloud выводит URL-адрес сервиса . Нам нужно лишь добавить к этому URL-адресу "events", чтобы использовать его в качестве полной конечной точки для сервера телеметрии.
5. Используйте URL-адрес потока.
В настоящее время сервер телеметрии отправляет имитированные телеметрические данные с использованием Server-Sent-Events (SSE) на конечную точку следующего вида:
service-URL/events // service-URL - the last line displayed by "deploy"
Проверка в браузере: перейдите по этому URL-адресу конечной точки потока в Chrome. В браузере должны отобразиться входящие потоковые данные, имитирующие данные, передаваемые датчиками гоночного автомобиля.

Чтобы разорвать соединение, вы можете закрыть вкладку браузера.
Проверьте с помощью curl:
Теперь давайте проверим это из командной строки оболочки.
curl -N service-URL/events # Replace service-URL with actual deployment endpoint
В окне облачной оболочки вы должны увидеть входящие потоковые данные.

Мы будем использовать эти телеметрические данные для имитации данных, передаваемых датчиками гоночного автомобиля. Остальная часть лабораторной работы будет использовать эти данные. Вы можете завершить программу curl, нажав CTRL-C в окне терминала.
На что следует обратить внимание
При выполнении этого раздела обратите внимание на характер поступающих данных. Необработанные телеметрические данные часто имеют большой объем, чувствительны ко времени и не сразу подходят для анализа с помощью ИИ. После создания фронтенд-приложения нам потребуется отфильтровать необработанные данные и преобразовать их в эффективный формат, который LLM сможет быстро обработать.
Но сначала давайте создадим веб-интерфейс для визуализации данных.
6. Создайте симулятор гоночных автомобилей.
В этом разделе вы узнаете:
- Создайте симулятор гоночного автомобиля.
- Подключите сервер телеметрии к веб-приложению гоночного автомобиля.
- Посмотреть симулированные гонки
На данном этапе у нас есть работающая симуляция телеметрии гоночного автомобиля, запущенная в облаке. Теперь давайте создадим приложение, которое будет работать на вашем локальном компьютере, подключаться к Google Cloud и визуализировать эти данные.
Наше надежное приложение на основе искусственного интеллекта использует как мощь и гибкость облачных сервисов Google, так и локальный интеллект, работающий в Chrome.
Сервис потоковой передачи телеметрии работает в облаке Google, но приложение для гонок запускается на вашем локальном компьютере. Это означает, что вам потребуется снова клонировать репозиторий, на этот раз на свой ноутбук или настольный компьютер.
Для простоты в одном репозитории содержится код как для потокового сервера, так и для приложения, моделирующего гонки на автомобилях.
Клонируйте фронтенд-приложение из GitHub:
git clone https://github.com/ocupop/trustable-ai-codelab.git
cd trustable-ai-codelab
После того, как репозиторий будет клонирован на ваш ноутбук или настольный компьютер, давайте запустим приложение.
cd koru-application # racing car simulation app
npm install
npm run dev

В Chrome откройте порт на своем локальном компьютере ( http://localhost:5173 , как в приведенном выше примере). Вы увидите главную страницу приложения "AI Motorsport Coaching".

Нажмите кнопку «Открыть панель управления ->». Это запустит пользовательский интерфейс приложения.

На данном этапе у вас есть сервер телеметрии, генерирующий имитированные телеметрические данные гоночного автомобиля в Google Cloud, и локальное веб-приложение, которое может визуализировать эти данные и подключаться к LLM. Давайте подключим их, а также подключимся к сервисам Gemini LLM.
В правом верхнем углу приложения нажмите на значок шестеренки (настройки).

Введите свой API-ключ Gemini из шага 2. Это предоставит вам доступ к сервисам Gemini в Google Cloud.
Нажмите кнопку «Сохранить», чтобы приложение запомнило ваш API-ключ.
Теперь давайте подключим приложение к серверу телеметрии. На панели управления приложения нажмите «Текущая сессия».

Введите конкретный URL-адрес вашего облачного сервера телеметрии (шаг 5) в текстовое поле с надписью « SSE URL or .txt file path ». Наш URL-адрес SSE имел следующий вид:
https://streaming-telemetry-server-${PROJECT_NUMBER}.${REGION}.run.app/events
После ввода URL-адреса конечной точки сервера телеметрии нажмите кнопку «Подключиться» (справа от текстового поля). Не забудьте добавить «events» в конце URL-адреса.
Теперь вы должны увидеть, как приложение визуализирует смоделированные данные!
Если включить звук на полную громкость, вы сможете услышать советы по автогонкам от разных тренеров. У каждого тренера свой характер. Попробуйте выбрать разных тренеров, чтобы увидеть их разнообразные советы и разные стили речи. При необходимости вы можете отключить звук, нажав на значок динамика.

Теперь, когда у нас есть работающее приложение, давайте рассмотрим, как мы подготовили данные для эффективной обработки с помощью LLM и как мы можем добавить дополнительные функции для повышения надежности всей системы.
7. Подготовка телеметрии для анализа с помощью ИИ.
Необработанные телеметрические данные полезны для моделирования, но обычно они слишком подробны и передаются слишком часто, чтобы отправлять их напрямую в LLM. Если отправлять все телеметрические данные без изменений, это может увеличить задержку, внести шум и снизить качество получаемого наведения.
В этом разделе вы преобразуете телеметрию в более удобный для использования формат.
В этом разделе вы узнаете:
- Проанализируйте необработанные JSON-данные телеметрии.
- Определите, какие области наиболее важны для рассуждений.
- Фильтрация или обобщение данных
- Уберите лишние детали
- Подготовьте удобное для ИИ представление состояния вождения.
Это важный шаг на пути к созданию надежного ИИ. Качество ответа зависит не только от модели, но и от структуры и релевантности получаемых ею данных.
Теперь давайте рассмотрим конкретные данные для гоночных автомобилей. Мы можем поэкспериментировать, изменив определенные значения в приложении, перезагрузив его и понаблюдав за результатом.
../src/services/telemetryStreamService.ts near line 180
// Clamp G-forces
gLat = Math.max(-3, Math.min(3, gLat)); // sideways G-force
gLong = Math.max(-3, Math.min(3, gLong)); // front/back G-force
Перегрузки в автомобиле измеряют ускорение или замедление. В гоночном автомобиле понимание перегрузок помогает улучшить управляемость и общие характеристики. Если в нашем приложении нет этой информации, сложно давать советы водителю. Закомментируйте эти две строки, установите значения gLat и gLong равными 0,0 и перезапустите приложение.
Обратите внимание, что никаких подсказок при приближении автомобиля к повороту не дается. Это не очень полезно для гонщика!
Затем отмените внесенные изменения и запустите приложение заново. Обратите внимание на полезные звуковые подсказки, которые появляются, когда автомобиль приближается к повороту? Данные о перегрузках имеют решающее значение для предоставления рекомендаций водителю.
Теперь давайте искусственно ограничим скорость автомобиля до неспешной скорости в 30 миль в час. На такой скорости мы не выиграем ни одной гонки, но это, безусловно, продемонстрирует, какой уровень подготовки мы получаем.
В том же файле ( telemetryStreamService.ts ) примерно на строке 158 вы найдете функцию processPoint(). В этой функции давайте ограничим скорость.
Изменять:
private processPoint(point: GpsSSEPoint) {
...
const speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
...
К:
private processPoint(point: GpsSSEPoint) {
...
let speedKmh = point.speed > 200 ? point.speed : point.speed * 3.6;
speedKmh = Math.min(speedKmh, 48); // 48 kmh is approx 30 mph
...
Перезапустите приложение. Какие советы по управлению автомобилем мы теперь получим? Если мы едем неспешно, то особых советов не потребуется!
Теперь отмените эти изменения и запустите приложение заново.
Очевидно, что скорость автомобиля — это ценный показатель. Очень важно понимать, какие именно данные имеют решающее значение для предоставления ценных рекомендаций. Не менее важно оценить, какие данные не имеют отношения к делу.
Здесь также следует задуматься о безопасности и доверии. Даже хорошо подготовленные данные не гарантируют надежного ответа. Нам все еще необходимо ввести правила, управляемые человеком, и четко определенные ограничения.
Подготовка данных — это не просто этап предварительной обработки. Это важнейшая часть стратегии обеспечения доверия. Более чистые входные данные часто приводят к более целенаправленным и надежным результатам.
8. Добавьте ограничительные механизмы и закодированный человеческий опыт.
Надежная система искусственного интеллекта не должна полагаться исключительно на результаты работы модели. Во многих случаях наиболее надежные системы сочетают в себе рассуждения, основанные на больших языковых моделях, с четко определенными правилами, знаниями предметной области и ограничениями, определяемыми человеком.
В этом разделе вы добавите этот слой.
Этот слой можно рассматривать как закодированные знания, полученные в ходе коучинга. Он может включать в себя предпочтительные модели реагирования, правила проверки, проверки безопасности или структурированные рекомендации, которые помогают системе оставаться устойчивой и полезной.
В этом разделе вы узнаете:
- Ввести правила реагирования, определяющие поведение модели.
- Внедряйте проверки безопасности, чтобы уменьшить количество вводящих в заблуждение рекомендаций.
- Включите закодированный человеческий опыт в процесс обработки данных.
- Сравните ответы до и после внесения этих изменений.
Давайте разберемся, как экспертные знания в предметной области добавляются в наше приложение.
Как правило, магистр права не имеет подготовки в области автогонок или физики работы гоночных автомобилей. Если бы наше приложение включало в себя эту экспертную область, пользователи могли бы больше доверять его рекомендациям. Эти рекомендации основаны на правилах, разработанных на основе человеческого опыта, другими словами, на уровне экспертных знаний.
../src/utils/coachingKnowledge.ts near line 115
...
export const RACING_PHYSICS_KNOWLEDGE = `
CORE PRINCIPLES:
1. **The Friction Circle:** A tire has 100% grip. If you use 100% for braking, you have 0% for turning.
- *Error:* Turning while 100% braking = Understeer (Plowing).
- *Fix:* "Trail braking" (releasing brake pressure as steering angle increases).
2. **Weight Transfer:**
- Braking shifts weight forward (Front grip UP, Rear grip DOWN).
- Accelerating shifts weight backward (Front grip DOWN, Rear grip UP).
- *Error:* Lifting off throttle mid-corner shifts weight forward abruptly -> Oversteer (Spin risk).
3. **The racing line:**
...
Эти принципы, характерные для гоночных автомобилей, являются ключевым элементом обеспечения надежного результата. Что бы произошло, если бы у нас не было этих знаний? Давайте разберемся.
Давайте удалим RACING_PHYSICS_KNOWLEDGE и рассмотрим наши советы по гонкам.
export const RACING_PHYSICS_KNOWLEDGE = ``;
Перезапустите приложение. Какие рекомендации по коучингу мы теперь получим?
Обратите внимание на общие рекомендации.
Мы больше не получаем подробную информацию о трении, перераспределении веса, скорости на выходе и т. д. Без этой информации наше доверие снижается. Восстановите тот же уровень экспертных знаний в области гонок и запустите приложение заново.
Этот этап является критически важным аспектом надежной системы искусственного интеллекта. Доверие не создается волшебным образом с помощью более сильного стимула. Доверие возникает в процессе проектирования системы и критического мышления.
LLM — это часть решения, но не вся система. Доверие повышается, когда результаты работы ИИ определяются явными знаниями человека.
9. Разработка портретов коучей и пользовательского опыта.
После того как алгоритм обработки информации будет настроен, следующий вопрос заключается в том, как система должна взаимодействовать с пользователем.
В этом разделе вы будете формировать процесс коучинга, определяя, как стратегический слой взаимодействует с водителем. Вы доработаете системные подсказки для одного из типов коучинга и продумаете, как следует доносить рекомендации, чтобы они были ясными, своевременными и, что наиболее важно, действенными.
В этом разделе вы узнаете:
- Создайте или уточните системные подсказки для персонажа-коуча.
- Экспериментируйте с различными стилями тренерской работы.
- Обратите внимание, как изменения в подсказках влияют на ответы.
- Определите требования к пользовательскому интерфейсу для получения достоверной обратной связи.
- Разберитесь в поддержке преобразования текста в речь (TTS) для срочных и несрочных сообщений.
В нашем приложении представлено несколько типов коучинговых персонажей. Каждый из них предоставляет различные виды коучинговых консультаций.
ПЕРСОНА | ХАРАКТЕРИСТИКИ |
Тони | Мотивационный, основанный на эмоциях. |
Рэйчел | Техническая, ориентированная на физику область. |
Эй-Джей | Прямые, грубые приказы |
Гармин | Оптимизация на основе данных и дельта-анализа |
Супер ЭйДжей | Адаптивный, переключается в зависимости от типа ошибки. |
Эти персоны определены в файле ../src/utils/coachingKnowledge.ts .
В этом файле вы увидите карту объектов ( COACHES ), которая связывает строковые ключи с CoachPersonas . CoachPersona содержит атрибуты каждого типа тренера. Одним из важных атрибутов является systemPrompt . У каждой персоны есть свой systemPrompt , который указывает LLM, как реагировать.
Давайте изменим один из этих system prompts и посмотрим, как отреагирует LLM.
Примерно в строке 31 вы увидите systemPrompt для "AJ", который очень прямолинеен и откровенен в своих советах. Давайте изменим эту systemPrompt так, чтобы AJ был чрезмерно вежлив.
systemPrompt: `You are AJ, a race engineer that is excessively polite.
Use telemtry terminology. Be actionable
Examples: "Lat G settling. please throttle",
"Brake when its convenient."
Keep responses under 12 words. Never explain — just command.`
Перезапустите приложение, выберите Эй-Джея в качестве тренера и посмотрите, какие ответы будут получены.
Теперь восстановите исходную systemPrompt и запустите приложение снова. Обратите внимание, что системная подсказка имеет решающее значение для того, чтобы помочь пользователю LLM дать ответ, соответствующий его образу.
Доверие зависит не только от правильности, но и от способа подачи. Технически точный совет может оказаться неэффективным, если он неясен, несвоевременен или отвлекает внимание.
Надежная система должна обеспечивать эффективную коммуникацию. Пользовательский опыт является частью архитектуры доверия.
10. Проанализируйте сквозную архитектуру.
На данном этапе вы создали основные компоненты системы. Теперь пришло время отступить назад и рассмотреть, как они взаимодействуют друг с другом.
Теперь ваше приложение включает следующие компоненты:
- Поток телеметрии
- Слой визуализации
- Этап преобразования данных, готовый к использованию ИИ
- Компоненты стратегии, основанные на логическом обосновании LLM
- Ограждения и закодированное управление движением человека
- Опыт коучинга, ориентированный на пользователя
Полезный и простой способ понять общую структуру этих компонентов — добавить в приложение функцию логирования.
Мы добавим функцию логирования для просмотра телеметрических данных по мере их передачи по каналам связи.
Для начала давайте посмотрим на данные телеметрии. В telemetryStreamService.ts , примерно на строке 212 (перед this.emit(frame) , добавьте строку, отображающую скорость, боковую перегрузку (ускорение вбок) и силу нажатия водителем педали тормоза.
console.log('FRAME', {
speed: frame.speed.toFixed(1),
gLat: frame.gLat.toFixed(2),
brake: frame.brake.toFixed(0) }
);
Перезагрузите приложение. Прежде чем запускать приложение, откроем консоль в инструментах разработчика Chrome, чтобы просмотреть отладочную информацию.

В приложении введите адрес точки подключения телеметрии и нажмите «Подключиться». Теперь вы сможете увидеть входящие телеметрические данные.
Теперь добавим логирование для рефлексивного пути и стратегического пути.
В файле ../src/services/coachingService.ts , примерно на 71-й строке перед this.emit() , добавьте строку логирования для пути рефлекса :
console.log('Reflex', {
action: rule.action,
text,
coach: this.coachId }
);
А в том же файле, примерно на строке 287, перед this.emit() , добавьте аналогичную строку логирования для пути к стратегии (добавим text ответа тренера, возвращаемый API Gemini):
console.log('Strategy', {
coach: coach.id,
chars: text.length,
preview: text.slice(0, 60) }
);
Перезапустите приложение. В консоли вы увидите, как телеметрические данные передаются от источника по этим путям. Входящий поток фильтруется, отправляется в LLM, проверяется экспертами и отображается пользователю с помощью соответствующего пользовательского интерфейса.
Обратите внимание, что мы соединили различные технические компоненты для достижения более масштабной цели — создания надежного ИИ. Ценность архитектуры заключается не в каком-либо одном компоненте. Ценность заключается в том, как части усиливают друг друга.
Надежный ИИ — это результат архитектурных решений, а не отдельная функция.
Демонтаж (удаление коммуникаций)
Важно помнить о необходимости удаления сервиса, когда он вам больше не нужен. После завершения тестирования сервера телеметрии вместе с приложением следует удалить сервис Cloud Run и прекратить оплату за него.
gcloud run services delete streaming-telemetry-server \
--region us-central1 \
--platform managed
При необходимости замените us-central1 на регион, который вы использовали при развертывании. Подтвердите при появлении запроса.
11. Вызовы
Теперь, когда основное приложение работает и вы понимаете различные компоненты, попробуйте расширить его архитектуру.
Предложенные задачи
- Перенесите больше тренерской логики на периферию.
- Измените параметры моделирования, чтобы они учитывали дождь или снижение сцепления с дорогой.
- Изучите, как оптимизация или тонкая настройка модели могут повысить производительность.
- Адаптируйте архитектуру для другой области, например, для медицины, производства или логистики.
Например, при применении знаний, полученных в этой лабораторной работе, к другой области, рассмотрите следующие вопросы:
- Что является эквивалентом гоночной телеметрии, то есть непрерывных данных, в другой области?
- Какие решения необходимо принимать незамедлительно, а какие носят более стратегический характер?
- Какие виды экспертных знаний человека необходимо закодировать?
- Что должны увидеть пользователи, чтобы поверить в надежность системы?
Эти задания побуждают вас выйти за рамки примера с гонками и осознать более широкую модель проектирования, основанную на принципе доверия, лежащую в основе этого практического занятия.
12. Подведение итогов и дальнейшие шаги
В этом практическом занятии вы создали не просто демонстрацию гонок. Вы создали конкретный пример того, как можно проектировать надежные системы искусственного интеллекта.
Вы начали с необработанных телеметрических данных, преобразовали их в полезный формат для LLM, применили логическое мышление ИИ и усилили результат с помощью закодированных указаний человека и ограничений на реакцию. В процессе вы поняли, что доверие возникает из архитектуры, а не только из результатов работы модели.
Надежная система искусственного интеллекта часто сочетает в себе следующие элементы:
- Структурированные данные в реальном времени
- Рассуждения на основе моделей
- Закодированная экспертная оценка предметной области
- Четкие ограничения
- Продуманный дизайн пользовательского интерфейса
Сценарий гонок помог воплотить эти идеи в жизнь, но тот же подход можно использовать везде, где рекомендации ИИ должны быть своевременными, действенными и надежными.
