diff --git a/blog/2025-2-6-openleaderboard-monthly-report/index.mdx b/blog/2025-2-6-openleaderboard-monthly-report/index.mdx new file mode 100644 index 0000000..cb03073 --- /dev/null +++ b/blog/2025-2-6-openleaderboard-monthly-report/index.mdx @@ -0,0 +1,65 @@ +--- +title: OpenLeaderboard 开源生态数据洞察(2025.2) +authors: [zsy, ww] +slug: 2025-2-6-openleaderboard-monthly-report +--- + +import SimpleECharts from '@site/src/components/SimpleECharts'; + +> OpenRank 指标是对工信部电子标准院的“信息技术 开源治理”系列标准中评价指标的开源实现,能够有效反映开源项目在开发者中的协作影响力,从而帮助我们了解开源世界,发现开源趋势,洞察开源事件。 + +## DeepSeek 系列大模型发布,震动全球 + +2025 年 1 月 20 日,中国人工智能公司 DeepSeek 发布的 R1 系列大模型引发全球 AI 行业震动。该模型以低成本、高性能和开源特性为核心,该事件不仅在短期内对美国金融市场造成了巨大冲击,同时对大模型发展的技术路线、行业格局及地缘政治将产生深远影响。因此本期洞察报告将从 DeepSeek 的全系列模型切入,进行一次较完整的专栏式数据解析。 + +### 数据事实 + +2025 年 1 月 20 日 DeepSeek 发布 R1 推理模型,同日 GitHub 仓库开源,后续 1 月 28 日发布 Janus Pro 多模态大模型,这两个模型以其低成本高性能引爆全球。自 R1 模型发布以来,截止到 2 月 6 日,DeepSeek 官方 GitHub 组织获得新增 Star 数总计超 15 万,活跃开发者数量 1679 人。DeepSeek 组织有 5 个仓库在 2025 年 1 月进入中国 OpenRank 仓库榜 Top 300,DeepSeek-R1 仅开源 10 天强势空降至中国第 62 位。DeepSeek 在 OpenRank 企业榜单中在 2025 年 1 月达到 207 分,快速上升至全球第 86 位以及中国第 13 位。 + +### 详情分析 + +下图给出了 DeepSeek 的 GitHub 账号下 Star 增长最快的 5 个仓库的 Star 每日变化情况。可以看到,在 20 日 DeepSeek-R1 发布后,开发者有了迅速的响应,其仓库在 20 日当天就有 2k+ 增长,而直至 26 日间每日均有 2k - 4k 的 Star 增长,此时其他仓库,如基座模型 V3 等尚无明显变化。后续真正的爆发点来自于 27 日美股因 DeepSeek-R1 的发布与后续数日的验证和口碑出现了暴跌,NVIDIA 当日收盘跌幅达 17%,金融市场的冲击导致 DeepSeek-R1 彻底出圈,并同时带火了其基座模型 V3 以及在 28 日发布的多模态模型 Janus Pro。1 月 28 日当日 V3、R1 的 Star 增长均超过 10k,而 Janus 仓库也有 4k+ 的增长。之后增长逐渐趋缓,而 2 月 5 日春节复工后又迎来了一波小幅的增长。 + + + +下图给出了这段时间内 Star 增长的来源国家与地区的分布比例情况,据 OpenDigger 数据显示,这段时间内增长的 15 万 Star 来自全球 185 个国家和地区,几乎覆盖所有主要国家和地区。从数据上来看,1 月 20 日 R1 模型发布后,当日 Star 增长来自 82 个国家,其中来源最多的国家为美国,占比 28%,远超中国的 17.4%,可见其敏锐的科技嗅觉。后续全球各地区的开发者快速响应,在 28 日前,如印度、德国等的开发者响应速度明显较快,28 日当天其全球影响力达到巅峰,当日增长来源于全球 149 个国家,而后巴西、韩国等国的大量开发者也迅速加入。而 2 月 5 日的增长则八成以上来自中国,也证明当日增长应该主要因春节复工导致。 + + + +下图给出了整体增长中各国的开发者的占比情况,中国依然以 24.4% 排名第一,美国 15.7% 紧随其后,之后的开发者最多的十个国家为:印度、巴西、德国、英国、加拿大、韩国、法国、日本、印度尼西亚和澳大利亚。而非洲开发者关注数量最多的几个国家也为互联网化程度最高的几个国家,如尼日利亚、埃及、南非、肯尼亚及阿尔及利亚等。 + + + +虽然作为大模型,DeepSeek 系列模型的主要使用与下载发生在 HuggingFace、魔搭等模型托管平台,但 GitHub 依然承担了一大部分论坛的作用,有大量开发者在 GitHub 进行讨论与问答,数量远高于 HuggingFace 社区中的讨论量。我们也从这段时间在 DeepSeek-R1 和 V3 仓库中活跃的开发者在过去半年的全域活跃情况进一步分析一下 DeepSeek 吸引了哪些领域的开发者参与到了讨论之中。 + +下图给出了 DeepSeek 组织中 OpenRank 贡献度的全球分布情况,从参与者的贡献度情况而言,可以看到中美处于第一梯队,后续新加坡、印度、德国、英国、巴西、波兰处于第二梯队,而法国、澳大利亚、以色列、意大利、加拿大处于第三梯队。值得注意的是,虽然新加坡的开发者数量并不占优,在开发者来源的数量分布中相对靠后,但在贡献度层面则紧随中美之后排在第三,而以色列近年来科技产业的崛起在这个数据中也得到了显现。 + + + +更详细的数据显示,DeepSeek 吸引到了大量在过去半年中深耕大语言模型领域的开发者和爱好者。如 LiteLLM(OpenRank 193)的创始人和 CEO Krish Dholakia([@krrishdholakia](https://github.com/krrishdholakia))、SGLang(OpenRank 180)的核心维护者 Yineng Zhang([@zhyncs](https://github.com/zhyncs))、Promptfoo(OpenRank 46) 的核心维护者 Michael([@mldangelo](https://github.com/mldangelo))、avante.nvim(OpenRank 57)的作者 yetone([@yetone](https://github.com/yetone)),Mem0 AI(OpenRank 31) 的联合创始人 Dev-Khant([@Dev Khant](https://github.com/Dev-Khant))、LangBot 的作者 Junyan Qin([@RockChinQ](https://github.com/RockChinQ))、ChatHub 的作者 wong2([@wong2](https://github.com/wong2))等等。当然也包含一些在企业中做 AI 相关业务的负责人,如来自微软的 PowerShell 团队 AIShell 项目的 Dongbo Wang([@daxian-dbw](https://github.com/daxian-dbw))、来自 Intel 的 AutoAround 团队的 Wenhua Cheng([@wenhuach21](https://github.com/wenhuach21))等。 + +通过上述清单也可以看到,中国和印度确实在这波大语言模型的浪潮中开始崭露头角并深度交流协同,而北美的开发者可能更多在使用 DeepSeek 却没有太多加入到真正的讨论之中,即便是一些美国企业也是在美华人参与的更多一些,我们也希望未来可以看到更多北美开发者可以深入参与到讨论协作之中。 + +### 作者点评 + +DeepSeek 系列大模型的发布,无疑是2025年初全球人工智能领域的一颗重磅炸弹。从 OpenDigger 数据来看,DeepSeek 的多个 GitHub 仓库在 R1 发布后的两周内就获得了超过 15 万 Star,活跃开发者近 1700 人,显示了全球开发者对这一创新成果的高度认可,也使得 DeepSeek 的 OpenRank 值产生了阶跃式的增长。 + +尽管 HuggingFace 和魔搭等平台承担了大部分模型托管功能,GitHub 依然成为了 DeepSeek 开发者讨论和交流的重要阵地,对 GitHub 数据的分析我们可以看到: + +- 从日增 Star 的来源来看,美国开发者依然具有极强的科技敏感度,在 DeepSeek-R1 模型发布初期其响应速度甚至快于中国开发者。 +- OpenRank 贡献度分布数据显示,新加坡、印度等开发者在此次 AI 浪潮中不仅扮演着重要角色,而且他们也更愿意和中国的开发者建立连接,不少的印度 AI 初创企业的创始人或合伙人深度参与到了 DeepSeek 的模型讨论之中。 +- 更详细的数据可以看到,虽然北美开发者关注数量较多,但从参与讨论贡献的情况来看,更多的美国开发者可能主要还是以使用和观望为主,参与深入讨论协同的开发者也多以华人为主。 + +通过上述分析,我们可以看到 DeepSeek 不仅在技术上取得了巨大成功,更在行业和社会层面产生了深远影响,吸引着全球开发者深度参与到人工智能的开发进步之中。期待 DeepSeek 在未来继续引领全球 AI 技术的发展,为人类社会带来更多可能性。 diff --git a/package-lock.json b/package-lock.json index 4a6fc6c..1ee3065 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "axios": "^1.7.2", "clsx": "^2.1.1", "docusaurus-plugin-image-zoom": "^2.0.0", - "echarts": "^5.5.1", + "echarts": "4.9.0", "echarts-for-react": "^3.0.2", "katex": "^0.16.11", "lodash": "^4.17.21", @@ -8046,12 +8046,11 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/echarts": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", - "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-4.9.0.tgz", + "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==", "dependencies": { - "tslib": "2.3.0", - "zrender": "5.6.0" + "zrender": "4.3.2" } }, "node_modules/echarts-for-react": { @@ -8067,11 +8066,6 @@ "react": "^15.0.0 || >=16.0.0" } }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", @@ -21646,17 +21640,9 @@ } }, "node_modules/zrender": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", - "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", - "dependencies": { - "tslib": "2.3.0" - } - }, - "node_modules/zrender/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-4.3.2.tgz", + "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==" }, "node_modules/zwitch": { "version": "2.0.4", diff --git a/package.json b/package.json index 545297a..e6899e0 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "axios": "^1.7.2", "clsx": "^2.1.1", "docusaurus-plugin-image-zoom": "^2.0.0", - "echarts": "^5.5.1", + "echarts": "4.9.0", "echarts-for-react": "^3.0.2", "katex": "^0.16.11", "lodash": "^4.17.21", diff --git a/src/components/SimpleECharts/index.tsx b/src/components/SimpleECharts/index.tsx index 8f0dea7..2051101 100644 --- a/src/components/SimpleECharts/index.tsx +++ b/src/components/SimpleECharts/index.tsx @@ -2,16 +2,13 @@ import React, { useEffect, useState } from 'react'; import ReactECharts from 'echarts-for-react'; import { merge } from 'lodash'; import { useColorMode } from '@docusaurus/theme-common'; -import echarts from 'echarts'; +import 'echarts/map/js/world'; export default (props: any): JSX.Element => { const { option, divStyle } = props; const [usedOption, setUsedOptions] = useState({}); const { colorMode } = useColorMode(); - const barColors = ['#3366FF']; - const lineColors = ['#83D328']; - useEffect(() => { const updateOptions = () => { const rootStyles = getComputedStyle(document.documentElement); @@ -20,7 +17,7 @@ export default (props: any): JSX.Element => { const defaultOption: any = { title: { left: 'center', - textStyle: { color: fontColor }, + textStyle: { color: fontColor, fontSize: 12 }, }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, formatter: function (params) { @@ -51,7 +48,6 @@ export default (props: any): JSX.Element => { radius: ['40%', '60%'], center: ['50%', '60%'], avoidLabelOverlap: true, - itemStyle: { borderRadius: 10, borderColor: fontColor, borderWidth: 1 }, label: { position: 'outside', fontSize: 14, color: fontColor, formatter: '{b}: {c}' }, labelLine: { length: 10, length2: 10 }, emphasis: { label: { fontSize: 20, fontWeight: 'bold' } }, @@ -62,13 +58,7 @@ export default (props: any): JSX.Element => { label: { show: true, position: 'inside', formatter: '{b}: {c}' } }); } else if (s.type === 'bar') { - if (count < barColors.length) { - defaultOption.series.push({ - itemStyle: { color: barColors[count] }, - }); - } else { - defaultOption.series.push({}); - } + defaultOption.series.push({}); if (Array.isArray(option.xAxis)) { defaultOption.xAxis = Array.from({ length: option.xAxis.length }, axisStyle); @@ -81,23 +71,7 @@ export default (props: any): JSX.Element => { defaultOption.yAxis = axisStyle(); } } else if (s.type === 'line') { - if (count < lineColors.length && !s.itemStyle?.color) { - defaultOption.series.push({ - itemStyle: { color: lineColors[count] }, - areaStyle: { - color: { - type: 'linear', - x: 0, y: 0, x2: 0, y2: 1, - colorStops: [ - { offset: 0, color: lineColors[count] }, - { offset: 1, color: 'rgba(255, 255, 255, 0)' } - ] - } - }, - }); - } else { - defaultOption.series.push({}); - } + defaultOption.series.push({}); if (Array.isArray(option.xAxis)) { defaultOption.xAxis = Array.from({ length: option.xAxis.length }, axisStyle);