Skip to content
指南阅读约需 7 分钟

在 Prolific 上运行标注研究

在 Prolific 上运行 Potato 标注研究:URL 直接登录、完成码、注意力检查,以及在 API 一侧监控提交。

Potato Team

把 Prolific 的研究 URL 指向你的 Potato 服务器并带上 ?PROLIFIC_PID={{%PROLIFIC_PID%}},设置 login.type: url_direct 以及一个与研究上的代码相符的 completion_code,每位参与者就会以自己的 Prolific ID 登录,并在做完后被送回 Prolific。

Prolific 是为学术研究搭建的参与者池,也是 Potato 支持得最完整的众包平台。本指南涵盖 Potato 所需的配置、Prolific 一侧的研究设置,以及在花钱之前值得先准备好的质量控制。

研究者为什么用 Prolific 做标注

Prolific 会筛选参与者并通过平台付款,所以众包里通常吃掉研究预算的那些部分,都在你的服务器之外处理掉了。它强制执行最低时薪,按人口统计和语言条件筛选参与者,并记录知情同意,这缩短了标注研究的 IRB 文书工作。通常拿来比较的 Mechanical Turk 已于2026 年 9 月 30 日关闭;对于原先在那里运行的研究,把研究迁出 MTurk介绍了这一转换。

开始之前需要什么

  1. 一个 Prolific 研究者账户。
  2. 运行在带有公开 HTTPS URL 的服务器上的 Potato。服务器部署指南讲了这一步。
  3. 一份配置,其中有你的数据文件、item_properties,以及至少一个标注方案。

Potato 所需的配置

四项设置就能把一个普通的 Potato 项目变成 Prolific 可以驱动的项目。login.url_argument 指明携带参与者 Prolific ID 的 URL 参数,completion_code 必须与 Prolific 研究上配置的代码相符,两个重定向键则把参与者送回 Prolific,而不是把他们留在一个完成页上。它下面的分配键限定任何一位参与者拿到多少工作量,一项研究的成本正是靠这个保持可预测。

yaml
annotation_task_name: "Sentiment Annotation Study"
task_description: "Classify the sentiment of short text snippets. This task takes about five minutes."
 
# Participants are logged in from the PROLIFIC_PID URL parameter
login:
  type: url_direct
  url_argument: PROLIFIC_PID
 
# Must match a completion code configured on the Prolific study
completion_code: "C1ABCDEF"
auto_redirect_on_completion: true
auto_redirect_delay: 5000
 
# Keep participants on task
hide_navbar: true
jumping_to_id_disabled: true
 
# Each participant labels 20 items; each item is labeled by 3 participants
assignment_strategy: random
max_annotations_per_user: 20
num_annotators_per_item: 3
 
data_files:
  - data/texts.json
 
item_properties:
  id_key: id
  text_key: text
 
output_annotation_dir: annotation_output/prolific-study/
export_annotation_format: jsonl
 
user_config:
  allow_all_users: true
  users: []
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment expressed in this text?"
    labels:
      - name: positive
      - name: neutral
      - name: negative
    sequential_key_binding: true
    label_requirement:
      required: true

num_annotators_per_item 按你打算拿这些数据做什么来定。如果你打算报告一致性或取多数标签,通常选三;一旦试点表明任务定义清晰,一个就够了。标注者间一致性指南讲了怎么解读结果。

在 Prolific 上设置研究

在 Prolific 的研究表单里,把外部研究 URL 设为你的 Potato 服务器,并在查询字符串里带上 Prolific 的占位符:

text
https://your-server.com/?PROLIFIC_PID={{%PROLIFIC_PID%}}&STUDY_ID={{%STUDY_ID%}}&SESSION_ID={{%SESSION_ID%}}

关于 Prolific ID 如何记录的那个问题,选择“I'll use URL parameters”,然后在研究上配置一个与你配置文件中 completion_code 相符的完成码。STUDY_ID 和 SESSION_ID 会被记入参与者的会话,供之后追踪使用。

点了链接的参与者带着 URL 里的 ID 来到 Potato。Potato 以那个 ID 建一个无密码账户,带参与者走完你配置的各个阶段,并在他们完成时显示完成码,附一个链接到 https://app.prolific.com/submissions/complete?cc=<code> 的返回 Prolific 按钮。设置了 auto_redirect_on_completion 之后,重定向会在 auto_redirect_delay 毫秒后自行发生。

域名要写成 app.prolific.com。旧的 app.prolific.co 域名已经不再提供 HTTPS,所以从旧指南里抄来的完成 URL,会在参与者把活干完之后把他们送到一个失效页面。

知情同意、指导语和退出问卷

大多数众包研究需要的不只是标注页面。Potato 的 phases 块把知情同意、筛选、指导语和研究后问卷安排在标注阶段周围,参与者按你列出的顺序依次经过:

yaml
phases:
  order: [consent, prestudy, instructions, annotation, poststudy]
 
  consent:
    type: consent
    file: surveyflow/consent.json
 
  prestudy:
    type: prestudy
    file: surveyflow/prescreening.json
 
  instructions:
    type: instructions
    file: surveyflow/instructions.html
 
  poststudy:
    type: poststudy
    file: surveyflow/demographics.json

把这个块加到上面那份配置里。annotation 是唯一必需的阶段,所以不需要知情同意书的研究可以把其余条目全部省掉。较早的项目用 surveyflow 配置同样的东西,Potato 仍然读它,但不再推荐新项目使用。

注意力检查

注意力检查是一个已知正确答案的条目,被混进队列,好让不专心的参与者给出可以被察觉的错误答案。Potato 从它们自己的文件而不是你的数据里加载这些条目,所以检查项不会进入你的数据集:

yaml
attention_checks:
  enabled: true
  items_file: "data/attention_checks.json"
  frequency: 10
  min_response_time: 3.0
  failure_handling:
    warn_threshold: 2
    block_threshold: 5

把这个块加到上面那份配置里。frequency: 10 每十个条目插入一次检查,min_response_time 会判定那些快到没人可能读完条目的回答不通过,不管答案写的是什么。计时在服务器上进行,从它发出条目的那一刻算到它收到保存的那一刻。

每个检查条目带有一个 id、参与者看到的文本,以及按方案名称给出的预期答案:

json
[
  {
    "id": "attn_001",
    "text": "Please select 'positive' for this item to verify you are reading carefully.",
    "expected_answer": {"sentiment": "positive"}
  }
]

block_threshold 要对着你研究的长度来设。在 20 个条目的任务里没通过五次检查的参与者根本没在标注;在 300 个条目里没通过五次的参与者,可能只是有一阵子累了,封掉他会丢掉他其余的工作。

监控进行中的研究

设置 login.type: prolific 并加上一个 prolific 块,Potato 就会在已有的 URL 直接登录之外,轮询 Prolific API 获取提交状态:

yaml
login:
  type: prolific
  url_argument: PROLIFIC_PID
 
prolific:
  config_file_path: configs/prolific_config.yaml
 
completion_code: "C1ABCDEF"

把这个块加到上面那份配置里。它指向的那个文件存放 API 令牌,所以别把它纳入版本控制:

yaml
# configs/prolific_config.yaml
token: "your-prolific-api-token"
study_id: "your-study-id"
workload_checker: true
max_concurrent_sessions: 30
workload_checker_period: 300

配好令牌之后,管理仪表盘会多出一个 Prolific 面板,可以发布、暂停和停止研究,批准或拒绝提交,发放奖金,以及预览增加名额的花费。工作量监控会在活跃参与者达到 max_concurrent_sessions 时暂停研究,并在数量降到该上限的 20% 以下时恢复研究。它只恢复自己暂停过的研究,所以你在 Prolific 里手动暂停的研究会一直暂停着。

中途退出的参与者

参与者没做完就离开时,Prolific 会把提交报为 RETURNED、TIMED-OUT 或 REJECTED。Potato 会释放分配给这些参与者的条目,让别人可以接手,同时保留他们已经完成的标注。如果退出的原因应当改变这些已完成工作的去向,就用 instance_reclaim:

yaml
instance_reclaim:
  enabled: true
  prolific:
    preserve_completed_annotations: true
    status_policies:
      TIMED-OUT:
        preserve_completed_annotations: true
      REJECTED:
        preserve_completed_annotations: false

把这个块加到上面那份配置里。这个区分值得认真设。超时的参与者通常是老老实实标注到被什么事打断,而被拒绝的参与者交出的是你决定不付钱的工作,把它留在数据集里等于削弱了这次拒绝。

输出里有什么

Potato 在 output_annotation_dir 下按标注者写文件;设置了 export_annotation_format 时,还会在 <output_annotation_dir>/exports/<format>/ 下定期导出。每条导出记录带有实例、标注者,以及按方案名称组织的标签:

json
{"instance_id": "t_014", "user_id": "5f2c9a1b3d4e5f6a7b8c9d0e", "labels": {"sentiment": {"positive": "positive"}}, "spans": {}, "links": {}}

user_id 是参与者的 Prolific ID,因为 Potato 正是用这个用户名给他们建的账户,这也是你能把一行数据对回某次 Prolific 提交、以便批准或发奖金的依据。发布数据集时,把这一列当作身份信息处理。

先跑一次试点

在启动完整研究之前先跑 5 到 10 名参与者,而且要读他们的输出,不要只看完成率。有两种问题事后才发现的代价很高。第一种是某条指导语有歧义,而你因为是写任务的人所以看不出来;第二种是单个条目的耗时与你的估计相差很远,这意味着你的薪酬标准在某个方向上定错了。

研究的定价要按试点的中位耗时来算,而不是按你自己的。界面在手机宽度下也要能用,因为不管研究说明怎么写,总会有参与者用手机。尽快批准提交,一来人们在等这笔钱,二来你的批准用时对正在考虑要不要接你研究的未来参与者是可见的。

下一步

完整参考见本站的众包集成,而 Potato 仓库里的 Prolific 集成文档介绍了仪表盘面板背后的管理 API 端点。如果你需要由自己的代码驱动研究创建、资格同步或付费筛除,从那里开始。