用 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 |
技能分類
- language: Python, TypeScript, JavaScript
- framework: LangChain, Next.js, React
- technique: RAG, LLM, Microservices
- infrastructure: Docker, Kubernetes, AWS
- domain: CISSP, Product Management
核心演算法:遞迴技能展開
/**
* 取得技能的所有隱含技能(遞迴)
* 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: 每個技能都要呼叫 LLM 做 NLI 驗證
- After: 圖譜推斷的技能直接跳過 → 減少 API calls
準確度提升
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 |
未來展望
- 技能圖譜視覺化 - 用 Mermaid 或 D3.js 呈現技能網路
- 自動從 JD 學習 - 分析多份 JD,自動發現新技能關係
- 技能演化追蹤 - 記錄圖譜變更歷史
- 多人共享圖譜 - 開源一份通用的技能圖譜
結論
技能圖譜是一個簡單但有效的解決方案:
- 輕量 - 只需一個 JSON 檔案
- 智能 - LLM 輔助建立關係
- 可控 - 人工審核確保準確
- 實用 - 直接整合到現有系統
如果你也在建立履歷系統或職涯工具,不妨試試這個方法。