โ† Blog
3 min readdevelopersrlhfevaluation

An RLHF data collection API: get human evaluations for LLM outputs on demand

Pairwise preference, rating scale, or free-form critique โ€” collect the human judgment RLHF pipelines need with one API call instead of standing up your own labeling ops.

RLHF and preference-tuning pipelines all hit the same bottleneck before the math even starts: you need a steady stream of real human judgments on model outputs โ€” which completion is better, how good is this response, what's wrong with it โ€” and you need it in a shape you can feed straight into training. Standing up an annotation team for that is a project in itself. GetABrain turns it into an API call: submit the comparison or rating, real people answer, you get structured, quality-scored responses back.

The three shapes RLHF work actually needs

Preference-tuning data isn't one thing โ€” it's usually a mix of these, and the API supports each as a distinct query type rather than forcing everything through free text:

  • ab_comparison โ€” the classic RLHF pairwise preference: show two model completions for the same prompt, ask which is better (and why, optionally). This is the core signal DPO/RLHF reward models train on.
  • rating_scale โ€” score a single output on a defined scale (helpfulness, correctness, tone) when you need magnitude, not just a winner.
  • free_text / structured text โ€” open-ended critique, useful for building rationale datasets or a qualitative pass before scaling up the graded types.

Why this beats building your own labeling pipeline

The honest alternatives are Mechanical Turk, Scale, Prolific, or an in-house Slack/spreadsheet loop. All three work; all three also mean you're managing recruiting, qualification, and payout logic instead of collecting data. GetABrain's workers already carry a quality score and tier, and you can gate a query to min_worker_quality so preference data only comes from proven-reliable raters โ€” the same lever RLHF teams reach for manually when they filter out noisy annotators after the fact.

The other difference is speed of iteration: because a test-mode key returns synthetic-but-correctly-shaped responses instantly, you can build and unit-test your whole ingestion pipeline (parsing, aggregation, reward-model input formatting) before a single real dollar or real rater is involved.

What comes back

Every response includes the structured answer for the query type, the worker's quality tier at time of response, and a timestamp โ€” enough to build inter-rater agreement checks or a majority-vote aggregation without any extra plumbing. rate_response lets you score the rating itself after the fact, which both filters bad raters over time and gives you a second, meta-quality signal if your pipeline wants one.

Submitting a pairwise preference comparison for RLHF
POST /api/v1/queries
{
  "type": "ab_comparison",
  "title": "Which response better answers the user's question?",
  "content_data": {
    "prompt": "Explain why the sky is blue, for a 10 year old.",
    "option_a": "<completion from model checkpoint A>",
    "option_b": "<completion from model checkpoint B>"
  },
  "required_responses": 5,
  "min_worker_quality": 4.0,
  "bid_amount_cents": 20
}
// -> { "query_id": "q_...", "status": "open" }

GET /api/v1/queries/{query_id}/responses
// -> {
//   "responses": [
//     { "answer": "b", "rationale": "more concrete, avoids jargon", "worker_quality_tier": "gold", "created_at": "..." },
//     ...
//   ]
// }

FAQ

Yes โ€” the ab_comparison query type is built for exactly this: show two model outputs for the same prompt and get back which one a real person prefers, optionally with a written rationale. Set required_responses above 1 to get multiple independent votes per pair.
Set min_worker_quality on the query so only workers above that rating (out of 5 stars) can answer, and use rate_response to score answers after review โ€” both feed the same quality system that tiers and, if it drops too low, suspends workers.
Yes. A free test-mode key (no card required) returns synthetic responses in the identical JSON shape live ones return, marked simulated: true, so you can build your aggregation and training-data export logic first and flip to a live key with no code changes.
Use free_text or structured text query types instead of ab_comparison โ€” useful for collecting rationale or qualitative feedback on a single output rather than a forced pairwise vote.

Start collecting real human preference data.

Mint a free test-mode key, submit your first pairwise comparison, and see the exact JSON shape your training pipeline will consume. Flip to live when you want real raters.