開發人員關係工程師
如要在 Android 應用程式中建構可用於正式環境的生成式 AI,不只要連結 LLM,還需要企業級安全防護和成本控管機制。在本場講座中,您將瞭解 Firebase AI Logic 如何協助開發人員大規模部署安全、符合預算的 AI 體驗。
涵蓋安全性基礎、Firebase App Check、成本管理、動態模型路由,以及多模態功能。
轉錄稿
歡迎參加 Android 開發人員高峰會。
我是 Firebase 產品經理 Ankita Saxena。
我是 Arthur Thompson,Firebase 團隊的開發人員關係工程師。
今天,我們將示範如何在 Android 應用程式中加入生成式功能。
現在我們來做個小測驗
什麼是 Firebase?
聽過 Firebase 的人請舉手。
喔,我看到很多。
太好了!
Firebase 是 Google 的應用程式開發平台。
Firebase 提供整合 20 多項產品的統一平台,因此您不會像使用其他軟體一樣,獲得零碎的使用體驗。
接著來談談將生成式 AI 導入行動應用程式的挑戰。
我們發現三大挑戰。
首先,API 金鑰外洩:只要幾分鐘就能擷取金鑰。
第二,更新模型名稱:我們一律建議開發人員不要在應用程式中硬式編碼,否則每次有新模型推出時,就必須推送另一個版本。
第三是檔案隱私權:對任何開發人員或應用程式使用者來說,保護資料並為應用程式設定適當的防護措施非常重要。
介紹 Firebase AI Logic,這是解決上述挑戰的主要方案。
Firebase AI Logic 為您提供的價值主張為何?
我們基本上會處理所有複雜的自訂後端,因此您不必自行開發。
第二,使用我們的用戶端 SDK,即可直接從行動應用程式安全呼叫 Gemini API。
讓我們深入瞭解架構的運作方式。
左側是 Firebase 用戶端 SDK。
我們目前支援多種用戶端 SDK。
我想指出我們也支援 Kotlin。
當開發人員想執行 AI 動作時,SDK 會將要求傳送至 Firebase AI Logic,再由 Firebase AI Logic 安全地轉送至 Gemini Developer API 或 Agent Platform Gemini API。
基本上,我們會處理您目前建立的所有自訂後端。
我們從中獲得的價值是,您可以在零成本的情況下加快上市時間。
現在來到有趣的部分。
這場示範將展示 FriendlyMeals 應用程式。
順帶一提,本課程的其餘示範都會使用同一個應用程式,歡迎下載。
你可以掃描這裡的 QR code。
我們來看看示範說明。
FriendlyMeals 應用程式基本上會根據您輸入的食材,找出合適的食譜。
因此,在這個工作流程中,您可以看到基本上有兩種方式可以擷取這些要素。
第一種是輸入現有食材。
第二,拍下食材。
我會使用第一個工作流程,也就是輸入食材。
這是我在冰箱裡找到的所有食材。
在生成食譜時,我想特別說明幾點。
因此,我們在幕後呼叫 Gemini 模型。
在這個特定用途中,我們會呼叫三個 Gemini 3.8 Flash。
上方的圖片實際上是使用 Gemini Nano Banana 模型,也就是最新版本 2.1 Nano Banana。
在開始編寫程式碼之前,我想先強調 Firebase AI Logic 的價值主張。
首先是無伺服器 SDK。
您想新增 AI 功能,但不想建立後端。
這時用戶端 SDK 就能派上用場。
直接從 Android 應用程式呼叫 Gemini。
第二個是強大的內建安全防護功能。
因此,呼叫 Gemini 時,您可以使用 Firebase App Check 和伺服器提示詞範本等功能,稍後我們會進一步介紹這些安全防護功能。
第三,支援多模態輸入和串流等進階功能。
假設您想建構一個應用程式,並加入簡單的 AI 功能,生成關於魔法背包的故事。
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model=Firebase.ai.generativeModel("gemini-4-argon")
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}只要完成這三個簡單步驟,就能新增 AI 功能,並準備好用於正式環境。
Firebase AI Logic 讓您輕鬆在應用程式中加入 AI 功能,因此您首先要思考的問題是,如何確保這項功能安全無虞?
接著,我們來深入探討安全性細節,首先是 Firebase App Check。
Firebase App Check 會驗證要求是否來自您的應用程式,協助您保護資料和使用者,並控管 API 資源的存取權。
這項額外安全防護機制可防止應用程式遭到濫用。
在開始編寫程式碼之前,您需要在 Firebase 控制台中完成幾個步驟。
因此,請在 Firebase 控制台的 App Check 頁面註冊 Android 應用程式,並新增相應的認證供應商。
例如 Play Integrity 或 reCAPTCHA Enterprise。
請注意,設定 App Check 後,請先從未強制執行模式開始。
這樣一來,應用程式就能提供遙測資料,確保所有應用程式都能成功向後端發出 API 呼叫,然後再強制執行。
確認遙測資料正常傳送後,即可強制執行 App Check。屆時,任何不具備有效硬體驗證權杖的要求都會遭到拒絕。
以下是實作 App Check 的程式碼。
class FireTravelApp : Application() {
lateinit var appContainer: AppContainer
private set
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Firebase.appCheck.installAppCheckProviderFactory(
DebugAppCheckProviderFactory.getInstance()
)
} else {
Firebase.appCheck.installAppCheckProviderFactory(
PlayIntegrityAppCheckProviderFactory.getInstance()
)
}
appContainer = AppContainer(this)
}
}在應用程式類別中,安裝 App Check 供應器。
在開發階段,您會想使用開發偵錯服務,等到準備好進入正式環境時,再切換至 Play Integrity 或 reCAPTCHA Enterprise。
不過請務必記得,您必須先設定 App Check,才能發出任何其他 Firebase 呼叫。
開發人員建構 AI 功能時,通常會直接在應用程式程式碼中硬式編碼提示,但這會造成兩大難題。
第一,如果需要修改提示,就必須推送完整更新。
第二,任何人只要解壓縮您的應用程式,就能存取您的專屬提示工程。
為解決這個問題,Firebase AI Logic 採用伺服器提示詞範本。
提示不會保留在裝置上,而是儲存在雲端。
這是 Firebase 控制台中的伺服器提示詞範本檢視畫面。
您可以使用 .prompt 格式編寫範本。
---
model: 'gemini-3-flash'
input:
schema:...
tools:...
---
{{role "system"}}
You're a storyteller that tells nice and joyful stories with happy endings.
{{role "user"}}
Create a story about {{topic}} with the length of {{length}} words in the {{language}} language.您可以在這裡設定模型名稱。
您隨時可以更新。
不必推送完整的應用程式更新。
您也可以更新系統指令,並採用嚴格的 JSON 結構定義來輸入和輸出。
同樣地,您不需要發布應用程式。
由於這項功能位於雲端,您可以立即調整提示或更換模型。
這是 Kotlin 程式碼的樣子。
val generativeModel = Firebase.ai.templateGenerativeModel()
val response = generativeModel.generateContent("storyteller-v1",
mapOf(
"topic" to topic,
"length" to length,
"language" to language
)
)
output.value = response.text這裡要特別說明的是,伺服器提示詞範本目前為公開預先發布版。
您也可以導入僅限授權模式。
這項功能會使用 Firebase Auth 使用者權杖授權要求。
如要完善安全防護功能,並完全鎖定應用程式,您也可以直接在 Firebase 控制台使用「僅限範本」模式。
應用程式上線後,您可能想瞭解其運作情形。
在「AI Monitoring」分頁中,只要按一下滑鼠,就能啟用 AI Monitoring 並設定取樣率。
Firebase 會自動擷取指標、延遲時間和權杖數量,您不必為此編寫自訂數據分析程式碼。
請注意,我們剛才看到的兩種模式,都可以在同一個視窗中使用。
在 Firebase 控制台啟用 AI Monitoring 後,資料會直接傳送至 AI Monitoring 資訊主頁。
您可以觀察第 95 個百分位數的延遲時間、找出突然激增的錯誤,並追蹤文字、圖片和音訊等不同模態的詞元消耗量。
您也可以檢查 Trace 檢視器,查看特定追蹤記錄。
在這個例子中,您可以看到我們使用的模型、延遲時間和成功率。
Firebase 控制台:可查看所有遙測資料,並瞭解 AI 功能的運作情形。
因此,在這種情況下,假設您發現權杖用量或延遲時間突然暴增,混合模式是降低這些成本或延遲時間的方法之一。
隨著生成式 AI 功能成為應用程式的重要部分,完全依賴雲端可能不是正確的選擇。
因此,Android 裝置端模型 Nano 4 可帶來三大優勢,您可能都已熟悉。
首先是離線模式。
因此,無論是在大型會議、飛機上或地鐵中,AI 功能都能正常運作。
費用。
因此,由於推論是在裝置上執行,您可以新增這些功能,不必擔心 AI 功能的成本上升。
第三個是資料隱私權。
因此,如果是私密資料,您可以向使用者保證,任何推論都不會離開裝置。
因此,您可以使用 Firebase AI Logic 設定這些推論模式,並制定明確的轉送策略,例如 PREFER_ON_DEVICE、PREFER_IN_CLOUD 或 ONLY_ON_DEVICE。
選擇 ONLY_ON_DEVICE 後,SDK 會直接使用裝置端模型,完全不經過雲端。
我們改用手機吧。
我們再次前往 FriendlyMeals,看看一些裝置端功能。
首先,我們要嘗試根據冰箱裡可能有的食材,建立食譜。
先前 Ankita 示範了手動方法,也就是輸入食材,然後生成食譜。
我們來試試其他方法。
我們來看看這台冰箱,這絕對是真實存在的,不是生成的。
冰箱裡有很多橄欖,來看看會生成什麼食譜。
我想特別指出幾點。
首先,圖片不會離開裝置。
圖片由 Nano by Gemma 在本機分析…
Nano 4。
第二點是回應速度。
因此,系統會生成素材。
因此,您可享有兩項優勢。
資料不會離開裝置,延遲時間也大幅縮短。
好,來看看冰箱裡只有橄欖時,會得到什麼食譜。
因此,這次我們將使用雲端。
因此,我們將冰箱中辨識出的食材傳送至雲端,並使用 Firebase AI Logic 生成食譜。
冰箱裡沒有鮭魚,但食譜裡有。
請回到投影片。
如示範影片所示,在本機模型和雲端模型之間切換非常簡單。
目前,Firebase AI Logic 會根據網路可用性,使用基本轉送功能執行推論。
您可以將其視為護欄,
因此,這個架構內建多模態和輸入/輸出結構定義等功能,並與 Gemini Nano 4 完整整合。
接著來看看這些護欄在實際應用中如何實作。
因此,混合式轉送功能不需要您建構複雜的中介軟體,或自行建構大量備用邏輯。
在程式碼方面,這只是一個額外參數。
您可以傳遞 onDeviceConfig 參數,設定偏好的模式。
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model = Firebase.ai.generativeModel(modelName = "gemini-3.8-flash",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE))
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}在這種情況下,SDK 會先嘗試使用本機模型,如果無法使用,則會自動改用雲端模型。
我們已介紹如何建構安全的應用程式,以及如何運用裝置端模型,接下來談談成本最佳化。
生成式功能可快速擴充,Cloud Billing 費用也會隨之增加。
因此,我們必須採取適當的防護措施,確保我們有適當的主動式基礎架構控制項和自動化功能,協助您預測預算,並提高應用程式的財務效率。
Arthur 剛才強調,裝置端推論完全免費,但仍會有一些情況需要複雜的推論工作,以及備用方案,這時就需要轉送至雲端。
當雲端呼叫發生時,您需要護欄來確保預算可預測。
這正是 Firebase 支出上限功能派上用場的時候。
您可以設定支出上限,更精細地控管應用程式費用。
因此,您不必採用通用的專案層級預算設定,也不必只透過電子郵件接收預算快訊,而是可以為 Firebase AI Logic 等個別服務設定特定的預算上限。
支出達到 100% 時,Firebase 會自動暫停 AI 服務,避免帳單費用超出預期。
除了簡單的支出上限,還有幾項進階成本最佳化策略。
今天想特別介紹的是 Firebase AI Logic 觸發條件。
如果需要在中間加入自訂邏輯,該怎麼辦?
這就是 Firebase AI Logic 觸發條件。
基本上,您可以在生成內容之前或之後執行函式。
您可以使用這項功能檢查使用者、篩選輸入內容、新增背景資訊,以及調整回覆。
現在我們已介紹成本最佳化和安全性,接下來要說明模型功能,看看 Firebase AI Logic 提供哪些服務。
為支援這些多模態體驗,Firebase AI Logic 提供完整的正式環境適用模型和工具目錄。
如需高速推論、文字、程式碼和媒體,可以使用 Gemini 4 Argon、Gemini 3.1 Pro、Gemini 3.8 Flash 等。
您也可以使用 Google 搜尋和 Google 地圖建立基準,將這些模型連結至真實世界的資料。
最後,在語音方面,我們提供自然的文字轉語音和 Gemini Live 音訊生成功能。
我們再切換到手機一次。
所以,這裡有我們的甜味和鹹味。
抱歉,不是那個。
我們將以「快速起司番茄醬吐司」為例。
聽起來很好吃。
首先來看看 Live API。
在這個例子中,我們可以使用回傳的影片,並說:「Gemini,可以告訴我桌上有哪些食材嗎?」
根據筆電螢幕上的圖片,你手邊的食材有麵包、切達起司和番茄醬。
現在我們來做個小測驗
我可以開始進行食譜的第一個步驟了嗎?
是。
第一步是將烤箱或烤架預熱至中高溫。
感謝您!
現在我們來做個小測驗
因此,在這種情況下,Live API 會保持對話開啟,直到我實際關閉為止。
另一個我想展示的是語音轉文字,抱歉,是文字轉語音。
在這個範例中,我們使用文字轉語音功能,將食譜操作說明轉換成語音。
因此,我不需要閱讀,只要點選「生成」或「朗讀」,系統就會將操作說明文字傳送至文字轉語音模型。
系統會生成音訊,並將音訊傳回裝置。
我可以播放、快取供日後使用,並像這樣播放。
1.
將烤箱或烤爐預熱至中高溫。
2.
將兩片麵包放在烤盤或烤箱托盤上。
好極了
很酷吧?
因此,Firebase AI Logic 讓我們只需幾行程式碼,就能實作這類酷炫功能。
讓我們切換回投影片。
看過 Gemini Live API 的運作示範後,您是否想親自打造免持對話式體驗?
這時 Gemini Live API 就能派上用場,協助您建立雙向語音對話。
Android 應用程式可以即時串流麥克風音訊和相機影格,並接收自然、低延遲的語音回覆。
在 Kotlin 中,這項設定看起來很熟悉。
val model = Firebase.ai.liveModel(
modelName = "gemini-3.1-flash-live-preview",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
},
systemInstruction = "Your main job is to change the color...",
tools = listOf(Tool.functionDeclarations(listOf(changeColorFunction)))
)
val session = model.connect(::handler)
session.startAudioConversation(::handler)
session.stopAudioConversation()您會例項化設定為音訊回應的 Live 模型,並使用串流處理常式連線至工作階段。
首先要強調的是,SDK 會在背景處理完整的 WebSocket 內容和串流通訊協定。
所以您不必編寫程式碼,對吧?
繼續寫。
import com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model=Firebase.ai.generativeModel("gemini-4-argon")
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}class FireTravelApp : Application() {
lateinit var appContainer: AppContainer
private set
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Firebase.appCheck.installAppCheckProviderFactory(
DebugAppCheckProviderFactory.getInstance()
)
} else {
Firebase.appCheck.installAppCheckProviderFactory(
PlayIntegrityAppCheckProviderFactory.getInstance()
)
}
appContainer = AppContainer(this)
}
}---
model: 'gemini-3-flash'
input:
schema:...
tools:...
---
{{role "system"}}
You're a storyteller that tells nice and joyful stories with happy endings.
{{role "user"}}
Create a story about {{topic}} with the length of {{length}} words in the {{language}} language.val generativeModel = Firebase.ai.templateGenerativeModel()
val response = generativeModel.generateContent("storyteller-v1",
mapOf(
"topic" to topic,
"length" to length,
"language" to language
)
)
output.value = response.textimport com.google.firebase.Firebase
import com.google.firebase.ai.ai
@Composable
fun MagicBackpackGenerator() {
var output by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
val model = Firebase.ai.generativeModel(modelName = "gemini-3.8-flash",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE))
val response = model.generateContent("Write a story about a magic backpack")
output = response.text.toString()
}
MagicBackpackUI(output)
}val model = Firebase.ai.liveModel(
modelName = "gemini-3.1-flash-live-preview",
generationConfig = liveGenerationConfig {
responseModality = ResponseModality.AUDIO
},
systemInstruction = "Your main job is to change the color...",
tools = listOf(Tool.functionDeclarations(listOf(changeColorFunction)))
)
val session = model.connect(::handler)
session.startAudioConversation(::handler)
session.stopAudioConversation()# Execute to add agent capabilities to your workspace
npx skills add firebase/agent-skills