iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
AI 自動化

30 天 AI 自動化實戰:用 n8n、FastAPI 與 Gemini 打造 AI 知識管家系列 第 10

Day 10 | AI 回答不能隨心所欲:Structured Output 與 Pydantic

  • 分享至 

  • xImage
  •  

從昨天的結果可以看出 LLM 的回答格式並不固定。有時候它會給你一大段純文字,有時候它會自己加上條列式,甚至會擅自加上「好的,以下是為您整理的摘要:」這類不需要的開場白。如果把這種充滿隨機性、缺乏結構的一大坨文字直接往後丟給自動化流程,我們根本無法精準提取需要的資訊。所以我們需要限制 AI 回答的結構,方便我們獲得資訊。我們要利用 Python 的 Pydantic 來定義 JSON Schema,強制 Gemini 吐出我們規定好的資料格式

main.py的程式碼裡,確保最上方有import json並新增以下 Class,明確定義出我們期望 AI 回傳的欄位有包含摘要(tldr)、重點(key_points)、專有名詞(terms)、標籤(tags)與分類(category):

class ArticleSummary(BaseModel):
    tldr: str
    key_points: list[str]
    terms: list[str]
    tags: list[str]
    category: str

接著,我們要修改 summarize 函式中處理 response 的部分。透過 generation_config 參數,我們可以直接告訴 Gemini:「請用 JSON 格式回答,並且必須符合 ArticleSummary 這個結構!」:

response = model.generate_content(
            prompt,
            generation_config=genai.GenerationConfig(
                response_mime_type="application/json",
                response_schema=ArticleSummary,
            )
        )
        
        ai_result = json.loads(response.text)
        
        return {
            "status": "success",
            "data": ai_result
        }

重新將 FastAPI 跑起來之後可以先使用 Swagger UI 測試,檢查輸出有沒有變成我們要的格式,成功的話就可以回到 n8n workflow 測試。這裡的 n8n workflow 還不用做調整,因為只有 FastAPI 自己把格式調整而已,整體架構還是一樣的。執行成功的話,會看到 HTTP Request 節點的 Output 已經不再是一長串難以解析的文字,而是結構分明、隨時可以被後續流程提取的標準 JSON 格式了:
https://ithelp.ithome.com.tw/upload/images/20260917/20183341wif51wk1p5.png


上一篇
Day 09 | 把 Gemini 放進 Workflow:Automation 第一次會理解文字
下一篇
Day 11 | Webhook:讓真實世界事件自動啟動 Workflow
系列文
30 天 AI 自動化實戰:用 n8n、FastAPI 與 Gemini 打造 AI 知識管家16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言