🚀 快速安装

复制以下命令并运行,立即安装此 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.pyheadless=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 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。