Files
offerpai_backend/.kiro/specs/scoring-system-refactor/改造方案.md
T

5.9 KiB
Raw Blame History

评分体系改造方案

核心公式

MatchScore = Sedu × 30% + Sexp × 40% + Sskill × 30%


一、表结构改动

1. 新建表:bg_major_category(专业分类,三级树形)

create table bg_major_category (
    id        bigint      not null comment 'ID' primary key,
    name      varchar(50) not null comment '类型名称',
    root_id   bigint      not null comment '根节点ID,顶级=自身ID',
    parent_id bigint      not null comment '父级ID0=顶级',
    level     int         not null comment '层级 1=一级 2=二级 3=三级'
) comment '专业分类' row_format = DYNAMIC;

基于《教育部普通高等学校本科专业目录》建立层级索引,AI 将简历/岗位专业归一化到标准 ID。

2. bg_skill_tag — 改造

操作 字段 说明
删除 category_id 不再挂岗位分类
新增 name 唯一索引 去重用

定位从"人工预定义"变为"AI 提取自动入库"。提取技能时先查表去重,不存在则 insert,拿 ID 写关联表。

3. bg_job — 新增字段

字段 类型 备注
required_major_ids json 要求专业ID数组,关联 bg_major_category
major_sensitivity tinyint 专业敏感度 0=不限 1=优先 2=强制

4. bg_user_profile — 新增字段

字段 类型 备注
major_ids json 用户专业ID数组,关联 bg_major_category
school_rank tinyint 学校等级 1=C9/985/QS前50 2=211/双一流/QS前200 3=普通一本/QS前500 4=其他
company_prestige tinyint 公司背书 1=名企 2=普通实习 3=校内活动 4=无
experience_duration tinyint 经历时长 1=≥3月 2=1-3月 3=≤1月
role_depth tinyint 职责深度 1=主导/创新 2=执行/应用 3=辅助/学习
output_quality tinyint 量化产出 1=有量化结果 2=有具体产出 3=纯描述
honors json 荣誉/竞赛/论文,格式:{"national":[],"provincial":[],"school":[],"paper":[]}

以上字段全部不在前端展示,纯用于评分计算,由 AI 分析简历后写入。

5. bg_user_profile — 废弃字段

字段 说明
work_years 被经历质量维度替代
experience_industry_ids 行业前置过滤废除

6. 不变的表

  • bg_job_skill_tag_relation — 结构不变,数据来源从预定义标签变为 AI 自动入库标签
  • bg_user_profile_skill_tag_relation — 同上

二、评分算法

维度1:教育背景(Sedu)— 权重 30%

学校等级分(Srank)与专业相关度(Smajor)的权重由专业敏感度决定:

专业敏感度 公式 特殊规则
强制(2 Sedu = Srank × 0.4 + Smajor × 0.6 若 Smajor < 40Sedu = Sedu × 0.5
优先(1 Sedu = Srank × 0.6 + Smajor × 0.4
不限(0 Sedu = Srank × 1.0 Smajor 默认100,不减分

学校等级映射:1→100, 2→80, 3→60, 4→40

专业相关度(基于 bg_major_category 树形匹配):

  • 完全匹配(同三级专业)→ 100
  • 相关对口(同二级专业类)→ 70
  • 跨专业相关(同一级学科门类)→ 30
  • 不相关 → 0

维度2:经历质量(Sexp)— 权重 40%

Sexp = 公司背书 × 30% + 时长 × 10% + 经历深度 × 60%

公司背书映射:1→100, 2→60, 3→30, 4→0 经历时长映射:1→100, 2→60, 3→30

经历深度(60%)内部拆解:

子项 占比 说明
语义相关度 40% AI 判断经历与岗位方向的相关性
职责深度 25% 映射:1→100, 2→80, 3→40
量化产出 20% 映射:1→100, 2→70, 3→40
荣誉加分 15% 封顶累加制,总分不超过100

荣誉分值规则:

  • 国奖级(national):每项 +15-20
  • 省奖/大厂赛(provincial):每项 +8-10
  • 院校级/专业证(school):每项 +3-5
  • 顶刊顶会论文:每项 +15-20,普通论文:每项 +8-10

维度3:技能匹配(Sskill)— 权重 30%

废除产品方案中的向量距离、技能近亲表、分层技能池。

采用简化方案:

  • AI 自由提取技能 + prompt demo 约束颗粒度
  • 提取结果入 bg_skill_tag(去重),写关联表
  • 匹配时通过 skill_tag_id 做集合碰撞
  • 公式:Sskill = (匹配数量 / 岗位要求数量) × 100

三、数据清洗改造

岗位清洗(JobCleanService

改动:

  • 第二次 AI 调用从"预定义标签匹配"改为"自由提取 + prompt demo 约束"
  • 新增:提取要求专业 → 归一化到 bg_major_category ID
  • 新增:提取专业敏感度
  • 技能入库逻辑:查 bg_skill_tag 去重 → insert → 写关联表

用户简历分析(UserSkillTagMatchService

改动:

  • 可能简化为一次 AI 调用,直接从简历全文提取
  • 新增:识别学校等级、公司背书、经历时长、职责深度、量化产出、荣誉
  • 新增:提取用户专业 → 归一化到 bg_major_category ID
  • 技能入库逻辑同上

DictCacheService

  • 删掉 skillTagMap、getSkillTagText()、getSkillTagIds()
  • 新增:加载 bg_major_category 缓存(供专业归一化使用)

四、影响文件汇总

文件 改动
SkillTag.java 删 categoryId
Job.java 加 requiredMajorIds、majorSensitivity
UserProfile.java 加 7 个新字段,删 workYears、experienceIndustryIds
MajorCategory.java 新建 PO
MajorCategoryMapper.java 新建 Mapper
DictCacheService 删技能缓存,加专业缓存
JobCleanService 改技能提取 + 新增专业/敏感度提取
JobCleanTransactionService 改技能入库逻辑
UserSkillTagMatchService 大改,新增多维度识别
JobMatchService 重写,三维度算法全换
JobMatchScoreDto 改字段(教育/经历/技能)
JobDto / JobDetailDto matchScore 范围可能变化