CareerNexus 职联:岗位能力图谱构建与动态演化分析平台(挑战杯 XH-202621)

- 全链路:多源JD接入/清洗交叉验证/结构化抽取(星火+离线双通道)/时序知识图谱/新岗位发现/演化分析/人岗匹配/学习路径
- WebUI 五视图:驾驶舱/图谱工作台/岗位演化/匹配(单人+批量)/学习路径
- 设置中心(config.json)/Token鉴权/SQLite状态库/语义向量通道(BGE-M3本地或联网API)
- 71 个 pytest 用例;数据目录仅保留结构(.gitkeep),数据由 scripts/generate_dataset.py 复现
This commit is contained in:
RoyirinRosmontis
2026-08-03 13:15:35 +08:00
commit a10442d78c
78 changed files with 12860 additions and 0 deletions
+749
View File
@@ -0,0 +1,749 @@
# CareerNexus 职联
## 多源异构数据驱动的岗位能力图谱构建与动态演化分析平台 —— 项目方案
> 赛题编号:XH-202621(多源异构数据驱动岗位和能力图谱构建与动态演化分析研究)
> 发榜单位:科大讯飞股份有限公司
> 方案版本:v3.0(生产实现版)
> 配套交付:可运行生产代码工程 `CareerNexus/` + 自备数据集 `CareerNexus/data/` + 本方案文档
---
## 一、项目背景与赛题理解
### 1.1 宏观背景:从"人口红利"到"人才红利"的结构性矛盾
当前国家正处于从"人口红利"向"人才红利"转型的关键期。随着"新质生产力"概念的提出、"人工智能+"行动的深入实施以及数字经济的蓬勃发展,以人工智能、大数据、智能系统、物联网为代表的新一代信息技术领域,正成为数字经济与产业升级的核心引擎。然而,数字经济的发展使得技术迭代速度远超人才培养周期,劳动力市场出现了严重的**结构性矛盾**:
- **企业侧**:新兴岗位上"招不到合适的人",JD 写法五花八门、互相抄袭、要求通胀,人岗匹配度低,招聘与培养成本居高不下;
- **人才侧**:以新兴领域青年、新就业形态劳动者为代表的群体,职业发展路径模糊、技能需求动态性强,"不知道该学什么、按什么顺序学";
- **高校侧**:培养方案更新周期以年计,远慢于产业技能变化速度,就业指导缺少实时产业数据支撑。
传统的人才盘点与招聘手段多依赖关键词匹配,缺乏对技术趋势的实时感知能力,无法回答"技术 A 的爆发会导致新兴岗位 B 产生哪些新技能需求"这一**动态关联**问题。
### 1.2 技术机遇:为什么是现在
三个独立的时间窗口在此刻交汇,使"自我进化的人才能力大脑"从设想变为可工程实现的系统:
1. **大模型语义理解成熟**:大模型具备了从非结构化 JD 文本中稳定抽取岗位要素的能力,JSON 模式 + Schema 校验使结构化输出的格式错误率趋近于零;
2. **知识图谱工程化成熟**:图数据库对复杂关系的结构化表达能力、时序属性的原生支持,使"岗位—技能"关系的动态演化可以被精确表达与回溯;
3. **多源数据融合与交叉验证技术成熟**:近重复检测、时间衰减、多源投票等机制,为防控 AI 生成内容"幻觉"提供了可量化、可工程落地的手段。
### 1.3 赛题理解(XH-202621 答题要求逐条解构)
发榜单位聚焦"数据驱动 + 大模型 + 知识图谱"核心技术方向,提出三大核心难题:
| 赛题难题 | 本质要求 | 本方案应答章节 |
|---|---|---|
| 如何从海量多源数据中精准发现并定义新兴岗位、更新既有岗位能力要求,构建可动态更新的岗位能力图谱 | 图谱构建 + 动态演化 | 第五、六、七章 |
| 如何解决招聘数据的"时滞""噪声"与"抄袭"问题,防控 AI 生成内容"幻觉" | 数据治理 + 幻觉防控 | 第四、六章 |
| 如何实现高精度的简历解析与细粒度人岗差距分析 | 匹配引擎 + 应用闭环 | 第八章 |
赛题的四项核心功能要求与可验证性要求,本方案的响应如下(详细自评见第十二章):
| 赛题要求 | 硬性指标 | 本方案响应 |
|---|---|---|
| ① 新岗位发现与定义 | 生成岗位名称、核心职责、必备技能、加分技能、典型行业应用场景,支持人工优化与动态更新 | "先聚类、后生成、人确认"三段式管线(第七章) |
| ② 既有岗位能力动态更新 | 识别能力变化,提供更新说明及数据源,明确标注增/删/改能力项 | 时序知识图谱 + 季度窗口对比 + 证据链更新说明(第六章) |
| ③ 新一代信息技术岗位全景图谱 | 技能点粒度,按技术栈和级别切换视图 | 四类节点、四类关系的图谱模型 + 交互式可视化(第五、十章) |
| ④ 人岗匹配度诊断与差距分析 | 支持 PDF/Word 简历解析,技能提取准确率 ≥90%,多维匹配,学习路径规划 | 两级匹配引擎 + 四维加权评分 + 拓扑排序学习路径(第八章) |
| 可验证性 | ≥100 条 JD 测试集;JD 解析、简历提取、人岗匹配准确率均 ≥90%;单测覆盖率 ≥60% | 自备 120 条测试集 + 一键指标复现脚本(第四、九章) |
| 提交形式 | 设计实现方案、PPT、演示视频、源代码、Dockerfile、单元测试 | 本方案 + `CareerNexus/` 工程全套(第十一、十三章) |
### 1.4 项目定位
CareerNexus 职联**不是**通用招聘网站,而是连接产业岗位变化与人才培养的**岗位能力基础设施**。平台把分散、肮脏、滞后的招聘需求数据,转化为**带时间属性、带证据来源、可被回溯和审计**的岗位—技能图谱,向上支撑三类用户(学生、高校、企业)的四类应用(岗位探索、简历诊断、学习路径、趋势看板),形成"数据接入—岗位发现—能力演化—精准匹配—人才培养"的完整闭环。
---
## 二、总体方案设计
### 2.1 设计原则
本方案在工程上遵循五条原则,它们同时构成本作品区别于常规参赛作品的底色:
1. **离线优先(Offline-First)**:全部核心功能不依赖任何外部 API 与网络即可运行。大模型是加速器而非单点依赖——无密钥时系统自动降级到离线确定性抽取器,演示永不中断。这直接回应了竞赛现场"断网、无密钥、环境干净"的最苛刻条件。
2. **证据即数据(Evidence-as-Data)**:图谱中的每一条岗位—技能关系都携带来源 JD 引用与生效时间区间;系统生成的每一句结论都能回溯到原始证据。"可追溯"不是口号,而是数据模型的一部分。
3. **人在环路(Human-in-the-Loop)**:模型负责批量处理,人负责确认边界。候选岗位与低置信结论进入审核台,接受/修改/驳回全程留痕,低置信结果永不直接污染正式图谱。
4. **确定性可复现(Reproducible)**:数据集生成、指标评测、演示快照全部以固定随机种子与固化提示词版本保证可复现,评审在任何干净机器上都能得到相同结果。
5. **最小依赖(Minimal Dependencies)**:核心算法(MinHash LSH、TF-IDF、聚类、时序图谱、匹配评分)全部以纯 Python 自实现,不引入重型深度学习框架,工程可在一台普通笔记本上从头跑到尾。
### 2.2 系统架构
平台采用"**数据采集 — 清洗验证 — 图谱构建 — 匹配应用**"四层流水线架构,各层以本地文件与图数据库为数据枢纽,由 Python 主程序统一调度;Web 服务层以 FastAPI 暴露 REST 接口,前端单页应用由后端直接托管,实现**单命令启动、单机运行、自动开屏**。
```
┌─────────────────────────────────────────────────────────────────┐
│ 展示层 WebUI(驾驶舱 / 全景图谱 / 岗位演化 / 人岗匹配 / 学习路径) │
├─────────────────────────────────────────────────────────────────┤
│ 服务层 FastAPI REST(统一响应格式 · 异步任务 · 静态托管) │
├─────────────────────────────────────────────────────────────────┤
│ 应用层 新岗位发现 │ 演化分析 │ 简历解析 │ 人岗匹配 │ 学习路径 │
├─────────────────────────────────────────────────────────────────┤
│ 图谱层 时序知识图谱 Temporal KG(岗位·技能·行业·场景) │
│ 关系属性:重要性/权重/生效区间/变更类型/数据源 │
├─────────────────────────────────────────────────────────────────┤
│ 算法层 MinHash LSH 去重 │ 时间衰减 │ 结构化抽取+Schema校验 │
│ 多源投票 │ TF-IDF 聚类 │ 窗口对比 │ 两级匹配评分 │
├─────────────────────────────────────────────────────────────────┤
│ 数据层 data/jd_raw → jd_clean → testset · 技能词表 · 简历 · 报告 │
└─────────────────────────────────────────────────────────────────┘
```
整体数据流:多源 JD 落地为本地 JSONL → 清洗与交叉验证(去重、去噪、时间衰减)→ 结构化抽取(Schema 强校验 + 多源投票)→ 写入时序知识图谱(追加式演化,不覆盖历史)→ 新岗位发现与演化事件计算 → 匹配引擎完成简历解析、人岗匹配与学习路径生成 → WebUI 呈现。
### 2.3 技术选型
| 架构层次 | 技术选型 | 承担职责与选型理由 |
|---|---|---|
| 数据接入层 | Python:JSONL 批量导入、手动上传/粘贴、pypdf(可选) | 多通道获取 JD 与行业报告,落地本地,演示全程走本地数据 |
| 数据清洗层 | 纯 Python 自实现 MinHash(64 哈希、5-gram shingles)+ LSH 分带;时间衰减加权 | 识别抄袭簇、抑制时滞、过滤噪声——幻觉防控第一道防线 |
| 抽取层 | 星火大模型 API(JSON 模式,可配置);离线确定性抽取器(技能词表+规则)为默认与兜底;Pydantic v2 Schema 强校验 | 语义理解结构化;无密钥不断链;坏数据入口拦截 |
| 知识图谱层 | 自研时序图谱内核(邻接表 + JSON 持久化);Neo4j 为可选增强适配器 | 关系级时间区间属性原生支持演化回溯;零外部服务依赖亦可运行 |
| 发现与演化 | 纯 Python TF-IDF(char n-gram)+ 凝聚聚类;季度窗口频次对比 | 新岗位候选簇识别;增/删/改事件可解释计算 |
| 匹配引擎 | 技能词表归一化召回 + 四维加权评分;图谱前置关系拓扑排序 | 透明、可解释、可配置的评分,学习路径符合认知顺序 |
| 服务与展示层 | FastAPI + Uvicorn;Pydantic v2 全链路校验;原生 HTML/JS 单页 WebUI(无构建步骤) | REST 接口 + 图谱可视化;前端零构建保证任何环境可跑 |
| 测试与部署 | pytest + pytest-cov;Dockerfile + docker-compose | 覆盖率 ≥60%;一键容器化交付 |
### 2.4 与常规方案的差异化
| 维度 | 常规参赛方案 | 本方案 |
|---|---|---|
| 大模型依赖 | 无 API 即瘫痪 | 离线抽取器全功能兜底,API 仅作增强与对照 |
| 图谱形态 | 静态快照,覆盖式更新 | 时序图谱,追加式演化,任意时间点切片查询 |
| 幻觉防控 | 宣称"人工检查" | 四道可量化防线(抄袭识别/时间衰减/多源投票/审核留痕)+ 证据链 |
| 匹配评分 | 单一相似度黑盒 | 四维加权透明评分,权重可配,逐项可解释 |
| 数据 | 现场爬取或来历不明 | 自备可复现数据集,含植入脏数据与标准答案,指标一键复算 |
| 交付 | 脚本合集 | 单命令启动的生产工程,Docker 化,测试覆盖率可报告 |
---
## 三、自备数据集建设方案(数据全部自己准备)
数据是本项目的地基。竞赛评分中"实用价值"占 30 分,核心考察"≥100 条 JD 测试集 + 三项准确率 ≥90%"的可验证性。为此我们**自行建设了全套数据集**,覆盖原始数据、脏数据、标准答案、技能词表、简历与行业报告六类资产,全部提交在 `CareerNexus/data/` 下,并由 `scripts/generate_dataset.py` 以固定随机种子(`seed=2026`)一键重新生成,保证评审可复现。
### 3.1 数据集总览
| 数据资产 | 路径 | 规模 | 用途 |
|---|---|---|---|
| 多源岗位 JD 原始库 | `data/jd_raw/*.jsonl` | 1375 条,18 岗位,2019—2026 年,15 城市、5 平台 | 图谱构建与演化分析原料 |
| JD 测试集 | `data/testset/jd_testset.jsonl` | 144 条(与原始库不重复) | JD 解析准确率评测 |
| 标准答案 | `data/testset/gold_answers.json` | 144 条逐字段标注 | 评测基准(抽取输出 Schema 同构) |
| 技能词表 | `data/skills_lexicon.json` | 159 个技能点,含别名/级别/前置关系、7 个行业维度 | 技能归一化、匹配、学习路径 |
| 简历样例 | `data/resumes/` | 7 份(覆盖 Java/前端/数据分析/大模型应用等目标,技能完整/部分/错位三典型) | 简历提取与匹配评测 |
| 行业报告 | `data/reports/` | 3 份行业趋势报告(与 JD 演化信号相互印证) | 多源异构数据之一、趋势佐证 |
### 3.2 JD 原始库设计:把"演化信号"与"三类脏数据"烘焙进数据
**岗位覆盖**(立足数字经济、瞄准新一代信息技术领域,对齐赛题岗位选择范围):
Java 开发工程师、大模型应用工程师、RAG 工程师、提示词工程师、算法工程师、NLP 工程师、CV 工程师、数据工程师、数据分析师、前端工程师、测试开发工程师、运维/SRE 工程师、云原生工程师、嵌入式工程师、物联网工程师、AI 产品经理等 16 个以上岗位。
**每条 JD 字段**:`job_title / company / city / salary / publish_date / source / url / text`,其中 `text` 为 150—400 字中文 JD 全文,由"职责 + 技能要求"模板族组合生成,公司名、城市、薪资区间、措辞均多样化,避免千篇一一律。
**演化信号(支撑"既有岗位能力动态更新"演示)**——以 Java 开发工程师为例:
| 时期 | 能力要求变化 |
|---|---|
| 2019—2021 | 以 SSM、Servlet、JSP、MySQL 为主,Struts 偶见 |
| 2022—2023 | 微服务、Spring Cloud、Docker/K8s 容器化权重显著上升,Struts 退出 |
| 2024—2026 | "AI 辅助编程""大模型应用集成"成为高频加分项,云原生进一步深化 |
而"大模型应用工程师""RAG 工程师""提示词工程师"等岗位 2023 年后才出现且数量快速增长——支撑"新岗位发现"演示。
**脏数据植入(支撑"时滞/噪声/抄袭"治理演示)**:
- **抄袭**:约 8% 的 JD 为近重复(同一 JD 换公司名重发、或同义改写),清洗模块必须能将其聚簇并降权;
- **噪声**:约 3% 的 JD 混入广告尾注、无关条款(如"本公司常年招聘各类人才""转发有礼"),清洗模块必须过滤;
- **时滞**:发布时间横跨 2019—2026,过期 JD 的技能要求经时间衰减降权,避免"五年前的要求左右今天的图谱"。
### 3.3 测试集与标准答案:评测公正性设计
测试集 120 条 JD 与原始库**不重复**,防止"背答案"。标准答案的生成遵循**先定答案、后写文本**的原则:生成器先采样出该条的岗位、必备技能、加分技能、职责与场景作为 ground truth,再据此渲染 JD 文本。评测脚本 `scripts/evaluate.py` 执行的是**从文本重新抽取、再与 gold 逐字段比对**的真实流程(字段级 Precision/Recall/F1),绝不在评测中引用生成时的内部状态。这一设计使"≥90%"是一个诚实、可复核、可向评审现场演示的数字。
### 3.4 技能词表:项目的隐性壁垒资产
`data/skills_lexicon.json` 收录 ≥120 个技能点,每个技能点包含:
- **名称与类别**(编程语言/框架/数据库/云平台/大模型技术/工程实践……);
- **别名集**:如"大模型应用开发"="LLM 应用开发"="生成式 AI 应用","K8s"="Kubernetes"——解决 JD 与简历中的表达异构,是技能归一化准确率的关键;
- **级别**:入门/熟练/精通,支撑图谱按级别切换视图;
- **前置关系**:如"RAG"前置"向量数据库"与"Prompt Engineering"——学习路径拓扑排序的依据。
词表随项目持续积累,构成"可迁移、可复制"交付能力的核心(见商业计划)。
### 3.5 数据合规
自备数据全部为团队生成的合成数据,不含任何真实个人信息与企业非公开信息;简历样例中的姓名、手机、邮箱均为虚构,用于验证脱敏功能。真实部署时,平台仅采集或导入具备使用依据的数据,保留来源与获取时间,简历上传前明示用途、默认脱敏、支持删除,日志不落简历全文与密钥。
---
## 四、数据治理与"幻觉"防控体系(创新点一)
赛题明确要求"探索多源异构数据清洗与交叉验证融合机制,解决数据的'时滞'与'噪音'问题"以及"能力'幻觉'防控"。本方案将幻觉防控设计为**四道纵深防线**,每一道都可量化、可演示、可在日志中观测,而不是一句"人工审核"的口号。
### 4.1 第一道防线:抄袭识别——MinHash LSH 近重复检测
招聘 JD 存在严重的"抄袭"现象:同一 JD 被不同公司改名重发,或同义改写后多发。若不去重,被抄袭的技能要求会因重复计数而被高估,图谱科学性从源头上被破坏。
**实现**(`app/cleaning/`,纯 Python 自实现):
1. 对 JD 文本切 5-gram 字符 shingles 集合;
2. 用 64 个独立哈希函数计算 MinHash 签名,将集合相似度估计压缩为签名比较;
3. LSH 分带(banding):把 64 维签名切成若干带,同带候选才两两比对,将 O(n²) 降为近似 O(n);
4. Jaccard 相似度 ≥ 阈值(默认 0.8)判定为抄袭簇,**保留最早来源,其余标记降权**,聚簇结果与证据写入 `data/jd_clean/`。
植入数据集约 8% 的抄袭 JD 必须被全部检出(有单元测试锁定该行为)。
### 4.2 第二道防线:时滞校正——时间衰减加权
JD 带有滞后性:一条五年前的 JD 不应与本周的 JD 同等左右"当前"岗位画像。清洗层对每条 JD 计算时间衰减权重:
```
w = exp(-λ · age_days) λ = ln2 / 半衰期(默认 540 天)
```
演化分析中所有频次统计均以 w 加权。效果是:旧技能要求随时间自然"退潮",新要求的"涨潮"信号被放大——这正是"动态感知"与"静态画像"的分水岭。
### 4.3 第三道防线:噪声过滤与结构化强校验
- **噪声过滤**:规则集过滤广告尾注、无关条款、超短/超长异常文本;不合格记录进错误清单并计入 WARN 日志,不进入后续链路。
- **Schema 强校验**:抽取输出必须通过 Pydantic v2 按岗位定义 Schema 逐字段校验(岗位名称、核心职责、必备技能、加分技能、应用场景、证据片段、数据源),不合规自动重试(大模型通道最多重试 2 次),仍不合规则丢弃并留痕。**格式错误率趋近于零**是工程保证而非期望。
### 4.4 第四道防线:多源交叉验证与人机协同审核
- **多源投票**:字段级投票机制已实现并有单元测试锁定(`app/extract/base.py` 的 `vote_field`,关键字段多源一致方可高置信)。默认演示走单通道离线确定性抽取;配置星火 API 与开源模型端点后即启用"主抽取器 + 对照通道"双通道投票,Self-Consistency 多采样为在线模式的可选增强。
- **证据绑定**:每个抽取字段必须携带原文证据片段(evidence span),无原文支持的字段不予入库——"幻觉"在数据模型层面无处容身。
- **审核台**:候选新岗位与低置信结论进入"待审核"分区,与正式图谱物理隔离。审核人员可执行接受/修改/驳回/合并,每次操作保存 `operator / operation_time / before / after / reason`,支持按版本回溯"模型结果 → 人工优化结果 → 最终发布结果"。
### 4.5 防线的可观测性
四道防线全部接入统一日志(`时间 | 级别 | 模块 | 消息`),示例:
```
2026-07-23 13:02:16 | WARN | app.cleaning | JD#1024 与 JD#0987 相似度 0.97, 判定抄袭簇, 已降权
2026-07-23 13:02:18 | WARN | app.extract | 对照通道响应超时(30s), 本条以主通道结果单源入库, 已标记待复核
2026-07-23 13:02:20 | INFO | app.graph | 演化事件: Java开发工程师 +[AI辅助编程](加分), 证据 14 条 JD, 窗口 2026Q1
```
答辩现场可以直接打开日志与审核台,向评委展示"AI 不是盲目生成,而是可控、可审、可回退"。
---
## 五、时序知识图谱:动态演化的学术级表达(创新点二)
### 5.1 为什么常规图谱不够用
常规岗位图谱是**静态快照**:今天的"Java 开发工程师"岗位要求覆盖了昨天的,历史无从查询,"演化"只能靠人工对比两个版本的 Excel。赛题要的"动态演化分析"本质上要求图谱把**时间**作为一等公民。
### 5.2 图谱模型
四类节点、四类关系,全部关系携带时序与证据属性:
| 类型 | 名称 | 关键属性 |
|---|---|---|
| 节点 | Job 岗位 | 名称、定义、级别、技术栈、创建/更新时间、审核状态 |
| 节点 | Skill 技能点 | 名称、类别、级别、别名集 |
| 节点 | Industry 行业 | 名称、描述 |
| 节点 | Scenario 应用场景 | 名称、描述 |
| 关系 | (Job)-[:REQUIRES]->(Skill) | **重要性(必备/加分)、权重、生效时间区间 [valid_from, valid_to)、变更类型(新增/增强/减弱/退出)、数据源引用** |
| 关系 | (Job)-[:BELONGS_TO]->(Industry) | — |
| 关系 | (Job)-[:APPLIES_TO]->(Scenario) | — |
| 关系 | (Skill)-[:RELATED_TO]->(Skill) | 关联类型(前置/同级/互斥) |
### 5.3 追加式演化与时间点切片
核心机制:**每次能力更新不覆盖旧关系,而是关闭旧关系的生效区间(写 valid_to)、追加新关系(写 valid_from 与变更事件)**。由此获得两个常规方案给不出的能力:
1. **任意时间点切片查询**:`snapshot(job_id, date)` 返回该岗位在任意历史日期的能力画像——"2021 年的 Java 工程师需要什么"与"2026 年需要什么"可以同屏对比;
2. **演化事件的可解释回溯**:每个增/删/改事件都挂载触发它的 JD 证据列表,点击"为什么 AI 辅助编程成了加分项",直接展示 2026Q1 窗口内 14 条原始 JD 片段及来源。
### 5.4 工程实现
图谱内核为自研邻接表结构(`app/graph/tkg.py`),JSON 快照持久化,零外部服务依赖即可运行;`docker-compose.yml` 的 `advanced` profile 提供 Neo4j 5 可选服务,配 `scripts/sync_neo4j.py` 幂等同步(MERGE 写入,含时间区间与证据属性),生产部署可平滑切换。写入操作携带幂等键(job+skill+valid_from 哈希),任务重复提交不会产生重复节点与关系;所有写操作在事务内完成,失败回滚并记 ERROR 日志。
应用状态(审核留痕、候选岗位、异步任务)存储于内嵌 **SQLite** 状态库(`data/careernexus.db`,标准库 sqlite3 实现、WAL 模式、零新增依赖、零服务):`audit_log / review_candidates / tasks` 三表,首次启动自动从旧 JSON 文件迁移种子数据,重启后任务状态可恢复。选择 SQLite 而非外部数据库的理由与"离线优先"一致:单机零配置、可直接打进 Docker 镜像与数据卷;多用户/大数据量场景下,存储边界已收拢在 `app/storage/db.py`,替换为 PostgreSQL 是局部改动。
### 5.5 GraphRAG:图谱作为生成的检索底座
生成"更新说明"与"学习建议"时,系统不直接把问题丢给大模型,而是**先在图谱中多跳检索**(岗位 → 缺失技能 → 前置技能 → 关联岗位 → 证据 JD),把检索到的证据链连同问题一起交给生成器。回答"有据可查",显著优于纯向量 RAG 的"看似合理实则编造"。默认(离线)模式下证据链直接模板化成文——更新说明与验收标准均由证据驱动生成,已实装;在线模式下可由大模型润色为更自然的表述,为增强项,两种模式共享同一条证据链。
---
## 六、既有岗位能力动态演化分析
### 6.1 演化事件计算
演化分析器(`app/evolution/analyzer.py`)按季度窗口聚合岗位—技能加权频次,对相邻时间窗口做对比,产生四类变更事件:
| 事件类型 | 判定规则(默认阈值,可配置) | 示例 |
|---|---|---|
| 新增 ADD | 上一窗口无此技能,本窗口加权频次 ≥ 阈值且覆盖 ≥3 家独立企业 | 2026Q1 Java 岗新增"AI 辅助编程"(加分) |
| 增强 STRENGTHEN | 权重环比增长 > 50% 且绝对增量显著 | 2022Q3 起"Spring Cloud"由加分升为必备 |
| 减弱 WEAKEN | 权重环比下降 > 50% | 2023 起"MySQL 调优"权重相对下降 |
| 退出 REMOVE | 连续两个窗口加权频次低于退出阈值 | 2022Q4 "Struts"退出能力画像 |
每个事件保存:前后权重、时间窗口、支持 JD 数、独立企业数、来源引用列表。为抑制单企业 JD 刷量造成的假信号,所有判定均要求**跨企业证据**(默认 ≥3 家独立企业)。
### 6.2 更新说明自动生成(赛题硬性要求"提供更新说明及数据源")
每个演化事件自动生成中文更新说明,明确标注能力项的新增/删除/修改,并附数据源,例如:
> **Java 开发工程师 · 2026Q1 能力更新说明**
> 【新增·加分技能】AI 辅助编程。在 2026Q1 窗口内,14 条有效 JD(覆盖 9 家企业,来源:boss/lagou/zhilian)明确提出 AI 编程工具(如 Copilot 类)使用能力要求,加权频次 0.31,达到新增阈值。建议关注该技能的后续演化。
> 数据源:jd_raw/batch_2026.jsonl#1024、#1031、#1049 ……(共 14 条,可逐条回溯原文)
说明文本由 GraphRAG 证据链驱动生成,评审可点击任一来源编号查看 JD 原文。
### 6.3 演示案例
交付数据中烘焙了两个完整演示案例:
- **演化案例**:Java 开发工程师 2019→2026,完整呈现"SSM 时代 → 微服务云原生时代 → AI 增强时代"的能力迁移,含 10+ 个演化事件;
- **新岗位案例**:大模型应用工程师,从 2023 年的萌芽簇到确认为正式岗位的全过程(见第七章)。
---
## 七、新岗位发现与定义:"先聚类、后生成、人确认"
### 7.1 发现管线
新岗位发现(`app/discover/cluster.py`)分三步,以**可解释、可演示**为目标,不依赖复杂在线训练:
**第一步:向量化与聚类。** 对 JD 的"岗位名称 + 职责 + 技能"文本计算 TF-IDF 向量(纯 Python,char n-gram 兼容中英文混排),凝聚聚类成簇。
**第二步:候选判定四指标。** 对每个簇计算并排序:
| 指标 | 含义 | 默认阈值 |
|---|---|---|
| 支持 JD 数 | 簇内有效 JD 量 | ≥ 15 |
| 独立企业数 | 防止单一企业造词 | ≥ 5 |
| 近期增长率 | 近两个窗口环比 | ≥ 50% |
| 与既有岗位差异度 | 与最近既有岗位的向量距离 | ≥ 0.4 |
四指标同时满足的簇判定为**新兴岗位候选**。"大模型应用工程师"簇(2023 年后出现、持续增长、与"算法工程师"差异显著)在内置数据上稳定命中。
**第三步:定义生成与人工确认。** 对候选簇生成结构化岗位定义(岗位名称、核心职责、必备技能、加分技能、典型行业应用场景),进入审核台;人工确认后写入正式图谱,修改留痕、支持版本回溯。**未经确认的候选永不出现在正式图谱与展示页**——这是防幻觉在"新岗位"场景的落点。
### 7.2 岗位定义输出 Schema(即测试集标准答案格式)
```json
{
"job_name": "大模型应用工程师",
"core_duties": ["设计和优化大模型应用链路", "构建 RAG 检索增强系统", "评估与压测模型效果"],
"required_skills": ["Python", "Prompt Engineering", "RAG", "LangChain"],
"bonus_skills": ["向量数据库", "模型微调", "Agent 框架"],
"scenarios": ["智能客服", "企业知识库", "办公 Copilot"],
"sources": ["jd_raw/batch_2024.jsonl#1024", "jd_raw/batch_2024.jsonl#1087"]
}
```
---
## 八、人岗匹配引擎与学习路径规划
### 8.1 简历解析与技能归一化
简历解析(`app/match/resume.py`)支持 TXT/Word(python-docx),PDF 为可选增强(pypdf);扫描件 OCR 为生产部署可选项。解析流程:文本提取 → **隐私脱敏**(姓名/手机/邮箱自动打码,日志不落全文)→ 技能要素抽取 → **归一化到技能词表**(别名映射:"LLM 应用开发"→"大模型应用开发")。归一化是提取准确率 ≥90% 的关键:没有词表,"K8s"和"Kubernetes"会被当成两个技能。
### 8.2 透明四维加权评分
匹配评分(`app/match/engine.py`)采用**完全透明、可解释**的加权模型,权重可在管理端配置:
| 维度 | 默认权重 | 计算依据 | 结果解释 |
|---|---|---|---|
| 必备技能 | 50% | 已命中必备技能权重和 / 全部必备技能权重和 | 核心胜任程度 |
| 加分技能 | 15% | 命中加分技能的加权覆盖率 | 岗位竞争优势 |
| 经验与熟练度 | 20% | 年限、项目描述与技能熟练度映射 | 实践经验匹配度 |
| 行业/场景 | 15% | 项目经历与岗位应用场景的语义相似度 | 业务环境适配度 |
输出:总分、四维分数、已满足能力、**关键缺口清单**、可迁移能力(已掌握技能可迁移至哪些相近岗位)、推荐岗位。总分只用于排序与诊断,系统明确声明"不代替企业最终招聘判断"。
### 8.3 学习路径:图谱拓扑排序生成
学习路径不是泛泛的"建议学习 Python",而是**算法生成**的:
1. 取差距清单中的缺失技能;
2. 在技能图谱中沿 RELATED_TO(前置)边做拓扑排序——先学"向量数据库"再学"RAG",符合认知顺序;
3. 按学习周期(用户输入,如 12 周)切分为 3—4 个阶段,每阶段给出目标技能、顺序、资源类型(文档/课程/项目)与验收任务;
4. 默认(离线)模式由模板结合证据链成文,并附带按技能类别生成的结构化验收标准(14 类模板);在线模式可由大模型结合 GraphRAG 证据链润色(增强项),两者共享同一技能顺序内核。
### 8.4 与图谱的闭环
匹配结果反向滋养图谱:群体性的技能缺口统计(脱敏聚合后)即"人才培养缺口报告",是高校版产品的核心数据资产;岗位的能力画像随 JD 流持续演化,匹配标准自动保持"新鲜"——这就是"静态画像"到"动态感知"的跨越。
---
## 九、生产代码工程实现
本方案随附**完整可运行的生产代码工程 `CareerNexus/`**(非伪代码、非演示脚本)。评审可执行三个命令完成全部验证:
```bash
pip install -r requirements.txt # 依赖均为轻量纯 Python 包
python scripts/run_demo.py # 端到端冒烟:生成数据→跑通全链路→打印图谱与匹配示例
python main.py # 启动服务,自动打开 http://127.0.0.1:9008
```
### 9.1 工程结构
```
CareerNexus/
├── main.py # 唯一入口:配置→图谱→服务→自动开浏览器
├── config.yaml # 端口(9008)、数据路径、运行模式 demo|live
├── requirements.txt Dockerfile docker-compose.yml README.md .env.example
├── app/
│ ├── models.py # Pydantic v2 全链路模型(统一数据对象)
│ ├── ingest/loader.py # JSONL 导入、source_id 分配、坏行错误清单
│ ├── cleaning/ # MinHash LSH 去重、噪声过滤、时间衰减
│ ├── extract/ # base(协议+投票) / offline(词表+规则) / llm(星火) / prompts(固化模板)
│ ├── graph/tkg.py # 时序图谱内核:追加式演化、时间点切片、JSON 持久化
│ ├── discover/cluster.py # TF-IDF 聚类 + 四指标候选判定 + 审核台
│ ├── evolution/analyzer.py# 季度窗口对比 → 增/删/改事件 + 更新说明
│ ├── match/ # resume(解析/脱敏/归一化) + engine(四维评分/差距/学习路径)
│ ├── services/pipeline.py # 端到端编排,CLI 与 API 复用同一管线
│ └── api/routes.py # FastAPI 路由 + 静态托管
├── webui/ # 原生 HTML/JS 单页应用,无构建步骤
├── scripts/ # generate_dataset.py / evaluate.py / run_demo.py
├── data/ # 自备数据集(见第三章)
└── tests/ # pytest,覆盖率 ≥60%
```
### 9.2 关键实现走读(源码节选)
**时序图谱的追加式演化写入**(`app/graph/tkg.py` 核心逻辑):
```python
def apply_change(self, job_id: str, skill_id: str, event: ChangeEvent) -> None:
"""演化写入:不覆盖历史,关闭旧区间、追加新区间,事件留痕。"""
old = self._active_edge(job_id, skill_id)
if old is not None:
old.valid_to = event.window_start # 旧关系生效区间关闭
new_edge = RequirementEdge(
job_id=job_id, skill_id=skill_id,
importance=event.importance, weight=event.new_weight,
valid_from=event.window_start, valid_to=None,
change_type=event.change_type, # ADD/STRENGTHEN/WEAKEN/REMOVE
sources=event.evidence_jds, # 证据链随关系持久化
)
self._edges[self._idem_key(new_edge)] = new_edge # 幂等键防重复写入
self.events.append(event)
def snapshot(self, job_id: str, at: date) -> JobProfile:
"""任意时间点切片:只取 valid_from <= at < valid_to 的关系。"""
edges = [e for e in self._edges.values()
if e.job_id == job_id and e.valid_from <= at and (e.valid_to is None or at < e.valid_to)]
return JobProfile(job_id=job_id, at=at, requirements=edges)
```
**抄袭检测 MinHash 签名**(`app/cleaning/` 核心逻辑):
```python
def minhash_signature(shingles: set[str], num_perm: int = 64) -> list[int]:
"""64 个独立哈希的 MinHash 签名,用于 Jaccard 相似度无偏估计。"""
sig = []
for i in range(num_perm):
sig.append(min(_hash(s, seed=i) for s in shingles))
return sig
def lsh_candidate_pairs(docs: dict[str, list[int]], bands: int = 16) -> set[tuple[str, str]]:
"""LSH 分带:同带桶内才两两比对,O(n²) → 近似 O(n)。"""
...
```
**四维匹配评分**(`app/match/engine.py` 核心逻辑):
```python
def score(self, profile: JobProfile, resume: ResumeSkills) -> MatchResult:
req_hit = self._coverage(resume, profile.required) # 必备 50%
bonus_hit = self._coverage(resume, profile.bonus) # 加分 15%
exp_score = self._experience_score(resume, profile) # 经验 20%
scen_score = self._scenario_similarity(resume, profile) # 场景 15%
total = (self.weights.required * req_hit + self.weights.bonus * bonus_hit
+ self.weights.experience * exp_score + self.weights.scenario * scen_score)
gaps = [s for s in profile.required if s not in resume.normalized_skills]
path = self.graph.topological_learning_order(gaps) # 前置关系拓扑排序
return MatchResult(total=total, gaps=gaps, learning_path=path, ...)
```
**离线确定性抽取器**(`app/extract/offline.py`,无 API 时的全功能兜底):
```python
class OfflineExtractor:
"""基于技能词表 + 句式规则的确定性抽取器:离线可用、结果可复现。"""
def extract(self, jd: JDRecord) -> ExtractionResult:
skills = self.lexicon.scan(jd.text) # 别名归一化扫描
required = [s for s in skills if self._in_required_context(jd.text, s)]
bonus = [s for s in skills if self._in_bonus_context(jd.text, s)] # "优先/加分/熟悉…者佳"
duties = self._duty_sentences(jd.text)
return ExtractionResult(..., evidence=self._spans(jd.text, skills)) # 逐字段证据片段
```
### 9.3 接口设计(统一前缀 /api,统一响应 `{code, message, data, request_id}`)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health | 服务与图谱健康检查 |
| POST | /api/jd/import | 导入 JD(文件/文本),触发清洗 |
| GET | /api/jobs | 岗位列表,按技术栈/级别筛选 |
| GET | /api/jobs/{id} | 岗位详情:定义、能力项、数据源 |
| GET | /api/jobs/{id}/evolution | 能力演化时间轴(增/删/改事件) |
| POST | /api/jobs/discover | 触发新岗位发现 |
| POST | /api/review | 候选审核(accept/modify/reject,留痕) |
| GET | /api/graph | 全景图谱节点与边(供前端渲染) |
| POST | /api/resume/parse | 简历解析与技能归一化(脱敏) |
| POST | /api/match | 人岗匹配诊断与差距分析 |
| POST | /api/learning-path | 生成改进建议与学习路径 |
轻量查询同步返回;耗时任务(导入、发现、生成)以任务 ID 异步执行,前端轮询进度。上传文件限制扩展名/MIME/大小,文件名随机化;密钥只从环境变量注入,仓库仅含 `.env.example`;Neo4j/图谱写入用幂等键防重复。
### 9.4 日志与安全
- 标准库 logging 全局配置,DEBUG/INFO/WARN/ERROR 四级,控制台彩色 + `logs/` 按天滚动保留 30 天;
- 日志默认不落简历全文、手机号、邮箱、密钥;
- 每条模型调用记录 `model_name / prompt_version / request_id / 耗时`,便于审计与复现;
- 演示账户与管理账户分离;简历支持任务完成后手动删除。
---
## 十、用户体验设计
### 10.1 五视图信息架构
前端为原生 HTML/JS 单页应用(**无 npm 构建步骤**,任何环境可跑),围绕"看趋势、查岗位、传简历、得建议"组织,关键操作三步以内完成:
| 视图 | 核心功能 | 主要输出 |
|---|---|---|
| 数据驾驶舱 | 平台数据规模与更新状态 | JD 数、岗位数、技能数、候选新岗位、最新变更 |
| 全景图谱 | Canvas 力导向交互图谱,按技术栈/级别切换 | 局部图谱、节点详情、证据来源 |
| 岗位演化 | 时间轴回溯岗位能力变化 | 新增/增强/减弱/退出事件、更新说明、证据 JD |
| 人岗匹配 | 上传简历、诊断差距 | 总分雷达图、命中/缺失清单、可迁移技能、推荐岗位 |
| 学习路径 | 分阶段提升方案 | 阶段目标、技能顺序、资源类型、验收任务 |
### 10.2 交互与异常设计
- 图谱默认只加载岗位及一级技能,点击局部展开,避免全量渲染卡顿;岗位/技能不同形状,必备/加分不同颜色,颜色同时配文字标签(不只依赖颜色传达信息);
- 模型处理较长时分阶段显示进度(上传→解析→归一化→匹配→生成建议);
- 证据不足时不生成确定性结论,显示"待补充证据"标记并可提交人工审核;
- 接口失败保留用户输入,显示可重试提示与请求编号;
- **演示模式/真实模式切换** + "演示数据重置"按钮:断网时核心页面仍可完整展示,每次答辩可从同一状态开始。
### 10.3 十分钟演示脚本
| 时间 | 演示内容 | 评审看到的价值 |
|---|---|---|
| 0:00–1:00 | 人才供需脱节问题与平台闭环 | 定位清晰 |
| 1:00–2:30 | 导入多源 JD,展示抄袭簇识别与降权 | 数据治理真功夫 |
| 2:30–4:00 | 新岗位候选"大模型应用工程师"四指标判定 + 人工确认 | 新岗位发现 + 防幻觉 |
| 4:00–5:30 | Java 工程师 2019→2026 演化时间轴,点击事件看证据 JD | 动态演化分析 |
| 5:30–6:45 | 技能点级全景图谱交互 | 图谱完整性与体验 |
| 6:45–8:30 | 上传简历,查看匹配度、差距清单、推荐岗位 | 实用价值 |
| 8:30–9:30 | 生成拓扑有序的学习路径 | 学生端闭环 |
| 9:30–10:00 | 现场运行 evaluate.py 复现三项指标 + 覆盖率报告 | 可验证、可交付 |
---
## 十一、测试与指标验证方案
### 11.1 三项核心指标的核算方法
| 指标 | 目标 | 核算方法 | 复现命令 |
|---|---|---|---|
| JD 解析准确率 | ≥90% | 120 条测试集,抽取输出与 gold_answers 逐字段计算 P/R/F1,宏平均 | `python scripts/evaluate.py` |
| 简历提取准确率 | ≥90% | 简历样例抽取技能与标注比对,字段级 F1 | 同上 |
| 人岗匹配准确率 | ≥90% | 标注人岗对(匹配/不匹配)上系统判定与人工判定一致率 | 同上 |
评测全流程"**从文本抽取 → 与标准答案比对**",不引用数据生成的内部状态;结果输出 `reports/metrics.json` 与控制台报告,答辩现场可一键重跑。实测结果见本方案附录 A(随代码提交更新)。
### 11.2 单元测试
pytest 覆盖六大核心模块,覆盖率 ≥60%(随源码提交 `pytest --cov=app` 报告):
- `test_cleaning`:植入的抄袭簇必须被全部检出,噪声行必须被过滤;
- `test_extract`:Schema 校验拦截坏 JSON、多源投票逻辑、离线抽取确定性;
- `test_tkg`:时间点切片正确性、演化追加不覆盖历史、幂等写入;
- `test_evolution`:构造两季度数据验证新增/减弱/退出事件判定;
- `test_match`:四维权重计算、差距清单、学习路径拓扑序;
- `test_api`:TestClient 覆盖 health/jobs/graph/match 主接口。
### 11.3 生成质量评估
在线模式下,对岗位定义、更新说明、学习路径等生成内容可以 RAGAS 框架做忠实度(faithfulness)与相关性量化评分(可选增强);默认模式以 `scripts/evaluate.py` 的字段级 F1 与证据链溯源作为量化手段——更新说明中的每一条结论都标注支撑 JD,"幻觉防控有效"从口号变成可复核的数字。
---
## 十二、评分标准自评对照(满分导向设计)
| 评分项 | 分值 | 评分要点 | 本方案对应交付 |
|---|---|---|---|
| 作品完整性 | 30 | "多源数据采集→新岗位发现与能力更新→图谱动态→简历解析→匹配与差距分析"全流程闭环;技能级全景图谱;可正常部署运行 | 五层管线全闭环(二章);五视图 WebUI(十章);`python main.py` 一键启动 + Dockerfile(十三章) |
| 技术创新性 | 25 | 大模型+知识图谱+RAG 创新应用;多源清洗交叉验证解决时滞噪音;幻觉防控方案完善 | 四道幻觉防线(四章);Temporal KG 追加式演化(五章);GraphRAG 证据链(5.5);多源投票(4.4) |
| 用户体验 | 15 | 界面简洁、图谱交互流畅、差距分析展示清晰 | 五视图 + 局部展开防卡顿 + 双模式演示(十章) |
| 实用价值 | 30 | ≥100 条 JD 测试集;三项准确率 ≥90%;可迁移至更多新一代信息技术岗位 | 120 条测试集 + 一键复现(三、十一章);词表/岗位库/界面三层可配置交付(十四章) |
---
## 十三、部署与运行方案
### 13.1 本地一键运行(评审主路径)
```bash
cd CareerNexus
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python scripts/generate_dataset.py # 数据已随工程提交,此步可复现重建
python main.py # 启动并自动打开 http://127.0.0.1:9008
```
`main.py` 启动流程:加载 `config.yaml` 与环境变量 → 加载/构建图谱与索引 → Uvicorn 监听 `127.0.0.1:9008` → `webbrowser.open` 自动开屏。任一前置条件缺失时输出明确解决指引而非直接退出。
### 13.2 Docker 交付(赛题要求 Dockerfile 或容器化部署说明)
```bash
docker build -t careernexus .
docker run -p 9008:9008 careernexus # 打开 http://127.0.0.1:9008
```
`docker-compose.yml` 另提供可选 Neo4j 服务编排(图谱内核默认零依赖运行,Neo4j 为生产增强)。镜像基于 `python:3.11-slim`,构建期完成依赖安装与数据集生成,运行期无需网络。
### 13.3 双模式与降级策略
| 模式 | 行为 | 场景 |
|---|---|---|
| live 在线模式 | 配置密钥后调用星火 API 抽取与生成,多源投票全开 | 有网有密钥的完整能力展示 |
| demo 演示模式 | 离线抽取器 + 预生成可追溯快照,断网完成全部核心演示 | 竞赛现场保底 |
降级纪律:**模型不可用时禁止伪造新结果**——允许浏览已有图谱、演化案例与匹配样例,新数据处理显式进入"待审核/待补充证据"状态。
### 13.4 环境依赖
Python 3.11+;依赖均为轻量包(fastapi、uvicorn、pydantic、httpx、networkx、python-docx、pytest、pytest-cov),核心算法纯 Python 自实现,无 GPU 需求,普通笔记本 2 分钟内完成启动。
---
## 十四、商业计划与推广方案
> 比赛阶段不承诺未经验证的收入数据。本章以**产品可复制性**为论证重点,所有测算标注假设与口径,收费方式为方向性设想,不构成收入承诺。
### 14.1 产品定位与客户价值
CareerNexus 职联是连接产业岗位变化与人才培养的**岗位能力基础设施**——把分散的招聘需求转化为可追踪的岗位—技能图谱,为学生提供职业导航,为高校提供专业调整依据,为企业提供岗位画像与差距诊断。
| 目标用户 | 核心痛点 | 产品价值 |
|---|---|---|
| 学生与求职者 | 不了解目标岗位、技能差距和学习顺序 | 岗位探索、简历诊断、学习路径、成长跟踪 |
| 高校就业部门 | 就业指导依赖经验,缺少实时产业数据 | 岗位趋势看板、学生能力诊断、就业报告 |
| 院系与教务部门 | 培养方案更新慢于产业技能变化 | 课程—岗位技能映射、专业预警、教改依据 |
| 企业招聘与培训部门 | JD 不统一、筛选成本高、培训目标模糊 | 岗位画像、人才匹配、技能缺口、培训建议 |
### 14.2 市场测算(TAM/SAM/SOM 三级漏斗,保守口径)
- **TAM**:全国高校就业服务与职业教育信息化市场。以 3000+ 所高校、年均就业指导与信息化投入计,岗位能力数据服务的可及市场约 **30 亿元/年**(口径:就业信息化预算中可用于数据与平台服务的部分,保守取 10%)。
- **SAM**:新一代信息技术相关专业集中的本科与高职院校约 800 所,加上区域内重点企业与产业园区,可服务市场约 **4 亿元/年**。
- **SOM**:三年内通过 3—5 所样板校复制至 50 所高校 + 20 家企业,按高校版年均 8 万元、企业版年均 5 万元测算,可获取市场约 **500 万元/年**。
每一级数字都服务于同一个战略结论:**这是一个"小而深"的基础设施市场,胜负手不在流量而在数据资产的持续积累**。
### 14.3 产品版本与商业模式
| 版本 | 服务对象 | 主要功能 | 收费方式(方向性设想) |
|---|---|---|---|
| 学生基础版 | 个人用户 | 岗位浏览、基础匹配、学习路径 | 核心功能免费,增值报告按次/会员 |
| 高校服务版 | 高校/院系 | 趋势看板、群体画像、课程映射、就业报告 | 年度软件服务 + 实施服务 |
| 企业服务版 | 企业 HR/培训部门 | 岗位画像、批量匹配、人才盘点、培训建议 | 按账号/岗位量/年度订阅 |
| 数据与接口版 | 研究机构/合作平台 | 脱敏趋势数据、岗位技能 API | 按调用量或项目合作 |
**单客户经济模型(高校版,保守假设)**:首年客单 8 万元(软件 6 万 + 实施 2 万),交付成本主要为词表配置与部署(约 1.5 万元,依托模板化交付),首年即可回本;次年起无实施成本,续约毛利率 >75%,续用率的假设依据是"趋势数据随时间增值、客户迁移成本随使用深度上升"。
### 14.4 壁垒:数据飞轮而非单一大模型
```
更多高校/企业接入 → 更多真实 JD 与反馈 → 词表与图谱更准
↑ ↓
迁移成本上升 ← 趋势报告更有价值 ← 演化时序数据更厚
```
四重壁垒相互强化:**持续积累的技能词表**(别名/前置关系)、**可追溯的时序岗位图谱**(时间即壁垒,新进入者买不到历史)、**跨来源去重与验证流程**(工程 know-how)、**课程—岗位映射数据**(高校场景独占资产)。大模型是公用品,数据资产才是护城河。
### 14.5 市场进入路径
1. **校内试点**(第 1 年):人工智能、软件工程、大数据专业,就业指导教师与学生共同验证岗位图谱与简历诊断;用"大模型应用工程师"和"Java 开发工程师"两个样板案例形成可复制展示模板;
2. **院系扩展**(第 1—2 年):接入培养方案与课程映射,产出季度就业趋势报告;
3. **区域闭环**(第 2—3 年):与区域企业、产业学院、招聘服务机构合作,引入真实岗位与反馈,形成高校—学生—企业闭环。
获客渠道:高校就业中心、创新创业基地、产业学院、校企合作项目。运营内容:季度岗位趋势简报、热门技能榜、专业能力差距报告、公开职业测评活动。
### 14.6 商业化验证指标
| 阶段 | 验证目标 | 观察指标 |
|---|---|---|
| 校内试点 | 学生是否理解并使用诊断结果 | 完成匹配人数、学习路径查看率、满意度 |
| 院系试点 | 趋势数据能否支持就业与教改 | 教师使用频次、报告采纳项、课程映射覆盖率 |
| 企业试点 | 岗位画像与匹配是否节省工作量 | JD 标准化时间、候选筛选时间、HR 反馈 |
| 规模推广 | 产品可复制性与交付成本 | 部署周期、续用率、单校维护成本 |
### 14.7 成本与合规
主要成本:数据整理与标注、模型调用或本地推理资源、图数据库与服务器、产品开发维护、高校/企业实施服务。早期通过本地部署、结果缓存、批处理与演示快照控制模型调用成本。合规底线:仅采集/导入具备使用依据的数据并保留来源;简历明示用途、默认脱敏、支持删除;聚合趋势展示不泄露个人与企业非公开信息;商业部署进一步完善授权、访问控制、数据保留期限与安全审计。
---
## 十五、实施计划与风险控制
### 15.1 分阶段实施(对齐赛题日程:2026 年 6 月启动,9—11 月评审)
| 阶段 | 时间 | 重点任务 | 形成成果 |
|---|---|---|---|
| 一、最小闭环 | 6 月 | 数据生成、清洗、抽取、图谱写入、基础图谱页 | 20 条 JD 端到端跑通 |
| 二、赛题核心 | 7—8 月 | 新岗位发现、演化分析、简历解析、匹配与学习路径 | 1 个新岗位 + 1 个演化岗位完整案例 |
| 三、指标与体验 | 8—9 月 | 120 条测试集、三项指标达标、图谱性能与页面优化 | 可复现指标报告 + 稳定 WebUI |
| 四、交付包装 | 9—11 月 | Docker 化、PPT、10 分钟视频、答辩与断网预案 | 完整比赛提交包 |
### 15.2 风险与降级方案
| 风险 | 影响 | 应对与降级 |
|---|---|---|
| 模型 API 不可用 | 在线抽取/生成中断 | 离线抽取器全功能兜底;演示快照;不生成无证据结果 |
| 指标未达 90% | 实用价值失分 | 标准答案前置建设,按错误类型(同义词/边界句式)迭代词表与规则 |
| 图谱渲染卡顿 | 现场交互不流畅 | 默认局部展开、节点上限、预计算布局 |
| 实时数据采集受限 | 数据更新不可复现 | 全部演示走自备本地数据集,爬虫仅作可选扩展 |
| 隐私与密钥泄露 | 合规风险 | 简历脱敏、环境变量注入、日志过滤、演示数据匿名化 |
| 开发延期 | 功能缺失 | 主链路(数据→图谱→匹配)优先,增强模块按优先级裁剪 |
### 15.3 团队分工建议
数据与算法 2 人(数据集建设、清洗、抽取、演化与匹配算法)、后端 1 人(FastAPI、图谱内核、测试与 Docker)、前端 1 人(五视图 WebUI 与演示脚本)、文档与答辩 1 人(方案、PPT、视频、商业计划),指导教师把握学术表达与合规。
---
## 十六、结语:本作品的三个"不一样"
1. **不一样在"时间"**:别人交付的是岗位的快照,我们交付的是岗位的**编年史**——每一条能力要求都有生效区间、变更事件与证据链,"演化"是数据模型的原生能力而非事后分析。
2. **不一样在"诚实"**:四道幻觉防线、待审核隔离区、全程留痕、指标一键复现——系统**设计为可被审查**,这在 AI 应用泛滥的当下恰是最稀缺的工程品格。
3. **不一样在"能跑"**:离线优先、零重依赖、单命令启动、Docker 交付、覆盖率可报告——评委拿到手的不是 PPT 上的架构图,而是 `python main.py` 之后真实转起来的系统。
---
## 附录 A:实测指标(本机实测,与 `reports/metrics.json` 一致)
| 指标 | 目标 | 实测 | 复现方式 |
|---|---|---|---|
| JD 解析准确率(字段级宏平均,144 条测试集) | ≥90% | **100%** | `python scripts/evaluate.py` |
| 简历技能提取准确率(7 份样例) | ≥90% | **100%** | 同上 |
| 人岗匹配准确率(36 对标注) | ≥90% | **100%** | 同上 |
| 单元测试 | 全部通过 | **37 passed** | `pytest tests/` |
| 单元测试覆盖率 | ≥60% | **78%** | `pytest tests/ --cov=app` |
| 抄袭簇检出 | 植入全量检出 | **全中、0 误伤** | `python scripts/run_demo.py` |
端到端冒烟实测:图谱 154 节点(15 岗位 / 118 技能 / 14 场景 / 7 行业)/ 261 边 / 264 个演化事件(新增 117、增强 39、减弱 22、退出 86);新岗位候选自动发现"大模型应用工程师(44 条 JD/40 家企业)、RAG 工程师、提示词工程师";Java 开发工程师 2020 时点画像为 SSM/Servlet/Struts 系,2025 时点为 Spring Cloud/Kubernetes/分布式系统 + AI 辅助编程(加分),前端、数据分析、运维(SRE)三条线同样有完整时代迁移剧本;示例简历脱敏(张\* / 138\*\*\*\*78)后匹配 Java 岗总分 85。服务实测:`/api/health`、`/api/jobs`、`/api/graph`、`/` 全部 200。
## 附录 B:最终交付物清单
- [x] 平台源代码、依赖文件、环境变量样例、README(`CareerNexus/`)
- [x] 自备数据集:1375 条多源 JD(18 岗位、15 城市、5 平台,2019—2026,含植入抄袭/噪声/四条岗位演化剧本)、144 条测试集与标准答案、159 项技能词表(含 7 个行业维度)、7 份简历样例、3 份行业报告(`CareerNexus/data/`)
- [x] 可执行启动脚本、Dockerfile、docker-compose 部署说明
- [x] 指标复现脚本与实测报告(`scripts/evaluate.py`、`reports/metrics.json`)
- [x] 单元测试与覆盖率报告(`tests/`,37 用例,覆盖率 78%)
- [x] 1 个新岗位案例(大模型应用工程师)+ 1 个既有岗位演化案例(Java 开发工程师,含数据源与输入输出示例)
- [x] 作品设计实现方案(本文档)
- [ ] 项目介绍 PPT(≤10 页)与 ≤10 分钟演示视频(按十章演示脚本录制)
*(完)*
@@ -0,0 +1,135 @@
# CareerNexus 职联 · 项目方案补充(v3.1)
> 本文档是《CareerNexus职联_项目方案.md》(v3.0)的补充,记录方案定稿后的**实现增量**。
> 所有内容均已落地为可运行代码并通过测试验证(pytest 53 用例全绿),与原方案不一致处以本文为准。
> 版本:v3.1 · 2026-08
---
## 一、补充概览
v3.0 方案交付了"能跑的最小完整系统"。v3.1 在此之上完成四个方向的增强:
1. **交互与展示深化**:WebUI 从"能用"升级到"企业级产品形态",演化分析从单一图表升级为七模块图表体系;
2. **应用能力扩展**:结构化简历模板与导出、批量人岗匹配、语义相似匹配通道;
3. **运行时工程化**:设置中心、Token 鉴权、SQLite 状态库、按需下载的打包策略、静态缓存控制;
4. **诚实性维护**:多处指标口径修正、测试隔离加固、文档与实现对齐。
---
## 二、前端体系(WebUI 2.0)
### 2.1 企业级设计系统
- 布局重构:**顶部品牌栏(56px)+ 横向导航条(46px,居中、选中态三重信号:主色加粗/浅蓝底/3px 指示条)**,替代原左侧深色边栏,主内容全宽。
- 设计 token:主色 #2f54eb、Arco 系语义色、8px 间距网格、按钮四态/tag/卡片/弹窗/toast/空态/骨架屏统一组件;图标全部内联 SVG,**零外部依赖、断网可用**。
- 静态资源缓存控制:非 /api 响应统一 `Cache-Control: no-cache` + 资源版本号,杜绝"浏览器拿旧前端"问题。
- **统一系统弹窗**(sysDialog 组件族:sysPrompt/sysConfirm/sysAlert/sysCopy),前端已无任何浏览器原生 alert/prompt/confirm。
- **URL 路由**:视图与图谱节点写入 location.hash(`#view=xxx&node=xxx`),刷新/分享可恢复到同一视图同一节点。
### 2.2 全景图谱工作台
- 节点四型分色分形状(Job/Skill/Industry/Scenario、待审核虚线框),必备实线/加分虚线 + 文字标签双编码,选中节点一跳高亮。
- 左上工具条(缩放/适应/筛选/标签开关/整理布局)、左下小地图与图例、导出 PNG、保存视图/分享链接。
- **右侧详情面板**(320px 可滚动):基础信息、关联节点(可点击跳转+返回)、证据来源(点击弹 JD 原文)、技能热度 sparkline、审核留痕。
- **可编辑**:节点属性编辑弹窗(写后端并留痕)、备注增删、候选节点确认/驳回。
- **连线类型复选框**:必备/加分/场景/行业四类边独立开关(默认全开),选中高亮与之一致。
- 右下"智能建议"浮层、底部演化逻辑链 chips。
### 2.3 首次使用引导
- 首次启动自动弹出"初始设置"弹窗(同设置面板),完成标记 `guided` 持久化在服务端 `config.json`(换浏览器不重弹);保存/跳过均可完成。
---
## 三、岗位演化页:七模块图表体系
信息结构自顶向下逐级下钻:
| 模块 | 内容 | 数据源 |
|---|---|---|
| ① 全部岗位演化热力图 | 岗位×季度矩阵,色深=事件数(开方缩放+封顶色阶),悬停看类型分布,点击行切换岗位 | /api/graph events |
| ② 统计条 | 当前必备/加分技能数、近 4 季度新增/退出、证据 JD 总量 | 岗位定义+事件 |
| ③ 能力画像时点对比器 | 任意两日期技能集合 diff:已退出(红)/保留(灰)/新增(绿),重要性升级带↑,点击跳图谱 | 新接口 `GET /api/jobs/{id}/snapshot?at=` |
| ④ 变更类型构成堆叠柱状图 | 每季度 新增/增强/减弱/退出 四色堆叠 | 事件 |
| ⑤ 技能生命周期甘特图 | 每技能一行,横条=生效区间(必备蓝/加分青),圆点=变更事件;读出"Struts 2019 进场 2022 退场"编年史 | 边 intervals |
| ⑥ 技能热度走势 | **每季度实际生效的技能关系数**(按 REQUIRES 边生效区间统计) | 边 intervals |
| ⑦ 事件时间轴 | 四类事件分色,点击弹证据 JD 原文,时间轴限高滚动 | 事件+source_ids |
**指标口径修正**:原"累计新增−退出"算法基线错误(忽略技能存量,导致曲线贴底看似无数据),v3.1 改为按生效区间统计真实活跃数,已用线上数据验证。
---
## 四、人岗匹配增强
### 4.1 技能归一化四级容错
1. 精确/别名(大小写不敏感):`redis→Redis`、`K8s→Kubernetes`;
2. 包含匹配(取最长命中):`微服务架构→微服务`、`Java语言→Java`(`JavaScript` 不被截胡);
3. 类别迁移提示:同类别技能作为"可迁移技能"展示;
4. **语义召回(v3.1 新增,可选增强)**:词表未命中时经向量相似度兜底(阈值 0.62,经真实数据标定——正确拦截 `JVM调优→模型微调` 错配与垃圾输入)。
诊断结果页补充"与目标岗位无关的技能(不计入评分)"展示区,消除"我加的技能哪去了"的困惑。
### 4.2 结构化简历模板与导出
- 解析增强:性别/学历/家庭住址识别(住址脱敏)、20+ 常见标题**智能分节**、**证件照提取**(docx 内嵌图 / pdf 页面图,data URI 返回)。
- 第 3 步左栏渲染**标准表格风简历**:左上照片、标签-值信息格、分节行(蓝底标题列),技能按匹配结论三色标注。
- **DOCX 导出**(`POST /api/resume/export`):照片嵌入 + 信息表 + 分节正文(命中技能加粗上色)+ 人岗匹配诊断摘要,一键下载。
- 上传支持 .txt/.docx/.pdf(≤5MB,临时文件即解析即删)。
### 4.3 批量匹配(企业服务雏形)
- 新接口 `POST /api/match/batch`:≤50 份简历对同一岗位批量打分,单份失败不拖垮整批。
- 前端"单人诊断 / 批量匹配"子页签:**拖拽文件/文件夹(递归遍历)、多选、整目录导入**三种添加方式;结果表按总分降序(候选人/总分进度条/命中/缺口/结论)。
- **CSV 批量导出**(14 列含四维分,带 BOM,Excel 中文不乱码)。
---
## 五、语义向量通道(BGE-M3)
- 双模式可选:`local`(本地权重,sentence-transformers 懒加载)/ `api`(联网 Embedding API,默认 DashScope 兼容模式 text-embedding-v4);任一就绪即启用,失败静默回退词表模式。
- 就绪检测:权重目录文件完整性(config.json + 权重文件 + 分词器)+ 依赖可导入,五字段状态经 /api/health 与 /api/config 暴露。
- 本机已实配:BGE-M3 权重 4.3GB(ModelScope 下载至 `models/bge-m3`),实测 `数据分析报表→数据分析(0.889)`、`写微服务→微服务(0.856)` 等正确命中。
---
## 六、设置中心与运行时工程
- **设置面板**(顶栏 ⚙,加宽 780px):服务监听(127.0.0.1/0.0.0.0 + 端口 + 访问令牌)、LLM API(星火/OpenAI 兼容,密钥脱敏回显)、语义向量(双模式 + 下载引导)。
- **config.json 运行时设置**:白名单键持久化,优先级 config.json > config.yaml > 默认值;LLM/令牌/语义配置保存即热生效,监听/端口需重启(面板提供"保存并重启",os.execv 原地重启)。
- **Token 鉴权**:设置令牌后 /api/* 需 `X-Access-Token` 头(health 与只读 GET /api/config 豁免),前端自动携带,401 自动弹设置引导。
- **双横幅提示**:LLM 离线回退 / 语义模型未就绪,同款橙色横幅上下排列,可独立关闭,配置后自动消失。
- **一键下载并配置**:`POST /api/semantic/setup` 异步管线(装依赖→镜像站下载权重→自动写配置),进度轮询(阶段+日志),幂等防并发——**打包只含基础环境(~400MB),重依赖按需下载**;`INCLUDE_EMBED=1` 全量镜像变体保留为断网交付选项。
---
## 七、SQLite 应用状态库
`data/careernexus.db`(标准库 sqlite3、WAL、零新增依赖):
| 表 | 内容 | 消费方 |
|---|---|---|
| audit_log | 审核/编辑留痕(时间/节点/动作/操作人/改前改后) | 图谱详情留痕区、驾驶舱消息流、/api/audit |
| review_candidates | 新岗位待审核候选(与正式图谱隔离) | 审核台、候选节点、待办计数 |
| tasks | 异步任务状态,重启可恢复,中断自动标记失败 | 任务轮询 |
首次启动自动从旧 JSON 文件迁移种子(幂等,原文件保留)。语料(jd_raw JSONL)、图谱快照(graph.json)、配置(config.json)仍留文件——**"随运行增改的状态进库,语料与快照留文件"**。
---
## 八、工程与验证现状(2026-08 实测)
- **pytest 53 用例全绿**,覆盖率 78%(新增:批量匹配、语义双模式、一键配置、结构化简历与导出、存储层、设置与鉴权等专项)。
- 测试卫生修复:路径隔离(不再污染真实 config.json)、幂等快路径(单测 150s→1.5s)。
- 装配层重构:`main.py` 瘦身为 10 行入口,`app/bootstrap.py` 承担启动装配;全工程 32 个 Python 模块、10 个子包。
- 三项指标维持:JD 解析 100% / 简历提取 100% / 人岗匹配 100%(scripts/evaluate.py 可复现)。
- Neo4j 可选组件:compose `advanced` profile + `scripts/sync_neo4j.py`(MERGE 幂等,--dry-run 可预览);Docker 默认镜像轻量离线,语义变体可选构建。
## 九、待办(下一步)
- Docker 镜像实际构建验证(Dockerfile 已就绪,未实机构建)。
- Neo4j 真实容器同步实测(当前 dry-run 验证)。
- 项目介绍 PPT(≤10 页)与 ≤10 分钟演示视频(按方案第十章演示脚本录制)。
*(补充完)*