Bộ mã nguồn mở microsoft/skills-for-fabric không chỉ là tập hợp các hướng dẫn sử dụng Microsoft Fabric cho AI Coding Assistant. Dưới góc độ kỹ thuật hệ thống (Systems Engineering), đây là một kiến trúc tham chiếu (Reference Architecture) cấp độ Production của Microsoft về cách thiết kế, điều phối và kiểm soát một hệ thống Conversational Analytics & BI Agent.
Tài liệu này bóc tách toàn bộ cấu trúc, luồng điều phối (orchestration workflow) và các mẫu thiết kế (design patterns) quan trọng nhất từ microsoft/skills-for-fabric để đội ngũ phát triển (Dev & Data Analyst) tham khảo và áp dụng trực tiếp vào hệ thống Conversational Analytics Agent nội bộ.
Trình Mô Phỏng Kiến Trúc & Tra Cứu Skills
Kịch bản mẫu: Người dùng hỏi: "Doanh thu của khách hàng Terra Firma trong kịch bản ngân sách (budget) theo từng khu vực là bao nhiêu?". Bấm vào từng bước bên dưới để xem cách FabricIQ điều phối MCP Tools:
Bước 1
MCP Tool1. Tại sao Đội Dev Conversational Analytics cần tham khảo Repo này?
Sơ đồ 1.1: Ma trận Chẩn đoán 5 Điểm Nghẽn của Conversational Agent & Cơ chế Khắc phục
Diagnostic MatrixNhồi toàn bộ hàng trăm bảng, measure và luật SQL/DAX vào 1 System Prompt duy nhất làm giảm khả năng suy luận.
File SKILL.md chỉ giữ bảng phân luồng (~250 dòng), nạp tài liệu theo chế độ và lọc Schema ngay trên MCP Server.
Tự đoán chuỗi ký tự trong mệnh đề lọc (VD: Region = 'North America' trong khi DB lưu 'NA'), trả về rỗng.
Gọi ValueSearch trước khi viết DAX để lấy đúng tên cột và giá trị chính tả chuẩn đang tồn tại trong DB.
Agent tự viết công thức từ bảng thô và bỏ sót bộ lọc ngầm của trang báo cáo, ra kết quả khác trên Dashboard.
Ưu tiên VerifiedAnswers, kế thừa toàn bộ Report + Page + Visual Filters và dùng TREATAS cho bảng ẩn.
Gộp hàm FILTER gây lỗi Auto-Exist; dòng Grand Total ở cuối bảng bị cắt mất khi chạm ngưỡng maxRows.
Chạy song song 1 Summary Query + 1 Detail Query có sắp xếp ORDER BY IsSubtotal DESC đẩy dòng tổng lên đầu.
Agent chạy thẳng từ bước lên ý tưởng sang sửa mô hình hoặc publish báo cáo khi chưa có sự phê duyệt.
Khóa cứng ở trạng thái approval_pending, xuất đặc tả _brief/report-spec.md và dừng chờ người dùng duyệt.
Khi xây dựng một hệ thống Conversational Analytics Agent (hỏi đáp dữ liệu bằng ngôn ngữ tự nhiên qua Text-to-SQL hoặc Text-to-DAX), các đội phát triển thường gặp 5 điểm nghẽn kỹ thuật lớn:
- Bùng nổ ngữ cảnh (Context Window Explosion): Nhồi toàn bộ schema của hàng trăm bảng, cột, measure và luật nghiệp vụ vào một System Prompt duy nhất làm giảm độ chính xác suy luận và tăng chi phí token/độ trễ.
- Ảo giác giá trị lọc (Filter Value Hallucination): Agent tự đoán giá trị trong mệnh đề lọc (ví dụ viết
WHERE Region = 'North America'trong khi dữ liệu thực tế lưu là'NA'hoặc'AMER'), dẫn đến kết quả trả về bằng 0 hoặc rỗng. - Lệch chuẩn số liệu giữa Chat và Dashboard (Metric & Filter Drift): Cùng một câu hỏi “Doanh thu quý này là bao nhiêu?”, Agent tính ra một con số khác với con số hiển thị trên Dashboard của Ban Giám đốc vì bỏ sót các bộ lọc ngầm định (Report/Page/Visual filters) hoặc tự viết công thức tính toán thay vì dùng Measure đã chuẩn hóa.
- Lỗi logic khi sinh truy vấn phức tạp (Auto-Exist & Subtotal Truncation): Khi gom nhóm nhiều chiều (multi-dimension hierarchy), câu lệnh sinh ra bị sai dòng tổng (Grand Total) hoặc bị cắt mất dòng tổng quan trọng do vượt quá giới hạn dòng trả về (
maxRows). - Rủi ro an toàn khi kết hợp Đọc và Ghi (Read/Write Mixing): Agent tự ý thay đổi cấu trúc mô hình hoặc xuất bản báo cáo khi người dùng mới chỉ yêu cầu lên phương án.
Trong microsoft/skills-for-fabric, Microsoft đã giải quyết triệt để cả 5 bài toán trên thông qua kiến trúc Hybrid 3-Tier (Agents - Skills - Common) kết hợp với MCP Orchestration Tools.
2. Kiến trúc tổng thể: Mô hình Hybrid 3-Tier và MCP Layer
Sơ đồ 2.1: Kiến trúc Phân tầng Hybrid 3-Tier kết hợp Tầng Thực thi MCP/CLI
System TopologyThay vì xây dựng một Agent nguyên khối (Monolithic Agent), Microsoft chia hệ thống thành 3 tầng văn bản điều hướng kết hợp với 1 tầng thực thi qua giao thức MCP (Model Context Protocol).
| Tầng kiến trúc | Thành phần trong Repo | Vai trò kỹ thuật trong hệ thống Agent |
|---|---|---|
| Tầng 1: Agents (Bộ định tuyến vai trò) | agents/*.agent.md (5 Agents: FabricIQ, FabricDataEngineer, FabricAdmin, FabricAppDev, FabricMigrationEngineer) |
Định nghĩa Persona, phạm vi trách nhiệm, điều kiện kích hoạt (Triggers), quy tắc phân quyền (Delegation Rules) và cổng kiểm tra bắt buộc trước khi gọi tool (Pre-Flight Check). |
| Tầng 2: Skills (Bộ điều phối theo chế độ) | skills/*/SKILL.md (25 Skills chuyên biệt) + thư mục con references/*.md |
Đóng vai trò là Mode Dispatcher. File SKILL.md gốc rất gọn, chỉ chứa bảng phân loại ý định (Intent Routing) và trỏ tới các file references/*.md chi tiết. Giúp thực hiện cơ chế Progressive Disclosure (Nạp ngữ cảnh lười - Lazy Loading). |
| Tầng 3: Common (Lõi chuẩn hóa dùng chung) | common/*.md (COMMON-CORE.md, COMMON-CLI.md, ITEM-DEFINITIONS-CORE.md, v.v.) |
Lưu trữ toàn bộ quy tắc xác thực (Auth/Token Audience), phân trang (Pagination), xử lý tác vụ chạy nền (Long-Running Operations - LRO) và cấu trúc payload chuẩn. Đảm bảo tính nhất quán (No-Drift) giữa các Skills. |
| Tầng 4: Execution Layer (MCP & CLI) | .mcp.json (FabricIQ, powerbi-modeling-mcp, fabric-sqlendpoint) + az rest / fab CLI |
Cung cấp các hàm nguyên thủy (Primitives) để truy vấn metadata, tìm kiếm thực thể, chạy DAX/T-SQL trực tiếp trên dữ liệu thật và thao tác trên cấu trúc Semantic Model. |
Cơ chế Progressive Disclosure (Tiết kiệm 70-80% Context Window)
Sơ đồ 2.2: So sánh Tiêu thụ Context Window giữa Monolithic Prompt và Progressive Disclosure
Token EfficiencyĐiểm đáng học hỏi nhất trong cách tổ chức thư mục của skills-for-fabric là không bao giờ nạp toàn bộ tài liệu hướng dẫn vào bộ nhớ cùng lúc.
Ví dụ với skill powerbi-report-cli (quản lý trọn vòng đời báo cáo Power BI với hơn 60 file tài liệu tham khảo chi tiết):
- File skills/powerbi-report-cli/SKILL.md chỉ dài khoảng 250 dòng và tuyên bố rõ: “This skill is a mode dispatcher and intentionally contains no detailed procedures. Select the mode that matches the request, then read the matching mode reference end to end before acting.”
- Khi người dùng yêu cầu thiết kế giao diện, Agent chỉ nạp references/design.md và references/design/chart-selection.md.
- Khi người dùng yêu cầu sửa code JSON của biểu đồ, Agent mới nạp references/authoring.md và references/authoring/cartesian.md.
Bài học cho Đội Dev: Hãy tách System Prompt của Conversational Agent thành một Router/Dispatcher mỏng và một hệ thống Knowledge Base dạng mô-đun (có thể truy xuất qua Tool
read_referencehoặc RAG theo chủ đề) thay vì ghép mọi luật SQL/DAX và mô tả bảng vào một prompt cố định.
3. Phân tích sâu FabricIQ: Luồng điều phối 9 bước cho Conversational BI Agent
Trong repo, agents/FabricIQ.agent.md và skills/fabriciq/SKILL.md là trái tim của hệ thống hỏi đáp dữ liệu tự nhiên trên Power BI và Semantic Model. Hệ thống này sử dụng một MCP Server duy nhất (https://fabriciq.svc.cloud.microsoft/v1/mcp/fabriciq) với đúng 6 công cụ (MCP Tools) được thiết kế cực kỳ chặt chẽ:
| Tên MCP Tool | Đầu vào chính | Mục đích & Quy tắc sử dụng bắt buộc |
|---|---|---|
DiscoverArtifacts |
searchQuery, artifactTypes, maxResults |
Tìm kiếm báo cáo (Report) và mô hình ngữ nghĩa (Semantic Model) theo từ khóa. Luôn gọi đầu tiên nếu người dùng chưa cung cấp ID hoặc URL. Luôn ưu tiên chọn Report hơn Semantic Model rời. |
ResolveFabricItem |
fabricItemId (GUID hoặc URL) |
Phân giải URL (bao gồm cả URL phức tạp của Power BI App) hoặc GUID chưa rõ loại sang fabricItemId chuẩn, itemType và workspaceId. |
GetReportMetadata |
reportObjectId, queries (JMESPath tùy chọn) |
Lấy cấu trúc các trang báo cáo (Pages), biểu đồ (Visuals), trường dữ liệu đang gắn (Bindings), Report-level measures và toàn bộ bộ lọc 3 cấp (Report / Page / Visual filters). |
GetSemanticModelSchema |
artifactId, queries (JMESPath tùy chọn) |
Lấy danh sách bảng, cột, measure, mối quan hệ (Relationships), cùng 2 thành phần tối quan trọng: VerifiedAnswers và CustomInstructions. |
ValueSearch |
artifactId, searchTerms, scope |
Tìm kiếm giá trị thực tế trong các cột của mô hình. Bắt buộc gọi trước khi viết bất kỳ điều kiện lọc DAX nào có chứa tên riêng (khách hàng, sản phẩm, khu vực, chiến dịch). |
ExecuteQuery |
artifactId, daxQueries (mảng 1-4 câu lệnh), maxRows |
Thực thi từ 1 đến 4 câu lệnh DAX độc lập song song (mỗi câu lệnh chứa một mệnh đề EVALUATE duy nhất) và trả về bảng kết quả (mặc định 250 dòng, tối đa 1.000 dòng). |
Quy trình 9 bước thực thi chuẩn (9-Step Execution Pipeline)
Sơ đồ 3.1: Luồng Điều phối 9 Bước của FabricIQ chia theo 3 Pha Thực thi
9-Step OrchestrationĐịnh vị & Thu thập Ngữ cảnh
VerifiedAnswers + CustomInstructions.Neo Ngữ nghĩa & Sinh Mã DAX
Nếu Không: Áp dụng Custom Instructions.
SUMMARIZECOLUMNS tách biệt từng filter bằng TREATAS / KEEPFILTERS.Thực thi, Tự sửa lỗi & Trả lời
EVALUATE độc lập song song (Summary + Detail Rollup).LASTNONBLANK, đối chiếu filter ẩn và chạy lại tối đa 1 lần.Khi nhận một câu hỏi từ người dùng (ví dụ: “Top 5 sản phẩm có doanh thu cao nhất của khách hàng Terra Firma trong kịch bản ngân sách là gì?”), FabricIQ bắt buộc Agent tuân thủ nghiêm ngặt trình tự 9 bước sau:
- Bước 1 - Định danh tài nguyên (Artifact Identification):
- Nếu có URL hoặc GUID: Gọi
ResolveFabricItem. - Nếu chỉ có tên hoặc từ khóa: Gọi
DiscoverArtifacts. Lưu ý tách biệt rõreportObjectId(ID của báo cáo) vàartifactId(ID của Semantic Model nằm bên dưới báo cáo đó). - Bước 2 - Đọc ngữ cảnh báo cáo (Report Metadata Inspection):
- Gọi
GetReportMetadata(lần đầu không truyền tham sốqueriesđể lấy toàn cảnh). - Trích xuất
semanticModelID, danh sách các Visual liên quan đến câu hỏi, các Measure đang được Visual đó sử dụng và toàn bộ bộ lọc đang áp dụng trên Report, Page và Visual. - Bước 3 - Phân tích Schema và Luật nghiệp vụ (Schema & Rules Analysis):
- Gọi
GetSemanticModelSchemavới ID của Semantic Model. - Đọc toàn bộ
VerifiedAnswers(câu trả lời đã xác thực) vàCustomInstructions(hướng dẫn nghiệp vụ của chủ sở hữu mô hình). - Bước 4 - Đối sánh Câu trả lời đã xác thực (Verified Answers Matching - Bắt buộc):
- Quét toàn bộ danh sách
VerifiedAnswersxem có mục nào khớp về mặt ngữ nghĩa với câu hỏi của người dùng không (kể cả khi dùng từ đồng nghĩa). Nếu khớp, bắt buộc dùng nguyên bản thiết kế (Bindings + Filters) của Verified Answer đó, không tự ý sáng tạo câu truy vấn mới. - Bước 5 - Neo giá trị thực thể (Entity Value Grounding qua
ValueSearch): - Với câu hỏi có chứa tên riêng như
"Terra Firma"và"Budget", Agent gọiValueSearch(artifactId, searchTerms=["Terra Firma", "Budget"])để biết chính xác giá trị này nằm ở bảng nào, cột nào và cách viết hoa/thường chuẩn trong cơ sở dữ liệu là gì. - Bước 6 - Sinh mã truy vấn theo khuôn mẫu (Constrained Query Generation):
- Viết câu lệnh DAX dựa trên các Measure có sẵn trong mô hình (ưu tiên Measure đang gắn trên Visual của báo cáo), kết hợp bộ lọc từ Bước 2, luật từ Bước 3/4 và giá trị chuẩn từ Bước 5.
- Bước 7 - Thực thi song song (Parallel Query Execution):
- Gọi
ExecuteQuery(hỗ trợ chạy song song tối đa 4 câu lệnhEVALUATEtrong 1 request để giảm độ trễ mạng). - Bước 8 - Kiểm chứng và Tự sửa lỗi (Verification & Error Recovery):
- Nếu kết quả trả về
BLANKhoặc rỗng bất thường: Kiểm tra lại xem có đang lọc vào một ngày không có dữ liệu không (re-anchor về ngày gần nhất có dữ liệu bằngLASTNONBLANK), kiểm tra lại bộ lọc của Report, sửa DAX và thử lại tối đa 1 lần (max 1 retry). - Bước 9 - Tổng hợp câu trả lời hướng người dùng (Business-First Synthesis):
- Trình bày kết quả ngắn gọn, đưa con số quan trọng lên đầu (in đậm), dùng bảng văn bản rõ ràng. Tuyệt đối không nhắc đến tên hàm DAX, tên bảng kỹ thuật hay tên MCP tool trong câu trả lời cho người dùng cuối.
4. Bảy Mẫu Thiết Kế (Design Patterns) Đắt Giá Nhất Cho Đội Dev
Dưới đây là 7 kỹ thuật cốt lõi được rút trích từ mã nguồn của skills-for-fabric mà đội phát triển Conversational Analytics có thể áp dụng ngay vào kiến trúc Agent của mình (dù backend của bạn dùng Power BI DAX, Fabric Warehouse T-SQL, BigQuery, Snowflake hay Postgres).
Pattern 1: Tháp ưu tiên nguồn chân lý (4-Level Hierarchy of Truth)
Một lỗi phổ biến của các Text-to-SQL / Text-to-DAX Agent là luôn cố gắng tự viết câu lệnh tính toán từ các bảng và cột thô (Raw Schema). FabricIQ định nghĩa một tháp ưu tiên 4 tầng rõ ràng:
Sơ đồ 4.1: Tháp Ưu Tiên Nguồn Chân Lý 4 Tầng (Hierarchy of Truth Pyramid)
Pattern 01Pattern 2: Kế thừa bộ lọc 3 cấp và Cơ chế công khai ghi đè (Filter Inheritance & Override Disclosure)
Sơ đồ 4.2: Phễu Kế thừa Bộ lọc 3 Cấp, Chặn Nhiễu Chéo và Quy tắc Ghi đè
Pattern 02Report Filters + Page Filters + Target Visual Filters.
Nếu bảng trong filter bị ẩn khỏi Schema: bắt buộc áp dụng qua
TREATAS({vals}, 'HiddenTable'[Col]).
Tuyệt đối không tự ý "mượn" filter từ biểu đồ bên cạnh (ngay cả khi trông giống quy tắc lọc dữ liệu rác chung) nếu không khai báo ở cấp Page/Report.
Year = 2025 nhưng User hỏi 2026:Chỉ ghi đè đúng chiều
Year, giữ nguyên các filter khác và bắt buộc công khai (disclose) việc ghi đè trong câu trả lời.
Tại sao người dùng hỏi Agent lại nhận được con số khác trên Dashboard? Vì trên Dashboard có các bộ lọc ngầm định ở cấp Báo cáo (Report filter), cấp Trang (Page filter) hoặc cấp Biểu đồ (Visual filter) - ví dụ: Status <> 'Cancelled' hoặc Scenario IN ('Actual', 'Forecast').
Quy tắc của Microsoft trong skills/fabriciq/SKILL.md:
- Mặc định kế thừa toàn bộ: Khi truy vấn dữ liệu dựa trên một Visual trong báo cáo, Agent bắt buộc đưa toàn bộ Report Filters + Page Filters + Target Visual Filters vào câu lệnh truy vấn.
- Cấm “mượn” bộ lọc chéo (No Cross-Visual Filter Borrowing): Không bao giờ lấy bộ lọc của một biểu đồ khác trên cùng trang để áp vào biểu đồ đang xét, ngay cả khi bộ lọc đó trông giống như quy tắc làm sạch dữ liệu chung.
- Xử lý bảng ẩn bằng TREATAS: Nhiều khi bộ lọc cấp báo cáo tham chiếu đến một bảng cấu hình bị ẩn khỏi Schema. Agent không được bỏ qua bộ lọc này mà phải áp dụng bằng hàm TREATAS({"Actual", "Forecast"}, 'Budget'[Scenario]).
- Ghi đè có công khai (Explicit Override Disclosure): Nếu báo cáo đang lọc cố định Year = 2025, nhưng người dùng hỏi “Doanh thu năm 2026 là bao nhiêu?”, Agent chỉ ghi đè đúng bộ lọc Year, giữ nguyên mọi bộ lọc khác, và bắt buộc ghi rõ trong câu trả lời (ví dụ: “Lưu ý: Kết quả này đã chuyển bộ lọc năm từ 2025 (mặc định của báo cáo) sang 2026 theo yêu cầu của bạn”).
Pattern 3: Xử lý Schema khổng lồ bằng JMESPath Projection (Two-Phase Metadata Retrieval)
Sơ đồ 4.3: Giao thức Truy xuất Metadata 2 Pha chống Tràn Bộ nhớ (Truncated Schema Recovery)
Pattern 03GetSemanticModelSchema(artifactId) không truyền tham số queries.→ Nếu mô hình vừa và nhỏ: Nhận toàn bộ Schema trong 1 lượt.
→ Nếu mô hình quá lớn (nhận cảnh báo truncated): Kích hoạt ngay Pha 2.
queries=[...] theo đúng thứ tự ưu tiên cứng:(1)
schema.VerifiedAnswers[] → (2) schema.CustomInstructions → (3) Các bảng và measure khớp từ khóa câu hỏi.
Khi một Semantic Model có hàng trăm bảng và hàng nghìn measure, kết quả trả về từ GetSemanticModelSchema hoặc GetReportMetadata sẽ vượt giới hạn token và bị cắt bớt (truncated).
Microsoft giải quyết bằng cơ chế Truy xuất 2 pha tích hợp JMESPath ngay trên MCP Server:
1. Pha 1: Gọi GetSemanticModelSchema(artifactId) không kèm tham số lọc. Nếu mô hình nhỏ, nhận toàn bộ schema trong 1 lần gọi.
2. Pha 2 (Nếu kết quả Pha 1 bị cắt bớt): MCP tool hỗ trợ tham số queries nhận mảng các biểu thức JMESPath để lọc dữ liệu ngay phía server trước khi trả về cho LLM. Thứ tự ưu tiên lấy bổ sung bắt buộc:
- Ưu tiên 1: Lấy toàn bộ danh sách câu hỏi xác thực:
queries=["schema.VerifiedAnswers[].{Title: Title, Question: Question}"]
- Ưu tiên 2: Lấy toàn bộ hướng dẫn nghiệp vụ:
queries=["schema.CustomInstructions"]
- Ưu tiên 3: Tìm kiếm measure và bảng theo từ khóa liên quan đến câu hỏi:
queries=["schema.Tables[].Measures[?regex_match(to_string(@), 'revenue|sales')].{Name: Name, Expression: Expression} | []"]
Bài học cho Đội Dev: Khi thiết kế MCP Tool trả về Schema hoặc Metadata lớn cho Agent, hãy tích hợp sẵn bộ lọc JMESPath hoặc JSONPath vào tham số đầu vào của Tool. Điều này giúp Agent tự truy vấn sâu (drill-down) vào đúng nhánh JSON cần thiết mà không làm tràn bộ nhớ.
Pattern 4: Truy vấn kép song song cho dữ liệu phân cấp (Parallel Dual-Query chống mất dòng tổng)
Sơ đồ 4.4: Kiến trúc Tách-Gộp Truy vấn Kép Song song (Parallel Dual-Query Split-Merge)
Pattern 04ROLLUPADDISSUBTOTAL) kèm toàn bộ các Measure.→ Số dòng cực ít (< 20 dòng), đảm bảo luôn lấy được con số tổng cấp cao chính xác 100%.
ROLLUPADDISSUBTOTAL trên toàn bộ các chiều phân cấp, nhưng bắt buộc:ORDER BY IsLevel1Sub DESC, IsLevel2Sub DESC, [Measure] DESC.→ Đẩy toàn bộ dòng Subtotal lên đầu bảng kết quả trước khi chạm trần
maxRows = 250.
Khi người dùng yêu cầu phân tích theo cấu trúc phân cấp từ 3 chiều trở lên (ví dụ: Khu vực -> Quốc gia -> Tỉnh thành -> Nhóm sản phẩm) hoặc các chiều có số lượng giá trị lớn (high-cardinality), câu lệnh tạo dòng tổng phụ (ROLLUPADDISSUBTOTAL trong DAX hoặc GROUP BY ROLLUP trong SQL) có thể sinh ra hàng chục nghìn dòng. Khi bị cắt ở giới hạn maxRows = 250 hoặc 1000, các dòng Tổng (Subtotals / Grand Total) rất dễ bị cắt mất, khiến Agent báo cáo sai tổng số.
Giải pháp trong skills/fabriciq/SKILL.md:
- Agent phải gửi 2 câu truy vấn chạy song song trong cùng một lệnh ExecuteQuery:
1. Summary Query (Truy vấn tổng hợp đỉnh): Chỉ gom nhóm theo 1-2 chiều cao nhất (không dùng rollup chi tiết) kèm toàn bộ các Measure. Kết quả cực gọn, đảm bảo 100% không bao giờ bị cắt dòng và luôn có con số tổng chính xác tuyệt đối.
2. Detail Query (Truy vấn chi tiết có Rollup): Gom nhóm toàn bộ các chiều với ROLLUPADDISSUBTOTAL, nhưng bắt buộc sắp xếp (ORDER BY) theo các cột cờ Subtotal giảm dần trước (IsLevel1Subtotal DESC, IsLevel2Subtotal DESC), sau đó mới sắp xếp theo giá trị Measure giảm dần. Nhờ vậy, toàn bộ các dòng tổng cấp cao luôn nằm ở đầu bảng kết quả và sống sót qua mọi giới hạn cắt dòng (maxRows).
Pattern 5: Kỷ luật sinh mã DAX/SQL (Chống lỗi Auto-Exist và Time Intelligence Trap)
Sơ đồ 4.5: Ba Chốt chặn Cú pháp DAX Bắt buộc (Syntax Guardrail Pillars)
Pattern 05FILTER('Table', A && B). Bắt buộc tách từng cột thành đối số riêng dùng TREATAS hoặc KEEPFILTERS(FILTER(ALL(Col), ...)).MAX('Calendar'[Date]) vì bảng lịch thường kéo dài tới tương lai. Bắt buộc dùng LASTNONBLANK kèm kiểm tra [Measure] <> BLANK().DEFINE MEASURE 'Table'[Name] = ....Để ngăn LLM viết ra những câu lệnh chạy được nhưng sai số liệu, skills/fabriciq/SKILL.md đặt ra bộ luật cú pháp cực kỳ nghiêm ngặt:
- Chống bẫy Auto-Exist khi lọc nhiều cột:
- Cấm tuyệt đối: Gộp nhiều điều kiện lọc vào chung một hàm
FILTER('Table', 'Table'[Col1] = "A" && 'Table'[Col2] = "B"). Trong DAX, cách viết này kích hoạt cơ chế auto-exist làm sai lệch dòng Grand Total. - Bắt buộc: Tách mỗi điều kiện lọc thành một đối số độc lập bên trong
SUMMARIZECOLUMNS. Với điều kiện bằng/IN (=,IN), dùngTREATAS({"A"}, 'Table'[Col1]). Với các điều kiện khác (<>,>,IS NOT NULL), dùngKEEPFILTERS(FILTER(ALL('Table'[Col1]), ...)). - Chống bẫy ngày tương lai trong Time Intelligence:
- Cấm tuyệt đối: Dùng
MAX('Calendar'[Date])để xác định “ngày hiện tại” vì bảng Calendar thường được tạo sẵn đến hết năm 2030. - Bắt buộc: Dùng
LASTNONBLANKhoặc lọc những ngày có phát sinh dữ liệu ([Measure] <> BLANK()) trước khi lấy mốc thời gian mới nhất. - Xử lý Report-Level Measures:
- Nhiều Measure được DA tạo trực tiếp trên file báo cáo Power BI chứ không nằm trong Semantic Model. Nếu gọi tên Measure đó trong câu lệnh DAX gửi xuống Semantic Model sẽ bị lỗi không tìm thấy.
- Giải pháp: Đọc biểu thức của Measure đó từ
GetReportMetadata, sau đó định nghĩa lại trực tiếp (inline) ở đầu câu truy vấn bằng cú phápDEFINE MEASURE 'HostTable'[MeasureName] = <biểu thức>.
Pattern 6: Chuẩn bị mô hình cho AI (Semantic Model AI Readiness & OneLake Catalog Curation)
Sơ đồ 4.6: Dây chuyền 5 Bước Chuẩn hóa Tầng Ngữ nghĩa cho AI (AI Readiness Pipeline)
Pattern 06onelake-catalog-cli (curate mode) quét mẫu dữ liệu thật để điền Description cho bảng/cột.Một hệ thống Conversational Analytics không thể trả lời chính xác nếu tầng dữ liệu bên dưới đặt tên cột viết tắt vô nghĩa (col_01, amt_v2). Repo cung cấp 2 skill chuyên biệt để chuẩn hóa tầng ngữ nghĩa cho AI:
semantic-model-authoring(Workflow: Semantic Model AI Readiness):- Kiểm tra và làm giàu metadata của Semantic Model để phục vụ Copilot và Data Agent: chuẩn hóa tên gọi thân thiện với nghiệp vụ, thêm mô tả (Description) giải thích ý nghĩa và công thức tính cho từng bảng/cột/measure, thiết lập từ đồng nghĩa (Synonyms), ẩn các cột khóa kỹ thuật (Surrogate Keys), và tạo sẵn bộ
VerifiedAnswerscùngCustomInstructions. onelake-catalog-cli(Chế độcurate):- Tự động lấy mẫu dữ liệu và cấu trúc của các đối tượng trong Workspace, từ đó dùng AI gợi ý mô tả cấp độ Item, Table và Column, trình bày thành bảng đối chiếu (Current vs Proposed) để Data Steward phê duyệt trước khi ghi hàng loạt vào hệ thống qua API.
Pattern 7: Cổng phê duyệt bắt buộc và Phân tầng công cụ (Greenfield Approval Barrier & Tool Tiering)
Sơ đồ 4.7: Máy Trạng thái Chuyển Chế độ có Chốt chặn Phê duyệt (State Machine with Approval Gate)
Pattern 07_brief/report-spec.md.Design Brief.Trong các skill có tác động thay đổi dữ liệu hoặc giao diện như powerbi-report-cli và semantic-model-authoring, Microsoft áp dụng 2 cơ chế bảo vệ quan trọng:
- Greenfield Approval Barrier (Chốt chặn phê duyệt bắt buộc):
- Ngay cả khi người dùng ra lệnh trong một câu duy nhất: “Hãy lên kế hoạch, thiết kế, tạo báo cáo Power BI và publish lên workspace cho tôi”, Agent vẫn bị khóa cứng ở trạng thái
approval_pending(chỉ được phép chạy chế độplanning). - Agent bắt buộc phải khảo sát Semantic Model, xuất ra bản đặc tả
_brief/report-spec.md, yêu cầu người dùng xác nhận và kết thúc lượt trả lời (end turn). Câu chữ “tạo và publish” trong prompt ban đầu chỉ được coi là “phạm vi mong muốn trong tương lai”, không được coi là giấy phép để bỏ qua bước duyệt thiết kế. - Tool Selection Priority (Phân tầng công cụ thực thi):
- Tier 1 (Ưu tiên số 1 - Live MCP): Nếu
powerbi-modeling-mcpđang kết nối trực tiếp tới mô hình (trên Desktop hoặc Workspace), mọi thao tác đọc/ghi phải đi qua MCP để đảm bảo tính toàn vẹn của Tabular Object Model (TOM) và cấm đọc file.tmdltrên đĩa để tránh lệch trạng thái (stale state). - Tier 2 (Fallback - Code/REST Round-trip): Chỉ khi không có MCP mới dùng phương pháp tải định nghĩa TMDL về qua
az rest, chỉnh sửa file văn bản và đẩy lên lại qua APIupdateDefinition.
5. Danh mục 25 Skills và 5 Agents trong microsoft/skills-for-fabric
Để đội ngũ phát triển và Data Analyst dễ dàng tra cứu, dưới đây là bảng phân loại toàn bộ 25 Skills trong repo theo nhóm chức năng:
Nhóm A: Conversational BI, Semantic Model & Báo cáo Power BI (Trọng tâm cho DA & BI Agent)
| Tên Skill | Chế độ (Modes) / Công cụ chính | Ứng dụng cho DA và Hệ thống Agent |
|---|---|---|
fabriciq |
FabricIQ MCP (DiscoverArtifacts, GetReportMetadata, GetSemanticModelSchema, ValueSearch, ExecuteQuery) |
Trả lời câu hỏi ngôn ngữ tự nhiên trực tiếp trên dữ liệu Power BI Report và Semantic Model với cơ chế chống ảo giác 9 bước. |
semantic-model-authoring |
powerbi-modeling-mcp, TMDL, INFO.VIEW DAX, az rest |
Thiết kế Star Schema, viết và tối ưu hiệu năng DAX, tạo Field Parameters, kiểm tra Best Practices và chuẩn bị mô hình cho AI (AI Readiness). |
powerbi-report-cli |
4 Modes: planning, design, authoring, management (powerbi-report-author CLI) |
Quản lý trọn vòng đời báo cáo PBIP/PBIR: lập đặc tả, chọn loại biểu đồ chuẩn, sửa code visual.json, chụp ảnh màn hình preview để tự đánh giá giao diện và publish lên Fabric. |
fabriciq-ontology-cli |
2 Modes: authoring, consumption |
Xây dựng và truy vấn đồ thị ngữ nghĩa (Ontology definitions, lineage, entity grounding, graph walks) trên Fabric IQ. |
activator-cli |
2 Modes: authoring, consumption |
Thiết lập cảnh báo tự động (Data Activator / Reflex) dựa trên các chỉ số từ Power BI (powerBiSource-v1) hoặc dòng sự kiện thời gian thực. |
Nhóm B: Truy vấn SQL, Data Warehouse & Khám phá Danh mục Dữ liệu
| Tên Skill | Chế độ (Modes) / Công cụ chính | Ứng dụng cho DA và Hệ thống Agent |
|---|---|---|
sqldw-cli |
3 Modes: authoring, consumption, operations + fabric-sqlendpoint MCP |
Truy vấn phân tích T-SQL trên Fabric Data Warehouse, thiết kế bảng/view/stored procedure và chẩn đoán truy vấn chậm (Query Insights). |
sqldb-cli |
3 Modes: authoring, consumption, operations |
Thao tác và truy vấn T-SQL trên SQL Database trong Fabric (OLTP workload) kèm kiểm tra hiệu năng. |
onelake-catalog-cli |
4 Modes: discover, assess, configure, curate |
Quản trị OneLake Catalog và tự động sinh mô tả (Data Dictionary / Metadata Curation) cho bảng, cột, báo cáo dựa trên dữ liệu thực tế. |
search-consumption-cli |
Fabric Catalog Search REST API | Tìm kiếm nhanh tài nguyên trên toàn bộ tổ chức theo từ khóa, loại đối tượng và workspace. |
dataflows-cli |
3 Modes: authoring, consumption, upgrade |
Viết mã Power Query (M) cho Dataflows Gen2, theo dõi lịch sử làm mới dữ liệu và nâng cấp từ Dataflow Gen1 lên Gen2 CI/CD. |
Nhóm C: Kỹ thuật Dữ liệu (Data Engineering), Real-Time Intelligence & Vận hành
| Tên Skill | Chế độ (Modes) / Công cụ chính | Ứng dụng thực tế |
|---|---|---|
e2e-medallion-architecture |
Cross-workload Orchestration | Thiết kế kiến trúc hồ dữ liệu 3 tầng Bronze (thô) -> Silver (làm sạch) -> Gold (phục vụ phân tích). |
spark-cli & project-osmos |
PySpark, Livy API, Materialized Lake Views | Phát triển Notebook PySpark, quản lý Lakehouse Delta tables, chạy job phân tích lớn và xử lý pipeline tự hành với Project Osmos. |
eventhouse-cli |
2 Modes: authoring, consumption (KQL) |
Truy vấn phân tích thời gian thực bằng KQL (bắt buộc có bộ lọc thời gian where Timestamp > ago(...)) và quản lý bảng/hàm trong Eventhouse. |
eventstream-cli & eventschemaset-cli |
2 Modes: authoring, consumption |
Thiết kế luồng thu thập dữ liệu streaming (Eventstream topology) và quản lý danh mục cấu trúc sự kiện (Schema Sets). |
git-integration-operations-cli |
fab api, az rest |
Tự động hóa quy trình Git (kết nối repo, commit, pull, xử lý xung đột) từ dòng lệnh. |
deployment-pipelines-authoring-cli & variable-library-cli |
Fabric CI/CD REST APIs | Quản lý đường ống triển khai (Dev -> Test -> Prod) và tham số hóa cấu hình môi trường qua Variable Library. |
azmon-mirroredcatalogs-operations-cli |
Azure Monitor + Fabric Mirroring | Đưa dữ liệu log/telemetry từ Azure Monitor, App Insights vào Fabric để phân tích tương quan với dữ liệu kinh doanh. |
e2e-fabric-cost-estimation |
Capacity & CU Sizing | Ước tính chi phí Fabric Capacity (F-SKU), quy đổi mức tiêu thụ CU của từng workload. |
| Nhóm Skills Migration (4 skills) | synapse-migration, databricks-migration, hdinsight-migration, pipeline-migration |
Chuyển đổi tự động kho dữ liệu, notebook và pipeline từ Synapse, Databricks, HDInsight, ADF sang Microsoft Fabric. |
6. Bảng Đối Chiếu Áp Dụng Cho Đội Phát Triển Conversational Analytics Agent
Sơ đồ 6.1: Kiến trúc Đề xuất khi Xây dựng Hệ thống Conversational Analytics Agent Nội bộ
Reference BlueprintVerified Answers + Lọc Schema lớn qua JMESPath.ValueSearch (Full-text / Vector) trước khi sinh query.Nếu đội Dev của bạn đang tự xây dựng một hệ thống Conversational Analytics Agent (trên nền tảng LangGraph, AutoGen, Semantic Kernel, Cloudflare Agents SDK, hoặc Custom Agent), dưới đây là các thành phần có thể học hỏi và tái sử dụng trực tiếp từ microsoft/skills-for-fabric:
| Bài toán trong Hệ thống Agent của bạn | Giải pháp tham chiếu từ skills-for-fabric |
File cần đọc kỹ trong Repo |
|---|---|---|
| Thiết kế kiến trúc Prompt không bị phình to khi thêm tính năng | Áp dụng mẫu Mode Dispatcher + Progressive Disclosure: File prompt chính chỉ chứa bảng phân loại ý định (Intent Table) và gọi tool đọc file hướng dẫn chi tiết theo từng chế độ. | skills/powerbi-report-cli/SKILL.md, skills/semantic-model-authoring/SKILL.md |
| Thiết kế bộ Tool cho Text-to-DAX / Text-to-SQL Agent | Chỉ cần 6 hàm nguyên thủy: Discover -> Resolve -> GetReportContext -> GetSchema (kèm JMESPath) -> ValueSearch -> ExecuteQuery (hỗ trợ chạy song song 1-4 câu). |
skills/fabriciq/SKILL.md, agents/FabricIQ.agent.md, .mcp.json |
| Ngăn chặn Agent tự bịa tên khách hàng/sản phẩm trong câu query | Bắt buộc thêm bước Entity Grounding (ValueSearch) vào pipeline trước bước sinh code SQL/DAX bất cứ khi nào câu hỏi có danh từ riêng hoặc giá trị phân loại. |
skills/fabriciq/SKILL.md (Mục Workflow Step 5 & Available Tools) |
| Đảm bảo con số Agent trả lời khớp 100% với Dashboard | Xây dựng kho Verified Answers (VA) và cơ chế 3-Level Filter Inheritance (tự động đính kèm bộ lọc của Dashboard vào câu query của Agent). | skills/fabriciq/SKILL.md (Mục Verified Answers & Inspect the report) |
| Tránh mất dòng tổng (Grand Total / Subtotal) khi query bị giới hạn số dòng | Áp dụng Parallel Dual-Query Pattern: Chạy 1 câu Summary lấy tổng cấp cao song song với 1 câu Detail có sắp xếp cờ IsSubtotal DESC lên đầu. |
skills/fabriciq/SKILL.md (Mục Verified Answers - Quy tắc số 6) |
| Chuẩn hóa dữ liệu và Metadata để AI hiểu đúng nghiệp vụ | Áp dụng quy trình Semantic Model AI Readiness và tự động hóa việc điền mô tả bảng/cột từ dữ liệu mẫu (Automated Metadata Curation). | skills/semantic-model-authoring/references/semantic-model-ai-readiness.md, skills/onelake-catalog-cli/references/curate.md |
| Cơ chế tự phục hồi lỗi (Self-Healing / Error Recovery) | Phân loại lỗi rõ ràng (Error Taxonomy): Lỗi cú pháp -> đọc lỗi, sửa và chạy lại tối đa 1 lần; Kết quả rỗng -> kiểm tra mốc ngày LASTNONBLANK và bộ lọc ngầm; Lỗi phân quyền (401/403) -> dừng ngay lập tức, không lặp vô tận. |
skills/fabriciq/SKILL.md (Mục Error Recovery & Error Taxonomy) |
7. Hướng dẫn Cài đặt & Trải nghiệm Nhanh
Đội ngũ phát triển và Data Analyst có thể tải về nghiên cứu mã nguồn hoặc cài đặt trực tiếp vào công cụ AI Coding đang sử dụng:
Cách 1: Clone trực tiếp Repo để nghiên cứu Kiến trúc Prompt & Skills
Vì repo đã tích hợp sẵn các file cấu hình gốc (CLAUDE.md, GEMINI.md, AGENTS.md, .cursorrules, .windsurfrules, .mcp.json), bạn chỉ cần clone repo về máy và mở bằng Antigravity, Claude Code, Cursor hoặc Gemini CLI:
git clone https://github.com/microsoft/skills-for-fabric.git
cd skills-for-fabric
Cách 2: Cài đặt qua GitHub Copilot CLI hoặc APM (Agent Package Manager)
# Cài đặt trọn bộ Fabric Skills trên GitHub Copilot CLI
copilot plugin install github:microsoft/skills-for-fabric
# Hoặc chỉ cài đặt gói chuyên biệt cho Power BI & Data Analyst
copilot plugin install github:microsoft/skills-for-fabric --plugin-path .github/plugins/powerbi-authoring
# Hoặc cài từng skill riêng lẻ qua APM
apm install microsoft/skills-for-fabric --skill fabriciq -g
apm install microsoft/skills-for-fabric --skill semantic-model-authoring -g
apm install microsoft/skills-for-fabric --skill powerbi-report-cli -g
Cách 3: Xác thực Azure AD để kết nối trực tiếp vào Fabric / Power BI
# Đăng nhập Azure CLI
az login
# Kiểm tra token truy cập Fabric REST API
az account get-access-token --resource https://api.fabric.microsoft.com
# Kiểm tra token truy cập SQL Endpoint (Warehouse / Lakehouse)
az account get-access-token --resource https://database.windows.net