首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Prodigy高效机器教学工具技术解析

Prodigy高效机器教学工具技术解析

原创
作者头像
用户11764306
发布2026-05-20 13:07:42
发布2026-05-20 13:07:42
1500
举报

Prodigy:一种用于实现极致高效机器教学的新工具

机器学习系统由代码和数据共同构建。代码易于复用,但数据难以重用,因此构建人工智能主要意味着进行数据标注。这本身是好事,因为示例数据正是你编程模型行为的方式——学习器本身实际上只是一个编译器。但当前用于创建示例数据的技术并不理想。因此,我们很高兴推出 Prodigy,一款可下载的、用于实现极致高效机器教学的工具。

为何不采用云端方案?

当有大量原始输入数据可供模型流式处理时,主动学习的效果最佳,这样可以选择更具信息量的示例进行标注。模型必须在标注过程中持续更新,并且更新需要针对每个用户进行个性化。这些问题固然可以开发出解决方案——但……何必呢?尽管SaaS对投资者很有吸引力,但只有当托管组件能增加价值而非削弱价值时,它才有意义。

Prodigy 通过让数据科学家自行进行标注来解决此问题,从而实现快速原型设计。想法测试的速度甚至可以快过第一次规划会议的安排。我们也期望 Prodigy 能够降低大型项目的成本,但我们最为兴奋的是其带来的敏捷性提升。

Prodigy 实现高效标注的方案

大多数标注工具避免向用户提供任何建议,以免对标注产生偏差。Prodigy 则采取相反策略:尽可能少地向用户提问,并尝试猜测其余部分。Prodigy 将模型置于循环之中,使其能够主动参与训练过程,并随着你的操作不断学习。模型利用已有知识来判断接下来该问你什么。在你回答问题的过程中,模型会不断更新,从而影响后续向你提问的示例选择。为了充分利用这一策略,Prodigy 以 Python 库和命令行工具的形式提供,并附带一个灵活的 Web 应用程序。此外,有一个可选且轻量的托管组件,用于方便地共享标注队列,但工具本身完全由你掌控。

Prodigy 内置了用于训练和评估文本分类、命名实体识别、图像分类和词向量模型的配方。此外,还有一个简洁的内置组件用于执行 A/B 评估,这在开发生成模型和翻译系统时特别有用。为尽可能降低系统要求,数据默认存储在 SQLite 数据库中。也很容易切换到其他 SQL 后端,或指定自定义存储方案。

通过在任何 Python 函数上添加 @recipe 装饰器,可以将各个组件组合成一个配方。该装饰器允许你从命令行调用函数,作为 prodigy 的子命令。配方可以通过返回一个组件字典来启动 Web 服务。配方系统在声明式与过程式方法之间取得了良好平衡。如果仅需组合内置组件,返回一个 Python 字典与等价的 JSON 表示相比,输入量并无增加。但 Python 函数也允许你实现更复杂的行为,并在多个配方之间复用逻辑。

代码语言:python
复制
# recipe.py
import prodigy
import your_arbitrary_ETL_logic

@prodigy.recipe('custom_stream', 
                dataset=("Dataset"), 
                db=("Database"), 
                label=("Label", "option"))
def custom_stream(dataset, db=None, label=''):
    DB = your_arbitrary_ETL_logic.load(db)
    return {
        'dataset': dataset,
        'stream': ({'text': row.text, 'label': label} for row in DB),
        'view_id': 'classification'
    }

基于 Prodigy 的用户体验驱动数据收集

当人与机器交互时,交互体验决定了交互的成败。大多数标注工具避免向用户提供建议,以免引入标注偏差。Prodigy 则采取相反策略:尽可能少地向用户提问。模型需要生成的结构越复杂,从 Prodigy 的二元交互界面中获得的收益就越大。Web 应用允许你直接在浏览器中标注文本、实体、分类、图像和自定义 HTML 任务——甚至在移动设备上也可使用。

人的时间和注意力是宝贵的。与其向标注者呈现一段包含实体的文本,要求他们高亮实体、从下拉列表中选择多个标签之一并确认,不如将整个交互过程拆解为简单的二元决策。为了获取同样的信息,你需要问更多问题,但每个问题都简单而聚焦。你会收集到更多的用户操作,从而获得许多可学习的小块信息,以及人与模型之间更紧密的反馈循环。

为什么机器学习系统需要标注示例

如今大多数人工智能系统依赖于监督学习:你提供带标签的输入-输出对,得到一个能够对新数据执行类似计算任务的程序。监督学习算法进步迅速,使许多人期待全新一代的完全无监督算法:这些算法如此“先进”,以至于无需你指定任何目标就能计算出你想要的结果。这无异于希望有一种极其先进的编程语言,让你甚至无需编写程序。

无监督算法基于数据的内在结构返回语义表示。根据定义,你无法直接控制该过程返回的结果。有时语义表示会直接回答某个有用的问题。如果你正在平台上寻找可疑活动,可能会发现异常检测过程就足够了。然而,无监督算法通常不会返回与你关心的标签精确对应的聚类。通过适当的特征权重,或许能构建一个更有用地对数据进行排序的模型,但手工完成这项工作效率低下——而这正是监督学习旨在解决的问题。

示例:文本分类

文本分类模型可训练用于执行多种实用任务,包括情感分析、聊天机器人意图检测、以及标记滥用或欺诈内容。文本分类的一个难题是:通常很难预估系统的准确表现。有些问题出人意料地简单,而另一些问题则非常困难,以至于需要重新设计预期功能。Prodigy 让你能够进行非常快速的原型设计,从而迅速判断哪些想法值得进一步探索。

工作流与数据集

Prodigy 入门

代码语言:bash
复制
prodigy textcat.print-stream "docs" --api github --label DOCS | less -r

自定义配方

子命令系统完全可扩展。你只需在函数上添加 @recipe 装饰器,即可从命令行调用它。要启动标注服务器,配方只需返回一个组件字典,如示例流、标注界面,以及用于更新和保存模型的可选回调函数。

现在开始标注。首先初始化一个新的数据集,并添加简短描述以备将来参考。下一个命令启动标注服务器。textcat.teach 子命令告诉 Prodigy 运行内置的配方函数 teach(),使用命令行中提供的其余参数。

代码语言:bash
复制

Prodigy 在标注过程中会根据你提供的答案训练模型。这使得 Prodigy 能够对流中的示例进行排序,从而减少冗余问题。从流式数据中学习是一个棘手的问题,因此通常在收集完所有标注后,从头开始训练一个新模型能获得更好的结果。这也可以让你更详细地研究模型,并尝试不同的超参数。

决策

数量

accept

261

reject

525

ignore

44

total

830

代码语言:bash
复制

默认情况下,Prodigy 使用某开源库 v2.0 的新文本分类系统(当前为 alpha 版本)。该模型是一个卷积神经网络叠加一元词袋模型。词袋模型学习速度快,而卷积网络在获得几百个示例后可以从更长的短语中捕捉线索。

使用 Prodigy 采用不同的文本分类策略非常容易。如果你想继续使用该开源库,只需将新的模型实例传递给 TextClassifier 组件即可。对于完全自定义的 NLP 解决方案,你只需要提供两个函数:一个用于为文本分配分数,另一个用于在新一批示例上更新模型。如果你的文本分类解决方案仅支持批量训练,可以在标注期间使用内置模型,然后导出标注数据,单独训练你的解决方案。

评估模型

通过使用更少的示例重新训练系统,可以了解随着更多数据被标注,系统将如何改进。

代码语言:bash
复制

%

准确率

增量

25%

0.73

+0.73

50%

0.82

+0.09

75%

0.84

+0.02

100%

0.87

+0.03

曲线解读

表中的每一行展示了一个实验:模型在 20% 的数据上进行评估,并在剩余示例的子集上训练。这让你能够看到数据集大小与准确率之间的关系,从而预测收集更多标注后准确率可能提升多少。

训练曲线显示了使用 10%、25%、50% 和 75% 的训练数据所达到的准确率。最后 25% 的训练数据带来了 3% 的准确率提升,表明进一步的训练将改进系统。类似的逻辑用于估计训练过程中的进度指示。

导出和使用模型

训练完模型后,Prodigy 输出一个可直接使用的模型,便于投入生产环境。该库附带一个便捷的 package 命令,可将模型目录转换为 Python 包,从而允许在 requirements.txt 中指定数据依赖项。这提供了从原型到生产的平滑路径,使得在更大系统的上下文中真正测试模型变得容易。

模型训练与打包

代码语言:bash
复制
spacy package /tmp/gh_docs /tmp
cd /tmp/gh_docs
python setup.py sdist
pip install dist/gh_docs-1.0.0.tar.gz

在 v2.0.0 alpha+ 中的使用

代码语言:python
复制
import gh_docs
nlp = gh_docs.load()
texts = ['missing documentation', 
         'docker container not loading', 
         'installation not working on windows']
for doc in nlp.pipe(texts):
    print(doc.cats)

# {'DOCS': 0.9812000393867493}
# {'DOCS': 0.005252907983958721}
# {'DOCS': 0.0033084796741604805}

如果标注项目启动成本高昂,你只能猜测哪些想法看起来有前景。这些猜测常常是错误的,因为在收集数据之前很难预测统计模型的性能。Prodigy 通过大幅降低验证新想法的成本,帮助你突破这一瓶颈。使用 Prodigy,整个标注过程成本更低,但最重要的是获得首个证据的时间缩短了。不乏那些一旦能够实现就会极具价值的想法。真正稀缺的是用于验证这些机会的时间——而这正是 Prodigy 能为你提供的更多资源。FINISHED

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Prodigy:一种用于实现极致高效机器教学的新工具
    • 为何不采用云端方案?
    • Prodigy 实现高效标注的方案
    • 基于 Prodigy 的用户体验驱动数据收集
    • 为什么机器学习系统需要标注示例
    • 示例:文本分类
      • 工作流与数据集
    • Prodigy 入门
      • 自定义配方
    • 评估模型
      • 曲线解读
    • 导出和使用模型
      • 模型训练与打包
      • 在 v2.0.0 alpha+ 中的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档