Ian Chou's Blog

教練循環:用 STAR 法把經驗變成履歷素材

教練循環:用 STAR 法把經驗變成履歷素材

技能驗證找出 MISSING/WEAK 後,不是丟給使用者自己補,而是用「教練式提問」逐步引導,把碎片化的工作記憶轉成結構化、可重用的履歷素材。本文分享教練循環的設計理念與實作細節。

問題:「你有 Kubernetes 經驗嗎?」

問這種問題只會得到兩種回答:

  1. 「有」 - 然後呢?寫什麼進履歷?
  2. 「沒有」 - 真的沒有嗎?還是只是沒想到怎麼表達?

真正的問題是:人們不擅長把工作經驗轉成履歷語言。

解決方案:STAR 結構化提問

STAR 是面試答題的經典框架,反過來用在提問也很有效:

S - Situation (情境)
    「在什麼專案或情境下你用過這個技能?」

T - Task (任務)
    「你被指派的具體任務是什麼?」

A - Action (行動)
    「你具體做了什麼來解決問題?」

R - Result (結果)
    「最終成果是什麼?有量化數據嗎?」

這四個問題逐步深挖,把模糊的「我有經驗」變成清晰的「我在 X 情境下,負責 Y,做了 Z,達成 W%」。

實作架構

verify → 發現 MISSING
           ↓
       coach CLI
           ↓
┌─────────────────────────────┐
│ 教練循環 (Coach Loop)       │
│                             │
│ Round 1: Situation 提問     │
│        → 使用者回答         │
│ Round 2: Task 提問          │
│        → 使用者回答         │
│ Round 3: Action 提問        │
│        → 使用者回答         │
│ Round 4: Result 提問        │
│        → 使用者回答         │
│                             │
│ 每 2 輪嘗試提取 bullet      │
│ 信心度 >= 70% → 入庫        │
└─────────────────────────────┘
           ↓
       ingest 入庫
           ↓
       關聯回 JD (created_from_jd)

CLI 使用

uv run career-kb coach --skill "Kubernetes" --jd-id "abc123"

輸出範例:

╭─────────── Step 4: 教練循環 ───────────╮
│ 教練式提問: Kubernetes                 │
│                                        │
│ 我會問一系列問題,幫你把真實經驗轉成   │
│ 可用的履歷素材。                       │
│ 如果真的沒有相關經驗,輸入 'skip'。    │
╰────────────────────────────────────────╯

問題 1 (SITUATION):
  在什麼專案或情境下你用過 Kubernetes?

你的回答: 在 ABC 公司的微服務專案...

問題 2 (TASK):
  你被指派的具體任務是什麼?

你的回答: 負責把 10 個服務從 VM 遷移到 K8s...

───────────────────────────────────────────

提取的素材:
╭─────────────────────────────────────────╮
│ Led Kubernetes migration of 10         │
│ microservices from VM to K8s clusters, │
│ reducing deployment time by 80% and    │
│ improving system reliability to 99.9%. │
╰─────────────────────────────────────────╯

技能標籤: Kubernetes, Docker, DevOps
角色層級: Lead
影響等級: 4/5
信心度: 85%

這個素材看起來足夠完整嗎? [Y/n]: y

✓ 已入庫: a1b2c3d4-5678-...
狀態: MISSING → 待驗證 (下次 verify 會確認 COVERED)

回答→素材轉換

LLM Prompt 設計

prompt = f"""Convert this user response into a professional resume bullet point.

Skill being demonstrated: {skill}
JD Context: {jd_context}

User's raw response:
{user_response}

Requirements:
1. Write in action-verb format (Led, Built, Designed, etc.)
2. Include specific numbers/metrics if mentioned
3. Keep it to 1-2 sentences max
4. Extract relevant skill tags
5. Determine role level (IC/Lead/Manager)
6. Rate impact level 1-5

Return JSON:
{
    "bullet": "The formatted bullet point",
    "skills": ["skill1", "skill2"],
    "role_level": "IC|Lead|Manager",
    "impact_level": 1-5,
    "star_components": {...},
    "confidence": 0.0-1.0
}"""

信心度門檻

信心度 處理方式
>= 0.7 可以入庫,詢問確認
0.5-0.7 繼續提問補充細節
< 0.5 需要更多上下文

三層備案策略

Fallback 1: 可遷移技能搜尋

當用戶輸入 skip

沒有直接經驗?讓我們找找可遷移技能...

建議搜尋:
  → career-kb search --focus "container orchestration deployment experience"

用 LLM 生成相關搜尋詞,從既有素材中找可以「對齊」的經驗。

Fallback 2: 策略性省略

strategy.py 中已處理。非核心技能直接標記為 STRATEGIC_IGNORE,不進入教練循環。

Fallback 3: 學習聲明

如果真的沒有經驗,但這是核心技能:

你正在學習這個技能嗎? [Y/n]: y
請描述學習來源 (課程/專案/自學): 正在 Udemy 上完成 K8s 認證課程

學習聲明 (Fallback 3):
╭─────────────────────────────────────────╮
│ Actively pursuing Kubernetes expertise │
│ through hands-on certification program │
│ (Udemy CKA), with lab exercises in     │
│ multi-node cluster deployment.         │
╰─────────────────────────────────────────╯

要把這個學習聲明入庫嗎? [Y/n]: y
✓ 已入庫: xyz789...

為什麼學習聲明有效?

  1. 誠實 - 不假裝有經驗
  2. 具體 - 說明學習來源和進度
  3. 可驗證 - 面試官可以追問
  4. 展現主動性 - 知道缺口並在補

為什麼每次回答後要 ingest

1. 長期資產累積

每次教練循環產出的素材不是用完就丟,而是:

今天準備 Google PM 職位 → 產出 3 個 bullet
明天準備 Meta PM 職位 → 搜尋發現有可用素材
                      → 只需補 1 個新 bullet

2. 去重保護

入庫時會做精確去重和相似去重:

# 精確去重:同一句不重存
if text_hash matches:
    return existing_id

# 相似去重:語意相近的標記為變體
if cosine >= 0.94 and skills_overlap >= 0.5:
    record["parent_id"] = similar_id
    record["status"] = "pending_review"

3. JD 關聯追蹤

record["created_from_jd"] = jd_id

這讓你知道每個素材是從哪個 JD 的教練循環產出的。

與其他步驟的銜接

Step 1: save-jd     → 取得 jd_id
Step 2: verify      → 找出 MISSING/WEAK
Step 3: (search)    → 找現有素材
Step 4: coach       → 挖掘新經驗入庫 ← 本文重點
Step 5: generate    → 生成履歷
Step 6: ingest      → 回寫優質內容

教練循環是一個增量學習的過程:每次準備新職位,你的素材庫都會變得更豐富。

實務建議

1. 先 verify 再 coach

不要盲目開始教練循環。先用 verify --with-strategy 看哪些是「核心 MISSING」,只針對那些做 coach。

2. 準備好具體數字

教練提問時,LLM 會特別追問量化數據:

3. 不要美化

教練循環的目標是提取真實經驗,不是編造。如果真的沒做過:

  1. 用 Fallback 1 找可遷移技能
  2. 用 Fallback 3 寫學習聲明
  3. 或者接受 Strategic Ignore

面試時被問穿比履歷有缺口更糟。

4. 每輪檢查提取結果

當信心度 >= 70% 時,系統會問「這個素材看起來足夠完整嗎?」

進階擴展

批次教練

對 MISSING 列表一次處理:

# 未來可能的 API
coach --jd-id "abc123" --skills "all-missing"

對話歷史

保存教練對話,讓後續 round 更精準:

previous_responses = ["Round 1 回答", "Round 2 回答"]
question = generate_coaching_question(
    skill, 
    previous_responses=previous_responses
)

素材品質評分

入庫後定期評估素材被使用次數和轉換率:

SELECT id, text, 
       array_length(used_in_jobs) as usage_count
FROM resume_chunks
WHERE created_from_jd IS NOT NULL
ORDER BY usage_count DESC

總結

環節 功能
STAR 提問 結構化挖掘碎片記憶
LLM 轉換 自然語言 → 履歷格式
信心度門檻 確保素材品質
即時入庫 建立長期資產
三層備案 處理「真的沒經驗」

教練循環把「你有經驗嗎」這個無效問題,變成一系列精準的 STAR 提問,最終產出可重用的履歷素材。


Career Knowledge Base 是一個本地優先的履歷知識庫系統,使用 Python + LanceDB + Voyage AI 建構。