從昨天的結果可以看出 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 格式了: