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)¶
条件(满足其一即可):
- Stars ≥ 1000 且 活跃度分 ≥ 70
- 活跃度分 ≥ 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