昨天把完全相同的 Prompt Run 了三次。
結果三次都成功產生 5 張 Learning Cards,指定的動物、欄位與主要知識點也都很接近。
如果只是坐在 Google AI Studio 前面看結果,其實完全沒什麼問題。
看得懂,也符合需求。
但不要忘記,這次的目標不是在 Google AI Studio 裡跟 Gemini 聊天。
最後這些 Learning Cards 是要真的放進網站裡。
所以今天決定換一個角度:
人看得懂的 Response,程式也看得懂嗎?
昨天 Gemini 產生的內容大概長這樣:
Emoji:🐢
Title:海龜
Content:海龜身上背著一個又圓又硬的大殼……
Question:海龜身上背著什麼東西來保護自己?
Answer:又圓又硬的大殼。
---
Emoji:🐳
Title:鯨魚
Content:鯨魚游到水面上呼吸的時候……
Question:鯨魚游到水面上時,頭頂會噴出什麼?
Answer:大水柱。
人類一看就知道:
但程式要使用這些資料,就沒有這麼直覺。
例如前兩次 Response 都使用:
---
分隔每張 Card。
那是不是可以直接用 JavaScript:
const cards = response.split("---");
看到 --- 就切成下一張 Card。
看起來很合理。
結果 Run #3:
---不見了。
而且前兩次使用:
Title:
Run #3 又變成:
Title:
對人來說只是全形、半形冒號的差別。
對程式來說,卻可能是完全不同的字串。
到這裡我才發現,前幾天一直在注意:
Gemini 回答得好不好?
但當 AI 要真正放進應用程式後,還要多問一件事:
程式能不能可靠地使用這份 Response?
比起一整段文字,我真正希望拿到的資料其實比較像:
[
{
"emoji": "🐢",
"title": "海龜",
"content": "海龜身上背著一個又圓又硬的大殼……",
"question": "海龜身上背著什麼東西來保護自己?",
"answer": "又圓又硬的大殼。"
}
]
這樣程式就不用猜:
哪裡是 Title?
哪裡是 Question?
哪裡是一張 Card 的結束?
因為資料本身已經有明確的結構。
這也是今天最大的發現:
看得懂的文字格式,不等於程式需要的資料結構。
看到這裡,第一個想法當然是:
請使用 JSON 格式回傳。
問題解決?
經過這幾天的實驗,我已經不太敢這麼快相信 Gemini 了(笑)。
因為用 Prompt 要求 JSON,仍然是在用自然語言告訴 AI:
「我希望你這樣回答。」
但如果要真的串進程式,我希望能更明確地定義:
一定有哪些欄位?
欄位叫什麼?
資料是什麼型別?
一次會有幾筆資料?
也就是不只要求:
請給我 JSON。
而是進一步告訴 Gemini:
請按照我定義的資料結構回傳。
這就來到下一個要研究的功能了。
Google AI Studio 裡有一個功能:
Structured Output
前幾天一直刻意沒有使用它,就是想先看看單靠 Prompt 會得到什麼結果。
經過 Day 05~Day 09,現在問題也慢慢變得很清楚:
Prompt
↓
可以控制內容
但是
自然語言 Response
↓
格式可能變化
↓
程式不好穩定解析
所以接下來要試試看:
如果直接定義 Gemini 的輸出結構,結果會不會不一樣?
今天沒有繼續改 Prompt,也沒有產生新的 Learning Card。
只是把昨天的 Response 換成「程式」的角度重新看一次。
最後發現一個很簡單,但接下來很重要的問題:
人看得懂,不代表程式好處理。
如果 Gemini 只是回答問題,文字排版清楚可能就夠了。
但如果要把 AI 真正整合進網站,我需要的就不只是「好看的回答」,而是:
有明確結構、可以被程式使用的資料。
所以明天就來試試看 Structured Output。
看看能不能讓 Gemini 從:
「回答得很整齊」
進一步變成:
「按照我們定義的格式交資料」。
Day 10|不要再猜格式了!用 Structured Output 讓 Gemini 回傳 JSON