Source code for pyrit.datasets.seclists_bias_testing_dataset

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

import random
from pathlib import Path
from typing import Literal, Optional

import pycountry

from pyrit.datasets.dataset_helper import FILE_TYPE_HANDLERS, fetch_examples
from pyrit.models import SeedPromptDataset
from pyrit.models.seed_prompt import SeedPrompt


[docs] def fetch_seclists_bias_testing_dataset( source: str = ( "https://raw.githubusercontent.com/danielmiessler/SecLists/4e747a4/Ai/LLM_Testing/Bias_Testing/" "nationality_geographic_bias.txt" ), source_type: Literal["public_url"] = "public_url", cache: bool = True, data_home: Optional[Path] = None, random_seed: Optional[int] = None, country: Optional[str] = None, region: Optional[str] = None, nationality: Optional[str] = None, gender: Optional[str] = None, skin_color: Optional[str] = None, ) -> SeedPromptDataset: """ Fetch SecLists AI LLM Bias Testing examples from a specified source and create a SeedPromptDataset. Args: source (str): The source from which to fetch examples. Defaults to the SecLists repository Bias_Testing. source_type (Literal["public_url"]): The type of source ('public_url'). cache (bool): Whether to cache the fetched examples. Defaults to True. data_home (Optional[Path]): Directory to store cached data. Defaults to None. random_seed (Optional[int]): Seed for random number generation for reproducibility. Defaults to None. country (Optional[str]): Specific country to use for the placeholder. Defaults to None. region (Optional[str]): Specific region to use for the placeholder. Defaults to None. nationality (Optional[str]): Specific nationality to use for the placeholder. Defaults to None. gender (Optional[str]): Specific gender to use for the placeholder. Defaults to None. skin_color (Optional[str]): Specific skin color to use for the placeholder. Defaults to None. Returns: SeedPromptDataset: A SeedPromptDataset containing the examples with placeholders replaced. """ if random_seed is not None: random.seed(random_seed) # Determine the file type from the source URL file_type = source.split(".")[-1] if file_type not in FILE_TYPE_HANDLERS: valid_types = ", ".join(FILE_TYPE_HANDLERS.keys()) raise ValueError(f"Invalid file_type. Expected one of: {valid_types}.") # Fetch the examples using the provided `fetch_examples` function examples = fetch_examples(source, source_type, cache, data_home) # Define placeholder values generation functions using pycountry and random.choice countries = list(pycountry.countries) subdivisions = list(pycountry.subdivisions) placeholder_values = { "Country": lambda: country if country else random.choice(countries).name, "Region": lambda: region if region else random.choice(subdivisions).name, "Nationality": lambda: ( nationality if nationality else random.choice(countries).name ), # Same as Country, the target LLM should be able to understand the context "GENDER": lambda: gender if gender else random.choice(["male", "female", "non-binary"]), "SKIN_COLOR": lambda: skin_color if skin_color else random.choice(["white", "black", "brown", "yellow"]), } # Replace placeholders in the examples with generated values filled_examples = [] for example in examples: prompt = example["prompt"] for placeholder, generator in placeholder_values.items(): values_used = set() while f"[{placeholder}]" in prompt: value = generator() # Ensure the new value is not the same as the previous one while value in values_used: value = generator() values_used.add(value) prompt = prompt.replace(f"[{placeholder}]", value, 1) filled_examples.append(prompt) # Create SeedPrompt instances from each example in 'filled_examples' seed_prompts = [ SeedPrompt( value=example, data_type="text", name="SecLists Bias Testing Examples", dataset_name="SecLists Bias Testing Examples", harm_categories=["bias_testing"], description="A dataset of SecLists AI LLM Bias Testing examples with placeholders replaced.", ) for example in filled_examples ] seed_prompt_dataset = SeedPromptDataset(prompts=seed_prompts) return seed_prompt_dataset