🚀 快速安装
复制以下命令并运行,立即安装此 Skill:
npx skills add https://skills.sh/aradotso/trending-skills/karpathy-jobs-bls-visualizer
💡 提示:需要 Node.js 和 NPM
karpathy/jobs — BLS 就业市场可视化工具
技能由 ara.so 提供 — Daily 2026 Skills 系列。
一个研究工具,用于可视化探索美国劳工统计局 职业展望手册 中 342 个职业的数据。交互式矩形树图通过矩形面积表示就业规模,通过颜色表示所选指标:BLS 增长前景、中位薪资、教育要求或 LLM 评分的 AI 影响。整个数据流程完全可复现——编写新的提示词,重新运行评分,即可获得新的颜色图层。
在线演示: karpathy.ai/jobs
安装与设置
# 克隆仓库
git clone https://github.com/karpathy/jobs
cd jobs
# 安装依赖(使用 uv)
uv sync
uv run playwright install chromium
创建 .env 文件,填入您的 OpenRouter API 密钥(仅 LLM 评分时需要):
OPENROUTER_API_KEY=your_openrouter_key_here
完整流程 — 关键命令
按顺序运行以下命令以完成全新构建:
# 1. 抓取 BLS 页面(非无头 Playwright;BLS 会阻止机器人)
# 结果缓存在 html/ 目录中 — 只需运行一次
uv run python scrape.py
# 2. 将原始 HTML 转换为干净的 Markdown,保存到 pages/
uv run python process.py
# 3. 提取结构化字段 → occupations.csv
uv run python make_csv.py
# 4. 通过 LLM 评分 AI 影响(使用 OpenRouter API,保存 scores.json)
uv run python score.py
# 5. 合并 CSV + 评分 → site/data.json,供前端使用
uv run python build_site_data.py
# 6. 在本地启动可视化服务
cd site && python -m http.server 8000
# 打开浏览器访问 http://localhost:8000
关键文件参考
| 文件 | 描述 |
|---|---|
occupations.json |
342 个职业的主列表(名称、URL、类别、slug) |
occupations.csv |
汇总统计:薪资、教育程度、就业人数、增长预测 |
scores.json |
所有 342 个职业的 AI 影响评分(0–10)及理由 |
prompt.md |
将所有数据打包成一个约 45K token 的文件,可粘贴到 LLM 中使用 |
html/ |
从 BLS 抓取的原始 HTML 页面(约 40MB,是数据源头) |
pages/ |
每个职业页面的干净 Markdown 版本 |
site/index.html |
矩形树图可视化(单个 HTML 文件) |
site/data.json |
前端使用的紧凑合并数据 |
score.py |
LLM 评分流程 — 修改此文件以编写自定义提示词 |
编写自定义 LLM 评分层
最强大的功能:编写任意评分提示词,运行 score.py,即可获得新的树图颜色图层。
1. 编辑 score.py 中的提示词
# score.py(简化结构)
SYSTEM_PROMPT = """
你正在评估未来 10 年内各职业受类人机器人影响的程度。
为每个职业打出 0 到 10 分:
- 0 = 无显著影响(例如,需要精细社交判断、非体力劳动)
- 5 = 中等影响(部分任务可自动化,但人类仍为核心)
- 10 = 高影响(重复性体力任务、可预测环境)
考虑因素:体力任务复杂性、环境可预测性、灵巧性要求、
机器人与人类成本对比、监管障碍。
仅以 JSON 格式回复:{"score": <0-10的整数>, "rationale": "<1-2句话>"}
"""
2. 运行评分流程
# 流程会读取 pages/ 中每个职业的 Markdown 内容,
# 发送给 LLM,并将结果写入 scores.json
# scores.json 结构:
{
"software-developers": {
"score": 1,
"rationale": "软件开发是数字化和认知型工作;人形机器人无法提供优势。"
},
"construction-laborers": {
"score": 7,
"rationale": "体力型、重复性的户外工作是人形机器人的目标,但非结构化环境仍有挑战。"
}
// ... 共 342 个职业
}
3. 重建站点数据
uv run python build_site_data.py
cd site && python -m http.server 8000
数据结构
occupations.json 条目
{
"title": "Software Developers",
"url": "https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm",
"category": "Computer and Information Technology",
"slug": "software-developers"
}
occupations.csv 列
slug, title, category, median_pay, education, job_count, growth_percent, growth_outlook
示例行:
software-developers, Software Developers, Computer and Information Technology,
130160, Bachelor's degree, 1847900, 17, Much faster than average
site/data.json 条目(合并后的前端数据)
{
"slug": "software-developers",
"title": "Software Developers",
"category": "Computer and Information Technology",
"median_pay": 130160,
"education": "Bachelor's degree",
"job_count": 1847900,
"growth_percent": 17,
"growth_outlook": "Much faster than average",
"ai_score": 9,
"ai_rationale": "AI 正在深刻改变软件开发工作流程..."
}
前端树图(site/index.html)
可视化是一个使用 D3.js 的独立 HTML 文件。
颜色图层(在 UI 中切换)
| 图层 | 显示内容 |
|---|---|
| BLS Outlook | BLS 预测增长类别(绿色 = 快速增长) |
| Median Pay | 年薪中位数(颜色渐变) |
| Education | 所需最低教育程度 |
| Digital AI Exposure | LLM 评分的 0–10 AI 影响估计 |
向前端添加新的颜色图层
<!-- 在 site/index.html 中,找到图层切换按钮 -->
<button onclick="setLayer('ai_score')">Digital AI Exposure</button>
<!-- 添加您的新图层按钮 -->
<button onclick="setLayer('robotics_score')">Humanoid Robotics</button>
// 在 getColor 函数中,为您的新字段添加 case:
function getColor(d, layer) {
if (layer === 'robotics_score') {
// 评分范围 0-10,蓝色 = 低影响,红色 = 高影响
return d3.interpolateRdYlBu(1 - d.robotics_score / 10);
}
// ... 现有 cases
}
然后更新 build_site_data.py,将您的新评分字段包含在 data.json 中。
生成 LLM 就绪的提示文件
将 342 个职业及汇总统计数据打包成一个文件,用于 LLM 对话:
uv run python make_prompt.py
# 生成 prompt.md(约 45K tokens)
# 粘贴到 Claude、GPT-4、Gemini 等模型中,进行数据驱动的对话
抓取说明
BLS 会阻止自动化机器人,因此 scrape.py 使用非无头 Playwright(可见的真实浏览器窗口):
# scrape.py 关键行为
browser = await p.chromium.launch(headless=False) # 必须可见
# 页面保存到 html/<slug>.html
# 已抓取的页面会被跳过(缓存)
如果抓取失败或遇到速率限制:
- 仓库中的
html/目录已包含缓存的页面 - 您可以完全跳过抓取,直接从
process.py开始运行 - 如需重新抓取,在请求之间添加延迟以避免被阻止
常见模式
仅对缺失的职业重新评分
import json, os
with open("scores.json") as f:
existing = json.load(f)
with open("occupations.json") as f:
all_occupations = json.load(f)
# 查找缺失项
missing = [o for o in all_occupations if o["slug"] not in existing]
print(f"缺失评分:{len(missing)}")
# 然后运行 score.py,并过滤仅处理缺失的 slug
手动解析单个职业页面
from parse_detail import parse_occupation_page
from pathlib import Path
html = Path("html/software-developers.html").read_text()
data = parse_occupation_page(html)
print(data["median_pay"]) # 例如 130160
print(data["job_count"]) # 例如 1847900
print(data["growth_outlook"]) # 例如 "Much faster than average"
加载并查询 occupations.csv
import pandas as pd
df = pd.read_csv("occupations.csv")
# 薪资最高的 10 个职业
top_pay = df.nlargest(10, "median_pay")[["title", "median_pay", "growth_outlook"]]
print(top_pay)
# 筛选:高增长 + 高薪资
high_value = df[
(df["growth_percent"] > 10) &
(df["median_pay"] > 80000)
].sort_values("median_pay", ascending=False)
将 CSV 与 AI 评分合并进行分析
import pandas as pd, json
df = pd.read_csv("occupations.csv")
with open("scores.json") as f:
scores = json.load(f)
df["ai_score"] = df["slug"].map(lambda s: scores.get(s, {}).get("score"))
df["ai_rationale"] = df["slug"].map(lambda s: scores.get(s, {}).get("rationale"))
# 高 AI 影响、高薪资——这是重塑,而非消失
high_exposure_high_pay = df[
(df["ai_score"] >= 8) &
(df["median_pay"] > 100000)
][["title", "median_pay", "ai_score", "growth_outlook"]]
print(high_exposure_high_pay)
故障排除
playwright install 失败
uv run playwright install --with-deps chromium
BLS 抓取被阻止 / 返回空白页面
- 确保
scrape.py中headless=False(已是默认值) - 添加手动延迟;不要在 CI 中运行
- 可直接使用仓库中缓存的
html/目录
score.py OpenRouter 错误
- 确认
.env中已设置OPENROUTER_API_KEY - 检查您的 OpenRouter 账户是否有额度
- 默认模型是 Gemini Flash — 在
score.py中更改model以使用不同的 LLM
重新评分后 site/data.json 未更新
# 更改 scores.json 后始终重建站点数据
uv run python build_site_data.py
树图显示空白 / 无数据
- 确认
site/data.json存在且为有效 JSON - 使用
python -m http.server提供服务(不要用file://协议 — CORS 会阻止本地 JSON 获取) - 检查浏览器控制台是否有获取错误
重要注意事项(来自项目)
- AI 影响 ≠ 职业消失。 9/10 分意味着 AI 正在重塑这项工作,而非消除需求。软件开发人员得分为 9/10,但需求仍在增长。
- 评分是大致的 LLM 估计(通过 OpenRouter 使用 Gemini Flash),并非严谨的经济预测。
- 该工具未考虑需求弹性、潜在需求、监管障碍或人们对人类员工的偏好。
- 这是一个开发/研究工具,不是经济出版物。
📄 原始文档
完整文档(英文):
https://skills.sh/aradotso/trending-skills/karpathy-jobs-bls-visualizer
💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

评论(0)