[Gemini 3.0][Image Generation] 使用 Gemini 3.0 Pro Image API 打造 PDF 文字優化工具

前情提要 最近經常使用 NotebookLM 來快速製作投影片,這個工具雖然方便,但有個令人困擾的問題:生成的中文字常常出現糊邊和亂碼。雖然「順序不響影讀閱」,但身為工程師還是希望能更專業一點。 在網路上看到有人分享了一個有趣的方法:將 NotebookLM 的投影片截圖後,上傳到 Gemini 3.0 Pro 的「思考型」+ 圖像功能,搭配精心設計的 prompt 來修復圖像。實測效果真的不錯!但每次都要手動截圖、上傳、複製貼上 prompt,實在太麻煩了。 於是我決定:為什麼不直接做成自動化工具? 我想要的功能很簡單: 📄 上傳 PDF 檔案 🤖 自動使用 Gemini API 優化每一頁的文字清晰度 📥 下載優化後的 PDF 聽起來很簡單對吧?但實際開發過程中踩了不少坑… 使用的神奇 Prompt 在開發之前,先分享這個優化圖像的 prompt(來自網路分享): Role Definition 你現在是搭載「多模態視覺認知引擎 (Multi-modal Visual Cognitive Engine)」的高階圖像修復專家。你具備上下文感知 OCR (Context-aware OCR) 與生成式圖像增強 (Generative Image Upscaling) 的核心能力。 Mission Objective 執行「語意級圖像重構 (Semantic-Level Image Reconstruction)」。針對輸入的低解析或模糊圖像,利用邏輯推演修復文字內容,並輸出 4K 廣色域的高傳真圖像。 Execution Protocol (思維鏈與執行協議) 請在後台嚴格執行以下運算流程,並直接輸出最終圖像: 1. 【光學字元邏輯推演 (Optical & Logical Inference)】 對圖像進行高維度掃描,鎖定模糊文字區域 (ROI)。 啟動「上下文語意分析 (Contextual Semantic Analysis)」:不只是辨識像素,更要依據前後文邏輯、常見詞彙庫,推算出模糊區域原本應有的「繁體中文」內容 (Traditional Chinese)。 容錯機制:若像素資訊遺失,優先採用信心分數 (Confidence Score) 最高的語意填補。 2. 【同構視覺合成 (Isomorphic Visual Synthesis)】 嚴格繼承原圖的拓樸結構 (Topological Structure):版面配置、物體座標、透視消點必須與原圖完全鎖定。 風格遷移 (Style Transfer):精確捕捉原圖的設計語言(配色、材質、光影),將其應用於新的高解析畫布上。 3. 【向量級細節渲染 (Vector-Grade Rendering)】 將文字與線條邊緣進行「抗鋸齒 (Anti-aliasing)」與「銳利化處理」。 文字筆畫必須呈現「印刷級」的清晰度,徹底消除 JPEG 壓縮噪點 (Artifacts) 與邊緣溢色。 Exclusion Criteria (負向約束) 嚴禁產生無法閱讀的「偽文字 (Gibberish)」或簡體中文。 嚴禁改變原圖的關鍵構圖結構。 嚴禁輸出模糊、低對比或過度平滑的油畫感圖像。 Output Output the reconstructed image ONLY. No textual explanation required. 這個 prompt 的重點在於: ✅ 使用「語意推理」而非純 OCR(能理解上下文) ✅ 保持原有版面配置 ✅ 生成高解析度圖像 ✅ 強制使用繁體中文 但為了自動化,我簡化成更直接的版本: prompt_text = "請優化這張圖片中的文字,使其更清晰、更易讀。保持原有的版面配置,但提升文字的品質、對比度和清晰度。請輸出優化後的圖片。" 雖然簡化了,但搭配 Gemini 3.0 的圖像生成能力不僅有效,而且實測之後效果更好! 關於 Vertex AI - API Key 因為這個使用到的是 gemini-3-pro-image-preview 的 API ,所以需要 Google...
繼續閱讀

[Gemini 3.0][Google Search] 使用 Google Search Grounding API 搭配 Gemini 3.0 Pro 來打造新聞與資訊助手

前情提要 在開發 LINE Bot 時,我想改進純文字搜尋功能:讓使用者輸入任何問題後,AI 能自動搜尋網路資訊並整理回答,同時支援連續對話。傳統做法需要串接多個 API(Gemini 提取關鍵字 → Google Custom Search → Gemini 總結),不僅慢(3次API調用)而且沒有對話記憶。 但 Google 在 2024 年推出了 Grounding with Google Search 功能,這是官方的 RAG (Retrieval-Augmented Generation) 解決方案,讓 Gemini 模型可以自動搜尋網路並引用來源,還原生支援 Chat Session!這項功能透過 Vertex AI 提供,讓 AI 回應不再憑空想像,而是基於真實的網路資訊。 畫面展示 ( 使用舊有的 Google Custom Search 的成果) 會發現他是根據 Google Search 的成果出來的結果, 主要 Repo https://github.com/kkdai/linebot-helper-python 開發過程中遇到的問題 問題 1:舊版實作的瓶頸 在實作 loader/searchtool.py 時,我使用的是傳統的搜尋流程: # ❌ 舊版的做法 - 3 次 API 調用 async def handle_text_message(event, user_id): msg = event.message.text # 第 1 次:提取關鍵字 keywords = extract_keywords_with_gemini(msg, api_key) # 第 2 次:Google Custom Search results = search_with_google_custom_search(keywords, search_api_key, cx) # 第 3 次:總結結果 summary = summarize_text(result_text, 300) # 回傳結果... 這個方法有幾個明顯的問題: ❌ 無對話記憶 - 每次都是新的對話,無法連續提問 用戶: "Python 是什麼?" Bot: [搜尋結果 + 摘要] 用戶: "它有什麼優點?" # ❌ Bot 不知道 "它" 指的是 Python ❌ 搜尋結果淺薄 - 只使用 snippet,無法深入閱讀網頁內容 ❌ 速度慢且成本高 - 3 次 API 調用(~6-8秒)+ Google Custom Search 費用($0.005/次) 問題 2:Client Closed 錯誤 當我改用 Vertex AI Grounding 後,遇到了這個錯誤: ERROR:loader.chat_session:Grounding search...
繼續閱讀

[n8n][Gemini] 打造 AI 自動摘要的 RSS 訂閱系統,每日定時推送 LINE 通知

前情提要 身為一個資訊焦慮的工程師,我每天都會追蹤多個技術部落格和 Hacker News。但手動瀏覽實在太花時間,於是我決定用 n8n 打造一個自動化系統:RSS 更新時自動抓取網頁內容、用 Gemini AI 產生摘要、存入 Google Sheets,然後每天早上 6 點推送精選文章到 LINE。 這個專案整合了多個服務: 📡 RSS Feed:訂閱多個資訊來源 🕷️ Firecrawl:抓取網頁完整內容 🤖 Gemini 2.5 Flash:AI 自動摘要 📊 Google Sheets:儲存文章資料 📱 LINE Messaging API:Flex Message 推送通知 聽起來很美好,但實作過程中踩了不少坑,這篇文章記錄我遇到的問題和解決方案。 系統架構 整個系統分成兩個獨立的 n8n Workflow: Workflow 1:RSS 即時處理 RSS 觸發 → 格式化資料 → Firecrawl 抓取網頁 → 內容預處理 → Gemini 摘要 → 寫入 Google Sheets Workflow 2:每日定時發送 每日 6:00 觸發 → 讀取 Google Sheets → 篩選未發送 → 取 10 筆 → 組合 Flex Message → LINE 推送 → 更新狀態 開發過程中遇到的問題 問題 1:n8n Code Node 語法錯誤 我一開始在 Code Node 使用 ES Module 語法: // ❌ 錯誤的做法 export default async function () { const items = this.getInputData(); // ... } 結果 n8n 一直報錯,執行失敗。 解決方案: 改用 n8n 標準的寫法,直接使用 $input.all(): // ✅ 正確的做法 const items = $input.all(); const newItems = items.map(item => { // 處理邏輯 return { json: { ...item.json, // 新增欄位 } }; }); return newItems; 問題 2:Gemini API...
繼續閱讀

[Gemini][Google Maps] 使用 Google Maps Grounding API 打造位置感知的 AI 應用

前情提要 在開發 LINE Bot 時,我想加入一個功能:讓使用者分享位置後,AI 可以智慧推薦附近的餐廳、加油站或停車場。傳統做法需要串接 Google Places API,處理複雜的搜尋邏輯和結果排序。但 Google 在 2024 年推出了 Grounding with Google Maps 功能,可以讓 Gemini 模型直接存取 Google Maps 的 2.5 億個地點資訊,讓 AI 回應自動帶有地理位置脈絡! 這項功能透過 Vertex AI 提供,可以讓 Gemini 模型「接地氣」(grounded)地回答位置相關問題,不再只是憑空想像。 開發過程中遇到的問題 在實作 maps_grounding.py 時,我最初使用 Gemini Developer API 搭配 API Key 的方式: # ❌ 錯誤的做法 client = genai.Client( api_key=api_key, http_options=HttpOptions(api_version="v1") ) response = client.models.generate_content( model="gemini-2.0-flash-lite", # 不支援 Maps Grounding contents=query, config=GenerateContentConfig( tools=[Tool(google_maps=GoogleMaps())], tool_config=ToolConfig(...) ), ) 結果出現了這個錯誤: google.genai.errors.ClientError: 400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Invalid JSON payload received. Unknown name "tools": Cannot find field. Invalid JSON payload received. Unknown name "toolConfig": Cannot find field.'}} 經過查閱文件後才發現,Google Maps Grounding 只支援 Vertex AI,無法使用 Gemini Developer API! 正確的解決方案 1. 理解 API 差異 Google 提供兩種不同的 Gemini API 存取方式: 特性 Gemini Developer API Vertex AI API 認證方式 API Key ADC / Service Account Maps Grounding ❌ 不支援 ✅ 支援 企業級功能 有限 完整 適用場景 快速原型開發 生產環境 2. 修正程式碼 以下是正確的實作方式: from google import genai from google.genai import...
繼續閱讀

[VS Code][Colab] Google 正式釋出 Colab VS Code Plugin

前情提要 Google Colab 是一個我很喜歡的服務,你可以在線上透過 JupyterNotebook 的介面,快速使用到 GPU (甚至是 TPU)。有許多需要大量運算資源的東西,都可以很快速的在遠端的機器上面執行。 我自己很常在上面去嘗試一些模型,雖然常常排隊排不到機器。 使用 Colab 可能有的痛點 雖然使用Google Colab 機器非常的方便,但是由於在線上編輯有一些比較麻煩的地方: 無法使用 Copilot 這類型的 Code Assist Tool 來幫我 Auto-Complete 一些程式碼 無法跑 Gemini CLI Code Assist 來幫我寫出一些更多的測試或是幫忙想應用。 Colab for VS Code Plugin 但是現在 Colab VS Code Extension 終於可以在 VS Code Plugin 上面使用了。你可以透過 “Colab” 直接找到官方釋出的 Plugin 。 安裝過程相當的簡單又快速。 連線到 Colab 如果要連線,在選擇 Kernel 的時候,就可以選擇 Colab 來遠端連線。 這裡還可以快速連線,或是找你上次連線過的伺服器。 這裡就是讓人興奮的地方,可以找找 TPU (不保證排得到隊伍)來用用看。 這樣就可以了。 實際應用: 這樣比較對味啦!! Vibe Coding 出現之後,我們越來越習慣 Vibe Coding 了。但是如果需要 Step by Step 的去偵錯,或是想要跑一些大型機器才能運行的運算。真的還是需要透過 Colab 來幫忙,但是如果又希望可以有 Gemini CLI 的輔助的話,或許 Colab VS Code Extension 就是你不可或缺的好夥伴。 目前一些需要注意的地方 由於 Colab VS Code Plugin 還在持續開發中,有一些原本在 Colab Web UI 上可以使用的 google.colab 功能目前還無法在 VS Code 中使用。以下是一些主要的限制: auth.authenticate_user(): 認證 URL 會出現在選單中,無法直接點擊。建議改用 Python Cloud Client Library。 drive.mount(): 目前無法掛載 Google Drive,可以改用 Drive Python API 來存取檔案。 files.download() / files.upload(): 原生的檔案上傳下載功能無法使用,但可以透過 IPyWidget 來達成相同效果。 userdata.get(): 目前會回傳錯誤,暫時需要從 Colab Web UI 複製 secret 值到 notebook 中。 雖然有這些限制,但整體來說 Colab VS Code Plugin 還是大幅提升了開發體驗,特別是對於習慣使用 VS Code 和各種 AI Coding Assistant 的開發者來說,絕對是值得一試的好工具! 參考資料 Colab VS Code...
繼續閱讀

[Python] LINE Bot 名片管家進化:一鍵生成 vCard QR Code,讓名片直接加入手機通訊錄

前情提要 在先前的 LINE Bot 智慧名片管家 專案中,我們已經實作了使用 Gemini Pro Vision API 自動辨識名片的功能。使用者只要拍照上傳名片,AI 就能自動解析姓名、職稱、公司、電話、Email 等資訊,並儲存到 Firebase Realtime Database 中。 但在實際使用時,我發現了一個痛點: 📱 我已經有數位化的名片資料了,但要加入手機通訊錄還是得手動一個一個欄位輸入… 想像這些情境: 📇 參加研討會:收集了 20 張名片,辨識完成後還要手動加入通訊錄 💼 業務拜訪:拿到客戶名片,想快速加入手機聯絡人 🤝 社交場合:認識新朋友,希望立即儲存聯絡方式 於是我想:既然資料已經數位化了,為什麼不能一鍵加入通訊錄呢? 最理想的方式就是:生成 vCard QR Code,讓使用者掃描後直接加入通訊錄! 專案程式碼 https://github.com/kkdai/linebot-namecard-python (透過這個程式碼,可以快速部署到 GCP Cloud Run,享受無伺服器的便利) 📚 關於 vCard 與 QR Code vCard 格式介紹 vCard(Virtual Contact File)是一種電子名片的標準格式,副檔名為 .vcf。幾乎所有智慧型手機和郵件客戶端都原生支援 vCard,包括: 📱 iPhone:自動識別並提示「加入聯絡人」 🤖 Android:透過聯絡人 App 匯入 💻 電腦:Outlook、Apple Mail、Gmail 等都支援 vCard 3.0 格式範例 BEGIN:VCARD VERSION:3.0 FN:Kevin Dai N:Dai;Kevin;;; ORG:LINE Taiwan TITLE:Software Engineer TEL;TYPE=WORK,VOICE:+886-123-456-789 EMAIL;TYPE=WORK:[email protected] ADR;TYPE=WORK:;;Taipei, Taiwan;;;; NOTE:Met at DevFest 2025 END:VCARD QR Code + vCard 的優勢 將 vCard 編碼成 QR Code 有幾個好處: ✅ 一掃即加:相機 App 掃描後自動識別 ✅ 跨平台:iPhone/Android 都支援 ✅ 無需下載:不用儲存檔案再匯入 ✅ 資料完整:包含所有聯絡資訊和備註 ✨ 專案功能介紹 核心功能流程 使用者上傳名片圖片 ↓ Gemini Vision API 辨識 ↓ 儲存到 Firebase Realtime Database ↓ 顯示名片 Flex Message ↓ 【新功能】點擊「📥 加入通訊錄」按鈕 ↓ 生成 vCard QR Code ↓ 上傳到 Firebase Storage ↓ 回傳 QR Code 圖片給使用者 ↓ 使用者掃描 → 加入通訊錄 ✅ 新增功能亮點 📥 一鍵生成 QR...
繼續閱讀