Gradio 用户数突破 100 万的历程!
五年前,我们推出了 Gradio,这是一个简单的 Python 库,旨在让斯坦福大学的研究人员能够轻松地通过 Web 界面演示计算机视觉模型。
如今,Gradio 每月被超过 100 万开发者用于构建和分享 AI Web 应用。这其中包括一些有史以来最受欢迎的开源项目,例如 Automatic1111、Oobabooga 的文本生成 WebUI、Dall-E Mini 和 LLaMA-Factory。
我们是如何走到这一步的?Gradio 是如何在竞争激烈的开源 Python 库领域保持增长的?我经常收到那些正在构建自己的开源库的人提出的这个问题。这篇文章总结了我过去几年学到的一些经验。
- 投资于良好的原语,而非高级抽象
- 将病毒式传播直接嵌入到你的库中
- 专注于一个(不断增长的)利基市场
- 你唯一的路线图应该是快速迭代
- 最大化用户消费你库输出的方式
1. 投资于良好的原语,而非高级抽象
当我们最初推出 Gradio 时,我们只提供了一个高级类(gr.Interface
),它可以从单个 Python 函数创建一个完整的 Web 应用。我们很快意识到开发者希望创建其他类型的应用(例如,多步骤工作流、聊天机器人、流媒体应用),但当我们开始列出用户想要构建的应用时,我们意识到我们需要做什么:向下探究。
我们没有构建许多高级类来支持不同的用例,而是构建了一个名为 Gradio Blocks 的低级 API,它允许用户从模块化组件、事件和布局组装应用程序。尽管使用起来通常需要更多工作,但今天的 gr.Blocks
占据了 Gradio 80% 的使用量——包括上述高度流行的应用程序。
对于一个小型团队来说,专注于低级抽象必然意味着我们无法追逐许多诱人的高级抽象。但这种专注使我们避免了两个常见的陷阱:
定制-维护陷阱:高级抽象易于使用,但用户会请求额外的参数来定制它们,这反过来导致维护负担增加,因为每个抽象和参数都需要实现、维护和测试以避免错误。
生产力幻觉:使用高级抽象看起来工作量较少,直到用户需要不支持的功能(这在项目开始时很难预测),迫使开发者进行代价高昂的重写。
第一个问题浪费了我们作为 Gradio 维护者的时间,而第二个问题浪费了我们用户的时间。直到今天,Gradio 只包含两个高级抽象(gr.Interface
和 gr.ChatInterface
),它们本身都是用 Blocks 构建的。
在 AI 辅助编码时代,拥有良好原语的优势更加显著,我们发现 LLM 通常善于通过文档并利用原语构建复杂的应用程序(例如,看看所有用 three.js
构建的游戏)。如果 AI 为你编写代码,编写低级代码并不会花费太多额外时间。
2. 将病毒式传播直接嵌入到你的库中
你的库最好的“大使”不是你,而是一个热心的用户。因此,你应该找到方法让用户在他们的工作流程中分享你的库或其产品。Gradio 的早期增长得益于我们的“分享链接”功能(它可以用一行代码为你的 Gradio 应用创建一个临时公共链接)。Gradio 用户无需担心打包或在具有适当计算能力的 Web 服务器上托管他们的代码,就可以立即与同事分享他们的应用。
加入 Hugging Face 后,我们还受益于成为 Hugging Face Spaces 的标准 UI——被机器学习研究社区广泛使用。最受欢迎的 Spaces 吸引了数百万访客,使开发者接触到 Gradio,他们反过来又分享和构建了自己的 Gradio 应用,并使用相同的 Spaces(其代码是公开的)作为学习如何使用 Gradio 的资源。
3. 为一个(不断增长的)利基用例而构建
早期,我们面临一个关键决定:Gradio 应该是一个通用 Python Web 框架,还是应该专注于构建机器学习 Web 应用?我们选择了后者,这带来了天壤之别。
在拥挤的 Python Web 库生态系统中,我们经常被问到:“Gradio 与 X 有何不同?”我们简洁的答案——Gradio 针对机器学习 Web 应用进行了优化——令人难忘且基本准确。每个 Gradio 应用都附带特别适合 ML 工作流的功能,例如内置队列,即使有数千并发用户也能高效管理长时间运行的 ML 任务。我们设计的组件专门针对 ML 用例。另一方面,很长一段时间以来,Gradio 甚至不包含像链接按钮这样的功能,仅仅是因为我们的核心用户从不需要它。通过缩小我们的关注点,Gradio 迅速成为机器学习开发者的首选——默认的“AI 用户界面”。
当然,我们选择了一个本身正在增长的利基市场,这让我们受益匪浅。最近推动所有 AI 相关事物的逆风极大地帮助了我们,如果我们专注于数据科学或仪表板等领域,我们可能不会经历同样的增长。
4. 你唯一的路线图应该是快速迭代
与其他一些库不同,Gradio 不发布路线图。相反,我们跟踪机器学习领域的新兴趋势并相应地发布。在开源软件(尤其是 AI)中,根据社区需求发布功能(并弃用不再需要的功能)是持续增长的关键。作为一个具体的例子,在 Gradio 的早期版本中,我们构建了特定功能,允许开发者显示其机器学习模型的“解释”——因为这在 2020-21 年间是一个非常流行的用例。随着对解释的兴趣减弱,我们弃用了此功能,并将精力投入到音频/视频流和聊天相关功能中。
我们的内部流程也是去中心化的。Gradio 团队的 11 名工程师和开发者倡导者都被鼓励识别有影响力的想法,快速原型制作,并通过 GitHub、Hugging Face 和社交媒体直接与开源社区互动。每个团队成员都会将这些想法带回团队,我们会不断地围绕哪些想法可能产生影响来建立和重建共识,因为我们会不断地朝着最有影响力的方向发展。
5. 最大化用户消费你库输出的方式
当你创建一个 Gradio 应用并“launch()”它时,你会在浏览器中得到一个 Web 应用。但这还不是全部——你还会得到每个 Python 函数的 API 端点,以及为每个端点自动生成的文档。这些端点可以通过我们团队构建的 Python 或 JavaScript 客户端消费,也可以直接使用 cURL。
我们这样做是因为我们希望开发者使用 Gradio 的每一分钟都尽可能有用。一个 Gradio 应用应该在本地运行或无需任何代码更改即可部署到 Hugging Face Spaces 或你自己的服务器上,或者以编程方式集成到更大的应用程序中,甚至通过 MCPs 被 AI 代理利用(很快会详细介绍!)。通过专注于最大化的可用性,我们希望开发者能够继续从 Gradio 库中获得越来越多的价值。
向 1000 万用户进发!