本文档是项目的唯一权威设计文档。所有实现必须以此为准;要改先改这里。
自动化管线持续抓取美国硕士项目的官网信息,用 LLM 做结构化抽取,带逐字段准确率评测和数据新鲜度监测,最终以可查询网站呈现。
做:
- 垂直:美国 CS/DS 方向硕士(MSCS / MSDS / MSIS / MEng-CS 等)
- 阶段一(pilot):10 所学校端到端跑通;阶段二:扩到 50–100 所(清单从 OpenCSApp 冷启动)
- 只抓学校官网可验证的客观信息
- 产出:爬取+抽取管线、逐字段 eval、定期重爬 + diff 监测、简单查询网站
不做(v1 明确排除):
- 录取案例、选校推荐、排名、论坛内容、文书相关
- BA 垂直(第二期,作为 vertical-agnostic 架构的验证)
- 用户系统 / 登录
设计约束:
- Schema 与管线必须 vertical-agnostic:新增垂直(如 BA)只应新增配置(项目清单),不改代码结构
- 记录粒度:一条记录 = 一个具体 program("CMU MSCS",不是"CMU")。同一大学不同学院的同类项目是不同记录(如 NYU Tandon vs Courant)
纳入(计算为核心的硕士学位):CS、DS/Analytics、AI/ML、软件工程、网络安全、信息系统/信息管理(IS/IM/MISM)、机器人/CV/NLP(含计算语言学)。
排除(v1 一律不收):
- 领域交叉型 DS 学位("X 领域 + Data Science"双域项目,如 Healthcare/Environmental/Public Policy/Spatial/Econ/Communication/Law + DS)
- HCI / 设计导向项目(MHCID、MSHCI、HCDE 等)
- Computer Engineering / EE 学科的学位(含 ECE 下的 ML 方向)。排除依据是学位学科而非开设院系:纳入学科的学位挂在 ECE 等院系下不受影响(例:CMU ECE 的 MS in Software Engineering 保留)
- 政策/战略/管理导向项目(如 CMU MITS);但 IS/IM 家族保留
- 属于更大学位下的 track / option / concentration,而非独立招生学位(如 UIUC MEng Autonomy 方向、UW-Madison Stats 的 DS option)
- 面向在职人群的非常规学位形态(MAS 等)
- 页面明示已停招的项目
- 非美国校区(含加拿大分校);UW 指西雅图主校区,Bothell/Tacoma 不在 pilot 内
粒度规则(修订):一条记录 = 一个独立招生的学位项目。校区/授课方式变体只有在"独立招生 + 有自己的官方页面"时才拆分(GT on-campus/OMSCS、UIUC MCS 三变体、Columbia 线上线下均符合)。多校区共用一次招生的(如 NEU Align),粒度保持 program,多校区问题记为已知限制、v2 处理。共享同一 URL 的两条记录必须核实"确为独立招生的两个学位"方可保留。
| 字段 | 类型 | 说明 |
|---|---|---|
school |
string | 学校名 |
program_name |
string | 项目名 |
degree_type |
enum | MS / MEng / MCS / MSc … |
department |
string | 所属学院/系 |
official_url |
url | 项目官网主页 |
location |
string | 保留官网使用的地名(如 Silicon Valley,不得换算为 San Jose);州信息仅在页面明示时保留;多校区以 ; 分隔;纯线上项目为 Online |
duration_months |
int 或 {min, max} |
标准时长;页面给区间时保留整数月区间 |
stem_designated |
bool | 是否 STEM |
total_credits |
int | 毕业学分 |
track_options |
enum | thesis / coursework / both / project |
deadlines |
array | round 用小写下划线;date 用 YYYY-MM-DD,原文无年份时用 MM-DD,滚动录取用 rolling |
application_fee |
object | 申请费;amount 为 number 或 {min, max},并带币种 |
tuition |
object | total 或 per_credit + 币种;amount 为 number 或 {min, max} |
toefl_min / ielts_min |
number | 语言最低分 |
gre_policy |
enum | required / optional / not_accepted |
gpa_min |
number | 若官方明示 |
prerequisites |
string[] | 先修要求 |
内容字段对象: {value, evidence, confidence, source_url}。source_url
是 evidence 所在页面;not_found 时 evidence 与 source_url 均为 null。身份字段
直接来自 seed,保留 source: "seed"、evidence 为 null,source_url 指向 seed
记录对应的项目主页。
scraped_at、extracted_at 与模型信息保留为记录级元数据。
设计原则:
- 能用枚举就不用自由文本——枚举才能精确算 eval 准确率
- 每个值可溯源——用户和 eval 随时能点回原网页核对
- 抽不到 ≠ 抽错。字段值允许
not_found,且 eval 中区分这两种情况 - 格式约束只规范已有事实,绝不能成为补出事实的理由;地点不得做地理别名换算,官网页脚、校区生活等位置出现的校区地名也可作为来源
Eval 归一规则:
- 文本比较忽略大小写与多余空白;
location按校区集合比较,pilot 所涉州的全名/缩写等价,同城一方缺州时仍可匹配,但双方都有州时必须一致 deadlines先解析日期并规范round词元,再一对一匹配(round, date);仅一方缺年份时按同月日匹配,部分条目匹配记为partial_correctprerequisites双方均有值但清单不一致时记为needs_adjudication,不直接计错且不进入 accuracy 分母;missed与hallucinated仍照常保留data/eval/adjudications.yaml中命中的(target_id, field)由 owner 裁决为correct,并以正交指标adjudicated单独计数
- 每轮刷新抓取全部已知主页与 aux 页面,继续遵守 robots.txt、同域限速、挑战识别和同日缓存。
- 页面变化以
clean_html后的正文文本 hash 判定,不能用原始 HTML hash;每份成功 snapshot 的 meta 同时保存 raw 与 clean hash。 - 页面按 URL 分为
unchanged、changed、new、gone;历史成功但本轮失败必须记为gone,不得静默丢失。 - 同一 URL 可属于多个项目;该页面变化时,所有关联项目都标为 dirty。
- dirty 项目用其当轮全部可用页面整项目重抽;unchanged 项目不调用 LLM,直接沿用最近结果。
- 展示分桶与最近一次历史快照比较;是否触发重抽则与最近一次已完成抽取所对应的快照比较,避免 dry-run 后页面不再变化时永久漏抽。Task 4b 已排除的本科 aux 仍可抓取和展示,但不触发重抽。
- 每轮生成字段级 JSON 与 Markdown diff,列出项目、字段、旧值、新值和新 evidence,并汇总页面、项目、字段变更数及 LLM 成本。
--dry-run只完成抓取与页面分桶,不调用 LLM,供 owner 先检查变化面;使用独立的.dry-run报告,不覆盖同日正式 diff。
难例(故意挑的):
- CMU — 一校多个相似项目(MSCS/MCDS/MSAII/MIIS…),考验 program 区分
- NYU — Tandon 与 Courant 两学院各有 CS 硕士,考验记录粒度
- Northeastern — 多校区 + Align 项目,信息结构混乱
- USC — 项目数量多
常规例: 5. Georgia Tech 6. UIUC 7. UW (University of Washington) 8. UCSD 9. Columbia 10. Wisconsin-Madison
- 10 所学校的全部目标 program 入库
- 逐字段抽取准确率有数字(对照人工核对的 ground truth;CS 垂直可借助 OpenCSApp 数据)
- 管线可重复执行:重跑能产出 diff 报告