top of page

How to prep a Power BI semantic model for Copilot: schema, verified answers, instructions

10 hours ago
10 min read
Cover with the title How to prep a Power BI semantic model for Copilot on a teal data skyline background, Data Studios original cover

Copilot in Power BI answers questions from the semantic model it is pointed at, so a model full of hidden helper columns, duplicate date fields and ambiguous measure names produces vague or wrong answers. Microsoft's answer is Prep data for AI, a set of model-level settings in Power BI Desktop and the Power BI service that lets the author decide which fields Copilot should use, which questions must return an approved visual, and which business rules Copilot should follow when it interprets a prompt.


The feature set is documented by Microsoft as a preview and has three main parts: an AI data schema, verified answers and AI instructions. All three are stored on the semantic model, so every report built on that model inherits them, and none of them can be seen or switched off by report consumers. The documentation was checked on November 14, 2026, and the limits below are the ones Microsoft lists on those pages. A model author can set up all three parts in one session, test them in the Copilot pane in Desktop and publish; the harder work is choosing what Copilot should see and checking its answers against independently computed numbers.


··········


⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

WHAT PREP DATA FOR AI CHANGES IN COPILOT FOR POWER BI.


Each part of Prep data for AI targets a different kind of Copilot error. The AI data schema reduces the set of fields Copilot considers when it answers a data question, which removes the choice between, for example, an order date and a ship date when a user simply asks about sales by month. Verified answers attach one or more trigger phrases to a visual you have already built and checked; when a prompt matches a trigger phrase exactly or semantically, Copilot returns that visual instead of generating a new answer. AI instructions are free-text guidance of up to 10,000 characters that tells Copilot how your organization uses its terms, such as which measure "sales" refers to or when the fiscal year starts.


Microsoft's FAQ adds table and column descriptions as a fourth tool, used for now only in DAX queries and search, and recommends working in this order: schema, verified answers, instructions, descriptions. The settings do not reach every Copilot skill in the same way: in Microsoft's capability table, the AI data schema affects only questions about the semantic model, while AI instructions also affect report summaries, report page creation and DAX queries.


··········


POWER BI COPILOT REQUIREMENTS BEFORE YOU PREP A MODEL.


Prep data for AI is only useful where Copilot itself runs. A full breakdown of capacity and license costs is in our Copilot in Power BI requirements reference.


........


Requirement

As documented by Microsoft

Capacity

Paid Fabric capacity F2 or higher, or Power BI Premium P1 or higher

Unsupported capacity

Trial capacities and free SKUs

Licenses

Pro or Premium Per User alone is not sufficient

Tenant setting

Users can use Copilot and other features powered by Azure OpenAI

Model setting

Power BI Q&A turned on for the semantic model

Desktop model types

Import, DirectQuery and Composite (local)

Service model types

All model types

Authoring in the service

Copilot-enabled workspace and authoring permission on the model


........


Two details trip up first setups. If Q&A is not enabled, the tabs in the Prep data for AI dialog are disabled, although the dialog offers a Turn on Q&A option. And if the tenant or capacity sits outside the United States or EU data boundary, Copilot is disabled by default until a Fabric admin enables the setting that allows data sent to Azure OpenAI to be processed outside the tenant's geographic region.


··········


THE THREE PREP DATA FOR AI SETTINGS AND THEIR LIMITS.


Microsoft documents hard limits mainly for verified answers and AI instructions. The AI data schema page lists behavioral rules rather than numeric caps, and the FAQ adds indexing limits that apply to large models.


........


Setting

Documented limit or rule

AI instructions

10,000 characters per semantic model

Verified answers per model

250

Trigger phrases per verified answer

15, with 5 to 7 recommended

Trigger phrase length

500 characters

Filters per verified answer

Up to 3, and 10 filter permutations

Relative date filters in verified answers

Not supported

Value index for model questions

Up to 5 million text values or 1,000 model entities

Text values indexed

Values shorter than 100 characters


........


Verified answers exclude several visual types, including text boxes, key influencers, decomposition trees, custom visuals and visuals that contain report measures, and work on Direct Lake models only on the web. Git integration, REST APIs and deployment pipelines are not supported for them during the preview, so they are maintained by hand when a model moves between environments.


··········


ILLUSTRATIVE SALES MODEL FOR THE COPILOT SETUP.


The worked example uses a small sales table with a fiscal year that starts on July 1. The data is illustrative and chosen to expose two common Copilot mistakes: reading "FY2026" as calendar 2026, and averaging row-level margin percentages instead of dividing totals.


........


OrderDate

Region

Product

GrossAmount

Discount

Returns

COGS

2025-08-14

East

Snowboards

12000

600

0

7200

2025-11-03

West

Boots

8000

400

500

4400

2026-01-22

East

Boots

6500

0

300

3900

2026-03-09

West

Snowboards

15000

1500

0

9300

2026-05-30

East

Helmets

4000

200

0

2000

2026-06-28

West

Helmets

3000

0

150

1650

2026-07-15

East

Snowboards

9000

450

0

5400

2026-09-02

West

Boots

7000

350

0

4200

2026-10-11

East

Helmets

2500

0

0

1300

2026-10-27

West

Snowboards

11000

1100

600

6500


........


The model has two explicit measures. Defining them in the model, with clear names, gives the AI instructions something unambiguous to point at.


Net Sales = SUM ( Sales[GrossAmount] ) - SUM ( Sales[Discount] ) - SUM ( Sales[Returns] )

Gross Margin % = DIVIDE ( [Net Sales] - SUM ( Sales[COGS] ), [Net Sales] )

If the model already uses a fiscal calendar table, the time-intelligence measures described in our fiscal-year YTD guide for Power BI are the ones to expose to Copilot, rather than raw date columns from the fact table.


··········


SETTING THE AI DATA SCHEMA IN POWER BI DESKTOP.


In Power BI Desktop, select Prep data for AI on the Home ribbon and open the Simplify data schema tab. In the service, the same button sits on the ribbon of the semantic model page. Select the fields Copilot should use, clear the ones that could confuse it, and select Apply. Microsoft's guidance is to prioritize clean columns with limited ambiguity.


For the example model, a sensible schema keeps OrderDate, Region, Product and the two measures, and leaves out GrossAmount, Discount, Returns and COGS, which pushes Copilot toward the measures. Fields that are hidden in the semantic model are excluded automatically the first time you set up the schema, but every field still appears in the selection pane, so check the list rather than assuming hidden means excluded later.


The documentation lists three behaviors that affect design. Copilot still follows relationships when only one side of a relationship is in the schema. Hierarchies can be selected as a whole but not component by component, and a hierarchy column you did not select at table level is still included. Creating report pages, searching for data and DAX queries use the entire semantic model and ignore the AI data schema. To test, open the Copilot pane, choose Answer data question in the skill picker, ask about a field outside the schema and confirm Copilot does not answer, then ask about a field inside it.


··········


[[ADPLUS_300x250_1]]

WRITING AI INSTRUCTIONS FOR NET SALES AND THE FISCAL YEAR.


AI instructions sit on the Add AI instructions tab of the same dialog. Microsoft recommends explicit, specific wording, grouping related rules under headings, breaking complex rules into simple steps and keeping the set focused, because conflicting instructions can confuse the model. The instructions below follow the structure of Microsoft's own sales example, adapted to the illustrative model.


Metrics
- When a user asks about "sales" or "revenue" without another qualifier, use [Net Sales].
- [Net Sales] is gross amount minus discounts minus returns. Never use [Gross Amount] for sales questions unless the user says "gross".
- For margin percentage, use [Gross Margin %]. Never average row-level margins.

Dates
- The fiscal year starts on July 1 and is named for the year it ends. FY2026 means July 1, 2025 through June 30, 2026.
- "This year" and "YTD" mean the current fiscal year, not the calendar year.

Terminology
- "Territory" means the Region column in the Sales table.

Ambiguity
- If "performance" could mean sales, growth or margin, ask which measure the user wants.

Instructions cannot be uploaded in Desktop, they cannot vary by user group or by view and edit mode, and Microsoft states there is no guarantee the language model follows them exactly. They also might not be respected when Copilot creates a page, suggests report page topics or summarizes the model. A short script keeps the text and the verified-answer phrases inside the documented limits before you paste them into the dialog.


instructions = open("instr.txt").read()
triggers = [
    "Net sales by region for FY2026",
    "FY2026 sales by territory",
    "How much did each region sell last fiscal year",
    "Region sales July 2025 to June 2026",
    "Net revenue by region FY2026",
    "Compare East and West sales for FY2026",
]
print("instruction characters:", len(instructions), "limit 10000 ->", len(instructions) <= 10000)
print("trigger phrases:", len(triggers), "max 15 ->", len(triggers) <= 15, "| recommended 5-7 ->", 5 <= len(triggers) <= 7)
print("longest trigger:", max(len(t) for t in triggers), "limit 500 ->", all(len(t) <= 500 for t in triggers))

Run on the example, the script reports 688 instruction characters, six trigger phrases and a longest phrase of 46 characters, all within the limits Microsoft publishes.


··········


CREATING A VERIFIED ANSWER FOR REGIONAL NET SALES.


Build a clustered bar chart of Net Sales by Region with a visual-level filter that restricts dates to July 1, 2025 through June 30, 2026. A date range filter is supported for verified answers, while a relative filter such as year to date is not, which is why the example uses fixed dates. Then open the three-dot menu on the visual header, select Set up a verified answer, add the trigger phrases from the script, optionally select Copilot suggestions for more, and select Apply.


Filters can be offered to users under Available to users only when they exist in the report and have no specific value applied, and a maximum of three can be active. Matching accepts synonyms, reordered words and filter criteria in the prompt, but a prompt that adds, removes or swaps a field or replaces the measure does not match. A request for net sales by product for FY2026 will therefore go to normal Copilot generation, not to this verified answer.


Changes usually take about 15 minutes to appear in the service. Verified answers are not returned when Fabric IQ is enabled, stop working if you hide fields the visual uses, and do not follow later edits to the report visual; they are edited on the Verified answers tab of the Prep data for AI dialog.


··········


EXPECTED COPILOT ANSWERS FOR THE TEST QUESTIONS.


Before approving the model, ask Copilot a fixed set of test questions and compare each answer with an independently computed result. The pandas code below reproduces the expected figures from the illustrative table.


import pandas as pd
df = pd.DataFrame({
    "OrderDate": pd.to_datetime(["2025-08-14", "2025-11-03", "2026-01-22", "2026-03-09", "2026-05-30",
                                 "2026-06-28", "2026-07-15", "2026-09-02", "2026-10-11", "2026-10-27"]),
    "Region": ["East", "West", "East", "West", "East", "West", "East", "West", "East", "West"],
    "GrossAmount": [12000, 8000, 6500, 15000, 4000, 3000, 9000, 7000, 2500, 11000],
    "Discount": [600, 400, 0, 1500, 200, 0, 450, 350, 0, 1100],
    "Returns": [0, 500, 300, 0, 0, 150, 0, 0, 0, 600],
    "COGS": [7200, 4400, 3900, 9300, 2000, 1650, 5400, 4200, 1300, 6500],
})
df["NetSales"] = df["GrossAmount"] - df["Discount"] - df["Returns"]
df["FY"] = df["OrderDate"].dt.year + (df["OrderDate"].dt.month >= 7).astype(int)
fy = df[df["FY"] == 2026]
by_region = fy.groupby("Region")[["NetSales", "COGS"]].sum()
by_region["GM%"] = (by_region["NetSales"] - by_region["COGS"]) / by_region["NetSales"] * 100
print(fy["NetSales"].sum(), fy["GrossAmount"].sum(), df[df["OrderDate"].dt.year == 2026]["NetSales"].sum())
print(by_region.round(2))

........


Test question

Correct answer

Typical wrong answer

Total sales in FY2026

44,850

53,350 (calendar 2026) or 48,500 (gross)

Sales by territory in FY2026

East 21,400; West 23,450

Regions summed over all dates

Gross margin % in FY2026

36.57%

38.76% (average of row margins)

East gross margin % in FY2026

38.79%

40.44% (average of row margins)

West gross margin % in FY2026

34.54%

37.08% (average of row margins)

Sales so far in FY2027

27,000

Calendar 2026 to date


........


A calendar-year answer means the fiscal-year instruction was ignored or the question bypassed it; a gross figure means Copilot used a raw column that should have been left out of the schema; a row-average margin means Copilot built its own aggregation instead of using the measure. The Copilot pane offers How Copilot arrived at this and a downloadable diagnostic from the pane menu, which show the fields and logic used. The same habit of checking figures applies to report summaries, covered in our guide on summarizing Power BI reports with Copilot.


··········


⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁤

WHERE COPILOT STILL GOES WRONG AFTER PREP DATA FOR AI.


Large models are the first risk. If the schema is too large, Copilot reduces it on its own and the diagnostic shows an AgentSchemaReduced warning. Value indexing stops at five million instance values or 1,000 model entities, and a column that would cross the limit is skipped entirely, so a question about a specific customer name can fail even when the field is in the schema. Model size limits by license are covered in our semantic model size limits reference.


Freshness is the second risk. Import models reindex when they are published or when a refresh runs and Copilot or Q&A was used in the previous 14 days; DirectQuery and Direct Lake models reindex on publish or when the index is older than 24 hours. A failed refresh can leave the index stale, and the first index can take an extra 15 minutes. New product or customer names may not be recognized until indexing finishes.


··········


APPROVED FOR COPILOT, GOVERNANCE AND SECURITY LIMITS.


Once the tests pass, the model owner can expand Approved for Copilot in the model settings, select the box and apply. Standalone Copilot then stops applying its friction treatment to answers from that model and its reports, and admins can restrict standalone Copilot to approved items. The change is usually reflected within an hour and can take up to 24 hours for models with many reports. Only semantic models can be approved; reports, dashboards and apps cannot.


Row-level and object-level security are not fully supported for verified answers, and Microsoft's documentation says not to rely on that functionality as a security feature during the preview. End users cannot see or disable the AI data schema or the AI instructions, and they cannot edit verified answers without write permission on the model. The verified answers page also notes that Q&A experiences are going away in February 2027, with Copilot recommended in their place, so teams still maintaining Q&A synonyms should plan to move that knowledge into AI instructions and verified answers.


··········


PREPPING POWER BI MODELS FOR COPILOT: CONCLUSIONS FOR MODEL AUTHORS.


Prep data for AI is a documented preview with clear limits (10,000 characters of instructions, 250 verified answers, 15 trigger phrases each) and it runs only where Copilot runs, on F2 or larger Fabric capacity or P1 or larger Premium capacity with Q&A enabled on the model.


The settings make Copilot more consistent, and its answers still need independent checks. Instructions are interpreted by a language model with no guarantee of compliance, verified answers do not sync with the visuals they came from, and security filtering is not fully supported for them. The workable routine is the one in the example: explicit measures, a trimmed schema, short grouped instructions, a few verified answers for the questions people ask most, and a test sheet of expected results computed outside Copilot before the model is marked Approved for Copilot.


··········


FOLLOW US FOR MORE.


·····


DATA STUDIOS


·····


datastudios.org


bottom of page