Recap: 昨天把職缺要求一條一條對回履歷,每一條都附原文
有了證據之後,就可以開始做大家最常叫 AI 做的事:改寫履歷
但這也是整個系列我最在意的一篇
因為一個會幫你編經歷的工具,比甚麼都不做的工具還危險,它產出來的東西看起來就能直接用
Day 04 第一次跑分析,模型給了三點建議:量化成果、補充細節、加上摘要
每一點都對,但每一點都可以原封不動拿去給任何一份四年經驗的工程師履歷
更要注意的是它建議的寫法
「導入CI/CD,使部署時間縮短30%」
「調整資料庫結構,提升核心查詢效率20%」
這兩個數字,履歷裡面完全沒有
模型好像把它當作示範格式給的
但你可以想像一個急著投履歷的人會怎麼處理這兩行
複製、貼上、送出
我要的不只是一個會隨便給數字的工具
是一個會問你「那個 30% 你有嗎 ?」的工具
改寫的 prompt 放了幾條硬約束
1. 只能重組、聚焦、強化履歷中既有的事實。
2. 不得新增任何原文沒有的內容 —— 包含數字、百分比、技術名詞、職責範圍、團隊規模。
3. 特別注意:不要為了「讓它看起來更有說服力」而加上任何數字。
如果你認為某處加上數字會更好,不要自己編一個,也不要用「約」「大約」帶過。
請把它寫成 ask_user,內容是你要問使用者的問題。
4. original 欄位必須是履歷中的原句,一字不差地複製。
重點在第 3 條
模型覺得這裡該有數字,這個判斷本身沒錯,錯的是它自己去填答案
所以給它一個出口:ask_user,把「我覺得這裡該有數字」變成一個問題丟回給使用者
每一條輸出長這樣
class RewriteItem(BaseModel):
# --- 模型填 ---
original: str # 履歷原句
rewritten: str # 改寫後
ask_user: str | None
# --- 程式驗證後補上 ---
source_verified: bool | None = None
invented_numbers: list[str] = []
verification_note: str | None = None
跟昨天一樣,模型填一半,程式驗一半
prompt 寫了不准編,不代表它不會編
所以每一條改寫都過兩道檢查
第一道:original 真的是履歷的句子嗎
直接用昨天做的引用驗證
如果模型改寫的「原句」根本不在履歷裡,那這條改寫就沒有根據
第二道:改寫後多出來的數字
把 original 跟 rewritten 裡的數字都抓出來,改寫後有、原文沒有的,就當成捏造
# 抓阿拉伯數字、百分比、倍數。中文數字先不處理,誤判成本高於漏判。
_NUMBER = re.compile(r"\d+(?:[.,]\d+)*\s*%?")
src_numbers = set(_numbers(item.original))
item.invented_numbers = [n for n in _numbers(item.rewritten) if n not in src_numbers]
拿 Day 04 那句來測
item = _run(
"建置內部部署流程,導入 CI/CD,團隊五人",
"導入 CI/CD,使部署時間縮短 30%",
)
assert item.invented_numbers == ["30%"]
assert not item.safe
抓到了,這條會被標成不安全,畫面上不會讓它看起來像可以直接用的建議
履歷用四年後端那份,就是 Day 06 標成 vague 的那份
通篇都是「負責開發」、「協助處理」,特別容易讓模型腦補
職缺用資深後端
結果 9 條改寫,程式擋掉 0 條
沒有編數字,9 條的原句也都驗證得到
而且 ask_user 真的有在用,4 條附了問題,像是
問:您通常處理哪些類型的線上問題?有無降低問題發生率的具體成果?
它想要數字,但這次是用問的,不是自己填
這個部分我覺得是今天做對的地方
然後仔細看改寫的內容
| 原句 | 改寫 |
|---|---|
| 負責公司產品的系統開發與維護 | 負責核心產品系統的開發與維護工作,確保服務穩定運行。 |
| 參與系統改版相關工作 | 參與核心系統的架構改版與優化工作。 |
| 負責網站後端功能開發 | 負責網站平台的後端功能開發,包含新功能實作與既有模組優化。 |
| 協助資料處理相關作業 | 協助處理與優化核心資料作業,確保資料一致性與處理效率。 |
| 參與內部系統的開發工作 | 參與內部業務系統的開發與實作,提升營運效率。 |
| 協助日常維運事務 | 協助執行系統的日常維運與監控,確保系統穩定運行。 |
粗體的部分,原文都沒有
「系統改版」變成「架構改版」,「公司產品」變成「核心產品」
履歷裡沒有任何一個字說他做過監控、做過優化、提升過營運效率
沒有一個數字,但每一條都比原文厲害一點
這就是標題說的,編得更厲害
這次程式擋掉 0 條,不是因為改寫都沒問題
回頭看自己寫的測試,其實早就有一個例子
def test_faithful_rewrite_passes():
item = _run(
"建置內部部署流程,導入 CI/CD,團隊五人",
"主導五人團隊建置內部部署流程並導入 CI/CD",
)
assert item.safe
原文是「團隊五人」,改寫變成「主導五人團隊」
原文只說團隊有五個人,沒說是他帶的
我當初把這個當成「忠實改寫」寫進測試,現在回頭看,這條不該過
數字好抓,因為它就是一個 token,有就是有,沒有就是沒有
但「主導」、「優化」、「確保」、「核心」這種詞,用字串比對抓不到
要判斷「參與」變成「主導」算不算誇大,需要懂意思
schema 裡其實預留了 invented_terms 欄位,但目前沒有任何程式在填它
另外中文數字也還沒處理,「團隊五人」改成「團隊八人」現在會直接過
這幾個先記下來
Day 25 做評估規準的時候,「有沒有加料」會是其中一個人工評分項目,到時候再看這批改寫能拿幾分
這次跑了 25.6 秒、5699 tokens,其中 3773 個是思考 token
版本:google-genai 2.22.0、pydantic 2.13.5、gemini-2.5-flash
今天改寫給了 4 個 ask_user 問題,昨天的對照也留下了一堆 not_found,而 not_found 不等於不會
這些問題現在只是列在結果裡,沒有人回答
明天把它做成一個流程:先問清楚,再下結論