This prompt is for search engineers and platform developers who need to normalize model-generated text before it enters a search index. The core job is to strip or standardize diacritical marks (accents, umlauts, cedillas) so that queries for 'cafe' and 'café' return the same results. This is not a general-purpose text cleaning prompt; it is specifically designed for the indexing pipeline where token matching, not human readability, is the primary constraint.
Prompt
Diacritic and Accent Normalization Prompt for Search Indexing

When to Use This Prompt
Define the job, reader, and constraints for diacritic normalization in search indexing.
Use this prompt when your search index treats accented and unaccented characters as distinct tokens, causing recall failures. It is appropriate when the model output is otherwise well-formed but contains inconsistent accent usage across languages. Do not use this prompt when accent marks carry semantic meaning that must be preserved (e.g., distinguishing Spanish 'si' from 'sí', or when the normalized text will be displayed to users without the original form available for reference). In those cases, store both the normalized and original forms.
The ideal user is a backend engineer or search relevance specialist who controls the ingestion pipeline and can wire this prompt into a pre-indexing transformation step. You need a clear language context for the input text; the normalization rules for French differ from those for German or Vietnamese. Before implementing, confirm that your downstream tokenizer and analyzer are also configured to handle the normalized output, or you will have solved one mismatch only to create another.
Use Case Fit
Where this prompt works, where it fails, and what you must provide before putting it into a search indexing pipeline.
Good Fit: Multilingual Search Normalization
Use when: Your search index treats café and cafe as different tokens, and model-generated content introduces inconsistent accent usage. Guardrail: Apply this prompt before tokenization, not after, to ensure the index receives consistently normalized text.
Bad Fit: Language-Sensitive Preservation
Avoid when: Diacritics carry semantic meaning that must be preserved, such as in Arabic, Hebrew, or tonal language romanization. Guardrail: Maintain a language allowlist and skip normalization for languages where accent stripping changes word meaning.
Required Input: Language Context
What to watch: The model cannot reliably normalize text without knowing the source language. Guardrail: Always pass a language code or detected language alongside the text to prevent false-positive stripping of meaningful diacritics.
Operational Risk: Over-Normalization
Risk: Aggressive accent stripping can merge distinct words into the same token, degrading search precision. Guardrail: Log every normalization decision with a before/after diff and set a review threshold for high-impact changes in production queries.
Operational Risk: Index Drift
Risk: If normalization rules change over time, previously indexed documents become inconsistent with new queries. Guardrail: Version your normalization prompt and re-index affected content when rules change, or store the normalization version in document metadata.
Bad Fit: Real-Time Query Correction
Avoid when: You need sub-millisecond accent folding at query time. Guardrail: Use deterministic ASCII folding libraries in your search pipeline for latency-sensitive paths, and reserve this prompt for offline or batch normalization of model-generated content.
Copy-Ready Prompt Template
A reusable prompt for normalizing diacritics and accents in model-generated text to ensure consistent search indexing.
The following prompt template is designed to be copied directly into your prompt library or orchestration layer. It instructs the model to normalize text containing diacritics and accented characters according to a specified strategy, producing output that is consistent for search indexing pipelines. The placeholders allow you to inject the raw text, define the normalization rules, and specify the exact output format your downstream systems expect.
textYou are a text normalization engine. Your task is to process the provided text and normalize all diacritic and accented characters according to a strict set of rules for search indexing. ### INPUT TEXT [INPUT] ### NORMALIZATION RULES Apply the following rules in order: [NORMALIZATION_RULES] ### LANGUAGE CONTEXT The primary language of the text is [LANGUAGE]. Apply language-specific normalization exceptions if any are defined in the rules. ### OUTPUT FORMAT Return ONLY the normalized text. Do not include any explanations, notes, or markdown formatting. The output must be a single block of text. ### CONSTRAINTS - Preserve all non-diacritic punctuation, whitespace, and line breaks exactly as they appear in the input. - Do not alter the semantic meaning of any word. - If a character has no defined normalization rule, leave it unchanged.
To adapt this template, replace the placeholders with concrete values. [INPUT] should be the raw, unnormalized text. [NORMALIZATION_RULES] must be a clear, ordered list of directives, such as 'Convert all characters to their ASCII equivalents using Unicode Normalization Form KD (NFKD)' or 'Strip accents from French characters but preserve the German 'ß' as 'ss'.' The [LANGUAGE] placeholder is critical for avoiding false-positive stripping in languages where diacritics are semantically significant. Before deploying, test this prompt with a golden dataset that includes edge cases like the Turkish 'İ/i' pair, Vietnamese tone marks, and combined characters to ensure your rules produce the expected output.
Prompt Variables
Inputs the diacritic normalization prompt requires to operate reliably. Each variable must be validated before the prompt is called to prevent normalization errors or language-specific data loss.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[INPUT_TEXT] | The raw text containing accented or diacritic characters that requires normalization for search indexing. | "Café au lait, naïve façade—piñata señor!" | Must be a non-empty string. Validate length does not exceed model context window. Null or empty input should short-circuit before prompt call. |
[TARGET_NORMALIZATION_FORM] | Specifies the Unicode normalization form to apply: NFD (decompose), NFC (compose), or STRIP (remove diacritics entirely). | STRIP | Must be one of: NFD, NFC, STRIP. Reject unknown values. STRIP is the default for search indexing but may cause data loss in some languages. |
[LANGUAGE_HINT] | ISO 639-1 code indicating the primary language of the input text to apply language-specific normalization rules. | fr | Must be a valid ISO 639-1 two-letter code or null. When null, the model applies general Unicode normalization without language-specific rules. Validate against known code list. |
[PRESERVE_CASE_SENSITIVITY] | Boolean flag indicating whether the original casing must be preserved in the normalized output. | Must be true or false. When true, normalization must not alter character case. When false, the model may lowercase output for index consistency. | |
[OUTPUT_SCHEMA] | The expected JSON structure for the normalized response, including fields for original text, normalized text, and a change log. | {"original": "...", "normalized": "...", "changes": [...]} | Must be a valid JSON Schema object or null. If provided, validate the model output against this schema. If null, accept plain text output. |
[KNOWN_FALSE_POSITIVES] | A list of words or tokens that must not have diacritics stripped, such as brand names or technical terms where accents are semantically significant. | ["résumé", "Björk", "MySQL"] | Must be a JSON array of strings or null. Each entry is case-sensitive. Validate that the prompt includes an explicit instruction to preserve these tokens exactly. |
[CONFIDENCE_THRESHOLD] | Minimum confidence score (0.0 to 1.0) the model must assign to each normalization decision. Outputs below this threshold should be flagged for human review. | 0.85 | Must be a float between 0.0 and 1.0. If the model cannot provide per-token confidence, set to null. When set, the eval harness must check flagged tokens against this threshold. |
Implementation Harness Notes
How to wire the diacritic normalization prompt into a search indexing pipeline with validation, retries, and language-aware checks.
The diacritic normalization prompt is designed to sit between model-generated content and your search index. It should be called as a post-processing step after text generation but before tokenization and indexing. The prompt accepts raw text and returns normalized text with consistent accent handling. You'll need to decide whether normalization happens synchronously during ingestion or asynchronously in a batch repair job. For high-throughput search pipelines, consider batching multiple documents into a single prompt call to reduce API overhead, but keep batches small enough that a single failure doesn't block an entire batch.
Wire the prompt into your application with a validation layer that checks the output before indexing. At minimum, validate that the output length is within a reasonable tolerance of the input length (a sudden 50% shrinkage likely indicates a failure mode). Implement a language detection check on the input text and compare it against the normalization rules applied. For example, if the input is detected as German, the output must preserve 'ä', 'ö', 'ü' as distinct characters rather than stripping them to 'a', 'o', 'u'. Use a lookup table of language-specific normalization rules: French retains 'é', 'è', 'ê', 'ë' as distinct; Spanish normalizes 'ñ' carefully; Turkish distinguishes dotted and dotless 'i'. If the validator detects a mismatch between detected language and applied rules, flag the output for human review or route to a language-specific retry prompt with explicit instructions.
Implement a retry loop with a maximum of two attempts. On the first validation failure, append the specific validation error to the retry prompt as additional context: 'The previous normalization incorrectly stripped accents from [LANGUAGE] text. Preserve [SPECIFIC_CHARACTERS] as distinct characters.' If the second attempt also fails validation, log the failure with the input text, detected language, and both output versions for offline analysis. Do not silently index failed normalizations. Instead, index the original text with a metadata flag indicating normalization was attempted but failed, so search quality can be monitored. For model choice, prefer models with strong multilingual performance. Test across your top five languages by volume before deploying. Avoid using this prompt on text that has already been normalized, as double-normalization can strip intentional diacritics that carry semantic meaning in the target language.
Expected Output Contract
Define the exact shape of the normalized output to ensure it can be safely ingested by a search index without breaking tokenization or comparison logic.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
normalized_text | string | Must not contain any characters with diacritical marks (Unicode combining marks or precomposed accented characters). Validate by checking Unicode property \p{M} is absent. | |
original_text | string | Must exactly match the [INPUT_TEXT] provided. Validate with a strict string equality check to ensure no unintended mutations occurred. | |
transformations_applied | array of strings | Must be a JSON array of strings from the allowed list: ['decompose', 'strip_marks', 'transliterate', 'lowercase']. Validate against the enum. | |
language_hint | string or null | If provided, must be a valid ISO 639-1 code. If null, the model could not determine the language. Validate with a regex check: ^[a-z]{2}$. | |
characters_changed | integer | Must be a non-negative integer representing the count of characters modified. Validate that the value is >= 0 and does not exceed the length of [INPUT_TEXT]. | |
processing_warnings | array of strings or null | If present, must be a JSON array of strings describing edge cases like 'ambiguous_transliteration'. If no warnings, the field must be null, not an empty array. | |
normalization_form | string | Must be a string specifying the final Unicode normalization form applied. Must be one of: 'NFC', 'NFD', 'NFKC', 'NFKD'. Validate against the enum. |
Common Failure Modes
Diacritic normalization in search indexing often fails silently, breaking recall and precision. These are the most common production failure modes and how to guard against them.
Over-Normalization of Semantic Distinctions
What to watch: The prompt strips accents that distinguish meaning in the target language (e.g., German 'schon' vs 'schön', Spanish 'si' vs 'sí'). This destroys search precision and can alter intent. Guardrail: Provide a language-specific stop list of words where diacritics are semantically load-bearing. Add a validation step that flags normalized tokens matching known ambiguous pairs for human review or context-based disambiguation.
Inconsistent Normalization Across Mixed-Language Content
What to watch: Model-generated content often contains multiple languages in a single document. The prompt applies a single normalization rule uniformly, stripping necessary diacritics from one language while correctly handling another. Guardrail: Include a language-detection pre-pass or instruct the model to apply normalization rules per detected language segment. Validate output by sampling segments from each detected language and checking against language-specific normalization rules.
Silent Loss of Named Entity Integrity
What to watch: Person names, brand names, and place names with diacritics (e.g., 'José', 'Müller', 'São Paulo') are normalized to ASCII equivalents, breaking entity resolution and making names unsearchable in their correct form. Guardrail: Add a named entity preservation rule to the prompt. Before normalization, extract and protect recognized entities. Store both the normalized form for recall and the original form for display and exact match. Validate with a golden set of known entity names.
Unicode Normalization Form Mismatch
What to watch: The prompt normalizes diacritics but doesn't specify Unicode normalization form (NFC vs NFD). Precomposed characters (é as U+00E9) and decomposed sequences (e + combining acute as U+0065 U+0301) are treated inconsistently, causing index fragmentation. Guardrail: Explicitly specify the target Unicode normalization form (prefer NFC for search indexes) in the prompt constraints. Add a post-processing harness check that verifies all output is in the specified normalization form using Unicode-aware string comparison.
Case-Folding Interaction with Diacritic Stripping
What to watch: The prompt performs case-folding and diacritic normalization in the wrong order or without coordination. Certain characters have different case mappings depending on locale (e.g., Turkish İ/i). Combined incorrectly, this produces tokens that match neither the original nor the intended search form. Guardrail: Define the exact transformation pipeline order in the prompt: Unicode normalization → locale-aware case folding → diacritic mapping. Include locale as a required input parameter. Test with Turkish, Greek, and French edge cases.
False-Positive Stripping of Intentional Diacritics in Code and Identifiers
What to watch: Model outputs containing code snippets, variable names, URLs, or technical identifiers with diacritics get normalized, breaking references and making code unexecutable or identifiers unresolvable. Guardrail: Add a content-type detection rule that preserves diacritics inside code blocks, URLs, and technical identifiers. Use delimiters or context markers to signal protected regions. Validate by checking that known code snippets and URLs survive the normalization round-trip intact.
Evaluation Rubric
Use this rubric to test the quality of diacritic and accent normalization before deploying the prompt to a search indexing pipeline. Each criterion targets a known failure mode in production.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Accent stripping completeness | All common Latin-script diacritics (é, ñ, ü, ç) are converted to their base ASCII character (e, n, u, c) | Output retains any combining diacritic or precomposed accented character | Run a golden set of 50 accented words through the prompt and assert output matches a pre-normalized reference file using a Unicode-aware diff |
Language-specific rule preservation | Characters with context-dependent normalization (e.g., German 'ö' → 'oe', not 'o') follow the specified language rules in [LANGUAGE_RULES] | Output applies generic stripping where a language-specific mapping was required, or vice versa | Test with a matrix of [INPUT_WORD] and [LANGUAGE_CODE] pairs; assert output matches the expected mapping for each locale |
False-positive stripping avoidance | Non-diacritic Unicode characters (e.g., Cyrillic, Greek, symbols) are passed through unchanged | Output strips or mangles characters from non-target scripts, or removes intentional symbols like © or ™ | Include a holdout set of non-Latin strings and special symbols in the test suite; assert character-level equality with input |
Case preservation | Output casing matches input casing exactly (e.g., 'ÉLITE' → 'ELITE', 'élite' → 'elite') | Output is lowercased or uppercased unexpectedly, or title-case logic is applied without instruction | Test with mixed-case inputs; assert that only diacritic characters are modified and case is byte-identical to the input except for the normalized character |
Whitespace and punctuation stability | All whitespace, punctuation, and delimiters remain identical to the input | Normalization introduces, removes, or replaces spaces, hyphens, or punctuation marks | Compare input and output strings with a diff tool after stripping only diacritics; assert zero non-diacritic character changes |
Empty and edge-case input handling | Empty string returns empty string; single accented character returns single base character; input with no diacritics returns input unchanged | Empty input causes null, error, or hallucinated content; no-op inputs are modified | Unit test with empty string, single character 'ñ', and a 1000-character ASCII-only string; assert identity or correct single-char normalization |
Performance consistency | Normalization completes in under 200ms for a 10KB text payload in the target environment | Latency spikes above 500ms or grows non-linearly with input size | Benchmark with 10KB, 100KB, and 1MB payloads; measure p95 latency over 100 runs and assert it stays below the threshold |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a simple test harness. Use a small set of known-accented strings (e.g., café, naïve, São Paulo) and verify the model returns the expected normalized form. Skip strict schema validation initially—focus on whether the normalization logic is correct for your target languages.
codeNormalize the following text by removing diacritics and accents. Return only the normalized text with no additional commentary. Text: [INPUT_TEXT] Target locale: [LOCALE]
Watch for
- Over-stripping: characters like
ñ(Spanish) orø(Norwegian) may be removed when they should be preserved per locale rules. - Language-agnostic behavior: the model may apply English-centric normalization to all inputs.
- Missing locale context: without a locale hint, the model guesses and may normalize inconsistently.

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us