Files
CareerNexus/docs/CareerNexus职联_技术栈.md
T

123 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CareerNexus 职联 · 技术栈清单
> 记录本项目实际使用的全部技术栈(2026-08,与代码仓库一致)。
> 选型总原则:**离线优先、零重依赖、单命令启动、可复现**。
---
## 一、语言与运行时
| 技术 | 版本 | 用途 |
|---|---|---|
| Python | 3.11+(开发环境 3.13) | 后端、算法、数据管线、脚本 |
| JavaScript(原生) | ES2020+ | 前端全部交互(无 TypeScript/无构建) |
| Node.js | 20+ | 仅用于前端语法检查与逻辑单测(不参与运行) |
## 二、后端
| 技术 | 版本 | 用途 |
|---|---|---|
| FastAPI | ≥0.110 | REST 接口层(20+ 端点,统一响应格式/任务轮询/静态托管) |
| Uvicorn | ≥0.29 | ASGI 服务(127.0.0.1:9008,可切 0.0.0.0 + Token 鉴权) |
| Pydantic | v2 ≥2.6 | 全链路数据模型与 Schema 强校验(JD/抽取/图谱/匹配/简历) |
| httpx | ≥0.27 | LLM API 与 Embedding API 调用 |
| networkx | ≥3.2 | 时序知识图谱的底层有向图结构 |
| python-docx | ≥1.1 | 简历 DOCX 解析、规范简历 DOCX 导出 |
| pypdf | ≥4.0 | 简历 PDF 文本与内嵌照片提取 |
| reportlab | 仅样例生成 | 中文演示 PDF 样例制作(非运行依赖) |
## 三、前端(零构建、完全离线)
| 技术 | 说明 |
|---|---|
| 原生 HTML/CSS/JS | 无 React/Vue/npm,FastAPI 直接托管静态文件 |
| Canvas 2D | 图谱力导向/同心分层/职级分带/时序四种布局渲染、趋势图、雷达图、甘特图 |
| 自研设计系统 | 设计 token(主色 #2f54eb)、组件库(按钮/tag/卡片/抽屉/弹窗/分段控件)、内联 SVG 图标 |
| sysDialog 组件族 | 统一系统弹窗(sysPrompt/sysConfirm/sysAlert/sysCopy),替代浏览器原生弹窗 |
| cnFetch | 统一网络层:业务化中文错误、屏蔽内部细节、原位重试 |
| localStorage/sessionStorage | 视图状态、备注、学习记录、引导标记缓存 |
## 四、数据与存储
| 技术 | 用途 |
|---|---|
| 自研 TemporalKG(时序知识图谱) | 岗位-技能关系带生效区间/变更事件/证据源,任意时点切片 |
| JSON 快照(graph.json) | 图谱持久化与快速加载 |
| SQLite(标准库 sqlite3,WAL) | 应用状态库:审核留痕 audit_log、候选 review_candidates、任务 tasks、人工覆写 job_overrides |
| JSONL | JD 语料交换格式(jd_raw/、data/real/) |
| config.yaml + config.json | 静态配置 + 运行时设置(设置面板持久化,白名单键) |
| 文件系统 data/ | 语料/测试集/词表/简历/报告分目录治理 |
## 五、算法(全部纯 Python 自实现,无重型 ML 框架)
| 算法 | 实现 |
|---|---|
| MinHash LSH 近重复检测 | 256 哈希签名 + 5-gram shingles + 16 band 分带(抄袭 JD 聚簇) |
| 时间衰减加权 | w=exp(-λ·age),抑制 JD 时滞 |
| TF-IDF + 凝聚聚类 | 字符 2/3-gram 向量化、平均链接贪心合并(新岗位发现) |
| 时序演化分析 | 季度窗口加权频次对比 → 新增/增强/减弱/退出事件 |
| 新岗位四指标判定 | 支撑 JD 数/独立企业数/双年窗口增长率/与既有岗位差异度 |
| Kahn 拓扑分层 | 学习路径按技能前置关系分层 + 每阶段 ≤3 技能拆分 |
| 四维加权匹配评分 | 必备 50%/加分 15%/经验 20%/场景 15%,权重可配 |
| 技能归一化四级容错 | 词表别名 → 包含匹配 → 类别迁移 → BGE-M3 语义召回(阈值 0.62) |
| 简历解析 | 正则族 + 版面分节 + 脱敏(姓名/手机/邮箱/住址)+ 照片提取 |
## 六、AI 模型
| 模型 | 接入方式 | 用途 |
|---|---|---|
| 讯飞星火 Spark 4.0 Ultra | OpenAI 兼容 API(JSON 模式 + Schema 校验 + 失败重试 + 离线降级) | JD 结构化抽取主通道(密钥经设置面板注入) |
| BGE-M3 | sentence-transformers 本地权重(models/bge-m3,4.3GB) | 语义相似召回兜底(词表外技能映射) |
| 通义千问 text-embedding-v4 | DashScope OpenAI 兼容 API(可选替代本地权重) | 联网语义向量 |
| 离线确定性抽取器 | 技能词表 + 版面规则(无模型) | 全部 AI 通道的降级兜底 |
## 七、测试与评测
| 技术 | 用途 |
|---|---|
| pytest + pytest-cov | 77 个单元/接口/持久化测试,覆盖率 ≥80% |
| node 逻辑单测 | tests/test_frontend_logic.js(49 个前端纯函数用例) |
| 自研 evaluate.py | 三层指标:合成集(100%)/ 真实 JD(AutoWeakS,F1 99.8%)/ 真实简历(100%) |
| run_demo.py | 端到端冒烟(pipeline + 图谱 + 匹配示例) |
## 八、部署与运维
| 技术 | 用途 |
|---|---|
| Docker(python:3.11-slim) | 一体化镜像;`INCLUDE_EMBED=1` 可选语义增强变体 |
| docker-compose | app 编排 + Neo4j `advanced` profile(可选) |
| Neo4j 5 Community(可选) | 生产图数据库增强,scripts/sync_neo4j.py MERGE 幂等同步 |
| init.bat / init.sh | 一键初始化(venv + 依赖镜像站安装 + 离线默认配置 + 数据集生成) |
| start.bat / start.sh | 一键启动(项目内 venv 直起服务,自动开浏览器) |
| ModelScope | BGE-M3 权重国内镜像下载(设置面板一键配置管线) |
## 九、数据源
| 数据集 | 授权 | 用途 |
|---|---|---|
| AutoWeakS(北大/人大,arXiv:2012.14234) | 论文公开语料 | 真实 JD 语料(2915 条被动接入)+ 500 条真实评测集 |
| AIStudio 中文简历标注集 | CC0 | 200 份真实简历评测 |
| Chinese_resume 数据集 | 公开(研究用途) | 批量匹配演示简历(脱敏后 32 份) |
| ISCO/ESCO 国际职业分类 | EU 公开 | 岗位标准外部锚点 |
| 程序生成语料(seed=2026) | 自产 | 1720 条演示 JD、176 条测试集、词表 179 项、匹配标注 52 对 |
## 十、版本与协作
| 技术 | 用途 |
|---|---|
| Git + Gitea | 代码托管(`https://git.bu4.ren/RoyirinRosmontis/CareerNexus.git`) |
| .gitignore/.dockerignore | 数据内容、密钥配置、模型权重不入库/不进镜像 |
---
## 已评估未采用(及原因)
| 技术 | 未采用原因 |
|---|---|
| React/Vue + AntV G6 | 引入 npm 构建链,违背"零构建离线" |
| FAISS / BGE reranker / BM25 引擎 | 需模型权重或额外服务;词表归一化 + 透明加权已满足精度 |
| BERTopic / HDBSCAN | 重依赖;纯 Python TF-IDF + 凝聚聚类可复现且足够 |
| GLiNER | 重型 NER 模型;离线确定性抽取器更轻且确定性更强 |
| RAGAS | 需在线评测框架;evaluate.py 字段级 F1 + 真实数据集评测已覆盖 |
| PostgreSQL | 单机演示规模用不上;SQLite 零配置,存储边界已隔离可随时切换 |