44import asyncio
55import logging
66from enum import Enum
7+ from typing import Any
78from uuid import uuid4
89
910from typing_extensions import override
@@ -130,7 +131,7 @@ class _AegisContentSafetyDataset(_RemoteDatasetLoader):
130131 HF_DATASET_NAME : str = "nvidia/Aegis-AI-Content-Safety-Dataset-2.0"
131132 harm_categories : list [str ] = [c .value .lower () for c in AegisHarmCategory ]
132133 modalities : tuple [Modality , ...] = (Modality .TEXT ,)
133- size : str = "huge" # 19093 annotated human-LLM interactions across all splits after filtering
134+ size : str = "huge" # 13246 unique unsafe prompts from 19093 annotated rows across all splits
134135 tags : frozenset [str ] = frozenset ({"default" , "safety" })
135136
136137 def __init__ (
@@ -231,7 +232,9 @@ async def _fetch_dataset_async(self, *, cache: bool = True) -> SeedDataset:
231232 ],
232233 }
233234
234- seed_prompts : list [SeedUnion ] = []
235+ # A prompt can appear in several rows (one per labeled response). Keep one seed per prompt, with the
236+ # first row's metadata and the categories of every kept row.
237+ merged : dict [str , tuple [dict [str , Any ], list [str ]]] = {}
235238
236239 for split_name in hf_dataset :
237240 for example in hf_dataset [split_name ]:
@@ -251,36 +254,41 @@ async def _fetch_dataset_async(self, *, cache: bool = True) -> SeedDataset:
251254 if violated_categories
252255 else []
253256 )
254- standardized_categories = self ._standardize_harm_categories (
255- prompt_harm_categories ,
256- alias_overrides = alias_overrides ,
257- )
258257
259258 # Filter by harm_categories if specified
260259 if self ._selected_category_values is not None and not any (
261260 cat in self ._selected_category_values for cat in prompt_harm_categories
262261 ):
263262 continue
264263
265- seed_prompts .append (
266- SeedPrompt (
267- value = prompt_value ,
268- data_type = "text" ,
269- dataset_name = self .dataset_name ,
270- harm_categories = standardized_categories if standardized_categories else None ,
271- source = self .source ,
272- authors = self ._AUTHORS ,
273- groups = self ._GROUPS ,
274- metadata = {
275- "id" : example .get ("id" ),
276- "prompt_label" : example .get ("prompt_label" ),
277- "response_label" : example .get ("response_label" ),
278- "prompt_label_source" : example .get ("prompt_label_source" ),
279- "response_label_source" : example .get ("response_label_source" ),
280- "aegis_violated_categories" : ", " .join (prompt_harm_categories ),
281- },
282- )
264+ _ , merged_categories = merged .setdefault (prompt_value , (example , []))
265+ merged_categories .extend (cat for cat in prompt_harm_categories if cat not in merged_categories )
266+
267+ seed_prompts : list [SeedUnion ] = []
268+ for prompt_value , (example , prompt_harm_categories ) in merged .items ():
269+ standardized_categories = self ._standardize_harm_categories (
270+ prompt_harm_categories ,
271+ alias_overrides = alias_overrides ,
272+ )
273+ seed_prompts .append (
274+ SeedPrompt (
275+ value = prompt_value ,
276+ data_type = "text" ,
277+ dataset_name = self .dataset_name ,
278+ harm_categories = standardized_categories if standardized_categories else None ,
279+ source = self .source ,
280+ authors = self ._AUTHORS ,
281+ groups = self ._GROUPS ,
282+ metadata = {
283+ "id" : example .get ("id" ),
284+ "prompt_label" : example .get ("prompt_label" ),
285+ "response_label" : example .get ("response_label" ),
286+ "prompt_label_source" : example .get ("prompt_label_source" ),
287+ "response_label_source" : example .get ("response_label_source" ),
288+ "aegis_violated_categories" : ", " .join (prompt_harm_categories ),
289+ },
283290 )
291+ )
284292
285293 if not seed_prompts :
286294 raise ValueError ("SeedDataset cannot be empty. Check your filter criteria." )
0 commit comments