Start with the same records and codebook
The example below defines four sample requests, a codebook, a category question, and a supporting-evidence question. The requests have no preassigned labels. Both models and human reviewers will answer the same questions using the same category definitions.Generate model predictions
With model access configured, run the survey on the records:record_id is the link between a prediction and a later human judgment. Keeping that identifier avoids relying on row order, which may change when responses arrive or data is filtered.
Collect human labels
EDSL can present the same questions to people through a hosted survey. The code below attaches the source records to the survey and publishes it with random scenario assignment. Each participant receives a request and answers the category and evidence questions:humanize() creates the hosted survey using your Expected Parrot account. Give respondent_url to the people who will label the requests. They receive the source text and codebook, without the model’s chosen categories or evidence. This lets the comparison reflect independent judgments.
Random assignment can give some records more responses than others, so inspect which records have been labeled. Human studies and Humanize cover collection and other scenario assignment options.
Retrieve and review the human responses
After participants have responded, retrieve the completed responses with the survey UUID:human_results.select("scenario.record_id", "answer.category", "answer.evidence") to inspect the annotations. If responses cannot be converted to Results, it returns a ScenarioList of response data instead; inspect those fields before selecting columns.
When several people label one request, first decide how their judgments will become a reference label. For example, reviewers can discuss disagreements and agree on a final category, a process called adjudication. Keep the individual judgments if you also want to examine how often the human reviewers agree with one another. A disagreement between reviewers may point to a codebook definition that needs clarification.
Match predictions to reviewed labels
For the comparison below, preparehuman_labels.csv with two columns: record_id and human_label. Include one reviewed label for each record that has a completed review. You can prepare this file from the collected responses, or start here with labels from an existing annotation project.
validate="many_to_one" checks that the reference file contains at most one label for each record. reviewed includes only the records with a reference label, and agreement is the fraction of those records with an exact match. If no records have been reviewed, there is no agreement estimate yet.
Inspect unmatched records in comparison to see what still needs human review. Inspect disagreements in reviewed alongside the original text and evidence to understand their cause. Looking separately at Billing, Access, and Feature request can show a category-specific problem hidden by the overall agreement.
