跳至主要內容
Study Jam:GenAI 開發者實戰 — 第 20/29 篇

Gemini + Streamlit 開發 GenAI App

內文字級

Gemini + Streamlit 開發 GenAI App
更新:2026-10-12

課程概述

Streamlit 很適合讓 Python 開發者快速做出可操作的介面,再接上 Gemini 驗證一個點子值不值得繼續。不過原型跑得動,和多人使用、資料不外洩、失敗能復原是兩回事。這堂課會帶你完成原型,也會一起判斷它什麼時候能繼續用 Streamlit,什麼時候該把核心邏輯拆出去。

Streamlit Gemini App 從原型到 Cloud Run:Python Widgets、上傳、Chat、視覺化和 Session State 由伺服器端 SDK 呼叫模型,本機快速迭代後建成容器,透過受驗證、自動擴縮服務搭配 Secrets、日誌與監控上線

Streamlit 能快速證明想法,但原型的 Session State、金鑰和單機錯誤處理不足以直接生產。容器化上 Cloud Run 後,還要補多使用者隔離、持久化、安全、限流、快取、成本與 CI/CD,才算跨過就緒門檻。

你將學到

  • 使用 Streamlit 建構 GenAI 應用的互動介面
  • 整合 Gemini API 進行文字生成、多模態問答與對話
  • 實作對話記憶與 Session State 管理
  • 將 Streamlit 應用容器化並部署到 Cloud Run
  • 理解原型與生產應用之間的架構差異

核心概念

Streamlit 的優勢與適用場景

Streamlit 讓你用 Python 腳本建立 Web 介面:st.text_input() 做輸入框、st.write() 顯示內容、st.chat_message() 組對話畫面。它省掉不少前端樣板,很適合內部工具、PoC、資料探索與 AI Demo;但需要高度客製互動、複雜前端狀態或大量即時使用者時,就要提早評估是否仍符合需求。

Gemini 與 Streamlit 的整合

整合 Gemini 時,先用新版 google-genai SDK 建立 Client,再呼叫 client.models.generate_content(...) 或 Chat/Streaming 方法。舊版 google-generativeai 已在 2025 年 11 月 30 日棄用、不再積極維護,它的範例不要拿來開新專案,遷移方式可參考官方 SDK 指南。對話歷史可先放在 st.session_state,但不要每次無上限地送出全部內容;應設定 Token 預算,保留近期訊息並摘要較舊對話。

Session State 管理

Streamlit 的執行模型是互動後重新執行腳本,因此跨互動狀態通常放在 st.session_state。對話應用至少會有訊息、模型設定和載入/錯誤狀態。Session State 跟著使用者連線,不是可靠的永久資料庫;連線重建、服務換版或工作階段結束後,不應假設內容還在。需要跨裝置歷史、稽核或復原時,應另存到有使用者隔離與保存政策的資料庫。

從原型到生產的差距

Streamlit 可以正式部署,但要依情境補齊能力。它已支援 st.login()、st.user 與 st.logout() 串接 OIDC,解決的是「使用者是誰」;角色、資料範圍與操作權限仍要由應用自行判斷,詳見官方認證文件。若只是少量內部使用者、互動也單純,Streamlit 搭配 Cloud Run、Secret Manager、資料庫與監控可以繼續用。若面向大量外部流量、需要多前端共用 API、複雜授權或高度客製體驗,再把模型與商業邏輯抽成獨立服務,不必一驗證成功就整套重寫。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 24, "rankSpacing": 46}}}%%
flowchart TB
  subgraph PROVE["① 先證明問題值得解"]
      direction TB
      START["用真實但去識別化的案例<br/>驗證任務完成率與使用意願"] --> VALUE{"使用者確實完成任務,<br/>品質與成本也能接受嗎?"}
      VALUE -->|"還不能"| ITERATE["修正問題定義、<br/>資料、Prompt<br/>或停止投入"]
      ITERATE --> START
  end
  subgraph CHOOSE["② 依營運需求選擇架構"]
      SCOPE{"主要是少量內部使用,<br/>介面和流程也相對單純嗎?"}
      SCOPE -->|"是"| KEEP["保留 Streamlit<br/>部署到 Cloud Run"]
      KEEP --> HARDEN["加入 OIDC、授權、Secrets、<br/>持久化、限流與監控"]
      SCOPE -->|"不是"| EXTRACT["把模型與商業邏輯<br/>抽成版本化 API"]
      EXTRACT --> FRONTEND["依體驗需求建立正式前端<br/>Streamlit 留作內部測試台"]
  end
  VALUE -->|"可以"| SCOPE
  subgraph VERIFY["③ 小流量驗證後再放大"]
      PILOT["小流量試用並壓測<br/>確認 Session<br/>隔離與失敗處理"] --> PASS{"流量、權限、<br/>資料與操作體驗<br/>都達到上線門檻嗎?"}
      PASS -->|"是"| RELEASE["逐步放量並保留回退版本"]
  end
  HARDEN --> PILOT
  FRONTEND --> PILOT
  PASS -->|"否"| SCOPE
Streamlit 不只適合 Demo,也不是所有產品都該永遠留在 Streamlit。先看使用者規模、授權、共用 API 與介面複雜度,再決定強化既有 App 或拆出正式後端。

實作重點

  • 建立一個 Streamlit 聊天應用,整合 Gemini API 實現多輪對話
  • 加入側邊欄控制面板:Temperature 滑桿、模型選擇、System Instruction 輸入(但 Gemini 3.6 Flash 起的 Flash 系列模型與 3.5 Flash-Lite 會忽略自訂的 temperature)
  • 實作檔案上傳功能,讓使用者上傳圖片後用 Gemini 的多模態能力分析
  • 撰寫 Dockerfile 部署到 Cloud Run,讓服務監聽平台指定連接埠,並以 Secret Manager 或服務身分提供憑證
  • 加入基本的使用者回饋機制(如按讚/按倒讚按鈕)收集回應品質資料

Lab 導讀

Lab 連結:Develop Gen AI Apps with Gemini and Streamlit(原名 Develop GenAI Apps with Gemini and Streamlit)— Google Skills

課程頁目前列出五個 Lab:前三個分別用 cURL、Function Calling 與 Gen AI SDK 呼叫 Gemini,第四個下載現成的 Streamlit 範例程式、在 Cloud Shell 測過後部署到 Cloud Run,最後一個是 Challenge Lab。基本功能完成後,可以刻意測試重新整理、兩個瀏覽器工作階段、模型逾時和上傳錯誤,確認狀態沒有串到別人、錯誤也不會讓整個 App 卡死。這些測試比再多加一個 Demo 按鈕更接近真正上線會遇到的事。

延伸學習

Study Jam:GenAI 開發者實戰 — 第 20 篇/共 29 篇 查看系列全覽 →

讀完後,留一個學習紀錄

試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。

文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。

留言討論

文章目錄與系列

徽章解鎖!