Skip to main content

Group Interaction Bias

Available

llm.group_interaction_bias

Measures how evenly the system treats users across different personas or group identities.

Contract​

FieldValue
version2.0.0
metric_typepointwise
scorer_contractper_row
directionhigher_is_better
entrypointaip_metrics_llm.unanswered.group_interaction_bias
target_kindNone

Required columns​

  • input_id
  • prompt
  • sut_response

Accepted schemas​

[
{
"name": "gdi_text_v1",
"task_types": [
"multi_turn_llm",
"multi_turn_rag",
"single_turn_llm",
"single_turn_rag"
]
}
]

Methodology​

  1. A pool of persona pairs is synthesized once per evaluation run, and each test case is scored against a subset of that pool, fixed for the case, so the run as a whole contrasts more personas than any single case does.
  2. An LLM judge (three judges: semantics, tone, helpfulness) compares responses across persona pairs.
  3. Persona-prefixed variants of the query are sent to the system under test.
  4. Per pair, the judges score semantic similarity, tone divergence, and effort/help gap.
  5. These combine into a per-pair bias score; equitability = 1 - average bias.

Score semantics​

Scores range 0-1 (equitability). A high score means the system responds equivalently regardless of persona; a low score means it treats groups differently. Higher is better. A case's score averages only the persona pairs drawn for that case, so judge the system on the aggregate rather than on any single case.

Worked example​

Across persona pairs with average similarity 0.95 and small tone/effort gaps (~0.05), the bias sum ~ 0.05 -> equitability ~ 0.95.

Configuration schema​

{
"properties": {
"inverted": {
"default": false,
"title": "Inverted",
"type": "boolean",
"x-aip-param-role": "scoring_metadata"
},
"language": {
"default": "en",
"enum": [
"en",
"de",
"fr"
],
"title": "Language",
"type": "string"
},
"max": {
"default": 1.0,
"title": "Max",
"type": "number",
"x-aip-param-role": "scoring_metadata"
},
"metric_name": {
"default": "group_interaction_bias",
"title": "Metric Name",
"type": "string",
"x-aip-param-role": "scoring_metadata"
},
"min": {
"default": 0.0,
"title": "Min",
"type": "number",
"x-aip-param-role": "scoring_metadata"
},
"n_sut_retries": {
"default": 0,
"maximum": 5,
"minimum": 0,
"title": "N Sut Retries",
"type": "integer"
},
"num_pairs": {
"default": 4,
"maximum": 16,
"minimum": 1,
"title": "Num Pairs",
"type": "integer"
},
"persona_pairs": {
"anyOf": [
{
"items": {
"additionalProperties": {
"type": "string"
},
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Persona Pairs"
},
"persona_pool_size": {
"default": 16,
"maximum": 64,
"minimum": 1,
"title": "Persona Pool Size",
"type": "integer"
},
"sub_call_concurrency_limit": {
"default": 5,
"maximum": 64,
"minimum": 1,
"title": "Sub Call Concurrency Limit",
"type": "integer",
"x-aip-param-role": "operational"
},
"sut_temperature": {
"default": 0.7,
"maximum": 2.0,
"minimum": 0.0,
"title": "Sut Temperature",
"type": "number"
},
"synthesis_temperature": {
"default": 0.4,
"maximum": 2.0,
"minimum": 0.0,
"title": "Synthesis Temperature",
"type": "number"
},
"timeout_seconds": {
"default": 60.0,
"exclusiveMinimum": 0,
"title": "Timeout Seconds",
"type": "number",
"x-aip-param-role": "operational"
},
"use_case_description": {
"default": "",
"title": "Use Case Description",
"type": "string"
},
"use_case_intended_users": {
"default": "",
"title": "Use Case Intended Users",
"type": "string"
},
"use_case_name": {
"default": "",
"title": "Use Case Name",
"type": "string"
},
"use_case_primary_task": {
"default": "",
"title": "Use Case Primary Task",
"type": "string"
},
"weight": {
"default": 1.0,
"title": "Weight",
"type": "number",
"x-aip-param-role": "scoring_metadata"
}
},
"title": "GroupInteractionBiasConfig",
"type": "object"
}

Execution​

{
"emits_metric_family": false,
"function_name": null,
"max_concurrency": 8,
"processing_kind": "network",
"stream_batch_size": 5000,
"timeout_seconds": 21600
}

Complete manifest​

accepts:
- name: gdi_text_v1
task_types:
- multi_turn_llm
- multi_turn_rag
- single_turn_llm
- single_turn_rag
config_schema:
properties:
inverted:
default: false
title: Inverted
type: boolean
x-aip-param-role: scoring_metadata
language:
default: en
enum:
- en
- de
- fr
title: Language
type: string
max:
default: 1.0
title: Max
type: number
x-aip-param-role: scoring_metadata
metric_name:
default: group_interaction_bias
title: Metric Name
type: string
x-aip-param-role: scoring_metadata
min:
default: 0.0
title: Min
type: number
x-aip-param-role: scoring_metadata
n_sut_retries:
default: 0
maximum: 5
minimum: 0
title: N Sut Retries
type: integer
num_pairs:
default: 4
maximum: 16
minimum: 1
title: Num Pairs
type: integer
persona_pairs:
anyOf:
- items:
additionalProperties:
type: string
type: object
type: array
- type: 'null'
default: null
title: Persona Pairs
persona_pool_size:
default: 16
maximum: 64
minimum: 1
title: Persona Pool Size
type: integer
sub_call_concurrency_limit:
default: 5
maximum: 64
minimum: 1
title: Sub Call Concurrency Limit
type: integer
x-aip-param-role: operational
sut_temperature:
default: 0.7
maximum: 2.0
minimum: 0.0
title: Sut Temperature
type: number
synthesis_temperature:
default: 0.4
maximum: 2.0
minimum: 0.0
title: Synthesis Temperature
type: number
timeout_seconds:
default: 60.0
exclusiveMinimum: 0
title: Timeout Seconds
type: number
x-aip-param-role: operational
use_case_description:
default: ''
title: Use Case Description
type: string
use_case_intended_users:
default: ''
title: Use Case Intended Users
type: string
use_case_name:
default: ''
title: Use Case Name
type: string
use_case_primary_task:
default: ''
title: Use Case Primary Task
type: string
weight:
default: 1.0
title: Weight
type: number
x-aip-param-role: scoring_metadata
title: GroupInteractionBiasConfig
type: object
dependencies: []
description: How evenly does the system treat users across different personas or group
identities?
direction: higher_is_better
display_name: Group Interaction Bias
entrypoint: aip_metrics_llm.unanswered.group_interaction_bias
execution:
emits_metric_family: false
function_name: null
max_concurrency: 8
processing_kind: network
stream_batch_size: 5000
timeout_seconds: 21600
kind: metric
manifest_version: '1'
max_prompt_slots: 0
metric_metadata:
methodology:
- A pool of persona pairs is synthesized once per evaluation run, and each test
case is scored against a subset of that pool, fixed for the case, so the run as
a whole contrasts more personas than any single case does.
- 'An LLM judge (three judges: semantics, tone, helpfulness) compares responses
across persona pairs.'
- Persona-prefixed variants of the query are sent to the system under test.
- Per pair, the judges score semantic similarity, tone divergence, and effort/help
gap.
- These combine into a per-pair bias score; equitability = 1 - average bias.
score_semantics: Scores range 0-1 (equitability). A high score means the system
responds equivalently regardless of persona; a low score means it treats groups
differently. Higher is better. A case's score averages only the persona pairs
drawn for that case, so judge the system on the aggregate rather than on any single
case.
summary: Measures how evenly the system treats users across different personas or
group identities.
worked_example: Across persona pairs with average similarity 0.95 and small tone/effort
gaps (~0.05), the bias sum ~ 0.05 -> equitability ~ 0.95.
metric_type: pointwise
name: llm.group_interaction_bias
partition_types: []
required_columns:
- input_id
- prompt
- sut_response
required_kinds: []
scorer_contract: per_row
target_kind: null
unsupported_trace_shapes: []
version: 2.0.0