A hotel's invoice rechnung-seeblick.pdf should not be typed in by hand: amount, date and line items should end up as fields in a table. That is information extraction, and for it Learn names Azure Content Understanding in Foundry Tools (Content Understanding for short). The service uses generative AI to bring documents, images, audio and video into an output format that you define. The code is not run against Azure; this is how Microsoft Learn shows it. Outputs are not printed.

The building blocks

Building block What it is (according to Learn)
Analyzer defines how content is processed: extraction, fields, models. There are prebuilt and custom ones
Content extraction turns the file into normalized text and metadata: text recognition (OCR), layout, tables, and for audio and video transcripts
Segmentation splits documents or videos into sensible sections, for example by document type or scene
Field extraction produces key-value pairs according to your schema
Confidence scores an estimate from 0 to 1 per field value of how reliable it is
Grounding shows where in the source a value is located

Fields are produced in three ways: Extract takes values as they appear in the content (only for documents, according to Learn), Classify assigns a fixed category (such as the sentiment of a call), Generate writes freely, such as a summary. According to Learn's what's-new page, confidence scores exist only for documents. Classification is built into the analyzer interface: That way a document can first be classified and then routed to the suitable analyzer.

Prebuilt analyzers

Learn names groups. The ones that matter for Nordlicht:

Analyzer What for
prebuilt-invoice invoices, utility and other bills, orders
prebuilt-receipt.hotel hotel receipts and hotel invoices (folios)
prebuilt-documentSearch documents for search and RAG: paragraphs, tables, figures, summary
prebuilt-imageSearch images: a paragraph of description
prebuilt-audioSearch audio: transcript with speakers and summary
prebuilt-videoSearch video: transcript and description per segment
prebuilt-callCenter call recordings: topics, sentiment, key points
prebuilt-layout, prebuilt-read only layout and text, without a language model

Learn advises copying a prebuilt analyzer schema for production, because prebuilt definitions can change between API versions.

Versions and status

On the day of writing, Learn names two API versions: a generally available (GA) one that is recommended for production, and a preview version that shows new capabilities: for example agentic document analysis, signature detection and finer classification. The version names contain a date and are therefore not given here; the package Azure.AI.ContentUnderstanding still carries the addition --prerelease in Learn's quickstart. The page on image solutions carries the label "preview" in Learn's references; whether that still applies to your case: open. Whether Nordlicht's region is supported is stated on a Learn page of its own on languages and regions: open.

Model deployments

Content Understanding uses your deployments in Foundry for everything that needs a generative model (lesson 2.1). According to Learn, the service needs a chat model and an embedding model; you pay for the tokens used at the deployment and in addition for Content Understanding's meters (no amount here). Prebuilt analyzers address the models through alias names; you assign your deployments to them, either as the default for the resource (in Content Understanding Studio or per call) or per request. prebuilt-layout and prebuilt-read need none. Learn's C# quickstart requires default deployments to be set as a prerequisite. Which models an analyzer supports is queried from it; whether the model behind reise-chat is among them is open. For the embedding model, another deployment would be needed; in the case it is newly called reise-embedding.

The code

Learn's C# quickstart uses Azure.AI.ContentUnderstanding. The client (key and address from environment variables; for production, Learn recommends Entra ID):

C#
var client = new ContentUnderstandingClient(
    new Uri(endpoint),
    new AzureKeyCredential(key)
);

Invoice, excerpt from Learn's example (the address is Learn's sample file; at Nordlicht, the address of rechnung-seeblick.pdf goes there; how files without a public address get in, the quickstart does not show: open):

C#
Operation<AnalysisResult> operation = await client.AnalyzeAsync(
    WaitUntil.Completed,
    "prebuilt-invoice",
    inputs: new[] { new AnalysisInput { Uri = invoiceUrl } });

AnalysisResult result = operation.Value;
DocumentContent documentContent = (DocumentContent)result.Contents!.First();
var customerNameField = documentContent.Fields["CustomerName"];
Console.WriteLine($"  Confidence: {customerNameField.Confidence?.ToString("F2") ?? "N/A"}");

AnalyzeAsync gets the analyzer ID and the input. For images, Learn names the same form with prebuilt-imageSearch, for audio with prebuilt-audioSearch. The result contains the fields; each has a value and a confidence. In Learn's own sample output for Learn's sample invoice, one field has a low value and another a high one: On a document, not all fields are equally certain. The Learn page also has a Python tab (note in lesson 2.3).

Try it (optional): The Foundry resource, deployments and every analysis call cost money per use. Use only made-up sample files and delete the resource group afterwards.

The case

File Analyzer Human step
rechnung-seeblick.pdf prebuilt-invoice, alternatively prebuilt-receipt.hotel staff check fields with low confidence and compare with the booking before anything is booked
anruf-hotline.wav prebuilt-audioSearch or prebuilt-callCenter a person reads transcript and summary
zimmerfoto.jpg prebuilt-imageSearch a person judges the finding

Learn names WAV, PDF and JPEG as supported file types. Which analyzer suits the hotel invoice better is decided by a test with real invoices; open. The same goes for the confidence threshold. The case stays with the rule: The service reads fields, a person checks, no model decides about refunds. Learn also ties Content Understanding to the deployment's guardrails: The analysis can succeed with warnings even if individual field values are missing; read the warnings before you use results automatically.

Exercise 1

Assign: analyzer, does it need a deployment (yes or no), who checks?

  1. From rechnung-seeblick.pdf, amount, date and line items should be read.
  2. Only the text of a scanned booking confirmation is needed, no fields.
  3. A summary should be produced for anruf-hotline.wav.

Solution 1

  1. prebuilt-invoice (or prebuilt-receipt.hotel); yes, a deployment with a chat and an embedding model; staff check fields with low confidence.
  2. prebuilt-read (or prebuilt-layout); no, both need no language model according to Learn; whoever uses the confirmation reads the text against the original.
  3. prebuilt-audioSearch; yes, it produces a summary with a model; a person reads it.

Further reading