iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Build on Google AI

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

Day 25 - 怎樣才算好建議?建立履歷分析與學習計畫的評估規準

  • 分享至 

  • xImage
  •  

Recap: 第 5 章結束,agent 上了雲端,出錯也知道該不該再試。接下來要回答的是:它給的建議到底好不好

Day 06 做了 10 份虛構履歷、6 份職缺、24 組答案卷
之後每天都在改 prompt,但一直沒有東西在打分數,改完是變好還是變壞,都是看幾個例子憑感覺

今天先把評分的規則定下來,再拿 24 組全部跑一次

要量什麼

直接從 Day 01 寫的那四件事開始

  • 可追溯:判成有證據的,引用要通過程式驗證
  • 不捏造:改寫的原句要找得到,不能多出原文沒有的數字
  • 不靜默失敗:沒做完的步驟有寫出來
  • 成本跟延遲:每組記 tokens 跟秒數

這幾項只要錯一次,那次分析就不能用,所以當成門檻,沒過就是不合格
不跟其他分數加總,不然一句編出來的數字,會被其他地方的高分蓋過去

另外是答案卷可以對的:職缺解析抽出幾條必備條件、判斷的方向、Day 06 故意埋的陷阱、not_found 有沒有被寫成「不會」(Day 09)、計畫有沒有附資源
這些有程度之分,各自給分

改寫有沒有變好、建議具不具體,今天不量
程式量不出來,硬寫一個字數比較只會量到別的東西,留給 Day 27

答案卷要補

Day 06 的答案卷,每組只有一個 expected_fit(strong / partial / weak)
它回答不了「SQL 那一條該不該判成有證據」,偏偏 Day 06 埋的毛病都是這種

所以在 data/index.json 裡給 8 組補上逐條的檢查,共 22 條

{
  "resume": "sample-backend-1y.txt",
  "job": "sample-job-backend-junior.txt",
  "expected_fit": "strong",
  "checks": [
    {"requirement": "SQL", "expect": "not_direct", "why": "技能欄與經歷都沒有資料庫(skill_gap)"},
    {"requirement": "Git", "expect": "found", "why": "技能欄有 Git"}
  ]
}
  • not_direct:不能判成 direct,履歷沒寫卻說「明確寫到」
  • found:要判成 direct 或 indirect,履歷有寫卻說沒有

not_direct 允許 indirect,因為 indirect 也要附通過驗證的原句,推論鬆不鬆交給人看

陷阱是用正規表示式去對職缺要求的原文,所以多寫了一個測試,確認每一條都對得到職缺裡的某一行
對不到的話,那條永遠不會被評到,結果還會顯示全部通過

適配度要自己推

答案卷是 strong / partial / weak,但系統本身沒有輸出這種結論,只有逐條的對照
要比的話,就照 Day 06 自己寫的 fit_scale 從對照結果推回去

# strong:必備缺 0-1 項;partial:缺 2-3 項;weak:缺 4 項以上
missing = sum(1 for m in matches if m["requirement"] in must and m["verdict"] == "not_found")

先測評分程式

評分程式自己也可能寫錯,所以先拿幾份故意做壞的報告去跑

  • 引用改過字,可追溯要沒過
  • 改寫多一個數字,要不合格,就算其他分數全滿
  • 陷阱判成 direct,要扣分
  • 有寫 stopped 的沒做完,不扣分,這是 Day 24 要的行為

12 個測試,都不打模型
評分只吃存下來的報告,跟 Day 18 一樣可以 --rescore,改了規則不用重跑模型

跑 24 組

evals/rubric_run.py 跑固定流程,同時跑 3 組

24 組有結果,0 組失敗
門檻全過:11/24
  traceable          沒過 7 組
  no_fabrication     沒過 9 組
  plan_valid         沒過 4 組
  no_silent_failure  沒過 0 組

不捏造沒過 9 組,第一個反應是模型在亂改
但看了是哪 9 組:全部是 backend-8y、frontend-5y、devops-sre-6y
這三份是 Day 06 標成 quantified 的,每一條都有數字,照理說最不需要編

相似度 1.00 卻沒過

引用沒通過驗證:熟悉監控與日誌系統(Prometheus…(引用與原文不完全相符(相似度 1.00),模型可能改過字)

相似度 1.00 還判成改過字,回去對原文

- 主導訂單服務由單體拆分為 5 個微服務,尖峰 QPS 從 1,200 提升至 4,500,
  P99 延遲由 820ms 降至 210ms

履歷在句子中間換行
模型引用的時候直接接起來:「…4,500,P99 延遲…」
驗證器把換行變成一個空格:「…4,500, P99 延遲…」

差一個空格,就判成改過字
改寫那邊也一樣,「原句在履歷找不到」的 15 條改寫,全部是這個原因

產品裡用的也是這個驗證器,所以使用者那邊一樣會看到這些警告
句子寫得越長、越具體,越容易跨行,越容易被標起來

evidence.py 改成:空白只在兩個英數字中間才留(Spring Boot),中文跟標點旁邊的換行直接拿掉

if not prev_space and out and _is_word(out[-1]) and nxt and _is_word(nxt[0]):
    out.append(" ")

Spring Boot 寫成 SpringBoot 還是會被抓到,兩種都寫成測試
驗證是程式算的,不用重打模型,拿新的驗證器把存下來的報告重算一次(--reverify)

no_fabrication     沒過 9 組 → 0 組
門檻全過          11/24 → 15/24

好幾行接成一句

career-changer 那組,7 句引用全部找不到

'技能\nSQL\nPostgreSQL\n資料存於 PostgreSQL\n完成後端工程師學習路線的線上課程,含資料庫設計與 REST API 章節'

每一段都在履歷裡,只是分在四個地方,連「技能」這個標題都接進來了
Day 09 的 prompt 有寫「不要把兩句話接成一句」,沒有用

一開始以為只是格式問題,後來看到 backend-4y 這一句

indirect | 能撰寫基本的 SQL 查詢 | 'MySQL\n協助資料處理相關作業' | 履歷提及熟悉 MySQL 且有資料處理經驗,暗示具備 SQL 查詢能力

技能欄有 MySQL,經歷有一條「協助資料處理相關作業」,兩個分開都是真的
但接在一起,看起來就像「用 MySQL 做資料處理」,履歷裡沒有這樣寫
所以拼接還是算可追溯沒過

評分程式再把沒過的引用分成三種:拼接、改字、找不到
一開始只看引用裡有沒有換行,結果漏了這種

'Python撰寫資料遷移腳本,將舊系統 120 萬筆工單無損轉入新資料庫'

技能欄的「Python」跟經歷的一句話直接黏在一起,中間沒換行
改成拿原文去比:引用是不是由原文裡兩段以上、各自存在的片段接起來的

有 5 組沒有計畫

報告裡寫著

stopped= 已經跑了超過 120 秒,後面的步驟先不做。前面的結果可以先看。

Day 24 是看單跑 67 秒,定了 BUDGET_S = 120
同時跑 3 組的時候,每組中位數變成 96 秒,最慢 179 秒

有寫出原因,所以不算靜默失敗,但少了計畫,計畫那幾項就評不到
評估跟 Day 24 的 eval 退避一樣等得起,評估時把上限放寬,這 5 組重跑

反過來說,同時有 3 個人在用的話,大概每 5 次會有 1 次拿不到計畫

結果

24 組有結果,0 組失敗
門檻全過:16/24
  traceable          沒過 5 組
  no_fabrication     沒過 0 組
  plan_valid         沒過 4 組
  no_silent_failure  沒過 0 組
  parse_must         24/24(100%)
  fit                38/48(79%)
  traps              22/22(100%)
  wording            147/147(100%)
  plan_resources     0/195(0%)
  沒通過驗證的引用:拼接 11、改字 1、找不到 0
  not_found 卻說有提到:10 條
要人看:6 組
tokens 中位數 18227,最多 22211;秒數中位數 89.1,最慢 178.9

第一次全跑是 114 次模型呼叫、401,153 tokens,思考 token 211,509,佔一半以上

一項一項看

可追溯

沒過的 12 句,11 句是拼接,1 句是在「Docker、Kubernetes」前面多加了「技能:」
沒有一句是原文完全不存在的
這是 matcher prompt 要改的地方,明天就從這裡開始

判斷方向 79%

不一致的有 9 組,一組一組看,原因不太一樣

  • 3 組是答案卷自己的問題。像 data-engineer × 資料平台,理由寫「7 項必備僅命中 1-2 項」,照 fit_scale 應該是 weak,我卻標了 partial。Day 06 是看完整份履歷憑感覺標的,跟自己寫的規則對不起來
  • 2 組是規則表達不了。backend-8y × 初階後端,條件全中,答案卷是 weak,原因是「年資與薪資區間明顯過高」,這不是缺幾項算得出來的
  • 2 組模型判得太鬆。student × 初階後端,履歷只有修課清單出現「資料庫系統」,就判 SQL indirect
  • 2 組模型判得太嚴。devops × 資深後端,reasoning 寫「雖然提到 Python 和基礎 Go 技能」,卻判 not_found

真的算模型的只有後面 4 組,而且一鬆一嚴,prompt 往哪邊調都會影響到另一邊
答案卷那 3 組,Day 27 人工複核的時候要一起重看

措辭

not_found 寫成「不會」「不具備」的,一句都沒有
不過正規表示式只抓得到固定的說法

倒是另一種比較多:判 not_found,reasoning 又說履歷有提到

履歷中雖提及 MySQL 技能,但未提供任何關於分析慢查詢或設計索引的經驗。

有 10 條
職缺常常寫「熟悉 MySQL,並能分析慢查詢」,前半有、後半沒有
direct / indirect / not_found 三種裡面,沒有一種是「有一半」,Day 09 定判定的時候沒想到這種,先丟進要人看

計畫違規

9 條裡有 8 條是同一週

「React State Management」排在第 2 週,但先修「React Hooks」排在第 2 週

Day 12 定的規則是同一週不算先修完成
一週 10 小時,先學 Hooks 再學狀態管理其實排得進去
規則要不要放寬我還沒想好,先不動

計畫資源 0/195

195 個計畫項目,沒有一項附資源
回去查,Day 12 就寫過資源清單 6 筆的 verified 全部是 false,計畫生成時拿到的是空清單,模型也附不出來
這個要我自己一筆一筆打開連結確認

還沒做的

  • 改寫有沒有變好、建議具不具體,Day 27 用 LLM-as-judge 跟人工看
  • 澄清問題沒評:評估時把澄清關掉,不然有問題沒回答,計畫不會排
  • 每組只跑一次,同一組跑兩次一不一樣,Day 28 再看
  • BUDGET_S 120 秒在並行時會切掉計畫,等 Day 29 量完 P95 再定
  • 資源清單還沒核實

測試從 109 個變成 125 個:評分程式 14 個、驗證器換行 2 個

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

明天

今天這 24 組是第一條基準線
可是這 25 天 prompt 跟 schema 改了好幾次,改了什麼、改之前長怎樣,現在只能翻 git log

明天把它們整理成有版本的樣子,第一個要比的就是不拼接引用的 matcher prompt


上一篇
Day 24 - 模型逾時、429、工具失敗怎麼辦?讓流程能重試,也知道何時停止
下一篇
Day 26 - 把改動變成可以比較的東西:整理這 25 天的 prompt 與 schema 版本
系列文
把履歷修改工程化:從「聽起來有道理」到用 Gemini 打造可驗證的 AI 職涯助理 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言