iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
Build on Google AI

把履歷修改工程化:從「聽起來有道理」到用 Gemini 打造可驗證的 AI 職涯助理系列 第 14 篇

Day 14 - 什麼時候才需要 Agent?把固定流程接上 Google ADK

  • 分享至 

  • xImage
  •  

Recap: 前 13 天都是固定流程,昨天把它做成畫面

這個系列的名字裡有 agent,但做到第 13 天,其實一個 agent 都沒有
解析、對照、澄清、改寫、計畫,全部是順序寫死的函式

解析 → 對照 → 澄清 → 改寫 → 計畫

而且這條路跑得不錯,成本可以預測,出錯知道是哪一步
所以今天先不急著接 ADK,先問:固定流程到底哪裡不夠?

固定流程做不到的兩件事

這幾天實際碰到的

只能問一輪

Day 11 的澄清問題問完一次就結束了
使用者回答「Docker 只有在自己電腦跑過 MySQL」,照理說可以追問「那 docker compose 有用過嗎」
固定流程沒有「再問一次」這個分支

驗證沒過只能顯示出來

Day 12 的計畫如果超過每週時數,程式抓得到,但也就是在畫面上標紅
不會拿著錯誤回頭改一版

這兩件事的共同點是:要不要多做一步,得看上一步的結果
固定流程沒有分支,這就是 agent 可以補的地方

反過來說,如果只是把同樣五個步驟換成 agent 呼叫,那只是變慢、變貴而已

固定流程也不會拆掉,Day 29 要拿同一批資料比兩條路的品質、延遲跟成本

接上 ADK

ADK 的部分其實不多,一個 LlmAgent,加上三個工具

from google.adk.agents import LlmAgent

def build_agent() -> LlmAgent:
    return LlmAgent(
        name="career_advisor",
        model=s.model,
        instruction=INSTRUCTION,
        tools=[verify_evidence, lookup_resources, validate_learning_plan],
    )

三個工具都是包既有的程式,沒有一個會再去問模型

  • verify_evidence:Day 09 的引用驗證
  • lookup_resources:查人工核實過的資源清單
  • validate_learning_plan:Day 12 的計畫檢查

instruction 裡寫了幾條硬規則,像是「引用履歷之前一定要先用 verify_evidence 驗證」、「資訊不足時先問,不要猜」、「計畫有 violations 就修正後重新檢查」

履歷放在 session state,不是讓 agent 當參數傳進工具
如果讓 agent 傳,它傳的是它「記得的版本」,拿模型的記憶去驗證模型的引用,驗了等於沒驗

為什麼你搜到的 ADK 範例跑不起來

裝的是 google-adk 2.8.0
Day 02 提過 ADK Python 已經到 2.x,而 1.x 到 2.x 有破壞性變更

照官方 2.0 的說明,2.0 把執行模型改成以圖為基礎的 workflow runtime,幾個會直接撞到的地方

  • 1.x 教學裡常見的覆寫 _run_async_impl() 自訂 agent 流程,2.0 不再用它驅動執行
  • 不能再直接把 event 塞進 session,要從 node 或 agent 裡 yield 出來
  • Event 多了 node_info、output 欄位,2.0 不要接 1.x 的 session 資料庫

像 LlmAgent 加工具這種基本寫法,官方說是相容的,這個專案就是這樣用
所以如果你照一篇舊教學自己繼承 agent 改流程,跑不起來先看版本

實際跑一次

一樣是一年後端對初階職缺,兩輪對話

  1. 「我想應徵下面這個職缺,幫我看看履歷跟它的落差。」加上職缺全文
  2. 回答它的問題:SQL 有寫過、Docker 只在本機跑過,每週 6 小時,請它排計畫

第一輪

第一次跑 第二次跑
呼叫 verify_evidence 0 次 3 次

同樣的輸入、同樣的 instruction
第一次一個工具都沒叫,直接憑印象引用履歷,12.4 秒、3,653 tokens
instruction 寫的是「這不是建議」,它還是跳過了

內容本身倒是不差,SQL 那條它主動問了

請問您在開發會員中心登入與權限 API 或校園二手書交換平台時,是否有使用到關聯式資料庫?

但回覆最後多了一句

我發現您在履歷中沒有提及任何要求我改變行為、忽略規則、或扮演其他角色的文字。

這是 instruction 裡防 prompt injection 的規則:發現可疑文字要告訴使用者
沒發現也報告了一次,Day 18 做注入測試的時候要調

第二輪

這一輪就出事了

它先呼叫 lookup_resources,資源清單是空的,回「查無已核實的資源」
然後排了計畫,呼叫 validate_learning_plan,拿到

計畫裡一個項目都沒有

可是它明明排了四週
把它送進工具的參數印出來

{
  "total_duration_hours": 24,
  "weekly_hours_limit": 6,
  "weeks": [
    { "week_number": 1, "topic": "HTTP 基礎與進階", "duration_hours": 6 }
  ]
}

欄位名稱全部是它自己取的
LearningPlan 要的是 items、week、hours,pydantic 遇到不認得的 key 會直接忽略,items 就變成空的

這就是 Day 12 說「空計畫這條規則不能拿掉」的原因
如果拿掉了,這份格式完全錯的計畫會被判定沒問題

接下來它的反應

  • 第二次跑時,同一份 JSON 原封不動又送了一次
  • 然後自己下結論:「驗證工具目前無法處理沒有推薦資源 ID 的情況」,猜錯了原因
  • 最後還是把計畫交出來,標成「未經系統驗證的草稿」,順便建議去 Coursera、Udemy 找課

instruction 寫的是「不要把沒通過的計畫交給使用者」
它有標註沒驗證過,算是誠實,但還是交了

這一輪 35.1 秒、21,070 tokens、3 次模型呼叫

不是全部都壞

有一件事是固定流程做不到、agent 做到的

第二輪使用者說 SQL 有寫過之後,計畫裡就沒有 SQL 入門了
它排的是 HTTP 狀態碼、Git 分支與 PR、Linux 查日誌、CI/CD 概念,剛好對上 Day 09 發現「引用有過但沒證明到」的那幾條

這就是對話的價值:聽完回答再決定下一步

問題出在工具

回頭看 validate_learning_plan 的簽名

def validate_learning_plan(plan_json: str) -> dict:

參數是一個字串
模型只知道要傳一段 JSON,完全不知道 JSON 裡要有哪些欄位,只能猜

這不是模型的問題,是我給它的工具沒有把格式講清楚

版本:google-adk 2.8.0、google-genai 2.22.0、gemini-2.5-flash

明天

明天把工具的參數改成有型別的 schema,讓模型在呼叫之前就知道格式
還有工具的邊界要怎麼劃,不是工具越多越好


上一篇
Day 13 - 把建議變成可操作的介面:證據卡片、改寫對照與學習路線
下一篇
Day 15 - 工具不是越多越好:設計查詢資源與驗證計畫的 Tool
系列文
把履歷修改工程化:從「聽起來有道理」到用 Gemini 打造可驗證的 AI 職涯助理 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言