关于 fabriciq
这项 FabricIQ 技能用于编排 Power BI 分析,从查找报表、检查元数据到查询语义模型。它要求依据工件数据回答,并遵循模型说明和已验证答案。
主要功能
- 01发现 Power BI 工件
- 02解析报表和项目标识
- 03检查报表与模型元数据
- 04搜索实体的确切值
- 05执行 DAX 查询
- 06遵循模型规则和已验证答案
适用场景
- 01为业务问题查找报表
- 02结合报表筛选条件分析数据
- 03查询语义模型中的已确认值
MCP 相关
该技能使用 FabricIQ MCP 服务来发现工件、检查报表和语义模型、解析值并执行 DAX 查询。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ microsoft/ skills-for-fabric --skill fabriciq安装后在 Claude Code 中输入/fabriciq确认已加载。
附带文件apm.yml
详细介绍
关键注意事项
- 要根据搜索查询查找项目详情(包括项目 ID):使用
DiscoverArtifacts和搜索词——不要调用工作区/项目列表 API- 要查找报表背后的语义模型:调用
GetReportMetadata,并从响应中提取模型 GUID- 当用户提供 Fabric 或 Power BI URL,或提供一个你尚不知道其项目类型的裸项目 GUID 时:调用
ResolveFabricItem,在继续操作前获取规范项目标识
Power BI 使用 — FabricIQ 技能
⚠️ 停止 — 在采取任何行动前,请完整阅读本文档。 在阅读并理解以下所有部分(包括工作流、DAX 规则、已验证答案和错误恢复)之前,不要开始编排工具调用。跳过内容会导致查询错误并遗漏指令。
你负责帮助用户分析 Power BI 数据。你需要编排每个步骤:发现项目、检查报表和模型架构、解析值并执行查询。使用 FabricIQ MCP 服务。
目录
| 任务 | 参考 | 说明 |
|---|---|---|
| Fabric 拓扑与关键概念 | COMMON-CORE.md § Fabric 拓扑与关键概念 | 层级;在 Fabric 中查找内容 |
| 环境 URL | COMMON-CORE.md § 环境 URL | 生产环境(公有云) |
| 身份验证与令牌获取 | COMMON-CORE.md § 身份验证与令牌获取 | audience 错误会导致 401;涵盖令牌 audience、委托权限与应用权限、OAuth 流程、身份类型和 Entra 应用注册 |
| 身份验证方案 | COMMON-CLI.md § 身份验证方案 | az login 流程、环境检测、令牌获取和调试 |
| 注意事项、最佳实践与故障排除 | COMMON-CORE.md § 注意事项、最佳实践与故障排除 | 常见错误;最佳实践 |
| 必须/优先/避免 | SKILL.md § 必须/优先/避免 | Power BI 使用防护规则 |
| 工作流 | SKILL.md § 工作流 | FabricIQ 编排步骤 |
可用工具
| 工具 | 用途 |
|---|---|
DiscoverArtifacts(searchQuery, artifactTypes?, maxResults?) | 通过自由文本搜索 Power BI 报表和语义模型。如果用户未提供工件 GUID 或 Fabric/Power BI URL,请首先调用。最多返回 50 个结果。优先选择报表,而非独立语义模型 |
ResolveFabricItem(fabricItemId=<guid-or-url>) | 将 Fabric 或 Power BI 项解析为其规范身份。接受裸项 GUID(首选)或受支持的工件 URL,并返回规范的 fabricItemId、itemType、已知时的 workspaceId,以及可选的后续步骤说明。如果用户粘贴 URL,或提供了类型尚未确定的原始 GUID,请调用此工具。对于工作区 App URL(.../groups/me/apps/<appId>/reports/<reportId>),必须调用此工具,因为路径中的 reportId 是每个 App 实例的 ID,而非已发布报表的 GUID |
GetReportMetadata(reportObjectId=<guid>) | 获取报表页面、视觉对象、筛选器和工作区信息。支持可选的 queries 参数(JMESPath 字符串),用于筛选精简子集——仅当上一次调用返回的是概览/摘要而非完整数据时才传入查询。首次调用时省略 queries,以查看完整元数据 |
GetSemanticModelSchema(artifactId=<guid>) | 获取表、列、度量值定义、关系、自定义 AI 指令和已验证答案。支持可选的 queries 参数(JMESPath)。首次调用时省略 queries,以查看完整架构 |
ValueSearch(artifactId, searchTerms, scope?) | 在针对命名实体(客户、产品、地区等)编写 DAX 筛选器之前调用。返回要筛选的列和准确值,避免 DAX 猜测规范拼写 |
ExecuteQuery(artifactId=<guid>, daxQueries=[...], maxRows?) | 执行 1–4 个 DAX 查询(每个条目一个 EVALUATE),并返回表格结果。每个查询默认返回 250 行,最多 1,000 行。如果需要超过默认值,请设置 maxRows |
必须/优先/避免
必须执行
- 生成查询前,完整阅读元数据和架构 — 在继续操作前,始终完整阅读
GetReportMetadata和GetSemanticModelSchema工具结果。遵循这些工具提供的所有指令(例如 CustomInstructions、VerifiedAnswers)。不要跳过、略读或只读部分结果——其中包含正确生成 DAX 所需的关键信息 - 始终遵循自定义指令 — 语义模型中的 CustomInstructions 是强制规则。完整阅读,并将其应用于编写的每个 DAX 查询(例如默认日期筛选器、必需的度量值、命名规则)。如果架构被截断,请在编写任何 DAX 之前使用 JMESPath 检索 CustomInstructions
- 编写自定义 DAX 前,始终检查已验证答案 — 阅读架构后,检查所有已验证答案的标题和问题,判断是否与用户的问题在语义上匹配。如果存在匹配项,请使用该答案。已验证答案涵盖相同意图时,不要编写临时 DAX
- 仅限来源数据 — 绝不编造事实或使用外部数据;只能依赖 Power BI 工件
- 始终先发现 — 除非你已经有工件 ID,或用户提供了 Fabric/Power BI URL 或尚未识别的 GUID(此时请先调用
ResolveFabricItem),否则应调用DiscoverArtifacts - 绝不编造数据 — 只能使用工具返回的结果
- 精简分析 DAX — 尽早聚合和筛选;优先选择满足需求的最小行集
- 洞察优先于结构 — 用户要求“总结报表”时,他们想要的是数据洞察,而非布局描述。始终运行查询以获取实际数据
首选
- 优先查看报表,而非语义模型。查看报表可视化项中的度量值和绑定项,而非原始架构度量值
- 默认应用报表、页面和可视化项筛选器 — 仅在用户指定了不同条件时才省略或调整
- 提供清晰、简洁、非技术性的回答 — 先说明结论,用 粗体 标出关键数字
- 使用
ValueSearch返回的已解析值,确保 DAX 筛选条件准确 - 尽可能使用图标展示进度:🔍 📊 📝
避免
- 使用尚未确认存在于数据中的值编写 DAX 筛选条件
- 在终端环境中使用图片 — 改用文本表格和 Unicode 排版
- 在面向用户的回答中提及 DAX、架构或工具名称
工作流
-
识别项目 —
- 如果用户分享 Fabric 或 Power BI URL,请调用
ResolveFabricItem(fabricItemId=<url>),除非平台已将该项目预先注册为[rpt_N]/[dataset_N](这种情况下直接使用对应的 GUID)。ResolveFabricItem是将工作区应用报表 URL 映射到基础已发布报表 GUID 的唯一可靠方式。它也接受裸项目 GUID — 如果用户提供了 ID,但你不确定它是报表还是语义模型,请使用此方法,然后根据响应中的itemType和任何后续步骤说明继续操作 - 否则调用
DiscoverArtifacts(searchQuery=<keywords from user request>) - 如果存在多个强匹配项,请列出它们并请用户选择
- 对于“列出我的所有报表”这类枚举请求(没有特定关键词),请使用宽泛词语调用
DiscoverArtifacts— 告知用户结果是最匹配的项目,并非完整列表 - 报表 ID ≠ 语义模型 ID —
GetReportMetadata需要报表 GUID(reportObjectId),而GetSemanticModelSchema、ExecuteQuery和ValueSearch需要语义模型 GUID(artifactId)。DiscoverArtifacts会返回这两种项目类型及各自不同的 ID。从报表开始操作时,请先调用GetReportMetadata— 其响应中的semanticModel字段包含基础语义模型 ID,之后将该 ID 传给架构/查询工具
- 如果用户分享 Fabric 或 Power BI URL,请调用
-
检查报表 — 如果项目是报表,请调用
GetReportMetadata(reportObjectId=...),不要传入queries参数,以先获取完整响应。这样可以全面了解页面、可视化项、绑定项和筛选器。仅当初始响应被截断或需要深入查看特定部分时,才在后续调用中使用 JMESPathqueries。查询报表数据时,默认始终在 DAX 查询中应用报表筛选器、页面筛选器和相关可视化项筛选器。不要跳过任何报表级筛选器 — 即使筛选器引用的表或列未出现在架构中(有些表已隐藏,但仍是正确筛选所必需的)。使用TREATAS应用此类筛选器,例如,如果报表元数据显示'Budget'[Scenario]的值为('Actual', 'Forecast'),但架构中没有 Budget 表,则应用:TREATAS({"Actual", "Forecast"}, 'Budget'[Scenario])。如果用户的问题明确与某个筛选器相矛盾(例如,报表筛选为 year=2022,而用户询问 2023 年),请在 DAX 中覆盖冲突维度上的筛选器,保留所有其他筛选器,并在回答中说明此覆盖。如果意图不明确 — 问题可能是“我想查看不同的数据切片”,也可能是“报表筛选器有误” — 请先询问用户的需求,再运行查询。 -
分析架构 — 首先调用
GetSemanticModelSchema(artifactId=...),不要传入queries参数,以获取完整架构。这会提供关于表、列、度量值、关系、CustomInstructions 和 VerifiedAnswers 的完整信息。阅读并保留 ALL VerifiedAnswers 条目(标题、问题、绑定)——下一步及整个会话中都会用到这些信息。只有在初始响应被截断(正文中出现警告文本或精简摘要)且需要提取特定部分时,才在后续调用中使用 JMESPathqueries。架构被截断时,必须先完整获取 VerifiedAnswers 和 CustomInstructions,才能继续——没有例外。 按以下顺序优先获取:(1)VerifiedAnswers —schema.VerifiedAnswers,(2)CustomInstructions —schema.CustomInstructions,(3)与用户问题相关的表/度量值。不要跳过(1)或(2)——两者都是正确生成 DAX 的必要条件。自定义指令(必须在生成任何 DAX 之前完整阅读): CustomInstructions 是由语义模型所有者编写的领域专用规则。它们可能定义默认时间范围、首选度量值、命名约定、筛选器要求、计算覆盖规则或业务逻辑约束。必须阅读并遵循 ALL CustomInstructions——它们决定了此模型中 DAX 的编写方式。若架构被截断且看不到 CustomInstructions,请在编写任何 DAX 之前调用
GetSemanticModelSchema并传入queries=["schema.CustomInstructions"]。除非匹配的 Verified Answer 与之冲突,否则每个查询都应应用 CustomInstructions——VA 定义优先适用于该特定查询(VA 的编写者了解 Custom Instructions,并有意为其定义自己的筛选上下文)。对于 VA 定义的查询,切勿使用 CustomInstruction 添加、移除或覆盖筛选器。 -
检查已验证答案(必须在编写任何自定义 DAX 之前完成) — 检查每条已验证答案的 Title 和 Question,判断其与用户问题在语义上是否相似。如果用户问题涉及相同的指标、实体、维度或分析意图,即使措辞不同(同义词、改述、不同粒度表述),也视为匹配。匹配示例:“按地区划分的收入” ↔ “按地理位置划分的销售明细”;“顶级客户” ↔ “按支出额排名最高的客户”。只要有任何 VA 高度匹配,就必须使用该 VA——遵循下方的 Verified Answers 规则。若存在 VA 匹配,不得跳过此步骤,也不得改用自定义 DAX。如果完整架构响应被截断,导致无法看到完整的 VerifiedAnswers 列表,请调用
GetSemanticModelSchema并传入queries=["schema.VerifiedAnswers[].{Title: Title, Question: Question}"],以获取所有 VA 标题后再继续。 -
解析实体值 — 如果用户指定了具体值(特定客户、产品、地区等),在构造 DAX 筛选器之前,先针对语义模型调用
ValueSearch(artifactId=<model guid>, searchTerms=[<value>])。 -
编写 DAX — 根据架构编写 DAX,并在适用时将范围限定为报表可视化效果所使用的列和度量值。优先使用模型定义的度量值,而不是临时编写 CALCULATE。
-
查询 — 使用
daxQueries(1–4 项)调用ExecuteQuery。在同一次调用中并行运行彼此独立的查询。 -
验证 — 如果查询返回 BLANK 或意外的空结果,请检查架构、度量值和筛选器,并使用修正后的 DAX 最多重试一次。
-
回答 — 综合结果,给出清晰且附有数据引用的答案。先说明发现,用 粗体 标出关键数字;在终端环境中以文本表格呈现。切勿提及 DAX、架构或工具名称。使用工件名称而非 ID 来指代工件。
后续问题
当用户针对同一项目提出后续问题时:
- 如果新问题提到了新的实体值,再次调用
ValueSearch - 编写一个结合先前结果上下文的新 DAX 查询
- 调用
ExecuteQuery并呈现结果
错误恢复
如果 DAX 查询返回空结果、行数过少或总计异常:
- 检查查询的日期是否没有数据 — 重新锚定到有值的正确日期
- 将 DAX 筛选器与报表元数据筛选器进行比较 — 缺少筛选器可能会导致范围错误
- 确认使用的是正确的度量值 — 检查报表可视化对象的绑定,以及架构中的度量值 DAX 表达式
- 如果遇到连接错误,该度量值可能依赖于实时连接的外部数据源 — 尝试使用其他表中的替代度量值
- 更正查询,并通过
ExecuteQuery重新执行
错误分类
| 错误 | 操作 |
|---|---|
| 无效 DAX | 阅读错误消息,修正 DAX,然后重试一次 |
| 未授权(无 PBI 访问权限) | 这可能是实际的访问问题(管理员需要启用 Power BI MCP 访问权限),也可能是已知限制:对于无法访问的项目,工具会报告“无访问权限”。告知用户 |
| 请求受限 | 告知用户 Power BI 受到速率限制;稍后重试 |
| 超出行数/值数量限制 | 数据已截断,但仍可使用。建议改为汇总数据,而非导出原始行 |
| 功能未启用 | 租户可能尚未启用 PBI MCP 端点。请用户联系管理员 |
| 超时 | 语义模型可能正在冷加载。重试一次。如果再次超时,建议用户几分钟后重试 |
支持的项目
仅支持 Power BI 报表和语义模型。目前不支持分页报表、仪表板以及任何其他 Power BI 或 Fabric 项目类型。如果用户指定了不受支持的项目,请说明这一点,并建议改用报表或语义模型。
已验证答案
⚠️ 已验证答案是优先级最高的事实来源。 如果某个已验证答案(VA)与用户的问题匹配,它将优先于你原本会编写的任何自定义 DAX — 包括根据 CustomInstructions 推导出的任何筛选器或范围。原样使用 VA 定义;只有在 CustomInstructions 不与 VA 的绑定、筛选器或粒度冲突时才应用它们,且绝不能仅根据 CustomInstructions 修改 VA 定义的元素。
当语义模型包含已验证答案,且其中一个答案与用户的问题匹配时:
- 通过 JMESPath 检索完整定义:
schema.VerifiedAnswers[?regex_match(Question, 'keyword')] | [0]- 如果初始 schema 响应已包含完整的 VA 定义,直接使用即可——无需额外调用。
- 如果你只有标题/问题(来自已截断的响应),现在检索完整定义。
- 已验证答案定义了一项可视化规范——将其视为需要复现的蓝图。
- 构建 DAX 查询,忠实复现所有绑定和筛选器——不得替换、遗漏或添加定义中未指定的列或度量值:
Bindings对象将可视化角色(Rows、Category、Columns、Values、Y、Series、Breakdown 等)映射到列和度量值——键的列表并非穷尽。请对照 schema,将每个绑定项分类为列或度量值。- 将所有列用作 SUMMARIZECOLUMNS 中的分组列,并且仅将列出的度量值作为表达式。引用字段时必须与 Bindings 中的写法完全一致。
- 将
Filters中的每个筛选器作为单独的 SUMMARIZECOLUMNS 筛选参数应用。不得跳过任何筛选器。按以下方式转换每个筛选器: • 正向 IN:TREATAS({values}, table[col]) • 所有其他条件(NOT IN、NOT NULL、IS BLANK、范围):KEEPFILTERS(FILTER(ALL(table[col]), )) • 多列元组筛选器:KEEPFILTERS(FILTER(ALL(table[col1], table[col2]), )) 切勿将多个列筛选器合并到单个 FILTER('table', ...) 中——这会因自动存在行为导致总计不正确。 - 当可视化包含多个维度列(例如矩阵中的 Rows + Columns)时,使用 ROLLUPADDISSUBTOTAL 为每个分组级别生成小计行。
- 不要添加 VA 定义中未包含的筛选器;VA 筛选器构成完整且权威的筛选上下文。只有当用户明确要求 VA 中未包含的数据切片时(例如“仅显示 Contoso Ltd”),才添加筛选器。如果 VA 未指定日期筛选器,即使结果为空,也不要添加日期筛选器。
- 不要简化、遗漏度量值或更改粒度。按 VA 绑定定义的粒度呈现结果——不要重新聚合,也不要汇总到更粗的粒度。如果用户明确要求不同的范围、粒度或筛选器,则按用户要求覆盖 VA。
- 层级查询(3 个及以上分组列或高基数结果): 当 VA 包含高基数维度分组列时,完整的 ROLLUPADDISSUBTOTAL 结果可能超过行数上限,导致重要小计被截断。请使用两个并行查询:
- 汇总查询: 仅包含最上层的 1–2 个分组列(不使用 ROLLUPADDISSUBTOTAL),并包含所有度量值。这样可确保顶层视图紧凑、完整,不会被截断。
- 明细查询: 使用包含所有分组列的完整 ROLLUPADDISSUBTOTAL。首先按小计标志降序排序(例如
IsLevel1Subtotal DESC, IsLevel2Subtotal DESC, …),然后在每个级别内按主要值度量值降序排序。这样可确保小计显示在叶级行之前,并能在截断时保留下来。 如果层级有 4 个及以上分组级别,可考虑将明细查询限制在前 3–4 个级别,或使用每级 TOPN,使结果不超过行数上限。并行调用两个查询。
- 行级明细 VA: 当 VA 返回包含关键度量值的实体级行时,按该度量值排序——不要按名称或 ID 排序。结果可能会被截断到行数上限;必须让最重要的行排在前面。
已验证答案定义优先于自定义指令。 匹配到已验证答案时,其绑定、筛选器和粒度是唯一依据。不要根据自定义指令添加、删除或覆盖任何筛选器(例如,不要添加 VA 未指定的默认时间范围筛选器)。VA 的编写者了解自定义指令,并有意定义了自己的筛选上下文。
JMESPath 查询示例
重要提示: 仅在后续调用中使用 JMESPath
queries——也就是初次调用(不带queries)返回完整或截断的响应之后。切勿跳过初次完整调用,直接使用针对性 JMESPath 查询。
对于 GetReportMetadata
| 用途 | 查询 |
|---|---|
| 查看页面和视觉对象标题概览 | queries=["ReportMetadata.Pages | { PageCount: length(@), Pages: @[0:20].{ Page: Title, VisualCount: length(Visuals), VisualTitles: Visuals[].Title } }"] |
| 按关键字搜索视觉对象 | queries=["ReportMetadata.Pages[].Visuals[?regex_match(to_string(@), 'revenue|sales')] | [] | [:10]"] |
| 提取报表和页面筛选器 | queries=["{ ReportFilters: ReportMetadata.Filters, PageFilters: ReportMetadata.Pages[?Title == 'PAGE_TITLE'] | [0].Filters }"] |
| 查找报表中定义的度量值 | queries=["ReportMetadata.Measures[?regex_match(to_string(@), 'revenue|target')] | [0:10]"] |
对于 GetSemanticModelSchema
| 用途 | 查询 |
|---|---|
| 获取已验证答案(截断时优先级 1) | queries=["schema.VerifiedAnswers[].{Title: Title, Question: Question}"] |
| 获取自定义说明(截断时优先级 2) | queries=["schema.CustomInstructions"] |
| 按关键字搜索度量值 | queries=["schema.Tables[].Measures[?regex_match(to_string(@), 'revenue|sales')].{Name: Name, Expression: Expression} | []"] |
| 获取表详情 | queries=["schema.Tables[?Name == 'TABLE_NAME'].{Columns: Columns[].{Name: Name, Type: Type}, Measures: Measures[].{Name: Name, Expression: Expression}} | [0]"] |
| 按关键字搜索已验证答案 | queries=["schema.VerifiedAnswers[?regex_match(to_string(@), 'revenue|sales')] | [:5].{Title: Title, Question: Question}"] |
| 列出所有关系 | queries=["schema.ActiveRelationships[].{PK: PK, FK: FK}"] |
DAX 规则
编写 DAX 查询时,请遵循以下严格规则:
查询结构
- 每个查询只包含一条
EVALUATE语句,绝不能包含多条 EVALUATE返回多行时,始终包含ORDER BY子句- 不要使用
ORDERBY函数对最终查询结果排序 - 如果查询在
EVALUATE之前包含VAR、MEASURE、COLUMN或TABLE定义,请在开头使用DEFINE - 使用
DEFINE时,只使用一个DEFINE块。各定义之间用换行分隔,不要使用逗号或分号 - 定义度量值时,始终使用其所属表的完整限定名称(例如
DEFINE MEASURE 'TableName'[MeasureName] = ...)。所属表必须存在于语义模型中 - 使用度量值时,只通过名称引用,不带表限定符(例如
[MeasureName])
CALCULATE / CALCULATETABLE 布尔筛选器
- 不能直接使用度量值或另一个
CALCULATE函数——先使用变量存储结果 - 不能引用两个不同表中的列
- 使用
IN运算符时,表操作数必须是表变量,而不是表表达式 - 不要将布尔筛选器赋值给
VAR定义
SUMMARIZECOLUMNS
- 参数顺序:分组列 → 筛选器 → 类度量值扩展列(均为可选,但必须遵循此顺序)
- 构建包含分组列和类度量值扩展列的汇总表时,默认使用此函数
- 不要在没有类度量值扩展列时使用(改用
SUMMARIZE) - 仅返回至少有一个度量值不为 BLANK 的行
- 不要使用布尔筛选器
SUMMARIZE
- 仅用于:
SUMMARIZE(<table expression>, <column1>, ..., <columnN>) - 绝不要与类度量值表达式一起使用——改用
SUMMARIZECOLUMNS - 获取单列的不同值时,使用
VALUES('Table'[Column]) - 第一个参数是表变量时,以
[Column]的形式引用列(而不是_TableVar[Column])
GROUPBY
- 仅当第一个参数是表值变量时使用
CURRENTGROUP仅可在GROUPBY中使用
SELECTCOLUMNS
- 用于投影列(保留重复项)或重命名列
- 重命名后,后续表达式(
TOPN、ORDER BY)必须使用新列名
其他规则
- 在
SELECTCOLUMNS或CALCULATETABLE等表表达式中,包含下游所需的所有列(例如用于ORDER BY、FILTER的列) - 筛选器会根据定义的方向(单向或双向)沿关系传播
- 对于集合函数(
INTERSECT、UNION、EXCEPT):两个输入表必须具有相同的列数 - 如果用户未指定筛选器,请遵循适用于目标视觉对象的筛选器(视觉对象 + 页面 + 报告级别),并在响应上下文中包含已应用的筛选器列表。
- 切勿借用任何其他视觉对象(同一页面或其他页面)的筛选器,即使这些筛选器看起来是通用的、防御性的或用于数据清理,除非同一筛选器也单独声明在目标视觉对象或页面/报告级别。
- 生成的 DAX 必须在逻辑上等同于适用的筛选器,且不得添加任何会改变这些筛选器所产生结果的谓词。
时间智能的日期上下文
- 始终通过日期表中的分组列或显式日期筛选器建立有效的日期上下文
- 将
ROW用于时间智能计算时,通过CALCULATETABLE提供外部筛选器,以建立清晰的“当前日期”参照 - 切勿单独使用
MAX('Calendar'[Date])——它可能返回未来日期。请使用LASTNONBLANK,或在按日期排序前使用[Measure] <> BLANK()进行筛选
报告度量值
- 报告度量值定义在报告层,而非语义模型中。要在 DAX 中使用报告度量值,请从
GetReportMetadata获取其表达式,并使用DEFINE MEASURE以内联方式重新定义。从 DAX 查询中按名称引用仅存在于报告中的度量值将失败。
附加规则
- 使用
TOPN进行排名。默认最多返回 50 行,除非用户要求更多 - 不支持 INFO 函数、DMV 查询和 MDX——仅支持 DAX
- 如果查询返回错误,请阅读错误消息、修复 DAX,然后重试一次
示例
发现并查询
用户:“Sales Benchmark 报告中收入最高的 5 种产品是什么?”
Agent 步骤:
- 使用 searchQuery:“Sales Benchmark” 调用
DiscoverArtifacts - 选择 Report 工件 → 记下
ArtifactId - 使用报告 ID 调用
GetReportMetadata - 使用工件 ID 调用
GetSemanticModelSchema——检查已验证的答案和自定义说明 - 使用视觉对象的度量值、绑定和筛选器编写 DAX 查询
- 使用工件 ID 和 DAX 查询调用
ExecuteQuery - 呈现格式化后的答案
带上下文的后续提问
用户:“现在按地区细分”
Agent 步骤:
- 编写新的 DAX 查询,并纳入前一个查询的上下文
- 使用工件 ID 和新的 DAX 查询调用
ExecuteQuery - 呈现格式化后的答案
值查找
用户:“预算情景下 Terra Firma 的销售额是多少?”
Agent 步骤:
- 使用工件 ID 和 searchTerms:["Terra Firma", "Budget"] 调用
ValueSearch - 使用解析出的值作为筛选器编写 DAX 查询
- 使用工件 ID 和 DAX 查询调用
ExecuteQuery - 呈现格式化后的答案