- 1.1 Choose the appropriate Foundry services — models, generative services, retrieval and indexing, agent memory/tools/knowledge
- 1.2 Set up AI solutions in Foundry — infrastructure design, deployment options, model and agent deployments, CI/CD
- 1.3 Manage, monitor and secure — quota, scaling, rate limits, cost; performance, drift, safety and grounding; ingestion and index health; identity and networking
- 1.4 Implement responsible AI — guardrails, evaluators, auditing and provenance, agent oversight
1.1 Choose the appropriate Foundry services
This objective is pure decision-making, and it is the highest-density source of "which service?" questions in the whole exam. The diagram below is the map; the tables underneath are the tie-breakers.
flowchart TD
Q["What does the workload need to do?"]
Q --> G["Generate or reason<br/>over free text"] --> GM["Foundry Models<br/>LLM / SLM / reasoning"]
Q --> R["Answer from<br/>private content"] --> RA{"How much content,<br/>how complex?"}
RA -- "A handful of files,<br/>Foundry owns the lifecycle" --> FS["File search tool<br/>+ vector store"]
RA -- "Enterprise corpus,<br/>filters, permissions, scale" --> AS["Azure AI Search index"]
RA -- "Many sources, one reusable,<br/>permission-aware layer" --> IQ["Foundry IQ<br/>knowledge base"]
Q --> P["Turn messy files into<br/>clean structured data"] --> CU["Content Understanding"]
Q --> T["Bounded NLP / speech<br/>/ vision task"] --> FT["Foundry Tools<br/>Language · Speech · Translator · Vision"]
Q --> A["Take actions,<br/>multi-step"] --> AG["Foundry Agent Service<br/>+ Toolbox"]
Q --> W["Public web facts"] --> WS["Web search tool /<br/>Grounding with Bing"] Choosing a model for each task
The trade-off table lives on the Foundations page; what follows is the part the exam actually phrases as scenarios.
| Scenario wording | Signal | Answer |
|---|---|---|
| "Millions of short classifications per day, cost per call is the constraint" | Volume + narrow task | Small language model (Phi family / mini tier) |
| "Must run on a factory device with intermittent connectivity" | Edge | SLM, or a Foundry Tools container if the task is bounded |
| "Plan a multi-step remediation and justify each step" | Deep reasoning | Reasoning model (o-series or equivalent) |
| "Answer questions about the photo the user uploaded" | Image + text input | Multimodal model |
| "Extract 14 named fields from scanned invoices with a confidence score per field" | Schema + confidence + audit | Content Understanding, not a raw prompt |
| "Redact national ID numbers before the text leaves our tenant" | Deterministic compliance | Azure Language PII detection (container if it must stay on-prem) |
| "Find semantically similar support tickets" | Similarity, no generation | Embedding model + vector search |
Choosing a retrieval and indexing method
"Choose an appropriate method for retrieval and indexing" is its own bullet in the outline. Four options, and they are not interchangeable:
| Option | What it is | Choose it when | Limits |
|---|---|---|---|
| File search tool | Foundry-hosted vector stores over files you upload to the project | A curated knowledge base where you want Foundry to own ingestion and the vector-store lifecycle; fastest path to a working RAG agent | No enterprise-grade filtering, security trimming or custom skillsets |
| Azure AI Search index | Your own index with keyword, vector, hybrid and semantic ranking, filters, facets, scoring profiles and skillsets | The corpus is large or changing, you need filters and relevance tuning, or the index is already the source of truth | You own the indexer, the schema and the refresh |
| Foundry IQ knowledge base | A managed knowledge layer over Azure AI Search: one or more knowledge sources, an optional LLM for query planning and answer synthesis, and agentic retrieval | Multiple sources behind one reusable, permission-aware retrieval surface shared by several agents | Adds a planning model to the cost and latency budget |
| Agentic retrieval | A multi-query pipeline: plan → decompose into subqueries → retrieve in parallel → semantically rerank → merge | Complex, multi-part questions where a single query loses recall | More model calls per answer; needs a knowledge base |
File search vs Azure AI Search — the deciding words
Watch for "filter by department", "only show documents the user is allowed to see", "millions of documents", "tune relevance", "enrich during indexing" or "the index already exists". Any of those means Azure AI Search. Words like "a folder of PDFs", "get a prototype working" or "let the service manage the vector store" mean file search.
Memory, tools and knowledge for agents
Three different things that scenarios deliberately blur:
- Conversation state
- The transcript of the current interaction, held server-side as a conversation of items. Pass the conversation id on each call and history is maintained for you. You can bring your own Azure Cosmos DB for conversation state when compliance requires you to own the store.
- Semantic memory
- Durable facts and summaries extracted from conversations and stored by scope, then retrieved in later sessions. This is what "remembers the user across sessions" means — it is deliberately not the full transcript. Extraction is asynchronous, so a write is not immediately readable.
- Knowledge
- Grounding content the agent retrieves from: file search, Azure AI Search, Foundry IQ, SharePoint, Fabric, Work IQ, or the public web. Knowledge is read; memory is learned.
- Tools
- Actions the agent can take: functions, OpenAPI endpoints, MCP servers, code interpreter, browser automation, agent-to-agent calls. Curated into a toolbox for reuse and central governance.
A phrasing cue that keeps paying out
"The agent should recall the user's preferences next week" → memory. "The agent should cite the HR policy" → knowledge / retrieval. "The agent should create the ticket" → tool. "The agent should keep track of this conversation" → conversation state.
1.2 Set up AI solutions in Foundry
Designing the Azure infrastructure
A defensible default enterprise topology, and the reasoning behind each choice:
- One Foundry resource per security/governance boundary — typically per environment (dev, test, prod) or per business unit with genuinely different compliance needs. Not one per team: that multiplies networking and policy work for no benefit.
- One project per team or application inside that resource. Projects inherit the parent's security and connections and can carry their own RBAC.
- Model deployments at resource scope, shared by the projects. Size them with quota in mind — see quota and rate limits.
- Connections for everything external: Azure AI Search for retrieval, Storage for documents, Application Insights for traces, Cosmos DB if you must own conversation state. Authenticate with managed identity, and remember the role assignment on the target.
- Private networking where required: private endpoints on the Foundry resource and every connected service, public network access disabled. Note that key-based auth is not supported with private networking for the Azure AI Search tool — use the project managed identity.
- Guardrails and Azure Policy applied at resource scope so every project inherits them.
- Observability wired up from day one: Application Insights connected, tracing on, an evaluation dataset in source control.
High availability and regional failure
With Global Standard and Data Zone Standard, if the primary region has an interruption, all traffic initially routed there is affected — global routing is not automatic disaster recovery. For real resilience you deploy the same model in more than one region and fail over (or load balance) in front of it, typically through a gateway such as Azure API Management.
Configuring model and agent deployments
A deployment binds a model, a version, a deployment type (the SKU) and a capacity allocation. Capacity is the lever that sets your rate limits.
# Deploy a model with the Azure CLI. The SKU name is the deployment TYPE.
az cognitiveservices account deployment create \
--name my-foundry \
--resource-group rg-ai103 \
--deployment-name gpt-5-mini \
--model-name gpt-5-mini \
--model-version "2026-04-01" \
--model-format OpenAI \
--sku-name GlobalStandard \
--sku-capacity 50 # capacity units -> TPM and, proportionally, RPM Other settings the exam expects you to know exist:
- Version upgrade policy — auto-update to default, upgrade when expired, or pin. Models retire; pinning without a plan means an outage on retirement day.
- Guardrail assignment — every deployment gets one; the default is
Microsoft.DefaultV2. - Dynamic quota preview — lets a standard deployment opportunistically exceed its TPM when spare capacity exists. It can only ever raise the effective limit, never lower it, and the extra tokens bill at normal rates.
- Agent deployments — prompt agents are created as agent versions through the portal or SDK; hosted agents ship as a container image or a .zip that Foundry builds. Publishing promotes an agent to a managed resource with a stable endpoint.
CI/CD for Foundry projects
flowchart LR DEV["Developer<br/>branch"] --> PR["Pull request"] PR --> CI["CI: lint, unit tests,<br/>evaluate agent against<br/>a golden dataset"] CI -->|"quality gate passes"| BICEP["Deploy infra<br/>Bicep / Terraform:<br/>resource, project,<br/>deployments, connections"] BICEP --> AGENT["Create or update<br/>agent version via SDK"] AGENT --> TEST["Test project<br/>smoke + safety evals"] TEST -->|"promote"| PROD["Prod project<br/>publish agent,<br/>stable endpoint"] PROD --> MON["Continuous evaluation<br/>+ Azure Monitor alerts"] MON -.->|"regression"| DEV
The pieces the outline expects:
- Infrastructure as code — Bicep, ARM or Terraform for the resource, projects, deployments and connections. Deployments can be created with the Azure CLI or Bicep.
- Agent definitions in code — define prompt agents with the SDK or REST in the pipeline rather than clicking in the portal, so they get version control, code review and automated rollout.
- Automated evaluation as a gate — run evaluators against a golden dataset on every PR and fail the build on regression. This is the distinctive part.
- Agent versioning and rollback — versions are snapshotted automatically; you can roll back or compare.
- Environment promotion — separate dev/test/prod projects, promote by publishing the tested agent version.
- azd for scaffolding and deploying hosted agents from the command line.
Why portal-built agents lose marks
If a scenario asks how to make agent changes reviewable, repeatable and promotable across environments, the answer is define the agent in code and create the version from the pipeline — not "export from the portal" and not "recreate it manually in prod".
1.3 Manage, monitor and secure AI systems
Quota, rate limits, scaling and cost
Quota is assigned to your subscription, per region, per model, per deployment type, in units of tokens per minute (TPM). You spend that quota by assigning capacity to deployments; a proportional requests per minute (RPM) limit comes with it (the ratio varies by model).
| Concept | What it actually means |
|---|---|
| Quota | The ceiling of TPM you may allocate across all deployments of a model in a region and deployment type |
| TPM rate limit | Enforced per deployment, per minute, on an estimate made when the request arrives — prompt + max_tokens — not on billed tokens |
| RPM rate limit | Derived from TPM. Evaluated over short windows (1–10 seconds), so bursts throttle even when the per-minute total is fine |
| 429 Too Many Requests | Rate limit exceeded, capacity throttling, or a temporary protective reduction of your effective limit |
| 403 Forbidden | A total token quota (hourly/daily/monthly) configured through the AI Gateway has been exhausted — a different mechanism from TPM |
429s: four causes, four different fixes
- "Rate limit is exceeded" → genuinely over TPM/RPM. Raise the deployment's capacity, rebalance quota across deployments, or request a quota increase.
- "Service is temporarily unable to process your request" → backend capacity pressure. Retry with
retry-after-ms; if persistent, move to provisioned throughput. - Temporary rate-limit adjustment →
x-ratelimit-limit-tokensin the response headers is lower than your configured TPM. Standard deployments share a pool; the reduction is protective and usually clears within hours. Back off, do not request quota. - Usage metrics look low but you still get 429s →
max_tokensis inflating the estimate. Lower it to match the response you actually expect.
import time
import random
from openai import RateLimitError
def call_with_backoff(openai, *, max_attempts=5, **kwargs):
"""Exponential backoff with jitter.
A 429 is not always a quota problem: it can be capacity throttling or a
temporary rate-limit adjustment. Honour retry-after-ms when the service
sends it, and only request more quota when the message really says the
deployment's rate limit was exceeded.
"""
for attempt in range(max_attempts):
try:
return openai.responses.create(**kwargs)
except RateLimitError as err:
if attempt == max_attempts - 1:
raise
retry_after_ms = getattr(err, "response", None) and err.response.headers.get("retry-after-ms")
delay = int(retry_after_ms) / 1000 if retry_after_ms else (2**attempt) + random.random()
time.sleep(delay) Cost levers, cheapest first
- Right-size the model — an SLM or a mini tier for routing, extraction and classification; the big model only where it earns its cost.
- Batch deployment types for asynchronous work — roughly 50% cheaper.
- Prompt caching and shorter system prompts — input tokens are the silent majority of spend in RAG.
- Trim retrieval — fewer, better chunks beats stuffing the context window; it also improves groundedness.
- Tool search in a toolbox — stops every tool definition being sent on every request once you have dozens of tools.
- Provisioned throughput — for steady high volume it is cheaper and more predictable than standard at scale.
- Token limits via the AI Gateway — per-project, per-deployment TPM caps and total token quotas to stop one team consuming everything.
Monitoring performance, drift, safety and grounding
Foundry observability has three legs, and the exam expects you to name the right one: tracing (what happened), evaluation (was it any good), monitoring (is it still good in production).
| You need to… | Use | Notes |
|---|---|---|
| See every model call, tool invocation and agent decision in one timeline | Tracing | Built on OpenTelemetry, flows into Azure Monitor Application Insights. Supports LangChain, LangGraph, OpenAI Agents SDK and Microsoft Agent Framework |
| Measure quality, safety and task success | Evaluators | Built-in and custom; run locally, in the cloud, or from CI |
| Track token consumption, latency and error rates live | Monitoring dashboards | Foundry observability dashboard + Application Insights |
| Detect quality decay over time | Scheduled evaluation against a fixed test dataset | This is how "drift" is detected in practice — the model or the data moved, the score dropped |
| Sample real production traffic for quality | Continuous evaluation | Evaluates a sampled rate of live traffic |
| Probe for safety and security vulnerabilities | AI red teaming agent | Uses Microsoft's PyRIT framework; best with a human in the loop. Can be scheduled |
| Be alerted when outputs breach a threshold or turn harmful | Azure Monitor alerts | Wired to evaluation metrics and safety signals |
Ingestion quality, index health and relevance
A separate bullet in the outline, and easy to overlook because it is search operations rather than model operations:
- Indexer execution history in Azure AI Search — success/failure counts, per-document errors and warnings, and the item-level failure thresholds that decide whether an indexer run fails.
- Index size, document count and storage/vector quota against the service tier — a silently full index stops accepting documents.
- Freshness — change-detection policy and indexer schedule; stale grounding data produces confidently wrong answers.
- Relevance — measure it, do not assume it. Evaluate retrieval separately from generation with document retrieval and relevance evaluators; hybrid + semantic ranking is the benchmark-backed baseline.
- Grounding quality — the groundedness evaluator tells you whether answers are supported by the retrieved context. A groundedness drop with a healthy model usually means the retrieval broke, not the model.
Diagnosing a RAG quality complaint
Split the pipeline before you tune anything. Bad retrieval shows up as low retrieval/relevance scores and can be fixed with chunking, hybrid search, semantic ranking or filters. Bad generation shows up as low groundedness or coherence with good retrieval, and is fixed with prompt changes, a better model or tighter instructions. Answering "improve the prompt" to a retrieval problem is the classic wrong answer.
Security: identity, networking and credentials
| Control | What to configure | Why the exam cares |
|---|---|---|
| Keyless credentials | Entra ID tokens via DefaultAzureCredential; disable local key auth on the resource | No secret to leak or rotate; access revoked by removing a role assignment |
| Managed identity | System- or user-assigned identity on the Foundry resource/project; grant it roles on connected resources | The step people forget — the connection exists but the identity is unauthorised |
| Agent identity | A dedicated Entra identity per agent; hosted agents get one automatically | Scoped, auditable access to external APIs and MCP servers without shared credentials |
| Private networking | Private endpoints, VNet integration, public access disabled. Prompt agents support private networking; hosted agents support BYO VNet with VM-isolated sessions | Data exfiltration and residency scenarios |
| Role policies | Least-privilege Foundry roles, custom roles where built-ins over-grant, Entra security groups rather than individuals | See the role table on the Foundations page |
| Egress controls preview | Allow-list of outbound destinations for hosted agents, set in the guardrail | Stops a compromised or manipulated agent calling out to anywhere |
| Customer-managed keys | Encryption with your own keys in Key Vault | Regulated-industry scenarios |
1.4 Implement responsible AI
Guardrails and controls
A guardrail is a named collection of controls. Each control pairs three things: a risk to detect, an intervention point to scan, and an action to take. The classification models come from Azure AI Content Safety.
flowchart LR U["User input"] -->|"Control: user prompt attacks,<br/>hate, violence, PII…"| M["Model / agent"] M -->|"Control: tool call<br/>(agents, preview)"| TOOL["Tool"] TOOL -->|"Control: tool response<br/>(agents, preview)"| M M -->|"Control: output<br/>groundedness, protected material…"| OUT["Response to user"]
| Risk | Models | Agents (preview) | Notes |
|---|---|---|---|
| Hate · Sexual · Self-harm · Violence | ✔ | ✔ | Severity threshold: Off / Low / Medium / High. Low is the most restrictive (it flags low severity and above) |
| User prompt attacks (jailbreak) | ✔ | ✔ | Prompt Shields — direct attacks in the user prompt |
| Indirect attacks (XPIA) | ✔ | ✔ | Injection hidden in retrieved documents, tool output, web pages or images |
| Spotlighting preview | ✔ | ✘ | Marks untrusted content so the model treats it as data, not instructions |
| Protected material for text / for code | ✔ | ✔ | Known copyrighted text and public-repository code |
| Groundedness preview | ✔ | ✘ | Detects ungrounded output against supplied source content |
| PII preview | ✔ | ✔ | Personal data in prompts or completions |
| Task adherence preview | ✔ | ✔ | Is the agent still doing the job it was given? |
Guardrail rules that get tested verbatim
- Actions: models support annotate and annotate and block; agents support annotate and block only.
- Inheritance: an agent uses the guardrail assigned to it. If none is assigned it inherits its model deployment's guardrail — not the service default. An agentic guardrail fully overrides the model's.
- Default: models get
Microsoft.DefaultV2. - Turning filters off requires approval through the Limited Access modified guardrails review — you cannot simply disable them.
- Guardrails apply to Foundry Models sold by Azure, except audio transcription models; and to agents built in Foundry Agent Service, not to every agent registered in the control plane.
- Severity direction trips people up: High = most permissive (only the worst is blocked), Low = most restrictive.
Responsible AI instrumentation
Guardrails are a runtime control. Evaluators are the measurement layer, and the outline names them explicitly under responsible AI.
| Category | Examples | Answers the question |
|---|---|---|
| General quality | Coherence, fluency | Is it well-formed language? |
| RAG-specific | Groundedness, relevance, retrieval | Is it supported by the sources, and did we retrieve the right ones? |
| Safety and security | Hate and unfairness, violence, sexual, self-harm, protected material, indirect attack | Is it harmful, or was it manipulated? |
| Agent-specific | Intent resolution, tool call accuracy, task adherence, task completion | Did the agent understand, pick the right tool, stay on task and finish? |
| Custom | Your domain rules, as code or as an LLM judge | Whatever "correct" means in your business |
"Detecting fabrications" in the outline maps to groundedness. Evaluations run at three lifecycle stages: base model selection (benchmarks and leaderboards), pre-production (your dataset, plus red teaming), and post-production (continuous, scheduled and alerted). Cluster analysis groups evaluation failures so you can see the pattern instead of reading individual rows.
Playground evaluations are billed by default
Evaluations in the agents playground are enabled by default for every Foundry project and billed by consumption. If a scenario complains about unexpected observability cost, one legitimate answer is to deselect the evaluators in the playground's metrics panel.
Auditing, provenance and approvals
- Trace logging — OpenTelemetry traces in Application Insights are the audit trail of what the agent decided and which tools it called. Retain them to match your compliance requirement.
- Provenance metadata — citations from retrieval tools, source grounding and confidence scores from Content Understanding, and content credentials (C2PA) on generated media. "Where did this answer come from?" must have an answer.
- Approval workflows — human-in-the-loop gates before sensitive tool calls. In Agent Framework this is an approval-required tool that pauses the workflow and emits a request for a decision; in Foundry workflows it is the human in the loop pattern.
- Azure Policy at resource scope for organisation-wide rules, and Azure Monitor alerts on safety signals.
Governing agent behaviour
| Lever | What it constrains |
|---|---|
| Oversight mode | How autonomous the agent is: fully interactive, autonomous with a turn limit, or approval-gated per action |
| Tool-access controls | Which tools the agent may call at all — curated centrally in a toolbox, with per-tool auth and policy |
| Approval-required tools | Specific irreversible actions (refunds, purchases, deletions) that pause for a human decision |
| Turn and iteration limits | Stops an autonomous loop running indefinitely without human involvement |
| Guardrails on tool call / tool response | Scans what the agent sends to a tool and what comes back — the XPIA surface |
| Network egress controls | Where a hosted agent may connect |
| Scoped agent identity | What the agent can authenticate to, and as whom (its own identity, or the user via OBO) |
Skill 1 rapid-fire review
- Quota is per subscription, per region, per model, per deployment type, measured in TPM.
- TPM is estimated from prompt +
max_tokensat request time, not from billed tokens. - 429 = rate limit or capacity. 403 = AI Gateway total token quota exhausted.
- Global Standard is the default; Data Zone for US/EU/APAC residency; Provisioned for predictable latency; Batch for ~50% off asynchronous work.
- Azure Owner/Contributor grant no data-plane access; developers need Foundry User.
- Guardrail severity: Low is the most restrictive. Agents can only annotate and block.
- An agent inherits its model deployment's guardrail unless one is assigned directly.
- "Fabrications" → the groundedness evaluator. "Did it pick the right tool?" → tool call accuracy.
- Red teaming uses PyRIT; tracing uses OpenTelemetry into Application Insights.