(function() {
  var plan = { en: 'Plan and Manage an Azure AI Solution', de: 'Azure KI-Lösung planen und verwalten' };
  var moderation = { en: 'Implement Content Moderation Solutions', de: 'Inhaltsmoderierungslösungen implementieren' };
  var vision = { en: 'Implement Computer Vision Solutions', de: 'Computer Vision-Lösungen implementieren' };
  var nlp = { en: 'Implement NLP Solutions', de: 'NLP-Lösungen implementieren' };
  var knowledge = { en: 'Implement Knowledge Mining and Document Intelligence', de: 'Knowledge Mining und Dokumentenintelligenz implementieren' };
  var genai = { en: 'Implement Generative AI Solutions', de: 'Generative KI-Lösungen implementieren' };

  var refs = {
    auth: 'https://learn.microsoft.com/azure/ai-services/authentication',
    disableLocalAuth: 'https://learn.microsoft.com/azure/ai-services/disable-local-auth',
    keyVault: 'https://learn.microsoft.com/azure/key-vault/general/overview',
    privateDns: 'https://learn.microsoft.com/azure/private-link/private-endpoint-dns',
    apim: 'https://learn.microsoft.com/azure/api-management/api-management-key-concepts',
    transient: 'https://learn.microsoft.com/azure/architecture/best-practices/transient-faults',
    bicep: 'https://learn.microsoft.com/azure/azure-resource-manager/bicep/overview',
    contentSafety: 'https://learn.microsoft.com/azure/ai-services/content-safety/overview',
    blocklist: 'https://learn.microsoft.com/azure/ai-services/content-safety/how-to/use-blocklist',
    visionAnalysis: 'https://learn.microsoft.com/azure/ai-services/computer-vision/overview-image-analysis',
    customVision: 'https://learn.microsoft.com/azure/ai-services/custom-vision-service/overview',
    face: 'https://learn.microsoft.com/azure/ai-services/computer-vision/how-to/use-face-api',
    docIntel: 'https://learn.microsoft.com/azure/ai-services/document-intelligence/overview',
    language: 'https://learn.microsoft.com/azure/ai-services/language-service/overview',
    clu: 'https://learn.microsoft.com/azure/ai-services/language-service/conversational-language-understanding/overview',
    questionAnswering: 'https://learn.microsoft.com/azure/ai-services/language-service/question-answering/overview',
    speech: 'https://learn.microsoft.com/azure/ai-services/speech-service/overview',
    speechTranslation: 'https://learn.microsoft.com/azure/ai-services/speech-service/speech-translation',
    translator: 'https://learn.microsoft.com/azure/ai-services/translator/overview',
    searchOverview: 'https://learn.microsoft.com/azure/search/search-what-is-azure-search',
    indexer: 'https://learn.microsoft.com/azure/search/search-indexer-overview',
    skillset: 'https://learn.microsoft.com/azure/search/cognitive-search-working-with-skillsets',
    semanticSearch: 'https://learn.microsoft.com/azure/search/semantic-search-overview',
    vectorSearch: 'https://learn.microsoft.com/azure/search/vector-search-overview',
    openaiChat: 'https://learn.microsoft.com/azure/ai-services/openai/how-to/chatgpt',
    embeddings: 'https://learn.microsoft.com/azure/ai-services/openai/concepts/understand-embeddings',
    contentFilter: 'https://learn.microsoft.com/azure/ai-services/openai/concepts/content-filter',
    semanticKernel: 'https://learn.microsoft.com/semantic-kernel/overview/'
  };

  function q(type, id, domain, difficulty, scenario, question, options, correct, explanation, hint, reference) {
    return {
      id: id,
      type: type,
      domain: domain,
      difficulty: difficulty,
      scenario: scenario ? { en: scenario[0], de: scenario[1] } : null,
      question: { en: question[0], de: question[1] },
      options: options.map(function(opt) {
        return { id: opt[0], text: { en: opt[1], de: opt[2] } };
      }),
      correct: correct,
      explanation: { en: explanation[0], de: explanation[1] },
      hint: { en: hint[0], de: hint[1] },
      reference: reference
    };
  }

  var extra = [ /* questions */
    q('scenario', 'ai102-301', plan, 'hard', [`An Azure Function calls Azure OpenAI with this code:
var credential = new DefaultAzureCredential();
var client = new OpenAIClient(new Uri(endpoint), credential);
In Azure the function has a managed identity, but calls return 403 Forbidden.`, `Eine Azure Function ruft Azure OpenAI mit diesem Code auf:
var credential = new DefaultAzureCredential();
var client = new OpenAIClient(new Uri(endpoint), credential);
In Azure besitzt die Funktion eine verwaltete Identität, aber die Aufrufe liefern 403 Forbidden.`], [`What must you configure so the function can authenticate without stored keys?`, `Was müssen Sie konfigurieren, damit sich die Funktion ohne gespeicherte Schlüssel authentifizieren kann?`], [['A', 'Grant the managed identity the Cognitive Services OpenAI User role on the resource', 'Der verwalteten Identität auf der Ressource die Rolle Cognitive Services OpenAI User zuweisen'], ['B', 'Copy an API key into local.settings.json and publish it', 'Einen API-Schlüssel in local.settings.json kopieren und veröffentlichen'], ['C', 'Enable anonymous access on the resource', 'Anonymen Zugriff auf der Ressource aktivieren'], ['D', 'Regenerate the endpoint hostname', 'Den Endpunkt-Hostnamen neu generieren']], ['A'], [`DefaultAzureCredential can obtain a token from the managed identity, but the identity also needs RBAC permission on the Azure OpenAI resource. Granting the OpenAI user role enables secretless access.`, `DefaultAzureCredential kann ein Token über die verwaltete Identität beziehen, aber die Identität benötigt zusätzlich eine RBAC-Berechtigung auf der Azure-OpenAI-Ressource. Die Rolle OpenAI User ermöglicht den Zugriff ohne Geheimnisse.`], [`Think about identity plus authorization.`, `Denken Sie an Identität plus Autorisierung.`], refs.auth),
    q('multiple', 'ai102-302', plan, 'medium', null, [`Which TWO steps support secret rotation and least privilege for an app that still uses API keys with Azure AI services?`, `Welche ZWEI Schritte unterstützen Schlüsselrotation und Least Privilege für eine App, die weiterhin API-Schlüssel mit Azure AI Services verwendet?`], [['A', 'Store the keys in Azure Key Vault', 'Die Schlüssel in Azure Key Vault speichern'], ['B', 'Let the app read the secrets from Key Vault by using a managed identity', 'Die App die Geheimnisse per verwalteter Identität aus Key Vault lesen lassen'], ['C', 'Commit the keys to source control for easier deployment', 'Die Schlüssel zur einfacheren Bereitstellung in die Versionsverwaltung einchecken'], ['D', 'Send the shared keys by email during every rotation', 'Die gemeinsamen Schlüssel bei jeder Rotation per E-Mail versenden']], ['A', 'B'], [`Key Vault centralizes storage and rotation, and managed identity avoids distributing another long-lived credential to the application. Source control and email both increase secret exposure.`, `Key Vault zentralisiert Speicherung und Rotation, und eine verwaltete Identität vermeidet die Verteilung weiterer langlebiger Anmeldeinformationen an die Anwendung. Versionsverwaltung und E-Mail erhöhen beide die Offenlegung von Geheimnissen.`], [`Pick one storage control and one access control.`, `Wählen Sie eine Speicher- und eine Zugriffskontrolle.`], refs.keyVault),
    q('scenario', 'ai102-303', plan, 'hard', [`A Bicep deployment disables public network access on an Azure AI resource and creates a private endpoint. App servers in the VNet still resolve the service hostname to a public IP address.`, `Eine Bicep-Bereitstellung deaktiviert den öffentlichen Netzwerkzugriff auf einer Azure-AI-Ressource und erstellt einen privaten Endpunkt. App-Server im VNet lösen den Dienstnamen dennoch auf eine öffentliche IP-Adresse auf.`], [`What additional configuration is required so clients resolve the private address?`, `Welche zusätzliche Konfiguration ist erforderlich, damit Clients die private Adresse auflösen?`], [['A', 'Link the private endpoint to the correct private DNS zone', 'Den privaten Endpunkt mit der richtigen privaten DNS-Zone verknüpfen'], ['B', 'Create an Azure CDN profile', 'Ein Azure-CDN-Profil erstellen'], ['C', 'Add a public load balancer in front of the service', 'Einen öffentlichen Load Balancer vor dem Dienst hinzufügen'], ['D', 'Switch the resource to the free tier', 'Die Ressource auf den kostenlosen Tarif umstellen']], ['A'], [`Private-only connectivity needs both the private endpoint and DNS that resolves the service name to the private IP. Without private DNS, clients can still try the public address.`, `Konnektivität nur über private Netzwerke benötigt sowohl den privaten Endpunkt als auch DNS, das den Dienstnamen auf die private IP-Adresse auflöst. Ohne privates DNS versuchen Clients weiterhin die öffentliche Adresse zu verwenden.`], [`The missing piece is name resolution, not compute.`, `Das fehlende Element ist die Namensauflösung, nicht Compute.`], refs.privateDns),
    q('single', 'ai102-304', plan, 'medium', null, [`Which Azure service is the best fit to centralize authentication, throttling, quotas, and request logging when many applications call the same AI backend?`, `Welcher Azure-Dienst eignet sich am besten, um Authentifizierung, Drosselung, Quoten und Anforderungsprotokollierung zu zentralisieren, wenn viele Anwendungen dasselbe KI-Backend aufrufen?`], [['A', 'Azure API Management', 'Azure API Management'], ['B', 'Azure Load Testing', 'Azure Load Testing'], ['C', 'Azure Bastion', 'Azure Bastion'], ['D', 'Azure DNS Private Resolver', 'Azure DNS Private Resolver']], ['A'], [`API Management can sit in front of Azure AI endpoints and apply centralized policies for auth, throttling, transformation, and observability.`, `API Management kann vor Azure-AI-Endpunkten liegen und zentrale Richtlinien für Authentifizierung, Drosselung, Transformation und Beobachtbarkeit anwenden.`], [`Think gateway and policy enforcement.`, `Denken Sie an Gateway und Richtliniendurchsetzung.`], refs.apim),
    q('multiple', 'ai102-305', plan, 'medium', null, [`Which TWO signals usually indicate a transient AI service condition instead of a permanent authentication or configuration problem?`, `Welche ZWEI Signale deuten normalerweise auf einen vorübergehenden Dienstzustand statt auf ein dauerhaftes Authentifizierungs- oder Konfigurationsproblem hin?`], [['A', 'HTTP 429 Too Many Requests', 'HTTP 429 Too Many Requests'], ['B', 'HTTP 503 Service Unavailable', 'HTTP 503 Service Unavailable'], ['C', 'HTTP 401 Unauthorized', 'HTTP 401 Unauthorized'], ['D', 'A misspelled endpoint hostname', 'Ein falsch geschriebener Endpunkt-Hostname']], ['A', 'B'], [`Rate limiting and temporary unavailability are classic transient faults that should trigger retry and backoff logic. Unauthorized responses and bad hostnames usually require a configuration fix.`, `Ratenbegrenzung und vorübergehende Nichtverfügbarkeit sind klassische temporäre Fehler, die Retry- und Backoff-Logik auslösen sollten. Unauthorized-Antworten und falsche Hostnamen erfordern normalerweise eine Konfigurationskorrektur.`], [`Choose the retryable conditions.`, `Wählen Sie die Bedingungen aus, die erneut versucht werden sollten.`], refs.transient),
    q('scenario', 'ai102-306', plan, 'hard', [`Your security team reviews this resource configuration for Azure AI Language:
properties: {
  disableLocalAuth: false
}
The policy says API keys must stop working and only Microsoft Entra tokens are allowed.`, `Ihr Sicherheitsteam prüft diese Ressourcenkonfiguration für Azure AI Language:
properties: {
  disableLocalAuth: false
}
Die Richtlinie besagt, dass API-Schlüssel nicht mehr funktionieren dürfen und nur Microsoft-Entra-Token erlaubt sind.`], [`Which change enforces that policy?`, `Welche Änderung erzwingt diese Richtlinie?`], [['A', 'Set disableLocalAuth to true', 'disableLocalAuth auf true setzen'], ['B', 'Create a second access key', 'Einen zweiten Zugriffsschlüssel erstellen'], ['C', 'Enable public network access', 'Öffentlichen Netzwerkzugriff aktivieren'], ['D', 'Change the SKU', 'Die SKU ändern']], ['A'], [`Setting disableLocalAuth to true turns off key-based access so the service can only be reached through token-based authentication.`, `Wenn disableLocalAuth auf true gesetzt wird, wird der schlüsselbasierte Zugriff deaktiviert, sodass der Dienst nur noch über tokenbasierte Authentifizierung erreichbar ist.`], [`The requirement is to disable keys, not networking.`, `Die Anforderung besteht darin, Schlüssel zu deaktivieren, nicht das Netzwerk zu ändern.`], refs.disableLocalAuth),
    q('single', 'ai102-307', plan, 'easy', null, [`Which credential class is designed to use a developer identity locally and a managed identity or service principal in Azure without code changes?`, `Welche Anmeldeinformationsklasse ist dafür vorgesehen, lokal eine Entwickleridentität und in Azure ohne Codeänderungen eine verwaltete Identität oder einen Service Principal zu verwenden?`], [['A', 'DefaultAzureCredential', 'DefaultAzureCredential'], ['B', 'AnonymousCredential', 'AnonymousCredential'], ['C', 'StorageSharedKeyCredential', 'StorageSharedKeyCredential'], ['D', 'BasicAuthenticationCredential', 'BasicAuthenticationCredential']], ['A'], [`DefaultAzureCredential tries several secure credential sources in order and is the standard choice for the same code path across local development and Azure hosting.`, `DefaultAzureCredential versucht mehrere sichere Anmeldeinformationsquellen in definierter Reihenfolge und ist die Standardwahl für denselben Codepfad in lokaler Entwicklung und Azure-Hosting.`], [`This is the general-purpose Azure identity chain.`, `Dies ist die allgemeine Azure-Identitätskette.`], refs.auth),
    q('multiple', 'ai102-308', plan, 'medium', null, [`Which TWO deployment artifacts should be versioned so an AI environment can be reproduced consistently across dev, test, and prod?`, `Welche ZWEI Bereitstellungsartefakte sollten versioniert werden, damit eine KI-Umgebung über Dev, Test und Prod hinweg konsistent reproduziert werden kann?`], [['A', 'Infrastructure templates such as Bicep or ARM', 'Infrastrukturvorlagen wie Bicep oder ARM'], ['B', 'Configuration and parameter files for endpoints and model deployments', 'Konfigurations- und Parameterdateien für Endpunkte und Modellbereitstellungen'], ['C', 'Screenshots of the Azure portal', 'Screenshots des Azure-Portals'], ['D', 'Browser bookmarks used by administrators', 'Browser-Lesezeichen der Administratoren']], ['A', 'B'], [`Versioning infrastructure definitions and deployment configuration creates a repeatable release process and makes changes reviewable. Screenshots and bookmarks are not reliable operational artifacts.`, `Die Versionierung von Infrastrukturdefinitionen und Bereitstellungskonfiguration schafft einen wiederholbaren Release-Prozess und macht Änderungen prüfbar. Screenshots und Lesezeichen sind keine verlässlichen Betriebsartefakte.`], [`Think reproducible deployment, not personal notes.`, `Denken Sie an reproduzierbare Bereitstellung, nicht an persönliche Notizen.`], refs.bicep),

    q('scenario', 'ai102-309', moderation, 'hard', [`A moderation API response contains category results with severity scores for violence, hate, self-harm, and sexual content. Your rule says any violence score of 4 or higher must be blocked.`, `Eine Moderations-API-Antwort enthält Kategorieergebnisse mit Schweregraden für Gewalt, Hass, Selbstverletzung und sexuelle Inhalte. Ihre Regel besagt, dass jeder Gewaltwert von 4 oder höher blockiert werden muss.`], [`Which result should the application inspect to enforce the rule?`, `Welches Ergebnis sollte die Anwendung prüfen, um diese Regel durchzusetzen?`], [['A', 'The returned severity for the violence category', 'Den zurückgegebenen Schweregrad für die Kategorie Gewalt'], ['B', 'Only the HTTP status code', 'Nur den HTTP-Statuscode'], ['C', 'Only the request identifier', 'Nur die Anforderungs-ID'], ['D', 'Only the original text length', 'Nur die ursprüngliche Textlänge']], ['A'], [`The moderation payload includes category-specific scores. To apply a threshold such as violence >= 4, the app must inspect the returned severity for that category.`, `Die Moderationsnutzlast enthält kategoriespezifische Werte. Um einen Schwellenwert wie Gewalt >= 4 anzuwenden, muss die App den zurückgegebenen Schweregrad für diese Kategorie prüfen.`], [`Use the model output, not transport metadata.`, `Verwenden Sie die Modellausgabe und nicht Transportmetadaten.`], refs.contentSafety),
    q('multiple', 'ai102-310', moderation, 'medium', null, [`Which TWO actions implement organization-specific text blocking in Azure AI Content Safety?`, `Welche ZWEI Aktionen implementieren organisationsspezifische Textsperren in Azure AI Content Safety?`], [['A', 'Create a custom blocklist', 'Eine benutzerdefinierte Blockliste erstellen'], ['B', 'Reference the blocklist in the analyze request', 'Die Blockliste in der Analyseanforderung referenzieren'], ['C', 'Train a Custom Vision object detector', 'Einen Custom-Vision-Objektdetektor trainieren'], ['D', 'Create an Azure AI Search synonym map', 'Eine Synonymzuordnung in Azure AI Search erstellen']], ['A', 'B'], [`Custom blocklists let you define prohibited words or phrases, and the request must use those blocklists so matches are returned during analysis.`, `Benutzerdefinierte Blocklisten ermöglichen die Definition verbotener Wörter oder Ausdrücke, und die Anforderung muss diese Blocklisten verwenden, damit Treffer während der Analyse zurückgegeben werden.`], [`The solution needs exact term blocking.`, `Die Lösung benötigt exakte Begriffsblockierung.`], refs.blocklist),
    q('scenario', 'ai102-311', moderation, 'hard', [`A RAG application retrieves passages from user-uploaded documents and inserts them into prompts for Azure OpenAI. The safety team worries that unsafe text inside the retrieved passages could bypass prompt moderation.`, `Eine RAG-Anwendung ruft Passagen aus benutzerhochgeladenen Dokumenten ab und fügt sie in Prompts für Azure OpenAI ein. Das Sicherheitsteam befürchtet, dass unsicherer Text in den abgerufenen Passagen die Prompt-Moderation umgehen könnte.`], [`Where should another moderation check run?`, `Wo sollte eine weitere Moderationsprüfung ausgeführt werden?`], [['A', 'On the retrieved passages before the app assembles the final prompt', 'Auf den abgerufenen Passagen, bevor die App den endgültigen Prompt zusammensetzt'], ['B', 'Only after monthly billing closes', 'Erst nach Abschluss der monatlichen Abrechnung'], ['C', 'Only after the browser tab is closed', 'Erst nachdem der Browser-Tab geschlossen wurde'], ['D', 'Only on the DNS response from the AI endpoint', 'Nur auf der DNS-Antwort des KI-Endpunkts']], ['A'], [`Retrieved content becomes part of the effective model input. Moderating that content before prompt assembly helps stop unsafe passages from reaching the model.`, `Abgerufene Inhalte werden Teil der effektiven Modelleingabe. Wenn diese Inhalte vor dem Zusammenbau des Prompts moderiert werden, gelangen unsichere Passagen gar nicht erst an das Modell.`], [`Moderate every inbound content source, not only the user text box.`, `Moderieren Sie jede eingehende Inhaltsquelle und nicht nur das Benutzertextfeld.`], refs.contentSafety),
    q('single', 'ai102-312', moderation, 'medium', null, [`Which Azure service should analyze an uploaded image for harmful categories such as violence or sexual content before the image is stored?`, `Welcher Azure-Dienst sollte ein hochgeladenes Bild auf schädliche Kategorien wie Gewalt oder sexuelle Inhalte analysieren, bevor das Bild gespeichert wird?`], [['A', 'Azure AI Content Safety', 'Azure AI Content Safety'], ['B', 'Azure AI Search', 'Azure AI Search'], ['C', 'Azure API Management', 'Azure API Management'], ['D', 'Azure Monitor', 'Azure Monitor']], ['A'], [`Azure AI Content Safety provides moderation for both text and images and is designed for policy enforcement before content is accepted or published.`, `Azure AI Content Safety bietet Moderation für Text und Bilder und ist für die Richtliniendurchsetzung vorgesehen, bevor Inhalte akzeptiert oder veröffentlicht werden.`], [`Use the service built for moderation workflows.`, `Verwenden Sie den Dienst, der für Moderations-Workflows entwickelt wurde.`], refs.contentSafety),
    q('multiple', 'ai102-313', moderation, 'medium', null, [`Which TWO data points are most useful to log for moderation audits and threshold tuning?`, `Welche ZWEI Datenpunkte sind für Moderationsaudits und die Abstimmung von Schwellenwerten am nützlichsten?`], [['A', 'Returned category severities', 'Zurückgegebene Kategorieschweregrade'], ['B', 'The final moderation action such as allow, review, or block', 'Die endgültige Moderationsaktion wie zulassen, prüfen oder blockieren'], ['C', 'The admin key of the moderation resource', 'Der Administratorschlüssel der Moderationsressource'], ['D', 'The deployment credentials of the backend service', 'Die Bereitstellungsanmeldeinformationen des Backend-Dienstes']], ['A', 'B'], [`Severity values explain why the decision was made, and the final action shows how the application enforced policy. Secrets should never be logged.`, `Schweregradwerte erklären, warum die Entscheidung getroffen wurde, und die endgültige Aktion zeigt, wie die Anwendung die Richtlinie durchgesetzt hat. Geheimnisse dürfen niemals protokolliert werden.`], [`Log decisions and scores, not secrets.`, `Protokollieren Sie Entscheidungen und Werte, nicht Geheimnisse.`], refs.contentSafety),
    q('scenario', 'ai102-314', moderation, 'hard', [`A single-page app uploads text and images to a backend API. Product owners want the same moderation thresholds enforced across the web app, mobile app, and future partner integrations.`, `Eine Single-Page-App lädt Text und Bilder zu einer Backend-API hoch. Die Produktverantwortlichen möchten, dass dieselben Moderationsschwellenwerte in der Web-App, der Mobile-App und künftigen Partnerintegrationen erzwungen werden.`], [`Where should the moderation policy be enforced?`, `Wo sollte die Moderationsrichtlinie erzwungen werden?`], [['A', 'In the backend service layer before content is stored or shown', 'In der Backend-Service-Schicht, bevor Inhalte gespeichert oder angezeigt werden'], ['B', 'Only in browser JavaScript', 'Nur in Browser-JavaScript'], ['C', 'Only in a wiki document for developers', 'Nur in einem Wiki-Dokument für Entwickler'], ['D', 'Only in local test data files', 'Nur in lokalen Testdatendateien']], ['A'], [`Centralizing moderation in the backend keeps policy consistent across clients and prevents users from bypassing checks by modifying frontend code.`, `Wenn Moderation im Backend zentralisiert wird, bleibt die Richtlinie über Clients hinweg konsistent und Benutzer können Prüfungen nicht durch Änderungen am Frontend-Code umgehen.`], [`Put enforcement in a trusted layer.`, `Legen Sie die Durchsetzung in eine vertrauenswürdige Schicht.`], refs.contentSafety),

    q('scenario', 'ai102-315', vision, 'hard', [`A product catalog service must return both a natural-language caption and OCR text from the same uploaded image with one API call.`, `Ein Produktkatalogdienst muss mit einem API-Aufruf sowohl eine natürlichsprachliche Bildbeschreibung als auch OCR-Text aus demselben hochgeladenen Bild zurückgeben.`], [`Which Azure capability is the best fit?`, `Welche Azure-Funktion passt am besten?`], [['A', 'Azure AI Vision Image Analysis with caption and read features', 'Azure AI Vision Image Analysis mit Caption- und Read-Features'], ['B', 'A Custom Vision training project only', 'Nur ein Custom-Vision-Trainingsprojekt'], ['C', 'Azure AI Translator', 'Azure AI Translator'], ['D', 'Azure AI Search indexer', 'Azure AI Search-Indexer']], ['A'], [`Image Analysis provides prebuilt visual features, including captions and text extraction, without requiring a custom model for general image understanding.`, `Image Analysis stellt vorgefertigte visuelle Features bereit, einschließlich Bildbeschreibungen und Textextraktion, ohne dass für allgemeines Bildverständnis ein benutzerdefiniertes Modell erforderlich ist.`], [`Use the prebuilt vision API that can combine visual features.`, `Verwenden Sie die vorgefertigte Vision-API, die visuelle Features kombinieren kann.`], refs.visionAnalysis),
    q('single', 'ai102-316', vision, 'medium', null, [`In an allowed identity-verification workflow, which Face API operation should compare a selfie with a stored badge photo to determine whether they belong to the same person?`, `Welche Face-API-Operation sollte in einem zulässigen Identitätsprüfungs-Workflow ein Selfie mit einem gespeicherten Ausweisfoto vergleichen, um festzustellen, ob beide zur selben Person gehören?`], [['A', 'Verify', 'Verify'], ['B', 'Translate', 'Translate'], ['C', 'Index', 'Index'], ['D', 'Summarize', 'Summarize']], ['A'], [`The Verify operation compares two faces or a face and a known person to determine whether they match.`, `Die Operation Verify vergleicht zwei Gesichter oder ein Gesicht mit einer bekannten Person, um festzustellen, ob sie übereinstimmen.`], [`Choose the identity-comparison operation.`, `Wählen Sie die Operation für den Identitätsvergleich.`], refs.face),
    q('multiple', 'ai102-317', vision, 'medium', null, [`Which TWO labeled assets are required to train an object detection model in Custom Vision?`, `Welche ZWEI beschrifteten Elemente werden benötigt, um ein Objekterkennungsmodell in Custom Vision zu trainieren?`], [['A', 'Training images', 'Trainingsbilder'], ['B', 'Bounding boxes or regions tagged around the target objects', 'Bounding Boxes oder Regionen mit Tags um die Zielobjekte'], ['C', 'Audio transcripts', 'Audiotranskripte'], ['D', 'An Azure AI Search synonym map', 'Eine Synonymzuordnung in Azure AI Search']], ['A', 'B'], [`Object detection training needs labeled images and location labels that show where each object appears in the image.`, `Für das Training der Objekterkennung werden beschriftete Bilder und Positionsmarkierungen benötigt, die zeigen, wo jedes Objekt im Bild erscheint.`], [`Detection needs both examples and object locations.`, `Erkennung benötigt sowohl Beispiele als auch Objektpositionen.`], refs.customVision),
    q('scenario', 'ai102-318', vision, 'hard', [`A factory kiosk must classify company-specific products even when the internet connection is unreliable. The team wants low-latency inference on the device itself.`, `Ein Werkskiosk muss unternehmensspezifische Produkte klassifizieren, auch wenn die Internetverbindung unzuverlässig ist. Das Team möchte Inferenz mit geringer Latenz direkt auf dem Gerät.`], [`What should you deploy?`, `Was sollten Sie bereitstellen?`], [['A', 'An exported Custom Vision model such as ONNX or a container for local inference', 'Ein exportiertes Custom-Vision-Modell wie ONNX oder ein Container für lokale Inferenz'], ['B', 'Only the public prediction endpoint over the internet', 'Nur den öffentlichen Vorhersageendpunkt über das Internet'], ['C', 'An Azure AI Search indexer', 'Einen Azure AI Search-Indexer'], ['D', 'A Translator glossary', 'Ein Translator-Glossar']], ['A'], [`Custom Vision can export trained models for edge scenarios so predictions can run locally with lower dependency on network availability.`, `Custom Vision kann trainierte Modelle für Edge-Szenarien exportieren, sodass Vorhersagen lokal mit geringerer Abhängigkeit von der Netzwerkverfügbarkeit ausgeführt werden können.`], [`The clue is offline and low latency.`, `Der Hinweis ist offline und geringe Latenz.`], refs.customVision),
    q('single', 'ai102-319', vision, 'medium', null, [`Which Azure service should extract structured fields such as vendor, invoice total, and line items from invoices without training a custom OCR pipeline?`, `Welcher Azure-Dienst sollte strukturierte Felder wie Lieferant, Rechnungsbetrag und Positionen aus Rechnungen extrahieren, ohne eine benutzerdefinierte OCR-Pipeline zu trainieren?`], [['A', 'Azure AI Document Intelligence', 'Azure AI Document Intelligence'], ['B', 'Azure AI Search only', 'Nur Azure AI Search'], ['C', 'Azure API Management', 'Azure API Management'], ['D', 'Azure Load Balancer', 'Azure Load Balancer']], ['A'], [`Document Intelligence provides prebuilt models such as invoice extraction for structured document processing.`, `Document Intelligence bietet vorgefertigte Modelle wie die Rechnungsextraktion für die strukturierte Dokumentverarbeitung.`], [`Choose the prebuilt document extraction service.`, `Wählen Sie den vorgefertigten Dienst zur Dokumentextraktion.`], refs.docIntel),
    q('scenario', 'ai102-320', vision, 'hard', [`A JavaScript service submits a PDF by using Document Intelligence:
const poller = await client.beginAnalyzeDocument('prebuilt-invoice', file);
The code then tries to read fields immediately and gets no completed result.`, `Ein JavaScript-Dienst sendet eine PDF mit Document Intelligence:
const poller = await client.beginAnalyzeDocument('prebuilt-invoice', file);
Der Code versucht dann sofort, Felder zu lesen, und erhält kein abgeschlossenes Ergebnis.`], [`What should the code do next?`, `Was sollte der Code als Nächstes tun?`], [['A', 'Wait for the long-running operation to finish, for example by calling pollUntilDone()', 'Auf den Abschluss der lang laufenden Operation warten, zum Beispiel mit pollUntilDone()'], ['B', 'Regenerate the storage account key', 'Den Speicherkontoschlüssel neu generieren'], ['C', 'Move the PDF into Azure AI Search first', 'Die PDF zuerst nach Azure AI Search verschieben'], ['D', 'Disable TLS certificate validation', 'Die TLS-Zertifikatsprüfung deaktivieren']], ['A'], [`Document Intelligence analysis is a long-running operation. The client must wait for the poller to complete before reading extracted fields.`, `Die Analyse in Document Intelligence ist eine lang laufende Operation. Der Client muss warten, bis der Poller abgeschlossen ist, bevor extrahierte Felder gelesen werden.`], [`This is a polling pattern question.`, `Dies ist eine Frage zum Polling-Muster.`], refs.docIntel),
    q('multiple', 'ai102-321', vision, 'medium', null, [`Which TWO result details are especially useful when your UI highlights extracted text on the original page image?`, `Welche ZWEI Ergebnisdetails sind besonders nützlich, wenn Ihre UI extrahierten Text im ursprünglichen Seitenbild hervorheben soll?`], [['A', 'Bounding regions or polygons', 'Begrenzungsregionen oder Polygone'], ['B', 'Page numbers', 'Seitennummern'], ['C', 'The resource SKU only', 'Nur die Ressourcen-SKU'], ['D', 'The admin key only', 'Nur der Administratorschlüssel']], ['A', 'B'], [`Bounding geometry tells the UI where the text appears, and page numbers identify on which page the highlight should be drawn.`, `Die Begrenzungsgeometrie zeigt der UI, wo sich der Text befindet, und Seitennummern geben an, auf welcher Seite die Hervorhebung gezeichnet werden soll.`], [`Think location plus page context.`, `Denken Sie an Position plus Seitenkontext.`], refs.docIntel),
    q('scenario', 'ai102-322', vision, 'medium', [`A public photo application only needs general captions, tags, and common object detection for uploaded images. The classes are not company-specific and there is no labeled training set.`, `Eine öffentliche Fotoanwendung benötigt nur allgemeine Bildbeschreibungen, Tags und die Erkennung häufiger Objekte für hochgeladene Bilder. Die Klassen sind nicht unternehmensspezifisch und es gibt keinen beschrifteten Trainingsdatensatz.`], [`Which approach minimizes implementation effort?`, `Welcher Ansatz minimiert den Implementierungsaufwand?`], [['A', 'Use prebuilt Image Analysis', 'Vorgefertigte Image Analysis verwenden'], ['B', 'Train a new Custom Vision model for every feature', 'Für jedes Feature ein neues Custom-Vision-Modell trainieren'], ['C', 'Build a search indexer first', 'Zuerst einen Search-Indexer erstellen'], ['D', 'Use Translator text translation', 'Translator-Textübersetzung verwenden']], ['A'], [`Prebuilt Image Analysis already provides general image understanding features and avoids the cost and time of custom labeling and training.`, `Die vorgefertigte Image Analysis liefert bereits allgemeine Bildverständnisfunktionen und vermeidet Aufwand und Zeit für benutzerdefinierte Beschriftung und Training.`], [`No custom labels means use the prebuilt model.`, `Keine benutzerdefinierten Labels bedeutet: das vorgefertigte Modell verwenden.`], refs.visionAnalysis),

    q('scenario', 'ai102-323', nlp, 'hard', [`A support chatbot must route messages to custom intents such as cancel subscription and change shipping address, and it must extract entities such as order number from the same utterance.`, `Ein Support-Chatbot muss Nachrichten an benutzerdefinierte Intents wie Abonnement kündigen und Lieferadresse ändern weiterleiten und aus derselben Äußerung Entitäten wie Bestellnummer extrahieren.`], [`Which Azure capability is the best fit?`, `Welche Azure-Funktion ist am besten geeignet?`], [['A', 'Conversational Language Understanding', 'Conversational Language Understanding'], ['B', 'Question answering only', 'Nur Question Answering'], ['C', 'Image Analysis', 'Image Analysis'], ['D', 'Azure AI Search synonym maps', 'Synonymzuordnungen in Azure AI Search']], ['A'], [`Conversational Language Understanding is built for intent classification plus entity extraction over custom utterances.`, `Conversational Language Understanding ist für Intent-Klassifizierung plus Entitätsextraktion über benutzerdefinierte Äußerungen vorgesehen.`], [`You need both intents and entities.`, `Sie benötigen sowohl Intents als auch Entitäten.`], refs.clu),
    q('multiple', 'ai102-324', nlp, 'medium', null, [`Which TWO Azure AI Language features are commonly useful before indexing call-center transcripts for search and analytics?`, `Welche ZWEI Funktionen von Azure AI Language sind häufig nützlich, bevor Callcenter-Transkripte für Suche und Analysen indexiert werden?`], [['A', 'PII detection', 'PII-Erkennung'], ['B', 'Key phrase extraction', 'Schlüsselphrasenextraktion'], ['C', 'Private endpoint DNS resolution', 'Private-Endpunkt-DNS-Auflösung'], ['D', 'VM image replication', 'VM-Image-Replikation']], ['A', 'B'], [`PII detection helps redact sensitive information, and key phrase extraction adds concise topic signals that can improve indexing and analytics.`, `PII-Erkennung hilft beim Schwärzen sensibler Informationen, und Schlüsselphrasenextraktion fügt knappe Themensignale hinzu, die Indexierung und Analysen verbessern können.`], [`Choose one privacy feature and one enrichment feature.`, `Wählen Sie ein Datenschutz- und ein Anreicherungsfeature.`], refs.language),
    q('single', 'ai102-325', nlp, 'easy', null, [`Which Azure AI capability is designed for FAQ-style bots that answer natural-language questions from curated question-and-answer pairs?`, `Welche Azure-AI-Funktion ist für FAQ-Bots ausgelegt, die natürlichsprachliche Fragen aus kuratierten Frage-Antwort-Paaren beantworten?`], [['A', 'Question answering', 'Question Answering'], ['B', 'Conversational Language Understanding', 'Conversational Language Understanding'], ['C', 'Custom Vision', 'Custom Vision'], ['D', 'Document Intelligence', 'Document Intelligence']], ['A'], [`Question answering is optimized for knowledge-base scenarios where users ask natural-language questions over curated answers.`, `Question Answering ist für Wissensdatenbank-Szenarien optimiert, in denen Benutzer natürlichsprachliche Fragen über kuratierte Antworten stellen.`], [`This is the FAQ service.`, `Dies ist der FAQ-Dienst.`], refs.questionAnswering),
    q('multiple', 'ai102-326', nlp, 'medium', [`A voice bot should listen to a caller and then read the generated answer aloud. Which TWO speech capabilities are needed?`, `Ein Sprachbot soll einem Anrufer zuhören und anschließend die generierte Antwort laut vorlesen. Welche ZWEI Sprachfunktionen werden benötigt?`], [['A', 'Speech to text', 'Speech-to-Text'], ['B', 'Text to speech', 'Text-to-Speech'], ['C', 'Object detection', 'Objekterkennung'], ['D', 'OCR layout extraction', 'OCR-Layout-Extraktion']], ['A', 'B'], [`Speech recognition converts the caller audio to text, and speech synthesis converts the final answer text back to audio.`, `Spracherkennung wandelt den Anruferton in Text um, und Sprachsynthese wandelt den endgültigen Antworttext wieder in Audio um.`], [`One capability listens, the other speaks.`, `Eine Funktion hört zu, die andere spricht.`], refs.speech),
    q('single', 'ai102-327', nlp, 'medium', null, [`Which Azure service should provide near-real-time translated subtitles from spoken German into English during a live webinar?`, `Welcher Azure-Dienst sollte nahezu in Echtzeit übersetzte Untertitel von gesprochenem Deutsch nach Englisch während eines Live-Webinars liefern?`], [['A', 'Speech Translation', 'Speech Translation'], ['B', 'Text Analytics for health', 'Text Analytics for Health'], ['C', 'Azure AI Search indexer', 'Azure AI Search-Indexer'], ['D', 'Custom Vision', 'Custom Vision']], ['A'], [`Speech Translation is designed for speech-to-text translation scenarios such as live captions and multilingual audio experiences.`, `Speech Translation ist für Sprach-zu-Text-Übersetzungsszenarien wie Live-Untertitel und mehrsprachige Audioerlebnisse ausgelegt.`], [`This is spoken language translation, not document translation.`, `Dies ist gesprochene Sprachübersetzung, nicht Dokumentübersetzung.`], refs.speechTranslation),
    q('scenario', 'ai102-328', nlp, 'hard', [`A translation API receives text in an unknown source language and must return French and Spanish in a single REST call.`, `Eine Übersetzungs-API erhält Text in einer unbekannten Ausgangssprache und muss in einem einzigen REST-Aufruf Französisch und Spanisch zurückgeben.`], [`How should the request be designed?`, `Wie sollte die Anforderung gestaltet werden?`], [['A', 'Use Translator and specify multiple target languages in the to parameter', 'Translator verwenden und mehrere Zielsprachen im Parameter to angeben'], ['B', 'Train a CLU project for each target language', 'Für jede Zielsprache ein CLU-Projekt trainieren'], ['C', 'Create two separate Speech resources only', 'Nur zwei separate Speech-Ressourcen erstellen'], ['D', 'Use Azure AI Search scoring profiles', 'Azure AI Search-Scoringprofile verwenden']], ['A'], [`Translator supports translation into multiple target languages in one request, and it can auto-detect the source language when needed.`, `Translator unterstützt die Übersetzung in mehrere Zielsprachen in einer Anforderung und kann bei Bedarf die Ausgangssprache automatisch erkennen.`], [`One service call can target multiple languages.`, `Ein Dienstaufruf kann mehrere Zielsprachen bedienen.`], refs.translator),
    q('single', 'ai102-329', nlp, 'medium', null, [`Which Azure AI Language feature should redact credit card numbers, phone numbers, and other sensitive data from chat transcripts before storage?`, `Welche Funktion von Azure AI Language sollte Kreditkartennummern, Telefonnummern und andere sensible Daten aus Chat-Transkripten vor der Speicherung schwärzen?`], [['A', 'PII detection', 'PII-Erkennung'], ['B', 'Entity linking', 'Entity Linking'], ['C', 'Language detection', 'Spracherkennung'], ['D', 'Optical character recognition', 'Optische Zeichenerkennung']], ['A'], [`PII detection identifies personally identifiable information and other sensitive patterns so applications can mask or remove them before persistence.`, `PII-Erkennung identifiziert personenbezogene Informationen und andere sensible Muster, sodass Anwendungen sie vor der Persistierung maskieren oder entfernen können.`], [`This feature is for sensitive data detection.`, `Diese Funktion dient der Erkennung sensibler Daten.`], refs.language),
    q('scenario', 'ai102-330', nlp, 'hard', [`Your CLU project was updated with new intents and entities, but the app endpoint still behaves like the old model version.`, `Ihr CLU-Projekt wurde mit neuen Intents und Entitäten aktualisiert, aber der App-Endpunkt verhält sich weiterhin wie die alte Modellversion.`], [`What is the most likely missing step?`, `Welcher Schritt fehlt am wahrscheinlichsten?`], [['A', 'Train and deploy the updated model version to the active deployment', 'Die aktualisierte Modellversion trainieren und in die aktive Bereitstellung deployen'], ['B', 'Rebuild the virtual network', 'Das virtuelle Netzwerk neu erstellen'], ['C', 'Create a new storage account', 'Ein neues Speicherkonto erstellen'], ['D', 'Switch the project to Custom Vision', 'Das Projekt auf Custom Vision umstellen']], ['A'], [`Changes in CLU are not served until the updated model is trained and deployed. Merely editing the project does not change the runtime endpoint behavior.`, `Änderungen in CLU werden erst dann bereitgestellt, wenn das aktualisierte Modell trainiert und bereitgestellt wurde. Das bloße Bearbeiten des Projekts ändert das Laufzeitverhalten des Endpunkts nicht.`], [`Project changes must reach a deployment.`, `Projektänderungen müssen in einer Bereitstellung ankommen.`], refs.clu),
    q('multiple', 'ai102-331', nlp, 'medium', null, [`Which TWO authentication approaches are common for a Speech SDK client?`, `Welche ZWEI Authentifizierungsansätze sind für einen Speech-SDK-Client üblich?`], [['A', 'A Speech resource key together with the region', 'Ein Speech-Ressourcenschlüssel zusammen mit der Region'], ['B', 'A short-lived authorization token issued by a secure backend', 'Ein kurzlebiges Autorisierungstoken, das von einem sicheren Backend ausgegeben wird'], ['C', 'Anonymous public access', 'Anonymer öffentlicher Zugriff'], ['D', 'A storage account SAS token', 'Ein SAS-Token für ein Speicherkonto']], ['A', 'B'], [`Speech SDK clients commonly authenticate either with the Speech key and region or with a short-lived auth token obtained from a backend. Anonymous access and storage SAS tokens are not Speech auth patterns.`, `Speech-SDK-Clients authentifizieren sich üblicherweise entweder mit dem Speech-Schlüssel und der Region oder mit einem kurzlebigen Auth-Token aus einem Backend. Anonymer Zugriff und Storage-SAS-Tokens sind keine Speech-Authentifizierungsmuster.`], [`Choose the options tied to the Speech service itself.`, `Wählen Sie die Optionen, die direkt mit dem Speech-Dienst verbunden sind.`], refs.speech),
    q('scenario', 'ai102-332', nlp, 'medium', [`A Node.js web app uses Azure AI Language locally with a developer sign-in and will run later in Azure App Service with a managed identity. The team wants the same credential code path in both places.`, `Eine Node.js-Web-App verwendet Azure AI Language lokal mit einer Entwickleranmeldung und läuft später in Azure App Service mit verwalteter Identität. Das Team möchte in beiden Umgebungen denselben Codepfad für Anmeldeinformationen verwenden.`], [`Which credential should the SDK client use?`, `Welche Anmeldeinformationen sollte der SDK-Client verwenden?`], [['A', 'DefaultAzureCredential', 'DefaultAzureCredential'], ['B', 'AnonymousCredential', 'AnonymousCredential'], ['C', 'A hard-coded API key only', 'Nur einen fest codierten API-Schlüssel'], ['D', 'A storage connection string', 'Eine Storage-Verbindungszeichenfolge']], ['A'], [`DefaultAzureCredential is the standard Azure SDK choice when the same app must work across local development and Azure-hosted managed identity environments.`, `DefaultAzureCredential ist die Standardwahl im Azure SDK, wenn dieselbe App sowohl in lokaler Entwicklung als auch in einer mit verwalteter Identität gehosteten Azure-Umgebung funktionieren muss.`], [`One credential type should work in both environments.`, `Ein Anmeldeinformationstyp sollte in beiden Umgebungen funktionieren.`], refs.auth),

    q('single', 'ai102-333', knowledge, 'medium', null, [`Which Azure AI Search field type is typically used to store embedding vectors?`, `Welcher Feldtyp in Azure AI Search wird typischerweise zum Speichern von Embedding-Vektoren verwendet?`], [['A', 'Collection(Edm.Single)', 'Collection(Edm.Single)'], ['B', 'Edm.String', 'Edm.String'], ['C', 'Edm.Boolean', 'Edm.Boolean'], ['D', 'Edm.DateTimeOffset', 'Edm.DateTimeOffset']], ['A'], [`Embedding vectors are numeric arrays, so the common Azure AI Search field type is Collection(Edm.Single).`, `Embedding-Vektoren sind numerische Arrays, daher ist der übliche Feldtyp in Azure AI Search Collection(Edm.Single).`], [`Think numeric vector array.`, `Denken Sie an ein numerisches Vektorarray.`], refs.vectorSearch),
    q('multiple', 'ai102-334', knowledge, 'medium', null, [`Which TWO Azure AI Search objects directly control scheduled ingestion and AI enrichment?`, `Welche ZWEI Objekte in Azure AI Search steuern direkt die geplante Aufnahme und KI-Anreicherung?`], [['A', 'Indexer', 'Indexer'], ['B', 'Skillset', 'Skillset'], ['C', 'VM scale set', 'VM-Skalierungsgruppe'], ['D', 'Route table', 'Routingtabelle']], ['A', 'B'], [`The indexer orchestrates data ingestion on a schedule, and the skillset defines the enrichment pipeline that runs during indexing.`, `Der Indexer orchestriert die Datenaufnahme nach Zeitplan, und das Skillset definiert die Anreicherungspipeline, die während der Indexierung ausgeführt wird.`], [`One object schedules, the other enriches.`, `Ein Objekt plant, das andere reichert an.`], refs.skillset),
    q('scenario', 'ai102-335', knowledge, 'hard', [`A developer sends a vector query to Azure AI Search, but the target field was created as Edm.String and the request fails.`, `Ein Entwickler sendet eine Vektorabfrage an Azure AI Search, aber das Zielfeld wurde als Edm.String erstellt und die Anforderung schlägt fehl.`], [`What must change in the index design?`, `Was muss sich im Indexdesign ändern?`], [['A', 'Add a vector field with the proper numeric collection type and vector configuration', 'Ein Vektorfeld mit dem richtigen numerischen Collection-Typ und der passenden Vektorkonfiguration hinzufügen'], ['B', 'Move the index into Azure Blob Storage', 'Den Index in Azure Blob Storage verschieben'], ['C', 'Disable searchable text fields', 'Durchsuchbare Textfelder deaktivieren'], ['D', 'Use a CDN endpoint in front of the index', 'Einen CDN-Endpunkt vor dem Index verwenden']], ['A'], [`Vector search requires a field designed for numeric embeddings, along with the vector dimensions and profile configuration expected by the index.`, `Vektorsuche erfordert ein Feld, das für numerische Embeddings ausgelegt ist, zusammen mit den vom Index erwarteten Vektordimensionen und Profilkonfigurationen.`], [`A plain string field cannot store embedding vectors correctly.`, `Ein einfaches Zeichenkettenfeld kann Embedding-Vektoren nicht korrekt speichern.`], refs.vectorSearch),
    q('single', 'ai102-336', knowledge, 'medium', null, [`Which query mode combines lexical keyword relevance with vector similarity in a single Azure AI Search request?`, `Welcher Abfragemodus kombiniert lexikale Schlüsselwortrelevanz mit Vektorähnlichkeit in einer einzigen Azure-AI-Search-Anforderung?`], [['A', 'Hybrid search', 'Hybride Suche'], ['B', 'OCR only', 'Nur OCR'], ['C', 'Static website hosting', 'Statisches Website-Hosting'], ['D', 'Speech synthesis', 'Sprachsynthese']], ['A'], [`Hybrid search blends keyword matching with vector similarity so one request benefits from both retrieval signals.`, `Die hybride Suche kombiniert Schlüsselworttreffer mit Vektorähnlichkeit, sodass eine Anforderung von beiden Abrufsignalen profitiert.`], [`Use both retrieval strategies together.`, `Verwenden Sie beide Abrufstrategien gemeinsam.`], refs.vectorSearch),
    q('scenario', 'ai102-337', knowledge, 'hard', [`PDF files in Blob Storage must be OCR-processed, split into smaller chunks, embedded, and then written into a search index during ingestion.`, `PDF-Dateien in Blob Storage müssen während der Aufnahme per OCR verarbeitet, in kleinere Chunks aufgeteilt, eingebettet und anschließend in einen Suchindex geschrieben werden.`], [`Which Azure AI Search construct defines that chain of enrichments?`, `Welches Konstrukt in Azure AI Search definiert diese Kette von Anreicherungen?`], [['A', 'A skillset', 'Ein Skillset'], ['B', 'A network security group', 'Eine Netzwerksicherheitsgruppe'], ['C', 'A CDN profile', 'Ein CDN-Profil'], ['D', 'A VM availability set', 'Eine VM-Verfügbarkeitsgruppe']], ['A'], [`A skillset defines the ordered enrichment steps that run during indexing, such as OCR, text splitting, and vectorization.`, `Ein Skillset definiert die geordneten Anreicherungsschritte, die während der Indexierung ausgeführt werden, z. B. OCR, Textaufteilung und Vektorisierung.`], [`The question is about the enrichment pipeline definition.`, `Die Frage betrifft die Definition der Anreicherungspipeline.`], refs.skillset),
    q('multiple', 'ai102-338', knowledge, 'medium', null, [`Which TWO metadata fields should remain retrievable in a search index so a RAG app can show citations?`, `Welche ZWEI Metadatenfelder sollten in einem Suchindex abrufbar bleiben, damit eine RAG-App Zitate anzeigen kann?`], [['A', 'Source file name or URL', 'Quelldateiname oder URL'], ['B', 'Page number or chunk identifier', 'Seitennummer oder Chunk-Kennung'], ['C', 'The admin key of the search service', 'Der Administratorschlüssel des Suchdienstes'], ['D', 'The resource group location only', 'Nur der Standort der Ressourcengruppe']], ['A', 'B'], [`Citation-friendly RAG needs provenance metadata, such as where the chunk came from and on which page or section it was found.`, `Für zitierfähiges RAG werden Herkunftsmetadaten benötigt, etwa woher der Chunk stammt und auf welcher Seite oder in welchem Abschnitt er gefunden wurde.`], [`Keep provenance with each chunk.`, `Bewahren Sie die Herkunft bei jedem Chunk auf.`], refs.vectorSearch),
    q('scenario', 'ai102-339', knowledge, 'hard', [`After extracting text from long documents, your team wants the search index to support passage-level retrieval instead of returning whole documents as one large blob.`, `Nach der Textextraktion aus langen Dokumenten möchte Ihr Team, dass der Suchindex den Abruf auf Passagebene unterstützt, anstatt ganze Dokumente als einen großen Block zurückzugeben.`], [`What preprocessing step should be added before indexing or embedding?`, `Welcher Vorverarbeitungsschritt sollte vor dem Indexieren oder Einbetten hinzugefügt werden?`], [['A', 'Split the text into smaller chunks', 'Den Text in kleinere Chunks aufteilen'], ['B', 'Convert the text into PNG images', 'Den Text in PNG-Bilder umwandeln'], ['C', 'Disable all metadata fields', 'Alle Metadatenfelder deaktivieren'], ['D', 'Move the data into DNS records', 'Die Daten in DNS-Einträge verschieben']], ['A'], [`Chunking creates smaller retrieval units that are easier to rank, embed, and inject into a model prompt than a full long document.`, `Chunking erzeugt kleinere Abrufeinheiten, die sich leichter ranken, einbetten und in einen Modell-Prompt einfügen lassen als ein vollständiges langes Dokument.`], [`Smaller retrieval units improve grounding quality.`, `Kleinere Abrufeinheiten verbessern die Grounding-Qualität.`], refs.vectorSearch),
    q('single', 'ai102-340', knowledge, 'medium', null, [`Which Azure AI Search feature returns extractive answers and captions for top matches?`, `Welche Funktion von Azure AI Search liefert extraktive Antworten und Bildunterschriften für die Top-Treffer?`], [['A', 'Semantic search with answers and captions', 'Semantische Suche mit Antworten und Bildunterschriften'], ['B', 'A blob lifecycle policy', 'Eine Blob-Lebenszyklusrichtlinie'], ['C', 'An NSG rule', 'Eine NSG-Regel'], ['D', 'A VM scale set', 'Eine VM-Skalierungsgruppe']], ['A'], [`Extractive answers and captions are semantic search capabilities that summarize top results in a more answer-oriented way.`, `Extraktive Antworten und Bildunterschriften sind Funktionen der semantischen Suche, die Top-Ergebnisse stärker antwortorientiert zusammenfassen.`], [`This is about richer query output, not ingestion.`, `Hier geht es um eine reichhaltigere Abfrageausgabe, nicht um Aufnahme.`], refs.semanticSearch),

    q('single', 'ai102-341', genai, 'medium', null, [`What kind of model output should be stored in a vector index to support semantic similarity search?`, `Welche Art von Modellausgabe sollte in einem Vektorindex gespeichert werden, um semantische Ähnlichkeitssuche zu unterstützen?`], [['A', 'Embeddings', 'Embeddings'], ['B', 'Rendered HTML', 'Gerendertes HTML'], ['C', 'PNG thumbnails', 'PNG-Miniaturbilder'], ['D', 'TLS certificates', 'TLS-Zertifikate']], ['A'], [`Embeddings convert text into numeric vectors that can be compared by similarity in a vector-enabled store.`, `Embeddings wandeln Text in numerische Vektoren um, die in einem vektorfähigen Speicher per Ähnlichkeit verglichen werden können.`], [`Similarity search needs vectors, not formatted text.`, `Ähnlichkeitssuche benötigt Vektoren, nicht formatierten Text.`], refs.embeddings),
    q('multiple', 'ai102-342', genai, 'medium', null, [`Which TWO prompt instructions help reduce hallucination in a RAG assistant?`, `Welche ZWEI Prompt-Anweisungen helfen, Halluzinationen in einem RAG-Assistenten zu reduzieren?`], [['A', 'Answer only from the provided sources', 'Nur auf Basis der bereitgestellten Quellen antworten'], ['B', 'State that the answer is unknown when the sources are insufficient', 'Angeben, dass die Antwort unbekannt ist, wenn die Quellen nicht ausreichen'], ['C', 'Invent missing facts to keep the answer complete', 'Fehlende Fakten erfinden, damit die Antwort vollständig wirkt'], ['D', 'Ignore all retrieved context', 'Den gesamten abgerufenen Kontext ignorieren']], ['A', 'B'], [`Grounding instructions that limit the model to supplied sources and allow it to say I do not know help reduce unsupported answers.`, `Grounding-Anweisungen, die das Modell auf bereitgestellte Quellen begrenzen und ihm erlauben, Ich weiß es nicht zu sagen, reduzieren unbelegte Antworten.`], [`Choose the instructions that constrain the model.`, `Wählen Sie die Anweisungen, die das Modell einschränken.`], refs.openaiChat),
    q('scenario', 'ai102-343', genai, 'hard', [`A chat application resends every prior message in the conversation to the model. Over time it hits token limits and response latency increases sharply.`, `Eine Chat-Anwendung sendet jede frühere Nachricht der Unterhaltung erneut an das Modell. Mit der Zeit stößt sie an Token-Grenzen und die Antwortlatenz steigt stark an.`], [`What is the best mitigation?`, `Was ist die beste Gegenmaßnahme?`], [['A', 'Summarize or trim older history and keep only the most relevant recent context', 'Ältere Historie zusammenfassen oder kürzen und nur den relevantesten aktuellen Kontext behalten'], ['B', 'Disable TLS to reduce overhead', 'TLS deaktivieren, um Overhead zu reduzieren'], ['C', 'Duplicate the same messages again for consistency', 'Dieselben Nachrichten zur Konsistenz erneut duplizieren'], ['D', 'Convert every message to an image first', 'Jede Nachricht zuerst in ein Bild umwandeln']], ['A'], [`Conversation history should be managed so the prompt stays within token and latency budgets. Summarization and selective retention are common approaches.`, `Der Gesprächsverlauf sollte so verwaltet werden, dass der Prompt innerhalb von Token- und Latenzbudgets bleibt. Zusammenfassung und selektive Aufbewahrung sind gängige Ansätze.`], [`Keep the useful context, not every token forever.`, `Behalten Sie den nützlichen Kontext, nicht dauerhaft jedes Token.`], refs.openaiChat),
    q('scenario', 'ai102-344', genai, 'hard', [`An Azure OpenAI endpoint returns HTTP 429 with a Retry-After header. The current client fails immediately and shows an error to the user.`, `Ein Azure-OpenAI-Endpunkt liefert HTTP 429 mit einem Retry-After-Header. Der aktuelle Client schlägt sofort fehl und zeigt dem Benutzer einen Fehler an.`], [`How should the client behave?`, `Wie sollte sich der Client verhalten?`], [['A', 'Retry with backoff and respect the Retry-After guidance', 'Mit Backoff erneut versuchen und den Retry-After-Hinweis beachten'], ['B', 'Switch to plain HTTP', 'Auf unverschlüsseltes HTTP umstellen'], ['C', 'Retry in a tight infinite loop with no delay', 'In einer engen Endlosschleife ohne Verzögerung erneut versuchen'], ['D', 'Disable all safety controls', 'Alle Sicherheitskontrollen deaktivieren']], ['A'], [`HTTP 429 indicates rate limiting, so the resilient client response is controlled retry with delay, ideally using the service hint when provided.`, `HTTP 429 zeigt Ratenbegrenzung an, daher ist die robuste Clientreaktion ein kontrollierter erneuter Versuch mit Verzögerung, idealerweise unter Verwendung des Diensthinweises, wenn dieser vorhanden ist.`], [`This is a throttling question.`, `Dies ist eine Frage zur Drosselung.`], refs.transient),
    q('single', 'ai102-345', genai, 'medium', null, [`In Semantic Kernel, what groups callable functions that the model can use as tools?`, `Was gruppiert in Semantic Kernel aufrufbare Funktionen, die das Modell als Tools verwenden kann?`], [['A', 'A plugin', 'Ein Plugin'], ['B', 'A blob container', 'Ein Blob-Container'], ['C', 'A private endpoint', 'Ein privater Endpunkt'], ['D', 'A skillset', 'Ein Skillset']], ['A'], [`Semantic Kernel exposes callable functions through plugins, which package related capabilities for tool use and orchestration.`, `Semantic Kernel stellt aufrufbare Funktionen über Plugins bereit, die zusammengehörige Fähigkeiten für Tool-Nutzung und Orchestrierung bündeln.`], [`Think reusable tool grouping.`, `Denken Sie an die Wiederverwendbarkeit einer Tool-Gruppe.`], refs.semanticKernel),
    q('multiple', 'ai102-346', genai, 'medium', null, [`Which TWO components are required for a vector-based RAG solution over enterprise documents?`, `Welche ZWEI Komponenten werden für eine vektorbasierte RAG-Lösung über Unternehmensdokumente benötigt?`], [['A', 'An embedding model to vectorize queries and documents', 'Ein Embedding-Modell zur Vektorisierung von Abfragen und Dokumenten'], ['B', 'A vector-enabled index or store', 'Ein vektorfähiger Index oder Speicher'], ['C', 'A speech synthesis voice only', 'Nur eine Stimme für Sprachsynthese'], ['D', 'A CDN endpoint only', 'Nur ein CDN-Endpunkt']], ['A', 'B'], [`Vector-based RAG needs a way to create embeddings and a place to store and query those vectors efficiently.`, `Vektorbasierte RAG benötigt eine Möglichkeit, Embeddings zu erzeugen, und einen Ort, um diese Vektoren effizient zu speichern und abzufragen.`], [`One component makes vectors, the other retrieves them.`, `Eine Komponente erzeugt Vektoren, die andere ruft sie ab.`], refs.vectorSearch),
    q('scenario', 'ai102-347', genai, 'hard', [`A chat app puts all business rules into the user message. Users can then override those rules by changing their prompt wording.`, `Eine Chat-App legt alle Geschäftsregeln in die Benutzernachricht. Benutzer können diese Regeln dann überschreiben, indem sie ihren Prompt anders formulieren.`], [`Where should the non-negotiable assistant behavior be placed?`, `Wo sollte das nicht verhandelbare Verhalten des Assistenten festgelegt werden?`], [['A', 'In the system message', 'In der Systemnachricht'], ['B', 'In the browser title', 'Im Browsertitel'], ['C', 'In a CSS file', 'In einer CSS-Datei'], ['D', 'Only in analytics logs', 'Nur in Analytics-Protokollen']], ['A'], [`The system message is the primary place for stable instructions that define how the assistant should behave across user turns.`, `Die Systemnachricht ist der primäre Ort für stabile Anweisungen, die festlegen, wie sich der Assistent über Benutzerdialoge hinweg verhalten soll.`], [`Put durable behavior at the highest instruction level.`, `Legen Sie dauerhaftes Verhalten auf die höchste Anweisungsebene.`], refs.openaiChat),
    q('single', 'ai102-348', genai, 'medium', null, [`Which Azure service is commonly paired with Azure OpenAI On Your Data to store and retrieve grounded enterprise content?`, `Welcher Azure-Dienst wird häufig zusammen mit Azure OpenAI On Your Data verwendet, um geerdete Unternehmensinhalte zu speichern und abzurufen?`], [['A', 'Azure AI Search', 'Azure AI Search'], ['B', 'Azure DNS Zone', 'Azure DNS Zone'], ['C', 'Azure Firewall Policy', 'Azure Firewall Policy'], ['D', 'Azure Container Registry only', 'Nur Azure Container Registry']], ['A'], [`Azure AI Search is a common retrieval layer for grounded prompts because it can index enterprise content and support lexical, semantic, and vector retrieval patterns.`, `Azure AI Search ist eine häufige Retrieval-Schicht für geerdete Prompts, weil es Unternehmensinhalte indizieren und lexikale, semantische und vektorbasierte Abrufmuster unterstützen kann.`], [`Think retrieval layer for enterprise documents.`, `Denken Sie an die Retrieval-Schicht für Unternehmensdokumente.`], refs.searchOverview),
    q('multiple', 'ai102-349', genai, 'hard', null, [`A production app already relies on built-in Azure OpenAI filtering, but it also needs custom policy checks for retrieved passages and final answers. At which TWO points should the app-side moderation run?`, `Eine Produktions-App verlässt sich bereits auf die integrierte Azure-OpenAI-Filterung, benötigt aber zusätzlich benutzerdefinierte Richtlinienprüfungen für abgerufene Passagen und endgültige Antworten. An welchen ZWEI Punkten sollte die appseitige Moderation ausgeführt werden?`], [['A', 'Before retrieved or user-provided content is sent to the model', 'Bevor abgerufene oder benutzerbereitgestellte Inhalte an das Modell gesendet werden'], ['B', 'After the model output is generated but before it is shown', 'Nachdem die Modellausgabe erzeugt wurde, aber bevor sie angezeigt wird'], ['C', 'Only after the daily backup job finishes', 'Erst nachdem der tägliche Backup-Job abgeschlossen ist'], ['D', 'Only when the browser process exits', 'Nur wenn der Browserprozess beendet wird']], ['A', 'B'], [`Application-level moderation is strongest when it screens both inbound content that reaches the model and outbound content that reaches the user.`, `Moderation auf Anwendungsebene ist am stärksten, wenn sie sowohl eingehende Inhalte prüft, die das Modell erreichen, als auch ausgehende Inhalte, die den Benutzer erreichen.`], [`Moderate on the way in and on the way out.`, `Moderieren Sie beim Eingang und beim Ausgang.`], refs.contentFilter),
    q('multiple', 'ai102-350', genai, 'medium', null, [`Which TWO production controls are especially important when using Semantic Kernel plugins or tool calls?`, `Welche ZWEI Produktionskontrollen sind besonders wichtig, wenn Semantic-Kernel-Plugins oder Tool-Aufrufe verwendet werden?`], [['A', 'Expose only approved plugins or functions to the model', 'Dem Modell nur genehmigte Plugins oder Funktionen zur Verfügung stellen'], ['B', 'Validate and authorize each function invocation before executing sensitive actions', 'Jeden Funktionsaufruf validieren und autorisieren, bevor sensible Aktionen ausgeführt werden'], ['C', 'Allow the model to call any internal admin API automatically', 'Dem Modell erlauben, automatisch jede interne Admin-API aufzurufen'], ['D', 'Store secrets directly inside the prompt text', 'Geheimnisse direkt im Prompttext speichern']], ['A', 'B'], [`Tool-enabled apps should restrict what the model can call and enforce authorization checks before side effects occur. Unrestricted tools and prompt-embedded secrets are dangerous.`, `Tool-fähige Apps sollten einschränken, was das Modell aufrufen darf, und Autorisierungsprüfungen erzwingen, bevor Seiteneffekte auftreten. Unbeschränkte Tools und im Prompt eingebettete Geheimnisse sind gefährlich.`], [`Think allowlist plus authorization.`, `Denken Sie an Allowlist plus Autorisierung.`], refs.semanticKernel)
  ];

  if (window.ExamData && window.ExamData['ai-102']) {
    window.ExamData['ai-102'].questions = window.ExamData['ai-102'].questions.concat(extra);
  }
})();
