Ian Chou's Blog

用 LLM 建立職涯技能圖譜:讓 AI 理解你的隱含能力

用 LLM 建立職涯技能圖譜:讓 AI 理解你的隱含能力

前言:履歷系統的痛點

在建立 Career MCP Server 的過程中,我遇到一個有趣的問題:

當 JD 要求 "Python",但我的履歷只提到 "LangChain",系統會判斷我缺少 Python 技能。

但這顯然不對 — 會 LangChain 的人一定會 Python,這是前置技能。

傳統做法是:手動在每個素材上標記所有相關技能。但這很繁瑣,而且當技能標籤上百個時,很難維護一致性。

於是我想到:能不能用「技能圖譜」來自動推斷隱含技能?


設計理念:輕量但有效

在研究了 Neo4j 等圖資料庫後,我決定走一條更簡單的路:

方案 優點 缺點
Neo4j 強大的圖查詢、視覺化 部署複雜、學習曲線高
JSON 圖譜 零依賴、Git 友好、輕量 不支援複雜圖查詢

對於單人履歷系統,JSON 圖譜完全夠用。而且最關鍵的是:可以用 LLM 來輔助建立技能關係


資料結構設計

{
  "version": "1.0.0",
  "skills": {
    "LangChain": {
      "category": "framework",
      "implies": ["Python", "LLM", "Prompt Engineering"],
      "relatedTo": ["RAG", "AI Agent", "OpenAI API"]
    },
    "Next.js": {
      "category": "framework", 
      "implies": ["React", "TypeScript", "JavaScript"],
      "relatedTo": ["Vercel", "SSR", "Full-stack"]
    }
  }
}

關係類型

關係 意義 例子
implies 前置技能(會 A 必會 B) LangChain → Python
impliedBy 反向關係(自動維護) Python ← LangChain
relatedTo 相關但非必要 LangChain ↔ RAG

技能分類


核心演算法:遞迴技能展開

/**
 * 取得技能的所有隱含技能(遞迴)
 * LangChain → [Python, LLM, Prompt Engineering, AI, Machine Learning]
 */
export function getImpliedSkills(
  skill: string, 
  visited: Set<string> = new Set()
): string[] {
  if (visited.has(skill)) return []; // 防止循環
  visited.add(skill);
  
  const node = graph.skills[skill];
  if (!node?.implies) return [];
  
  const implied = [...node.implies];
  
  // 遞迴展開
  for (const impliedSkill of node.implies) {
    implied.push(...getImpliedSkills(impliedSkill, visited));
  }
  
  return [...new Set(implied)]; // 去重
}

實際效果

Input:  [LangChain, Next.js]
Output: [LangChain, Next.js, Python, LLM, Prompt Engineering, 
         AI, Machine Learning, React, TypeScript, JavaScript]

(2 技能 → 10 技能)

LLM 輔助:自動建議技能關係

手動建立所有技能關係太累了。於是我用 Gemini 2.0 Flash 來輔助:

const { object } = await generateObject({
  model: google("grok-4-1-fast-reasoning"),
  schema: SkillSuggestionSchema,
  prompt: `分析技能 "${skillName}" 的關係:
    1. 屬於什麼類別?
    2. 隱含哪些前置技能?
    3. 與哪些技能相關?`,
});

互動流程

$ bun run skill-graph suggest "GraphQL"

🤖 Asking LLM to suggest relationships for "GraphQL"...

📋 LLM Suggestion:
   Category: framework
   Implies: API Design
   Related to: JavaScript, Node.js, React, Apollo

Accept this suggestion? (y/n/edit): y

✅ Added "GraphQL" to skill graph!

人在迴圈 (Human-in-the-loop):LLM 負責建議,人負責審核確認。這樣既有效率,又保證準確性。


整合到 MCP Server

最關鍵的是把技能圖譜整合到現有的 verify_skill_coverage tool:

// 在驗證前,先用技能圖譜做預處理
const graphResult = checkSkillGraph(skillsToVerify, possessedSkills);

for (const skill of skillsToVerify) {
  // Fast path: 如果技能圖譜說是 implied,直接跳過 LLM 驗證
  if (graphResult.implied.includes(skill)) {
    results.push({
      skill,
      status: "IMPLIED",
      evidence: "[Inferred from Skill Graph]"
    });
    continue;
  }
  
  // 否則用 NLI 驗證
  const verdict = await evaluateWithLLM(skill, materials);
  // ...
}

效能提升

準確度提升

Before (無技能圖譜):
  Required: [Python, LLM, React]
  Possessed: [LangChain, Next.js]
  Result: Missing 3 skills ❌

After (有技能圖譜):
  Required: [Python, LLM, React]  
  Possessed: [LangChain, Next.js]
  Result: All skills implied ✅

CLI 工具一覽

# 查看所有技能
bun run skill-graph list

# 顯示特定技能的關係
bun run skill-graph show LangChain

# 統計圖譜狀態
bun run skill-graph stats

# 擴展技能列表
bun run skill-graph expand "LangChain,Next.js"

# 檢查覆蓋情況
bun run skill-graph coverage "Python,LLM,React" "LangChain"

# LLM 建議新技能
bun run skill-graph suggest "Kubernetes"

技術棧

元件 技術
Runtime Bun + TypeScript
LLM Gemini 2.0 Flash (via Vercel AI SDK)
Schema 驗證 Zod
圖譜儲存 JSON 檔案
MCP 整合 @modelcontextprotocol/sdk

未來展望

  1. 技能圖譜視覺化 - 用 Mermaid 或 D3.js 呈現技能網路
  2. 自動從 JD 學習 - 分析多份 JD,自動發現新技能關係
  3. 技能演化追蹤 - 記錄圖譜變更歷史
  4. 多人共享圖譜 - 開源一份通用的技能圖譜

結論

技能圖譜是一個簡單但有效的解決方案:

  1. 輕量 - 只需一個 JSON 檔案
  2. 智能 - LLM 輔助建立關係
  3. 可控 - 人工審核確保準確
  4. 實用 - 直接整合到現有系統

如果你也在建立履歷系統或職涯工具,不妨試試這個方法。


相關連結