不用再一個個拉紅框了!Gemini 3 新功能教學:我如何用Agentic Vision,在LINE裡標註目標?
不用再一個個拉紅框了!Gemini 3 新功能教學:我如何用Agentic Vision,在LINE裡標註目標?
2026.02.03 | AI與大數據

在完成 LINE Bot 的 Multi-Agent Orchestration 架構 之後,原本的圖片分析功能是直接將圖片送到 gemini-2.5-flash 做識別。但 Google 在 2026 年 1 月發布了 Gemini 3 Flash 的 Agentic Vision 功能,讓模型不再只是「看」圖片,而是能主動寫 Python 程式碼來放大、裁切、標註圖片。

這讓我想到一個有趣的使用場景:

使用者傳一張照片,說「幫我把咖啡標記出來」,AI 不只回覆文字描述,還會畫出 bounding box 標註在圖片上,把標註後的圖片傳回 LINE。

本文記錄了實作這個功能的完整過程,包括踩到的坑和解決方案。

Agentic Vision 是什麼?

傳統的圖片分析是靜態的:丟圖片給模型,模型回傳文字描述。

Agentic Vision 把圖片理解變成一個主動的調查過程,使用 Think → Act → Observe 循環:

Agentic Vision 流程                         │
│                                                             │
│  1. Think  - 分析圖片,規劃要怎麼深入調查                     │
│  2. Act    - 寫 Python 程式碼(裁切、放大、標註、計算)         │
│  3. Observe - 觀察程式碼執行結果(包括生成的標註圖片)          │
│  4. 重複以上步驟直到完成分析                                   │
└─────────────────────────────────────────────────────────────┘

技術核心

模型: gemini-3-flash-preview
關鍵功能: code_execution 工具 — 讓模型能寫並執行 Python 程式碼
輸出: 除了文字分析,還能回傳模型生成的標註圖片

# 啟用 Agentic Vision 的 API 呼叫
response = client.models.generate_content(
    model="gemini-3-flash-preview",
    contents=[image_part, "幫我把咖啡標記出來"],
    config=types.GenerateContentConfig(
        tools=[types.Tool(code_execution=types.ToolCodeExecution)],
        thinking_config=types.ThinkingConfig(thinkingBudget=2048),
    )
)

# Response 包含多種 part:文字、程式碼、執行結果、標註圖片
for part in response.candidates[0].content.parts:
    if part.text:           # 文字分析
    if part.executable_code: # 模型寫的 Python 程式碼
    if part.code_execution_result:  # 程式碼執行結果
    if part.as_image():     # 生成的標註圖片!

功能設計

使用者體驗流程

原本收到圖片就直接分析,改成先讓使用者選擇模式:

使用者傳送圖片
     │
     ▼
┌─────────────────────────────────────┐
│  📷 已收到圖片,請選擇分析方式:      │
│                                     │
│  ┌──────────┐  ┌─────────────────┐  │
│  │ 識別圖片  │  │ Agentic Vision │  │
│  └──────────┘  └─────────────────┘  │
│         (Quick Reply Buttons)        │
└─────────────────────────────────────┘
     │                    │
     ▼                    ▼
 gemini-2.5-flash    使用者輸入指令
 直接回傳文字描述    「幫我把咖啡標記出來」
                         │
                         ▼
                  gemini-3-flash-preview
                  + code_execution
                         │
                    ┌────┴────┐
                    ▼         ▼
               文字分析    標註圖片
               (Text)    (Image)
                    │         │
                    ▼         ▼
               LINE TextMsg + ImageSendMessage

為什麼要分兩步?

Agentic Vision 需要使用者提供具體指令(例如「標記出所有人」「數一數有幾隻貓」),不像一般識別只需要「描述圖片」。所以選擇 Agentic Vision 後,會先請使用者輸入想要達成的目標。

實作細節

1. 圖片暫存機制

因為 LINE 的 Quick Reply 是異步的(使用者點按鈕觸發 PostbackEvent),圖片需要暫存:

# main.py
image_temp_store: Dict[str, bytes] = {}        # 暫存圖片(user_id → bytes)
pending_agentic_vision: Dict[str, bool] = {}    # 等待使用者輸入指令

流程:

  1. 收到圖片 → 存入 image_temp_store[user_id]
  2. 使用者點「Agentic Vision」→ 設定 pending_agentic_vision[user_id] = True
  3. 使用者輸入文字 → 偵測到 pending 狀態,取出圖片 + 文字一起送去分析

2. Quick Reply 實作

使用 LINE SDK 的 PostbackAction ,與現有的 YouTube 摘要、地點搜尋 Quick Reply 保持一致的模式:

quick_reply_buttons = QuickReply(
    items=[
        QuickReplyButton(
            action=PostbackAction(
                label="識別圖片",
                data=json.dumps({"action": "image_analyze", "mode": "recognize"}),
                display_text="識別圖片"
            )
        ),
        QuickReplyButton(
            action=PostbackAction(
                label="Agentic Vision",
                data=json.dumps({"action": "image_analyze", "mode": "agentic_vision"}),
                display_text="Agentic Vision"
            )
        ),
    ]
)

3. Agentic Vision 分析核心

# tools/summarizer.py
def analyze_image_agentic(image_data: bytes, prompt: str) -> dict:
    client = _get_vertex_client()

    contents = [
        types.Part.from_text(text=prompt),
        types.Part.from_bytes(data=image_data, mime_type="image/png")
    ]

    response = client.models.generate_content(
        model="gemini-3-flash-preview",
        contents=contents,
        config=types.GenerateContentConfig(
            temperature=0.5,
            max_output_tokens=4096,
            tools=[types.Tool(code_execution=types.ToolCodeExecution)],
            thinking_config=types.ThinkingConfig(thinkingBudget=2048),
        )
    )

    result_parts = []
    generated_images = []

    for part in response.candidates[0].content.parts:
        if hasattr(part, 'thought') and part.thought:
            continue  # 跳過 thinking parts
        if part.text is not None:
            result_parts.append(part.text)
        if part.code_execution_result is not None:
            result_parts.append(f"[Code Output]: {part.code_execution_result.output}")
        # 提取模型生成的標註圖片
        img = part.as_image()
        if img is not None:
            generated_images.append(img.image_bytes)

    return {
        "status": "success",
        "analysis": "\n".join(result_parts),
        "images": generated_images  # 標註後的圖片 bytes
    }

4. 圖片回傳機制

LINE 的 ImageSendMessage 需要公開的 HTTPS URL。因為我們部署在 Cloud Run(本身就是公開 HTTPS),所以直接在 FastAPI 上加一個圖片 serving endpoint:

# 暫存標註圖片(UUID → bytes,5 分鐘 TTL)
annotated_image_store: Dict[str, dict] = {}

@app.get("/images/{image_id}")
def serve_annotated_image(image_id: str):
    """提供暫存的標註圖片給 LINE 下載"""
    entry = annotated_image_store.get(image_id)
    if not entry:
        raise HTTPException(status_code=404)
    if time.time() - entry["created_at"] > 300:  # 5 分鐘過期
        annotated_image_store.pop(image_id, None)
        raise HTTPException(status_code=404)
    return Response(content=entry["data"], media_type="image/png")

自動偵測 App 的 base URL(從 webhook request 的 headers):

@app.post("/")
async def handle_webhook_callback(request: Request):
    global app_base_url
    if not app_base_url:
        forwarded_proto = request.headers.get('x-forwarded-proto', 'https')
        host = request.headers.get('x-forwarded-host') or request.headers.get('host', '')
        if host:
            app_base_url = f"{forwarded_proto}://{host}"

最後組合成 ImageSendMessage

def _create_image_send_message(image_bytes: bytes):
    image_id = store_annotated_image(image_bytes)
    image_url = f"{app_base_url}/images/{image_id}"
    return ImageSendMessage(
        original_content_url=image_url,
        preview_image_url=image_url,
    )

成果展示

 Agentic Vision
圖/ Evan提供
 Agentic Vision
圖/ Evan提供

踩到的坑

坑 1: from_image_bytes 不存在

ERROR: Error analyzing image: from_image_bytes

原因: google-genai SDK 中沒有 types.Part.from_image_bytes() ** 這個方法,正確的是 **types.Part.from_bytes()

# ❌ 錯誤
types.Part.from_image_bytes(data=image_data, mime_type="image/png")

# ✅ 正確
types.Part.from_bytes(data=image_data, mime_type="image/png")

坑 2: ThinkingLevel enum 不存在

ERROR: module 'google.genai.types' has no attribute 'ThinkingLevel'

原因: google-genai==1.49.0ThinkingConfig 只支援 thinkingBudget (整數),不支援 thinking_level enum。Context7 和官方文件的範例是基於更新版本的 SDK。

# ❌ 在 v1.49.0 不存在
types.ThinkingConfig(thinking_level=types.ThinkingLevel.MEDIUM)

# ✅ v1.49.0 支援的寫法
types.ThinkingConfig(thinkingBudget=2048)

教訓 :AI 生成的程式碼範例可能基於較新或較舊的 SDK 版本,永遠要用 python -c "help(types.ThinkingConfig)" 確認實際可用的參數。

坑 3: 識別圖片結果不完整

原因: gemini-2.5-flash 預設啟用 thinking,thinking tokens 會消耗 max_output_tokens 的額度。原本設定 max_output_tokens=2048,thinking 用掉一大半後,實際回覆被截斷。

# ❌ 改前:thinking 消耗了大部分 token 額度
config=types.GenerateContentConfig(
    max_output_tokens=2048,
)

# ✅ 改後:關閉 thinking + 加大 token 額度
config=types.GenerateContentConfig(
    max_output_tokens=8192,
    thinking_config=types.ThinkingConfig(thinkingBudget=0),  # 關閉 thinking
)

重點: 對於簡單的圖片描述,thinking 是多餘的開銷。thinkingBudget=0 可以關閉 thinking,讓全部 token 用在回覆上。

修改的檔案

原本的 VisionAgent 只有一條路徑,現在變成:

LINE Image Message
     │
     ▼
handle_image_message()
     │
     ├── image_temp_store[user_id] = image_bytes
     │
     ▼
Quick Reply: "識別圖片" / "Agentic Vision"
     │                         │
     ▼                         ▼
handle_image_analyze_      pending_agentic_vision[user_id] = True
postback()                     │
     │                         ▼
     │                   使用者輸入文字指令
     │                         │
     │                         ▼
     │                   handle_agentic_vision_with_prompt()
     │                         │
     ▼                         ▼
orchestrator               orchestrator
.process_image()           .process_image_agentic(prompt=使用者指令)
     │                         │
     ▼                         ▼
VisionAgent.analyze()      VisionAgent.analyze_agentic()
     │                         │
     ▼                         ▼
analyze_image()            analyze_image_agentic()
gemini-2.5-flash           gemini-3-flash-preview
thinkingBudget=0           + code_execution
                           + thinkingBudget=2048
     │                         │
     ▼                         ├── 文字分析 → TextSendMessage
TextSendMessage                ├── 標註圖片 → /images/{uuid} → ImageSendMessage
                               └── push_message([text, image])

開發心得

1. SDK 版本差異是最大的坑

這次開發最花時間的不是功能設計,而是 SDK 版本差異。 google-genai 的 API 變動頻繁:

  • from_image_bytesfrom_bytes(方法名稱變更)
  • ThinkingLevel enum 在 v1.49.0 不存在(需要用 thinkingBudget 整數)
  • thinkingmax_output_tokens 的影響沒有文件說明

建議:開發前先跑 pip show google-genai 確認版本,再用 help() 確認實際可用的 API。

2. LINE Bot 回傳圖片的限制

LINE 的 ImageSendMessage 要求圖片必須是公開的 HTTPS URL,不能直接傳 bytes。解決方案:

方案 優點 缺點
GCS 上傳 穩定、持久 需要設定 bucket 和權限
FastAPI endpoint 自行 serve 簡單、不需外部服務 重啟後消失、記憶體佔用
Base64 嵌入文字 最簡單 LINE 不支援

我選擇 FastAPI endpoint 方案,因為:

  • Cloud Run 本身就是公開 HTTPS
  • 標註圖片只需要短暫存在(5 分鐘 TTL)
  • 不需要額外設定 GCS bucket

3. Thinking 是一把雙刃劍

gemini-2.5-flash 預設啟用 thinking,這對複雜推理有幫助,但對簡單的圖片描述反而是負擔:

  • 消耗 max_output_tokens 額度
  • 增加延遲
  • 回覆可能被截斷

原則:簡單任務關閉 thinking(thinkingBudget=0),複雜的 Agentic Vision 才開啟。

4. 狀態管理的取捨

Agentic Vision 需要兩步互動(選模式 → 輸入指令),這引入了狀態管理:

image_temp_store: Dict[str, bytes] = {}       # 圖片暫存
pending_agentic_vision: Dict[str, bool] = {}   # 等待指令

用 in-memory dict 最簡單,但有個風險:Cloud Run 可能在兩次請求之間重啟。對於個人 Bot 這是可接受的,但如果要做成產品級服務,應該改用 Redis 或 Firestore。

本文授權轉載自Evan部落格,原文標題為:[Gemini 3 Flash] 在 LINE Bot 中實現 Agentic Vision:讓 AI 主動標註圖片甚至做更多 AI 處理

往下滑看下一篇文章
AI造浪席捲跨境電商!亞馬遜揭「科技、價值、信任」三大趨勢,引領台灣企業搶賺全球商機
AI造浪席捲跨境電商!亞馬遜揭「科技、價值、信任」三大趨勢,引領台灣企業搶賺全球商機

台灣有無數「隱形冠軍」和世界級的製造實力,在各大產業中閃閃發光。但面對全球供應鏈重組、消費習慣碎片化,以及近年生成式AI的爆發性成長,台灣企業該如何將優質的硬實力,轉化為知名的品牌力?

為了因應相關議題,協助台灣中小企業尋找突破口,2026亞馬遜全球開店博覽會以「AI造浪,品牌出海」為主軸,舉辦豐富的講座、實際體驗和諮詢服務,吸引眾多渴望轉型出海、對進軍全球市場有強烈企圖的企業和品牌,共同與會。

代理式AI崛起,重塑購物旅程、企業營運模式

在開場講座中,亞馬遜全球開店台灣總經理謝孜希首先以「從台灣到全球,AI時代品牌跨境突圍實戰」為題指出,跨境電商已經從過去的「流量競爭」,正式進入「數據和智能驅動」的根本性轉變,「AI不只是輔助工具,還在全面重塑消費者的購物旅程和企業的營運模式,尤其『代理式AI』(Agentic AI)的崛起,將成為品牌連結全球消費者的關鍵。」她進一步解釋,過去的AI像被動的指令接收器,人下指令、AI接著執行;但現在的代理式AI,更像企業的營運夥伴、顧客的購物助理,能主動分析市場、規劃策略、自動執行任務,並在找出消費者的喜好自動下單。

amazon-2.jpeg
亞馬遜全球開店台灣總經理謝孜希表示:「AI不只是輔助工具,還在全面重塑消費者的購物旅程和企業的營運模式,尤其『代理式AI』(Agentic AI)的崛起,將成為品牌連結全球消費者的關鍵。」
圖/ Amazon

在亞馬遜上,Agentic AI讓消費者從普及的應用AI來搜尋,再到比較決策、進而購買商品。比方說,亞馬遜的購物助理Rufus AI,能根據消費者的搜尋動作判斷意圖,主動推薦商品,這讓使用Rufus AI的消費者,購買轉換率可比未使用的消費者提升逾60%,目前已有超過3億、97%的活躍用戶,透過Rufus AI進行消費決策。此外,亞馬遜還推出「Interests」功能,即使顧客不主動搜尋,這個AI私人購物助理也會24小時不間斷地幫忙逛街,並根據個人偏好推送新品、降價資訊,最終成功讓近20%的用戶,將推薦商品加入購物車。

謝孜希特別提到,亞馬遜的「Buy for Me」功能,已經從「資訊代理」進化成「行動代理」。根據最新數據統計,可以由AI代為完成購物的跨平台商品,已經超過50萬件,「這代表電商正從『關鍵字經濟』,變成『興趣經濟』、『AI代理經濟』。」

在賣家端,AI同樣展現強大價值,謝孜希透露,目前已有高達90萬名賣家導入亞馬遜的AI工具,包括能協助找出仍未被滿足需求的「商機探測器」、自動生成符合當地生活風格品牌場景圖的「A+內容」,以及能自動優化廣告素材的Ads Agent和Creative Agent等工具。這些代理式AI工具,平均每週能為賣家節省約5.6小時的時間,「賣家能將寶貴的時間,專注在更高價值的品牌決策和產品創新上。」

聚焦全球三大消費趨勢,台灣品牌迎來絕佳出海契機

了解AI如何改變規則後,謝孜希進一步分析,現今的全球消費趨勢,分別為高科技研發升級體驗、價值創新打造爆品和安全信任建立品牌,「這三大趨勢和台灣企業在技術、創新、品質上的優勢,完美契合。」

首先,當前全球消費電子市場規模已突破一兆美元,其中搭載AI的消費電子產品成長速度,更是整體消費電子市場的5倍。而台灣擁有全球最完整的PC和電子零組件供應鏈,占全球先進製程晶片製造的90%;根據財政部統計處2026年3月的最新統計,資通訊加電子零組件則占出口近八成。謝孜希以賣家「TRYX創氪星系」為例,指出品牌看準PC DIY市場長期陷入CP值和價格戰的痛點,決定專注高階玩家,推出全球首款「裸眼3D水冷散熱器」和L型曲面螢幕機箱,「TRYX創氪星系不跟風做低價競爭,反而善用亞馬遜商機探測器,預判消費者的需求,再用『技術』重新定義品類,並透過評論工具Vine快速建立信任。」進軍亞馬遜短短一年內,TRYX創氪星系的營收便成長了197%。

amazon-3.jpeg
「TRYX創氪星系」成長旅程,進軍亞馬遜短短一年內,TRYX創氪星系的營收便成長了197%。
圖/ Amazon

其次,消費者不再單純要求「低價」,轉而追求「超出期待的體驗」和「價值」。根據Deloitte的調查顯示,當品牌兼具創新力和信賴感時,消費者的年均支出會提升62%,且有近六成消費者願意為創新永續的產品付更多錢。健身器材熱銷全球80多國、累積千萬台銷量的居家健身品牌WONDER CORE,就是最佳的價值創新典範。

早在2009年,WONDER CORE就發現現代人居住空間變小,轉而開始研發小型健身器材,鑽研「讓健康變簡單」的解決方案。如今,WONDER CORE已有逾200項專利,更將硬體結合專屬APP,透過AI分析運動、飲食數據,提供客製化課程給消費者。

amazon-4.jpeg
累積千萬台銷量的居家健身品牌WONDER CORE,已有逾200項專利,將硬體結合專屬APP,透過AI分析運動、飲食數據,提供客製化課程給消費者。
圖/ Amazon

至於在年產值逾5500億美元的母嬰、寵物等市場,讓消費者買單的重點,是「安全」與「信任」。高達73%的消費者認為,品牌信任是影響忠誠度的首要因素,忠誠客戶的消費金額較一般消費者高出31%,回購率也大幅提升。台灣寵物品牌「超凝小姐Lady N」掌握安全、信任等要素,專注研發高品質的天然豆腐貓砂,便首創使用國際安全香氛協會認證的安全香氛,打破市場對香味貓砂不安全的刻板印象。儘管剛進美國市場前三個月的訂單只有個位數,但透過優質體驗帶來的口碑效應,曾創下24小時內狂銷數十箱的紀錄,以及10倍的銷售成長、高達60%的回購率。

amazon-5.jpeg
台灣寵物品牌「超凝小姐Lady N」專注研發高品質的天然豆腐貓砂,便首創使用國際安全香氛協會認證的安全香氛,打破市場對香味貓砂不安全的刻板印象。透過優質體驗帶來的口碑效應,曾創下24小時內狂銷數十箱的紀錄,以及10倍的銷售成長、高達60%的回購率。
圖/ Amazon

「AI結合品牌力,就是取得全球成功的方程式。」謝孜希鼓勵台灣企業善用亞馬遜的AI選品、代理式AI等工具,用數據驅動決策、掌握高成長品類,並從「Day 1」起,就具備建立國際品牌的視野,讓AI成為走向全球的加速器。

跨界對談傳授出海心法,善用數據、驅動決策

另外,博覽會還安排了由《數位時代》創新長黃亮崢主持,亞馬遜全球開店台灣總經理謝孜希、台北市進出口商業同業公會秘書長黃文榮、安克創新副總裁暨海翼電商執行長吳灼輝、嘖室營運長高立杰等專家,從不同角度探討企業的出海痛點並剖析各種AI應用。

amazon-6.jpg
由左至右,分別為嘖室營運長高立杰、安克創新副總裁暨海翼電商執行長吳灼輝、亞馬遜全球開店台灣總經理謝孜希、台北市進出口商業同業公會秘書長黃文榮共同與會、分享,並由《數位時代》創新長黃亮崢主持。
圖/ 數位時代

高立杰建議,剛起步的品牌在使用任何AI工具前,都應該先「認識自己」並「釐清品牌定位」。他指出品牌洞察到年輕人不喜歡被傳統業務推銷的痛點,因此創造了「被動式」、「無壓力」的線上線下購物體驗,「AI可以幫你生成精美的圖片、文案,但如果品牌本身就缺乏靈魂,產出的素材依舊無法打動目標客群。」

黃文榮則提到,科技進步讓全球市場通路日益碎片化,導致傳統大客戶的訂單日益流失,許多OEM、ODM廠商被迫走上跨境電商之路,「所以現今企業的最大挑戰,是『轉變心態』。過去是客戶給規格照著做,現在得自己去面對廣大、多樣的消費者需求。」他建議,企業務必透過AI工具和市場同步,也必須自己培養跨界人才,同時,無論如何都要勇敢搭上數位轉型的列車,並善用亞馬遜全球開店等跨境電商產業資源。

而吳灼輝觀察,跨境電商已從過去的「單點工具」競爭,進化到「系統化AI營運」的時代。他認為,企業不應只把亞馬遜當成單純的銷售通路,更應視為獲取消費者回饋和洞察市場的「大數據中心」,並利用各項AI工具來提升決策效率,才能在激烈的市場競爭中,占據領先地位。

謝孜希總結指出,AI已降低全球化門檻,企業思維應從「品牌全球化」,轉變為營運第一天起就決心打造全球品牌,「不要等在地市場成熟才布局海外,應該善用AI,放大對消費者的理解和決策品質,加速走向世界,讓AI真正成為品牌邁向全球的加速器。」

除了各方專家分享的精實內容,此次博覽會還設置「亞馬遜AI算命館」、各項工具體驗和服務商展示專區,企業、品牌可以體驗亞馬遜全球開店最新的商機探測器、A+內容等AI工具,讓系統解讀自家的「產品命盤」,進而找出潛在商機;今年更增設跨境諮詢專區Seller Cafe,安排了專業的亞馬遜官方專家和跨境顧問,提供未註冊和剛註冊的新手、有廣告投放和行銷等進階問題的老賣家,一對一的實戰指導。

amazon-7.jpg
博覽會本次設置「亞馬遜AI算命館」,協助企業、品牌可以快速找到問題,並體驗亞馬遜全球開店最新的商機探測器、A+內容等AI工具,讓系統解讀自家的「產品命盤」,進而找出潛在商機。由左至右為:亞馬遜全球開店台灣總經理謝孜希、臺北市政府俞振華副秘書長。
圖/ 數位時代

值此AI造浪時代,亞馬遜全球開店博覽會透過趨勢剖析、台灣的成功賣家案例分享,以及各界專家的深度對談,為企業描繪了一張清晰的出海藍圖。台灣品牌只要能緊抓科技研發、價值創新、安全信任等三大優勢,再搭配亞馬遜的AI賦能工具與全球資源,相信能在全球航道上乘風破浪,持續寫下世界級的亮眼佳績。

立即下載_亞馬遜 2026 消費性電子品類攻略手冊|掌握下一波成長動能

圖/ Amazon

登入數位時代會員

開啟專屬自己的主題內容,

每日推播重點文章

閱讀會員專屬文章

請先登入數位時代會員

看更多獨享內容

請先登入數位時代會員

開啟收藏文章功能,

請先登入數位時代會員

開啟訂閱文章分類功能,

請先登入數位時代會員

我還不是會員, 註冊去!
追蹤我們
AI全球100+台灣20
© 2026 Business Next Media Corp. All Rights Reserved. 本網站內容未經允許,不得轉載。
106 台北市大安區光復南路102號9樓