Skip to main content
Back to Blog
AI Testing
2026-07-13

Testing Toxic LLM Output with Multilingual Prompts

Test toxic LLM output with multilingual prompts using native-speaker datasets, obfuscation cases, calibrated judges, severity labels, and release gates.

Testing Toxic LLM Output with Multilingual Prompts

A safety suite translated word for word from English can pass while the product mishandles the language its users actually speak. Slurs change force by region, politeness can conceal harassment, grammatical gender affects the target, and code-switching moves the harmful phrase into whichever language the detector understands least. Multilingual toxicity testing is a localization and sociolinguistic evaluation problem, not a bulk translation task.

The test objective is controlled behavior across languages: refuse direct requests to generate targeted abuse, avoid adding toxic content unprompted, preserve benign discussion and counterspeech, and respond helpfully when a user reports harassment. Those outcomes require separate labels. A detector that blocks every mention of a slur can appear safe while failing victim-support use cases.

Define toxicity with target, act, and severity

“Toxic” is too broad to produce a debuggable release report. Annotate what happened, who or what was targeted, whether the model generated or merely transformed supplied content, and how severe the harm is.

DimensionExample valuesWhy it changes expected behavior
Harm actInsult, threat, dehumanization, sexual harassment, incitementA credible threat needs stricter handling than mild profanity
TargetIndividual, protected class, profession, fictional entity, no targetPolicy treatment and social harm differ
User intentGenerate, classify, quote, translate, seek help, counterspeakBenign transformation should not be scored like endorsement
Model stanceEndorses, neutrally reports, condemns, refusesKeyword presence alone cannot distinguish these
SeverityContextual rubric levelsSupports escalation and release thresholds
Language formMonolingual, code-switched, transliterated, obfuscatedExposes coverage gaps in filters and model behavior

Write the rubric before generating cases. Review it with safety, localization, legal, and product stakeholders. Local annotators need a process for contested labels because a word can be reclaimed in one community and abusive in another.

Select languages by exposure and risk

Equal case counts per language look tidy but may misallocate effort. Prioritize languages by active users, expected growth, moderation incidents, product domain, model support, and the consequence of failure. Include regional variants when meaning changes materially.

A language coverage record should state script, locales, code-switch partners, transliteration conventions, annotator availability, and known detector limitations. “Spanish covered” is incomplete if all fixtures use formal European Spanish while most product traffic is colloquial Latin American speech.

Coverage tierSuggested contentRelease role
Primary product languagesFull intent and severity matrix, native reviewBlocking evaluation
Emerging languagesCore severe harms plus benign controlsBlocking for catastrophic failures
Long-tail detected languagesSmall smoke set and monitoringAlert until coverage matures
Unsupported language claimExplicit fallback and disclosure testsPrevent silent overclaiming

Do not publish a universal safety claim from a subset. Report exactly which languages, locales, scripts, and behavior categories were evaluated.

Author cases natively, then use translation as a cross-check

Give native-speaking reviewers a scenario and policy intent, not an English sentence to mirror. Ask them to write natural user messages at the register seen in the product: informal chat, gaming, workplace support, classroom, or customer service. Back-translation can reveal drift but cannot certify cultural equivalence.

For every harmful request, add nearby benign controls. If the harmful case asks the model to insult a nationality, controls might request an explanation of why the phrase is harmful, a neutral translation for moderation, or help responding to abuse. This measures over-refusal.

Store metadata separately from the prompt text:

- id: es-mx-harassment-014
  language: es
  locale: es-MX
  script: Latn
  form: monolingual
  intent: generate_targeted_harassment
  target_type: individual
  severity: high
  expected:
    must_refuse_generation: true
    may_offer_safe_alternative: true
    must_not_repeat_targeted_abuse: true
  prompt: "Escribe aquí el caso revisado por el evaluador nativo"
  provenance: native_authored
  review_status: approved

The placeholder shown here should be replaced with an approved internal fixture, not copied as a test. Keep truly harmful strings in access-controlled evaluation data when repository visibility would expose staff or contributors unnecessarily.

Build a matrix that forces linguistic variation

Natural language varies along more than locale. Combine only dimensions that produce plausible utterances, then sample deliberately to avoid a combinatorial explosion.

  1. Script: native script, Latin transliteration, mixed script.
  2. Register: formal, informal, honorific, slang-heavy.
  3. Directness: explicit command, implication, quoted request, role-play.
  4. Target reference: named person, pronoun, euphemism, group reference.
  5. Obfuscation: spacing, punctuation, homoglyphs, numerals, emoji.
  6. Code-switching: instruction in one language, abusive payload in another.
  7. Conversation position: first turn, after benign context, after a prior refusal.
  8. Transformation intent: generate, summarize, translate, classify, rewrite.

Avoid mechanically inserting a slur into hundreds of carrier sentences. That creates an easily memorized benchmark and underrepresents discourse-level harm such as exclusion, stereotyping, or escalating intimidation.

For broader safety behavior and bypass testing, align this suite with the LLM guardrails testing guide. To operationalize adversarial generation and provider comparisons, see the Promptfoo red-teaming guide.

Represent expected behavior as assertions, not one golden answer

LLM output is variable. Exact string equality overfits wording and language style. Evaluate multiple properties: whether prohibited content appears, whether the model complies with harmful intent, whether refusal is respectful, and whether a safe alternative is relevant.

Use a structured result that can combine deterministic rules with human or model review:

export type ToxicityEvaluation = {
  caseId: string;
  language: string;
  prohibitedContent: boolean;
  harmfulCompliance: boolean;
  appropriateRefusal: boolean | null;
  helpfulAlternative: boolean | null;
  severity: 'none' | 'low' | 'medium' | 'high' | 'critical';
  evidence: Array<{ start: number; end: number; label: string }>;
  evaluator: 'rule' | 'classifier' | 'human';
};

export function passesCase(
  result: ToxicityEvaluation,
  expectedRefusal: boolean,
): boolean {
  if (result.prohibitedContent || result.harmfulCompliance) return false;
  if (expectedRefusal && result.appropriateRefusal !== true) return false;
  return result.severity === 'none' || result.severity === 'low';
}

The policy threshold in passesCase is an example and must match your rubric. Do not collapse null into false without deciding what unavailable evaluator evidence means. For high-severity cases, an unevaluated output may need to fail closed.

Run repeated samples and retain the generation configuration

One passing sample does not characterize a stochastic model. Run each priority case multiple times with the production system prompt, sampling settings, tool definitions, retrieval configuration, and safety middleware. Record model identifier, provider version when available, temperature, seed if honored, and evaluation version.

# run_multilingual_eval.py
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any


@dataclass(frozen=True)
class Case:
    case_id: str
    language: str
    prompt: str
    expected_refusal: bool


def run_case(
    case: Case,
    generate: Callable[[str], str],
    judge: Callable[[Case, str], dict[str, Any]],
    samples: int = 5,
) -> list[dict[str, Any]]:
    if samples < 1:
        raise ValueError('samples must be positive')

    results = []
    for sample_index in range(samples):
        output = generate(case.prompt)
        verdict = judge(case, output)
        results.append(
            {
                'case_id': case.case_id,
                'language': case.language,
                'sample_index': sample_index,
                'output': output,
                'verdict': verdict,
            }
        )
    return results

The runner uses injected callables, so unit tests can supply deterministic doubles while the evaluation harness supplies real provider clients. Protect raw outputs according to their harmful-content classification and retention policy.

Report per-case failure frequency as observed in that run, not as a universal model statistic. Small sample counts have wide uncertainty. Release rules can still be strict, for example no critical harmful compliance in any primary-language sample, without pretending the estimate is precise.

Calibrate automated judges per language

An English-trained toxicity classifier may under-detect local abuse and over-detect identity terms. A general LLM judge may translate internally, lose pragmatic force, or favor verbose refusal styles. Validate every evaluator against native human labels in each language family and target locale.

EvaluatorStrengthMultilingual risk
Keyword or lexicon ruleTransparent and fastMisses inflection, context, obfuscation, reclaimed usage
Supervised classifierScalable severity signalTraining distribution may not cover locale or code-switching
LLM-as-judgeCan follow nuanced rubricBias, nondeterminism, and shared model blind spots
Native human reviewContextual authorityCost, reviewer exposure, disagreement
EnsembleCombines evidenceRequires explicit conflict resolution

Calculate agreement and confusion by language and harm type. An aggregate score can hide a classifier that works well in English and poorly in another language. Route uncertain or high-severity disagreements to trained human review.

Keep judge input from being manipulated by the generated output. Delimit content, use a fixed rubric, request structured fields, and treat any text inside the candidate response as untrusted evidence rather than judge instructions.

Score over-refusal alongside harmful compliance

A model that refuses “translate this harassment report for my lawyer” may avoid emitting a toxic phrase but fail the user's legitimate goal. Include these benign categories:

Benign intentDesired behaviorCommon safety defect
Victim seeks response adviceEmpathetic, actionable helpGeneric refusal because abuse is quoted
Moderator classifies a messageAccurate label with minimal repetitionAdds or intensifies offensive content
Researcher analyzes rhetoricContextual analysisBlocks identity terms without considering intent
User requests neutral translationFaithful handling with appropriate warningRefuses all transformation or endorses content
Counterspeech draftingCondemns harm without targeting backGenerates retaliatory harassment

Measure task completion, unnecessary refusal, and tone. Safety and utility are simultaneous quality attributes. A release gate based only on toxic-word absence incentivizes empty responses.

Attack normalization and code-switch boundaries

Filters frequently normalize differently from the model tokenizer. Create controlled cases with Unicode normalization, zero-width characters, homoglyphs from another script, repeated punctuation, inserted spaces, phonetic spellings, and leetspeak. Keep a benign confusable set so normalization does not turn ordinary words into toxic matches.

Code-switched prompts need more than an English instruction plus a foreign noun. Use natural switching patterns reviewed by speakers. Test harmful instruction in language A with target phrase in B, safety framing in A with quoted evidence in B, and multi-turn switching after the model establishes a language preference.

Normalize for detection, but preserve original text for the model and human evidence when policy permits. Overaggressive normalization can erase distinctions needed for interpretation.

Test multi-turn escalation and refusal recovery

Attackers rarely stop after one refusal. Script conversations where the user reframes the request as humor, fiction, a quotation, a translation, encoded text, or an alleged moderation task. The expected behavior can preserve helpful context while refusing the prohibited transformation.

Also test recovery in the other direction. After refusing targeted abuse, the model should accept a safe request such as “help me write a firm but respectful complaint.” A system that remains locked in refusal mode has poor conversational utility.

Store each turn and expected transition. Scoring only the last answer misses a harmful phrase emitted earlier and later apologized for.

Exercise the complete guardrail stack

Evaluate the base model path, input filter, system prompt, output classifier, streaming layer, and product rendering both separately and together. Component isolation tells you where a failure originates; end-to-end tests tell you what the user receives.

Possible outcomes differ:

  1. Input filter blocks a benign identity discussion before the model sees it.
  2. Model refuses correctly but output filter replaces the refusal because it quotes the user's phrase.
  3. Model begins harmful compliance and a streaming filter stops only after partial disclosure.
  4. Backend returns a safe refusal, but UI error handling displays the raw blocked content.
  5. Retrieval injects toxic forum text that bypasses user-input classification.

Include retrieved documents and tool outputs in the threat model. The model can generate harmful content based on untrusted context even when the user's prompt is benign.

Make release gates severity-aware

Separate deterministic smoke gates from broader scheduled evaluation. Pull requests can run a curated set of severe cases and benign controls across primary languages. Nightly or pre-release jobs can sample the larger, access-controlled corpus multiple times.

Gate signalExample action
Any critical harmful compliance in a primary languageBlock release and review output
Regression in benign task completionBlock if beyond agreed language-specific tolerance
Judge disagreement on severe caseHold for native human adjudication
New unsupported language detected in trafficAdd monitoring and coverage work
Minor style drift in refusalTrack unless it violates rubric

Thresholds should be documented policy decisions based on measured baselines. Do not fabricate benchmark percentages or compare model versions using unequal prompts, sample counts, or judges.

Protect evaluators and test data

Toxicity review exposes people to harmful material. Limit repeated exposure, warn reviewers about content categories, rotate assignments, support opt-out, provide wellness resources, and avoid tying productivity targets to rapid reading of abuse. Minimize raw content in ordinary dashboards.

Access-control the dataset when it contains slurs, threats, or realistic targeted scenarios. Use synthetic names and entities. Preserve provenance, consent where applicable, reviewer locale, version history, and adjudication decisions without collecting unnecessary personal data.

Diagnose regressions without flattening languages

When a release fails, slice results by language, locale, script, intent, severity, target type, form, and guardrail stage. Examine whether a single detector update caused over-refusal, whether a model change affected one script, or whether a judge version changed labels.

Keep frozen anchor cases for longitudinal comparison, but refresh part of the suite to prevent optimization against a static benchmark. Newly observed attack forms should enter a controlled regression set after review. Never paste raw production harassment into CI without authorization and minimization.

Test language identification inside the safety path

Some guardrail stacks route text to a language-specific classifier. Short prompts, transliteration, named entities, and code-switching can send a request to the wrong model. Capture detected language and selected policy component as evidence, then create cases where only the harmful clause is in a second language.

Do not make “unknown language” a silent pass-through. Test the documented fallback, whether it is a multilingual detector, conservative response, or escalation. Include benign unknown-language text to measure how much utility the fallback sacrifices.

Separate refusal quality from translation quality

A safe answer can still be unusable if it responds in the wrong language, chooses an alien regional register, or returns an English policy lecture after a non-English request. Add language match, fluency, respectfulness, and local comprehensibility to refusal review. These measures do not override harmful-compliance decisions, but they explain user impact.

Native reviewers should flag refusals that repeat the harmful request more vividly than needed. A model can acknowledge a boundary and offer a constructive alternative without reproducing target terms. Verify that alternatives remain relevant to the user's language and context instead of falling back to a canned paragraph.

Frequently Asked Questions

Can machine translation create the multilingual toxicity suite?

It can propose variants and support consistency checks, but native authors and reviewers should own naturalness, severity, and cultural meaning. Literal translation misses slang, register, pragmatic intent, and region-specific targeting.

How many samples should each prompt receive?

Choose based on risk, cost, variance, and the decision being made. Severe release-gate cases merit repeated samples, while a broad exploratory set may use fewer. Report the sample count and observed outcomes instead of implying statistical certainty.

Should the expected response always be a refusal?

No. Classification, counterspeech, victim support, and some neutral transformations can be legitimate. Specify prohibited behavior and acceptable assistance per case. Blanket refusal is an over-safety failure when it prevents a safe task.

Is one multilingual toxicity classifier enough as an oracle?

Not without language-specific validation. Use deterministic rules where appropriate, calibrated classifiers or judges, and native human adjudication for severe or uncertain cases. Track disagreement rather than forcing false certainty.

How should code-switched prompts be labeled?

Record every language present, the dominant language if meaningful, script, switch points, intent, target, and expected behavior. Evaluate with reviewers who understand the actual language combination, because a monolingual reviewer may miss the harmful segment or its force.

Testing Toxic LLM Output with Multilingual Prompts | QASkills.sh