These are my own condensed notes from studying for AI-901 (Azure AI Fundamentals) — Microsoft's 2026 refresh of AI-900, which folds implementation work into the unified Microsoft Foundry portal. I've organised them around the two domains Microsoft publishes for the exam rather than copying any single prep guide, and the examples are ones I came up with while trying to make the concepts stick for myself. Treat it as a revision aid, not an official syllabus.
1.1 Responsible AI principles
Microsoft groups responsible AI into six principles. The exam rarely asks you to define them — it gives you a scenario and expects you to name the principle it violates or satisfies.
Fairness
An AI system should produce similar outcomes for similar people, regardless of protected characteristics like gender, race, age, or disability.
- Data bias — the training set over- or under-represents a group.
- Algorithmic bias — the model amplifies a pattern that correlates with a protected characteristic even if that characteristic was never an explicit input.
- Mitigation — rebalance the training data, test performance per subgroup (not just overall accuracy), and use tools such as Fairlearn to measure and reduce disparity.
Example I use to remember it: a CV-screening model trained mostly on past hires from one university starts down-ranking equally qualified graduates from other schools. Nobody told it to discriminate by school — it inferred a proxy for something else.
Reliability and safety
The system should behave consistently under normal conditions and fail safely — not confidently — when it meets something it wasn't trained for.
- Robustness to noisy, incomplete, or adversarial input.
- Graceful degradation: returning "not confident enough" beats guessing.
- Azure angle: Azure AI Content Safety for filtering harmful output, plus monitoring/testing built into Azure Machine Learning pipelines.
Example: a shelf-scanning model in a warehouse that has only ever seen well-lit photos should say "unable to classify" under flickering fluorescent light — not silently misreport stock.
Privacy and security
Sensitive data must be minimised, protected, and used only with consent.
- Data minimisation — collect only what the task needs.
- Anonymisation / pseudonymisation — strip identifying details before training.
- Encryption at rest and in transit; Azure Key Vault for secrets, Private Link to keep traffic off the public internet.
- Two attack types worth recognising: model inversion (reconstructing training data from outputs) and membership inference (working out whether a specific record was in the training set).
Inclusiveness
The system should be usable by people regardless of ability, language, age, or access to modern hardware.
- Design for accessibility (screen readers, captions, alternative input) from the start rather than bolting it on.
- Consider the digital divide — not every user has a fast connection or a recent device.
- Azure angle: Azure AI Speech for accents/dialects, Azure AI Translator for language coverage, OCR for screen-reader-friendly text extraction.
Transparency
Users should know they're talking to an AI, roughly how it reached a decision, and where it's likely to be wrong.
- Global explainability — how the model behaves overall (e.g. "credit score is the heaviest-weighted factor").
- Local explainability — why this specific prediction came out the way it did.
- Simpler models (decision trees, linear regression) are naturally more interpretable than deep neural networks, which is a trade-off worth calling out when a scenario asks for an explainable system.
Accountability
A named human or team must own the outcome of an AI system — not just its code.
- Human-in-the-loop for consequential decisions.
- Governance — policies and review boards for AI risk.
- Auditability — logs that let you reconstruct what happened.
- Azure angle: Azure RBAC for ownership boundaries, Azure Monitor / Log Analytics for the audit trail.
Quick recap — matching a scenario to a principle
- Unequal outcomes across a demographic group → Fairness
- Confidently wrong on unfamiliar input → Reliability and safety
- Data exposed, no consent, or re-identification risk → Privacy and security
- Can't be used by someone with a disability or a minority language → Inclusiveness
- No explanation for a decision → Transparency
- Nobody responsible when it goes wrong → Accountability
1.2 AI model components and configuration
How generative models actually produce output
The pipeline, end to end:
- Pre-training — the model learns grammar, facts, and patterns from a huge, mostly unlabeled corpus, usually via a next-token-prediction objective (self-supervised learning).
- Fine-tuning (optional) — further training on a smaller, labelled, domain-specific set to specialise the model.
- Inference — a user sends a prompt, it's broken into tokens (roughly ¾ of a word each), the model predicts the next token repeatedly, and the result is decoded back into text as the completion.
Terms worth locking in: parameters are the learned internal weights (capacity roughly scales with parameter count); a token is the unit the model actually bills and reasons over; inference is simply "running the trained model to get an answer."
Sampling controls how the model picks the next token:
| Setting | Low value | High value |
|---|---|---|
| Temperature | Deterministic, repetitive, "safe" | Varied, creative, sometimes odd |
| Top-p (nucleus sampling) | Restricted to only the most likely tokens | Draws from a wider pool of plausible tokens |
Picking the right AI capability for a task
The exam likes to describe a business need and expect you to name the matching Azure capability. I find it easier to sort by what the task fundamentally does:
| The task is asking you to… | Capability | Typical Azure service |
|---|---|---|
| write, chat, summarise, or draw something new | Generative AI | Azure OpenAI (GPT, DALL·E, Whisper) |
| estimate a number | Regression | Azure Machine Learning |
| assign a label/category | Classification | Azure Machine Learning |
| flag something unusual | Anomaly detection | Azure AI Anomaly Detector |
| understand an image or video | Computer vision | Azure AI Vision / Video Indexer |
| understand written text | NLP | Azure AI Language / Translator |
| understand or produce speech | Speech | Azure AI Speech |
A trap the exam sets deliberately: not every "smart" task is generative. "Predict next month's revenue" is regression, not generation, even though it sounds futuristic.
Deployment options
Where a model runs changes its latency, cost model, and connectivity requirements.
| Option | Runs where | Best fit | Typical latency |
|---|---|---|---|
| Real-time (managed online) endpoint | Azure cloud | Chatbots, live scoring | Milliseconds |
| Batch endpoint | Azure cloud | Overnight jobs on large datasets | Minutes to hours |
| Edge / on-premises | Local device or server | No/unreliable internet, strict data residency | Very low, no network hop |
| Container | Your own Kubernetes/Docker host | Portability, multi-cloud, custom infra requirements | Depends on host |
Rule of thumb I use: "immediate" or "interactive" → real-time endpoint. "Overnight" or "thousands of files at once" → batch. "Factory floor," "no connectivity," or "can't leave the building" → edge. "We already run Kubernetes" → container.
Configuration parameters that shape a generative response
| Parameter | Controls | Low | High |
|---|---|---|---|
| Temperature | Randomness | Focused, factual | Creative, varied |
| Top-p | Size of the candidate token pool | Narrow, safe | Wide, diverse |
| Max tokens | Response length / cost ceiling | Short, cheap | Long, more expensive |
| Stop sequences | Where generation halts | — | Prevents rambling past a marker |
{
"prompt": "Summarise this support ticket in one sentence.",
"temperature": 0.2,
"top_p": 0.9,
"max_tokens": 60,
"stop": ["\n\n"]
}A low temperature plus a tight max_tokens is the classic setup for anything that needs to be consistent — data extraction, classification-by-prompt, or a customer-facing summary. Push temperature up only when you actually want variety, like brainstorming or creative copy.
Quick recap — 1.2
- Generative AI creates; regression predicts a number; classification assigns a label; anomaly detection flags outliers.
- Real-time endpoint = instant single requests. Batch = large volumes, no urgency. Edge = offline/private. Container = portability.
- Lower temperature/top-p = predictable. Higher = creative.
max_tokenscaps length and cost; stop sequences cap rambling.
1.3 AI workloads
Generative AI vs. agentic AI
Both can involve a language model, but they answer different questions:
| Generative AI | Agentic AI | |
|---|---|---|
| Core behaviour | Produces content | Takes action toward a goal |
| Typical loop | Prompt → completion | Goal → plan → tool calls → result |
| Example | "Draft a reply to this email" | "Read the inbox, categorise every unread message, and archive the newsletters" |
| Human role | Reviews the output | Can set boundaries (approvals, allowed tools) but the agent drives the steps |
The keyword to watch for is whether the scenario describes making something versus doing something autonomously, possibly across multiple steps or tools.
Text analysis techniques
Four techniques come up repeatedly, all under Azure AI Language:
| Technique | What it returns | Good trigger phrase |
|---|---|---|
| Keyword (key phrase) extraction | A list of the most relevant phrases | "main topics," "what is this about" |
| Entity detection (NER) | Categorised real-world entities — person, place, org, date, plus a PII subset for sensitive data | "find all the companies/dates," "redact personal data" |
| Sentiment analysis | Positive/negative/neutral/mixed, with a confidence score, at document or sentence level | "how do customers feel," "positive or negative" |
| Summarisation | A shorter version — extractive (pulls real sentences) or abstractive (writes new ones) | "condense," "tl;dr," "meeting minutes" |
A distinction that's easy to blur: keyword extraction returns descriptive phrases ("battery life," "checkout process"), entity detection returns named things with a category attached ("Contoso" → Organization). If the question wants proper nouns with a label, it's entities; if it wants themes, it's keywords.
Speech: recognition vs. synthesis
| Speech-to-Text (recognition) | Text-to-Speech (synthesis) | |
|---|---|---|
| Direction | Audio → text | Text → audio |
| Notable features | Real-time or batch transcription, phrase lists for jargon, speaker diarization, pronunciation assessment, language identification | Neural voices, SSML for pitch/rate/pauses, a voice gallery, custom neural voice |
| Trigger words | "transcribe," "captions," "diarization" | "synthesize," "neural voice," "SSML," "make it speak" |
Both live under a single Azure AI Speech resource. A quick SSML example, since the exam likes to check you know what it's for:
<speak>
<prosody rate="slow" pitch="+2st">Take a breath before we continue.</prosody>
<break time="400ms"/>
<emphasis level="strong">This part matters.</emphasis>
</speak>Computer vision and image generation
Analysis (image/video → information):
| Feature | What it gives you | Watch out for |
|---|---|---|
| Tagging | A flat list of detected concepts | Just words, no location |
| Description | A human-readable sentence | Reads like a caption |
| Object detection | Tags plus bounding boxes | The "where" is the whole point |
| OCR (Read API) | Printed/handwritten text from an image | Also counts as information extraction |
| Face detection (Vision) | Bounding box + attributes (age range, emotion, glasses) — not identity | Cannot say who someone is |
| Face service | Matches a face against a known database | This is the one that answers "who" |
| Video Indexer | Combines vision + speech + OCR across a video timeline | Reach for it whenever a question wants multiple insight types from one video file |
The Vision-vs-Face distinction above is a favourite exam trap: "detect that someone is smiling" is Vision; "confirm this is employee #4471" is the Face service, and only the Face service carries the consent/privacy baggage that comes with identifying a specific person.
Generation (text/image → new image): Azure OpenAI's image models cover text-to-image generation, inpainting (editing part of an image with a mask and a prompt), and generating variations of an existing image, with control over resolution and quality tier.
Extracting information, whatever the source
The pattern that ties Domain 1.3 together: identify the modality first, then pick the service.
| Source | Go-to service | What comes out |
|---|---|---|
| Text | Azure AI Language | Entities, key phrases, sentiment, PII, summaries |
| Image | Azure AI Vision | OCR text, tags, objects, faces |
| Audio | Azure AI Speech | Transcript, speaker labels, pronunciation scores |
| Video | Azure AI Video Indexer | Everything audio gives you, plus on-screen text, objects-in-motion, scene changes |
| Forms/PDFs | Azure AI Document Intelligence | Key-value pairs, tables, prebuilt invoice/receipt/ID fields |
A two-step pattern shows up a lot: to get sentiment out of a phone call, you transcribe first (Speech), then run the transcript through Language. The exam sometimes describes this whole chain and expects you to name both services in order.
Quick recap — 1.3
- "Bounding box" or "coordinates" → object detection, not plain tagging.
- "Who is this person" → Face service. "Is there a face, is it smiling" → Vision.
- Multiple insight types from one video → Video Indexer.
- Structured fields from a form/invoice → Document Intelligence, not plain OCR.
- Sentiment from a phone call → transcribe first (Speech), then analyse (Language).
2.1 Generative AI apps and agents in Microsoft Foundry
System prompts vs. user prompts
| System prompt | User prompt | |
|---|---|---|
| Sets | Persona, rules, output format, guardrails | The actual request |
| Visible to end user? | No | Yes |
| Set by | The developer | Whoever is chatting |
Things that consistently make a prompt better, in the order I check them: be specific rather than vague; break a multi-part task into explicit steps; give the model a role ("you are a strict code reviewer"); state the output format you want (JSON, a table, three bullet points, a word limit); and, for anything pattern-based, show one or two examples inside the user prompt (few-shot).
Deploying a model and testing it in the Foundry portal
Key vocabulary: the model catalog is where you pick a foundation model (GPT, Llama, Phi, and others); a deployment is a named, configured instance of that model; the endpoint is the REST URL you call; a token is the billing/limit unit (roughly 4 characters or ¾ of a word).
Flow: open your Foundry project → Model catalog → pick a model → Deploy as a real-time endpoint → give it a deployment name, choose standard (pay-as-you-go) or provisioned (reserved capacity) throughput → wait for it to come online → test it in the Chat playground, where you can edit the system message, type a user message, and tune temperature/top-p/max tokens live before writing a single line of code.
Standard billing is per-1,000-tokens with variable latency — good for development. Provisioned billing reserves hourly capacity for consistent low latency — better once traffic is predictable and production-grade.
A minimal chat client with the Foundry SDK
Once a deployment exists, calling it from code follows the same shape every time: authenticate, build a client pointed at your deployment, assemble a message list, call complete, read the response.
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential
client = ChatCompletionsClient(
endpoint="https://<your-project>.cognitiveservices.azure.com/",
credential=AzureKeyCredential("<api-key>"),
deployment="<deployment-name>",
)
messages = [
SystemMessage(content="You are a terse recipe assistant. Reply in under 40 words."),
UserMessage(content="What can I make with eggs, spinach, and feta?"),
]
response = client.complete(messages=messages)
print(response.choices[0].message.content)For a multi-turn client, append each AssistantMessage back onto the messages list before the next call — the API itself is stateless, so you are the one carrying the conversation history forward.
Single-agent solutions
An agent is a model plus tools, optional grounding data, and an orchestration loop that decides which tool to call and when — the thing that turns "answers from training data" into "can actually go do something."
| Plain chat model | Agent | |
|---|---|---|
| Uses external tools | No | Yes (search, functions, custom APIs) |
| Grounded in your data | Only if you paste it into the prompt | Yes, via a connected knowledge source |
| Remembers the conversation | Only if you resend history | Built-in, via threads |
| Decides how to answer | No — it just answers | Yes — picks a tool, calls it, reasons over the result |
Building one in the Foundry portal: create the agent, give it a name/model/system prompt, add tools (Bing search for live web data, Azure Functions or a REST call for custom logic, a code interpreter for calculations, or file/data grounding to answer from your own documents), optionally add knowledge (upload files or connect a data source so it stops guessing), decide whether tool calls need human confirmation or can run automatically, then test it in the Agent playground, which shows the reasoning/tool-call trace so you can see why it did what it did.
A minimal client for an agent
Talking to an agent from code introduces two ideas a plain chat client doesn't need: a thread (the conversation session) and a run (one execution of the agent against that thread).
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MessageTextContent
from azure.core.credentials import AzureKeyCredential
import time
project = AIProjectClient.from_connection_string(
credential=AzureKeyCredential("<api-key>"),
conn_str="<project-connection-string>",
)
agent = project.agents.get_agent("<agent-id>")
thread = project.agents.create_thread()
project.agents.create_message(thread_id=thread.id, role="user",
content="What's the latest release version of Azure AI Foundry?")
run = project.agents.create_run(thread_id=thread.id, agent_id=agent.id)
while run.status in ("queued", "in_progress", "requires_action"):
time.sleep(1)
run = project.agents.get_run(thread.id, run.id)
if run.status == "requires_action":
# the agent is waiting on a tool result — supply it via submit_tool_outputs
pass
for msg in project.agents.list_messages(thread_id=thread.id).data:
if msg.role == "assistant":
for part in msg.content:
if isinstance(part, MessageTextContent):
print(part.text.value)Run statuses worth memorising: queued/in_progress mean keep polling; requires_action means the agent is stuck waiting on a tool's output and you must call submit_tool_outputs; completed means read the messages; failed/cancelled mean stop and check what went wrong.
Quick recap — 2.1
- System prompt = hidden rules. User prompt = the visible ask.
azure-ai-inferencetalks to a plain deployed model.azure-ai-projectstalks to an agent via threads and runs.- An agent without a tool is just an expensive chatbot — tools are what make it "agentic."
requires_actionalways means: go fetch the tool result and submit it back.
2.2 Text and speech solutions in Foundry
A lightweight text-analysis app
The same ChatCompletionsClient from 2.1 can double as a text-analysis tool if the system prompt tells it to: put the extraction instruction in the system message, the raw text in the user message, and (if you need structured output) ask for JSON explicitly.
response = client.complete(messages=[
{"role": "system", "content": "Extract entities and overall sentiment. Reply as JSON with keys 'entities' and 'sentiment'."},
{"role": "user", "content": "Contoso shipped the update a week late, but support was excellent."},
])Responding to spoken prompts with a multimodal model
A multimodal deployment (for example a Phi-4-multimodal style model) can accept an audio clip inline alongside text, so the same chat-completion call that handles text can also transcribe and answer a spoken question in one round trip:
from azure.ai.inference.models import UserMessage, TextContentItem, AudioContentItem, InputAudio
response = client.complete(messages=[
{"role": "system", "content": "Answer the spoken question in one short sentence."},
UserMessage(content=[
TextContentItem(text="Here's the question as audio:"),
AudioContentItem(input_audio=InputAudio.load(audio_file="question.wav")),
]),
])Building with the Azure AI Speech SDK directly
For a dedicated "listen and speak" loop — rather than sending audio into a chat model — the Speech SDK handles both directions:
import azure.cognitiveservices.speech as speechsdk
recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
heard = recognizer.recognize_once().text
# ...send `heard` to a language model, get back `reply`...
synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config)
synthesizer.speak_text_async(reply).get()The end-to-end shape for a voice assistant is always: capture → recognise (STT) → process with a language model → synthesise (TTS) → play back.
Quick recap — 2.2
- A chat-completion call can take audio inline via
AudioContentItem— no separate transcription step needed for a multimodal deployment. - A pure Speech SDK app still follows recognise → process → synthesise.
2.3 Vision and image generation in Foundry
Interpreting images
Just like audio, an image can ride inside a chat message as an ImageContentItem, which unlocks captioning, visual Q&A ("what colour is the packaging?"), counting, and reading on-image text in a single call:
from azure.ai.inference.models import UserMessage, TextContentItem, ImageContentItem, ImageUrl
response = client.complete(messages=[
{"role": "system", "content": "Describe what's happening in the image in one sentence."},
UserMessage(content=[
TextContentItem(text="Describe this:"),
ImageContentItem(image_url=ImageUrl.load(image_file="warehouse.jpg")),
]),
])Generating new images
Deploy an image-generation model from the catalog, send a descriptive text prompt (and, for edits, an existing image plus a mask), and get back a generated image as a URL or binary payload. Typical uses: mockups, concept art, marketing variants, and masked edits ("change only the background to a studio backdrop").
Putting it together in a small app
The architecture is consistent whether you're interpreting or generating: a simple frontend collects an image and a question (or a prompt), the backend forwards it to the deployed multimodal or image-generation model in Foundry, and the response — text or a new image — gets displayed. Swapping text input for image input barely changes the client code; the SDK carries the extra content type for you.
Quick recap — 2.3
- Vision analysis and image generation are opposite directions of the same idea: image→text vs. text→image.
- Both slot into the same chat-completion call shape as text and audio — just a different content item type.
2.4 Information extraction with Azure Content Understanding
How it differs from Document Intelligence
| Document Intelligence | Content Understanding | |
|---|---|---|
| Focus | OCR + layout extraction | Extraction plus generative reasoning, in one pass |
| Best for | Forms that barely change (W-2s, standard receipts) | Messy, high-variation sources — invoices from hundreds of vendors, natural photos, audio, video |
| Modalities | Documents | Documents, images, audio, and video |
| Trade-off | Lower latency | More latency and token cost, but can infer things that aren't explicitly labelled |
Every field extracted by Content Understanding can be produced three ways: extract (pull an exact value), classify (assign it to a predefined category), or generate (produce a new summary/insight that isn't literally present in the source).
Documents and forms
Beyond raw text, it captures selection marks (checkboxes), barcodes, mathematical formulas, tables (including multi-page and spanning cells), and hierarchical sections. Prebuilt analyzers cover general reading/layout plus domain-specific document types — financial (invoices, statements), identity (passports, licences), tax forms, mortgage/lending paperwork, procurement contracts, and utility bills — so you often don't need to design a custom schema at all.
Images
The same service handles unstructured photos, not just scanned forms: OCR on signage or packaging, object and people detection, logo/landmark recognition, and parsing charts/graphs into structured data. The service auto-detects whether it's looking at a clean document layout or a natural scene and adjusts its preprocessing (deskewing, contrast correction) accordingly.
Audio and video
| Extracted | Audio | Video |
|---|---|---|
| Transcript + speaker diarization | ✅ | ✅ (from the audio track) |
| Non-speech audio events (applause, a door closing) | ✅ | ✅ |
| Sentiment / summarisation / action items | ✅ | ✅ |
| On-screen text, object motion, scene changes, logos | — | ✅ |
Every extracted fact carries temporal grounding — a timestamp range and speaker label — which is what makes the output auditable rather than a black box:
{
"field": "ActionItem",
"value": "Send the revised proposal by Friday",
"grounding": { "startTime": "00:12:04", "endTime": "00:12:11", "speaker": "Speaker A", "confidence": 0.91 }
}Practical limits worth knowing exist for both — rough caps on file size and duration, and video processing is batch rather than real-time because sampling and analysing frames simply takes longer than reading an audio waveform.
Quick recap — 2.4
- Document Intelligence = fixed-format forms. Content Understanding = messy, multi-modal sources that need reasoning.
- Three field-extraction verbs: extract (exact), classify (category), generate (new insight).
- Video = audio capabilities + on-screen/visual signals layered on top.
- Temporal grounding (timestamp + speaker + confidence) is what enables human-in-the-loop review of audio/video extraction.
Cross-cutting trigger words
The fastest way I've found to move through scenario questions: scan for one of these words first, then pick the service.
| If the scenario says… | Reach for… |
|---|---|
| generate, draft, compose, write | Azure OpenAI (generative) |
| act autonomously, multi-step, take action on my behalf | An agent, not a plain chat model |
| positive/negative, mood, feedback | Sentiment analysis |
| main topics, important phrases | Keyword extraction |
| find people/places/dates, redact personal data | Entity detection / PII |
| transcribe, captions, convert speech to text | Speech recognition |
| synthesize, neural voice, SSML | Speech synthesis |
| bounding box, coordinates, where is it | Object detection |
| who is this person | Face service (not plain Vision) |
| read text from a photo/sign | OCR |
| video insights, key moments | Video Indexer |
| invoice/receipt fields, structured form data | Document Intelligence / Content Understanding |