賽車環境嚴苛,有高速、高溫和遙測限制。裝置端代理如何協助處理即時車輛資料,用於運動和工程應用程式?
這場技術講座將探討結合邊緣硬體和雲端代理的實驗性混合架構。我們將逐步說明研究概念驗證,使用 Raspberry Pi 串流 CAN 匯流排遙測資料、Pixel 手機執行由 ML Kit 和 Gemini Nano 驅動的裝置端對話式代理,以及代理對代理 (A2A) 雲端連線,用於賽後工作流程。
轉錄稿
您好
我是 Alastair,今天很高興能與大家分享我們去年與 Formula E 合作的專案。
今天我們邀請到 Oli,請他談談我們合作的成果。
我在 Google Cloud 的技術長辦公室工作,我們經常嘗試突破行動裝置和雲端的極限,並探討兩者如何協同運作。
我會播放一部短片,簡單介紹我們做了什麼。
第 4 代賽車擁有 600kW 的強大動力。
全電動、永久全輪驅動。
我會說它快得驚人。
我們能否在 Pixel 手機上使用代理,連結車輛傳來的遙測資料?
當駕駛在 Goodwood 爬坡時,實際上可以與車輛對話。
很方便吧!
Gemma,我的輪胎狀況如何?
胎壓正常,大約 1.4 bar。
手機直接插入 ECU,讀取我身為駕駛的許多資料點。
這是賽車史上首次出現這種情況。
我認為沒有比這裡更適合展示這項功能的地方了。
Gemma,準備好了嗎?
隨拿即用。
因此,我們想嘗試在駕駛艙中加入副駕駛代理。
基本上,我們想挑戰極限,看看邊緣代理能做到什麼程度,因為這是一個非常困難的挑戰。
賽車面臨的挑戰顯然是高溫。
賽車容易過熱,這是眾所皆知的事,也是我們面臨的最大挑戰之一。
連線不穩。
我們在古德伍德速度嘉年華 (Goodwood Festival of Speed) 舉辦這項活動,現場有數十萬名賽車迷聚集,觀看賽車爬坡。
不難想像,當數十萬人聚集在同一個場地時,連線能力會是一大挑戰。
藍牙。
這輛車基本上就像法拉第籠,因此光是連上賽車手的安全帽,就面臨重重挑戰。
最後是低延遲需求。
這位車手的時速超過 200 公里,因此副駕駛代理必須快速、俐落地回答問題,這點非常重要。
我們對此非常感興趣,因為我們相信代理將無所不在。
我們已開始看到這種情況。
不再只存在於電腦中。
手機、手錶、眼鏡、智慧型住宅,甚至汽車,都看得到這項技術。
因此,我們基本上想看看在這種困難的情況下,能達到什麼成果。
在腦力激盪如何建構這項功能時,我們曾想過是否要建構一個內建小型加速器的微型電腦,以便在其中執行模型?
我們突然意識到,所有需要的元素都已經存在,那就是 Android。
Android 是這項技術的完美平台,因為我們有 ADK,也就是 Agent Developer Kit。
這個程式庫非常實用,可讓您直接在應用程式中建構代理。
Android 擁有數十億使用者,而且支援多種板型規格,因此我們能輕鬆執行、測試及發布程式碼。
開發人員工具,可讓您偵錯、嘗試不同做法,以及找出問題所在。
Google Pixel 手機現在內建 TPU,專為手機上的裝置端模型最佳化,因此只要使用 ML Kit 等 API,就能輕鬆存取強大的模型。
此外,我們也提供文字轉語音和語音辨識等功能,以及完全離線的 API,讓您能打造出真正強大的對話式體驗。
最後,當然是連線能力。
手機是為了連線能力而設計,無論是透過行動網路、Wi-Fi 或其他方式。
不過,邊緣代理無法處理所有工作,因此如何與雲端代理協作,也是一項挑戰。
如果採用混合式解決方案,會怎麼樣?
如果手機中的代理能直接與雲端中的代理對話,執行更複雜的操作,會怎麼樣?
舉例來說,假設車手想知道自己的排名,
車輛本身不會知道自己在比賽中的排名,但雲端中的代理可能會知道。
我們還有一項名為「代理對代理」的通訊協定,可讓您在邊緣和雲端建立代理,並讓代理直接互相對話,執行更複雜的操作。
那麼,我們是如何建構這項服務的呢?
接下來,我會介紹這個系統的組成要素。
從線束開始。
這裡的測試控管程式基本上是執行 Android 版 Agent Developer Kit 的 Android 應用程式。
第二部分是模型。
您需要模型來驅動這項功能,而我們是透過 ML Kit 使用 Gemini Nano,這是一款非常強大的裝置端模型,可輕鬆上手。
接著是資料。
Oli 稍後會稍微談到這一點,但您有來自汽車的資料,也有可能來自駕駛的語音辨識。
最後,您也可以定義代理可執行的動作。
這可能是文字轉語音功能,可回覆駕駛並提出後續問題或提供所需資訊,或如前所述,與雲端中的代理進行代理對代理通訊,以執行一些更複雜的操作。
現在,我想邀請 Oli 上台,稍微談談我們如何與 Formula E 合作。
謝謝 Alastair。
現在我們有了要素,但接下來才是難題:如何實際將 AI 代理整合至 Formula E 賽車?
首先是 VCU,也就是車輛控制單元。
現在,車上的每個感應器和元件都會透過 CAN 匯流排回報資料。
車輛每秒會產生數千個遙測資料點,包括速度、加速度、油門、煞車等。
為了讀取這項遙測資料,我們決定透過這個 CAN 連線,將 Raspberry Pi 直接插入車輛的 VCU。
Raspberry Pi 有幾項功能。
首先,系統會解碼原始信號、轉換信號,並將信號降採樣至約 10 Hz,這對副駕駛來說已足夠。
接著,Raspberry Pi 會透過 MQTT 將這些精細資料發布到車內駕駛座的 Pixel 10 Pro。
這是託管代理應用程式的 App Hosting 可接受的輸入內容。
第二個是 Android 語音辨識。
因此,當駕駛說話時,應用程式會將輸入內容轉換為文字,而 Gemini Nano 能夠對這兩項輸入內容進行推論。
現在,代理可以做出兩項決策:首先,它可以使用 Android 的文字轉語音引擎回覆駕駛。
第二,如 Alastair 先前所述,它能透過 A2A 通訊協定與雲端代理通訊。
現在,代理流程相當簡單:說出啟動字詞 (在本例中為「Hey, Gemma」),提出問題,然後取得答案。
之後,代理會持續聆聽約 5 秒,方便你提出後續問題,不必重新開始,就像與真正的賽車工程師交談一樣。
這個應用程式也是多輪對話代理,可存取對話記錄,提供更自然的對話體驗。
因此,您可能會預期這段程式碼看起來有點複雜,對吧?
其實很簡單。
前幾行會使用 ML Kit 呼叫 onDeviceModel,並將其包裝為 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 定義代理。
請為代理命名,並提供兩種指令:第一種是靜態指令,用於定義代理的個性和身分。
包括如何與駕駛員對話,以及賽道相關資訊。
第二個是動態指令。
現在,系統會根據每項查詢生成最新遙測摘要,因此代理隨時都能掌握駕駛的行為。
如前所述,這也包括目前的對話記錄。
此外,我們也定義了一些工具,例如讓它能與先前的會話資料對話、與雲端代理對話,以及使用文字轉語音功能與駕駛對話。
接著,我們來看看代理在 Formula E 辦公室模擬器上的實際運作情形。
我們如何整合所有內容?
首先,我們必須前往巴黎的 Spark Racing Technology,我們的賽車就是在這裡製造的。
左邊是我將 Raspberry Pi 連接到電動方程式賽車的實際 VCU。
到目前為止,我們建構的所有內容都是在模擬資料上執行,並從測試工作階段重播,因此我們不確定是否能與實際資料搭配使用。
因此,我們接上電源、開機、等待,再等一下,最後裝置開始傳送遙測資料,證明資料確實如預期在系統中移動。
右側是完成後的系統,可以看到手機實際安裝在駕駛艙中,就在駕駛座旁邊。
我們已為古德伍德做好萬全準備。
那麼,當天究竟發生了什麼事?
還記得 Alastair 先前提到的四項挑戰嗎?
Goodwood 賽道確實考驗了其中兩項。
首先是熱能。
在英國,我們通常只會為晴天以外的天氣做準備。
因此,我們自然而然地迎來了有記錄以來最熱的一週,正好處於熱浪的中間。
在 Formula E 賽車中安裝電腦的最佳時機。
但事情沒那麼簡單。
手機其實沒問題。
Android 幾乎沒有受到影響。
結果發現,Raspberry Pi 的表現最吃力。
由於無法直接插入車內,我們必須使用 UPS,也就是看起來像一堆電池黏在 Pi 底部的裝置。
幸好,我們在一天中不時補充燃料,才解決了這個問題。如果沒有這麼做,車子可能就無法在沒有 AI 代理的情況下爬上那座山。
接著是藍牙。
當時我們從未實際測試過車手的安全帽,安全帽是透過藍牙連線至應用程式。
這項工作有點難度。
為了測試這項功能,我們坐在草地上,看起來玩得很開心,對吧?
我們拿出筆電,愉快地聊著天。
但實際上,那段時間可能是我職涯中壓力最大的時期之一。
我們拼命想讓程式碼順利運作,並在下午上山前將藍牙安全帽連上應用程式。
不過,多虧了最後一刻的緊急修正和 Android 的強大偵錯工具,我們及時修正了問題,車子順利上山,AI 代理也運作良好。
現在,我將交棒給 Alastair,他將與我們分享更多從專案中學到的經驗。
謝謝。
謝謝 Oli。
那麼,我們從這項專案中學到了什麼?
首先,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 */
)
)