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):
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):
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?
- From
rechnung-seeblick.pdf, amount, date and line items should be read. - Only the text of a scanned booking confirmation is needed, no fields.
- A summary should be produced for
anruf-hotline.wav.
Solution 1
prebuilt-invoice(orprebuilt-receipt.hotel); yes, a deployment with a chat and an embedding model; staff check fields with low confidence.prebuilt-read(orprebuilt-layout); no, both need no language model according to Learn; whoever uses the confirmation reads the text against the original.prebuilt-audioSearch; yes, it produces a summary with a model; a person reads it.