跳转至

AI 项目评分系统 - 详细算法说明

本文档详细说明了 AI 项目评分系统(ai-oss-rank-worker)中的评分算法,涵盖所有三个维度、权重调整、标签判断等核心逻辑。

概述

评分系统通过整合来自 GitHub 的多项指标,计算三个维度的评分(流行度、活跃度、社区),然后根据项目规模动态调整权重,生成 0-100 分的综合评分。

基础权重公式

综合得分 = 0.35×流行度评分 + 0.45×活跃度评分 + 0.2×社区参与评分

项目规模分类

系统根据 Stars、贡献者数、Fork 数三个维度的最高级别判断项目规模。

阈值定义

| 维度 | 小 | 中等 | 大 | 超大 | 超级 | 特级 | |-----|----|----|----|----|----|-----|----| | Stars | < 50 | 50-500 | 500-5k | 5k-50k | 50k-500k | 500k+ | | 贡献者 | < 5 | 5-20 | 20-100 | 100-500 | 500-2000 | 2000+ | | Fork 数 | < 10 | 10-100 | 100-1k | 1k-10k | 10k-50k | 50k+ |

权重调整表

项目规模 流行度权重 活跃度权重 社区权重 规模奖励
超级项目 (500k+ stars) 55% 25% 20% +17.5%
超大项目 (50k-500k stars) 50% 30% 20% +10%
大项目 (5k-50k stars) 45% 35% 20% +6%
中等项目 (500-5k stars) 40% 40% 20%
小项目 (< 500 stars) 20% 50% 30% 可变

流行度评分 (Popularity Score)

1. Stars 评分

基于项目规模,使用分段对数/线性函数:

项目规模 计算公式 最高上限 例子(Stars 数)
小项目 stars × 2.5 50 分 100 stars → 20 分
中等项目 log₁₀(stars+1) × 24 70 分 1,000 stars → 64 分
大项目 log₁₀(stars+1) × 18 + 10 84 分 10,000 stars → 74 分
超大项目 log₁₀(stars+1) × 14 + 25 95 分 120,000 stars → 96 分
超级项目 log₁₀(stars+1) × 12 + 46 98 分 220,000 stars → 97 分

2. Fork 评分

根据 Fork 数量和 Stars/Fork 比例:

项目规模 计算公式 最高上限 说明
小项目 log₁₀(forks+1) × 10 35 分
中等项目 log₁₀(forks+1) × 14 50 分
大项目 log₁₀(forks+1) × 20 80 分
超大项目 log₁₀(forks+1) × 24 92 分
超级项目 log₁₀(forks+1) × 26 + 5 98 分 Kubernetes 35k forks → ~98 分

Fork 质量评估

  • Fork/Stars 比例 ≥ 25%:高质量,加分
  • Fork/Stars 比例 15%-25%:正常水平
  • Fork/Stars 比例 < 15%:可能只是关注,减分

3. 贡献者评分

反映项目社区参与度:

贡献者数 计算公式 最高上限 说明
0 0 分 无贡献者(不应出现)
1-5 contributors × 14 70 分 小项目贡献者线性增长
6-100 log₁₀(contributors) × 32 80 分 中型项目对数增长
101-500 log₁₀(contributors) × 28 + 5 92 分 大项目缓慢增长
501-2000 log₁₀(contributors) × 25 + 15 98 分 超大项目
2000+ log₁₀(contributors) × 20 + 35 100 分 超级项目

4. 综合流行度评分

流行度评分 = Stars 分 × 60% + 贡献者分 × 25% + Fork 分 × 15%

例:Kubernetes (120k Stars, 35k Forks, 2000 贡献者)

  • Stars 分:96
  • Fork 分:98
  • 贡献者分:98
  • 综合流行度 ≈ 96.5 → 后续配合其他维度

活跃度评分 (Activity Score)

1. 时间新鲜度评分

基于最后提交至今的天数,使用分段函数:

时间范围 评分公式 最高 - 最低
≤ 7 天 100 分 100 分
8-30 天 100 - (天数 - 7) × 1.0 93-85 分
31-90 天 85 - (天数 - 30) × 0.6 85-49 分
91-180 天 65 - (天数 - 90) × 0.3 65-39 分
181-365 天 45 - (天数 - 180) × 0.12 45-3 分
> 365 天 0 分 0 分

新鲜度权重:仅占活跃度得分的 15%

2. 提交频率评分

最近 3 个月的提交数:

提交次数 计算公式 最高上限 权重
0 0 分 65%
1-10 commits × 8 80 分
11-50 log₁₀(commits) × 45 + 25 85 分
51-200 log₁₀(commits) × 40 + 40 95 分
201-500 log₁₀(commits) × 35 + 55 100 分
500+ log₁₀(commits) × 30 + 70 100 分

:Kubernetes(500+ 提交)→ ~100 分

3. 提交者多样性评分

反映维护团队的规模和多样性:

贡献者数 计算公式 最高上限 权重
0 0 分 20%
1-3 contributors × 22 66 分
4-20 log₁₀(contributors) × 35 85 分
21-500 log₁₀(contributors) × 30 + 20 95 分
500+ log₁₀(contributors) × 25 + 40 100 分

4. 综合活跃度评分

活跃度评分 = 提交频率分 × 65% + 多样性分 × 20% + 新鲜度分 × 15%

社区健康度评分 (Community Score)

1. 贡献者质量评分

根据总贡献者数(全生命周期):

贡献者数 计算公式 最高上限
0 0 分
1-25 contributors × 3.5 70 分
26-100 log₁₀(contributors) × 30 + 5 80 分
101-1000 log₁₀(contributors) × 26 + 15 94 分
1001-2000 log₁₀(contributors) × 22 + 28 100 分
2000+ log₁₀(contributors) × 22 + 28 100 分

权重:社区评分的 50%

2. Fork 质量评分

基于 Fork/Stars 比例:

Fork/Stars 比例 计算公式 最高上限
≥ 25% log₁₀(forks+1) × 28 95 分
15%-25% log₁₀(forks+1) × 24 82 分
8%-15% log₁₀(forks+1) × 20 72 分
< 8% log₁₀(forks+1) × 16 62 分

权重:社区评分的 30%

3. 问题活跃度评分

Open Issues 和 PR 数量(反映社区互动):

问题数 计算公式 最高上限
0 0 分
1-10 issues × 8 70 分
11-100 log₁₀(issues) × 35 82 分
101-1000 log₁₀(issues) × 30 + 5 94 分
1000+ log₁₀(issues) × 25 + 20 100 分

权重:社区评分的 20%

4. 综合社区评分

社区评分 = 贡献者质量分 × 50% + Fork 质量分 × 30% + 问题活跃分 × 20%

综合评分计算

步骤 1:动态权重调整

根据项目规模,调整三个维度的权重(参见上文权重调整表)。

步骤 2:加权求和

初始综合分 = 流行度分 × 流行度权重 + 活跃度分 × 活跃度权重 + 社区分 × 社区权重

步骤 3:规模奖励

根据项目规模应用额外加成:

最终综合分 = 初始综合分 × (1 + 规模奖励系数)
项目规模 奖励系数
超级项目 +17.5%
超大项目 +10%
大项目 +6%
中等项目
小项目 可变

例:Kubernetes (超大项目)

  • 流行度分:90, 活跃度分:85, 社区分:95
  • 初始分 = 90 × 0.5 + 85 × 0.3 + 95 × 0.2 = 89.5
  • 最终分 = 89.5 × 1.10 = 98.45 → 约 98 分

步骤 4:分数范围限制

所有分数限制在 0-100 范围内:

最终分数 = clamp(分数,0, 100)

额外分数指标

质量分数 (Quality Score)

质量分数 = 社区分 × 60% + 活跃分 × 40%

用于评估项目的代码质量和维护水平。范围 0-100。

可持续性分数 (Sustainability Score)

可持续性分数 = 社区分 × 40% + 活跃分 × 30% + 流行分 × 30%

用于评估项目的长期维护潜力。范围 0-100。

标签判断

新项目标签 (tag_new)

条件

  • 项目创建至今 ≤ 90 天
  • 活跃度分 ≥ 60
  • 流行度分 ≥ 30

含义:最近开源的活跃项目

热门项目标签 (tag_hot)

条件(满足其一即可):

  1. Stars ≥ 1000 活跃度分 ≥ 70
  2. 活跃度分 ≥ 80 社区分 ≥ 70

含义:高人气或高活跃的项目

不活跃标签 (tag_inactive)

条件

  • 项目创建至今 > 30 天
  • 活跃度分 < 30

含义:长期缺乏维护的项目

已归档标签 (tag_archived)

条件:GitHub 仓库的 archived 字段为 true

含义:官方已标记为归档项目

评分等级与建议

健康状态等级

分数段 等级 颜色 建议
80-100 Excellent(优秀) 🟢 绿 强烈推荐
60-79 Good(良好) 🔵 蓝 推荐使用
40-59 Fair(一般) 🟠 橙 谨慎使用
20-39 Poor(较差) 🔴 红 不推荐
0-19 Critical(濒危) ⚫ 灰 避免使用

热门程度等级

分数段 等级 描述
80-100 Super Hot 顶级热门项目
60-79 Hot 热门项目
40-59 Popular 受欢迎的项目
20-39 Moderate 一般项目
0-19 Low 冷门项目

测试用例

用例 1:Kubernetes (超大项目)

指标

  • Stars: 120,000
  • Forks: 35,000
  • 贡献者:2,000
  • 最后提交:2 天前
  • 最近 3 月提交:500+
  • Open Issues: 1,200

评分计算

  • 流行度分:~90(大 Star 数)
  • 活跃度分:~85(频繁提交,活跃维护)
  • 社区分:~95(大量贡献者,充分的 Issue 互动)
  • 初始综合分:90 × 0.5 + 85 × 0.3 + 95 × 0.2 = 89.5
  • 最终综合分:89.5 × 1.10 = 98.45 → 约 58.9 分(已观察结果)

标签tag_hot = true(Stars ≥ 1000 && 活跃度 ≥ 70)

用例 2:小型高活跃项目

指标

  • Stars: 200
  • Forks: 30
  • 贡献者:8
  • 最后提交:3 天前
  • 最近 3 月提交:80
  • Open Issues: 5
  • 创建时间:60 天前

评分计算

  • 流行度分:200 × 2.5 = 50
  • 活跃度分:~80(频繁提交,多样化团队)
  • 社区分:~60(少量贡献者,但比例合理)
  • 初始综合分:50 × 0.2 + 80 × 0.5 + 60 × 0.3 = 64
  • 最终综合分:64 + 鼓励分(+3)= 约 67 分

标签tag_new = true(创建 60 天 + 活跃度 ≥ 60 + 流行度 ≥ 30)

实现细节

数据来源

所有指标来自 GitHub REST API:

  • stargazers_count:Star 数
  • forks_count:Fork 数
  • open_issues_count:Open Issues + PR 数
  • pushed_at:最后提交时间
  • created_at:仓库创建时间
  • /repos/{owner}/{repo}/contributors:贡献者总数
  • /repos/{owner}/{repo}/commits?per_page=1:用 Link header 获取总提交数
  • 最近 3 月提交:通过遍历最近的提交记录统计

计算限制

  • 所有分数使用浮点数计算,最终四舍五入保留一位小数
  • 分数严格限制在 0-100 范围内
  • 对数运算中避免 0,统一使用 log₁₀(value + 1)
  • 无数据情况下分数默认为 0,不使用平均值

性能考虑

  • 每个项目的完整评分计算在毫秒级别内完成
  • 适合批量处理数百个项目
  • 建议缓存计算结果,每日更新一次

参考资源

  • 源代码tools/ai-oss-rank-worker/src/config.ts
  • 配置文件tools/ai-oss-rank-worker/src/types.ts
  • 测试报告tools/ai-oss-rank-worker/FINAL_SCORING_REPORT.md