ITD HANDS-ON WORKSHOP · 3 HOURS

讓企業資料
成為 Agent 能理解的世界。

從本體建模、MCP 工具與雙智能體協作,到可公開存取的 Copilot 應用。一步一步把散落的經營資料,變成可追問、可信任、可部署的運營智能。

FABRIC IQ MCP AGENT FRAMEWORK AZURE CONTAINER APPS
06實驗單元
03h完整動手流程
04核心實作挑戰
01可部署應用
01 · WORKSHOP CONTEXT

資料都在。缺的是關係。

一家高速擴張的 AI frontier company,交付側已經大量使用 AI,運營側卻仍靠人工拉表。預算、專案與工作流各自在不同系統,關係只存在於人的腦中。

01

資源稀缺

算力與預算是最緊的約束,經營會必須隨時回答錢花在哪、還剩多少。

02

關係分散

FundingPool、Project、Task 分別存在,卻沒有系統描述它們如何互相連接。

03

決策要快

跨兩跳再聚合的問題,不能等分析師隔天交付,也不能讓模型自行猜數字。

THE FOUR QUESTIONS
  1. 01
    哪些專案正在推進?單一實體過濾
  2. 02
    PRJ-001 還有哪些工作未完成?一跳關係遍歷
  3. 03
    哪個資金池支撐哪些專案、總預算多少?關係遍歷 + 聚合
  4. 04
    每個資金池名下的總投入工時?跨域兩跳 + 聚合
02 · SYSTEM VIEW

Understand → Reason
→ Build → Run

本體讓系統讀懂業務,MCP 把能力標準化,Agent Framework 組織推理,Container Apps 提供人人可用的入口。

↓ HTTPS
APPLICATIONFastAPI + Agent WorkflowAssistantAgent → DataAnalystAgent
↙ MCP SANDBOX ↘
KNOWLEDGEOntology + MCPFundingPool · Project · Task
EXECUTIONMonty CodeAct隔離程式碼執行與圖表
↓ DEPLOY
LAB 00 · PRE-WORK

登入 Azure 與配置模型憑據

後續實驗同時使用 Azure Developer CLI 與 Azure CLI;兩者的登入狀態不共享。模型即時測試還需要由講師透過安全渠道提供的設定。

10 分鐘Azure CLIAzure Developer CLI
01取得並保護實驗設定

向 coach 取得 Client ID、Tenant ID、Client Secret 與 Azure OpenAI API Key。Secret 與 Key 不可放進群聊、截圖、Issue 或 Git。

read -r -p "Client ID: " AZURE_CLIENT_ID
read -r -p "Tenant ID: " AZURE_TENANT_ID
02分別登入 azd 與 az
azd auth login \
  --client-id "$AZURE_CLIENT_ID" \
  --tenant-id "$AZURE_TENANT_ID" \
  --client-secret ""

azd auth login --check-status
read -r -s -p "Client Secret: " AZURE_CLIENT_SECRET
echo
az login \
  --service-principal \
  --username "$AZURE_CLIENT_ID" \
  --password "$AZURE_CLIENT_SECRET" \
  --tenant "$AZURE_TENANT_ID" \
  --output none
unset AZURE_CLIENT_SECRET
03建立本地 .env 並驗證
cd code
cp agents/.env.example agents/.env
chmod 600 agents/.env

填入模型 endpoint、deployment 名稱、API version 與 Key;確認檔案被 Git 忽略。

cd ..
git check-ignore code/agents/.env
cd code/agents
python test_workflow.py --live \
  "What is the total budget by program status? Draw a bar chart."
完成標準:登入狀態正確、`.env` 未被 Git 追蹤、即時流程能產生答案與圖表。
LAB 01 · UNDERSTAND

讓系統讀得懂業務

用 ontology 宣告 FundingPool、Project、Task 與它們的關係;語意放在本體,物理鍵放在 data binding。

25 分鐘Fabric IQOntology動手:新增 Team
01確認 Python 環境
python -c "import mcp, matplotlib; print('ready')"

若失敗,建立並啟用虛擬環境,再安裝兩份鎖版 requirements。

python3 -m venv .venv
source .venv/bin/activate
pip install -r code/mcp/requirements.txt \
  -r code/agents/requirements.txt
02閱讀本體與資料綁定

在 `code/dataIQ/ontology/frontier.rdf` 找到 3 個 `owl:Class`、識別欄位與 `funds` / `has_task` 關係;再到 `data-bindings.json` 查看關係如何映射外鍵。

FundingPoolfunds 1:N →Projecthas_task 1:N →Task
03執行本體 self-test
cd code
python mcp/server.py --selftest

確認 3 個實體、2 個關係,且 active / done 預算聚合結果正確。

04動手:新增 Team 實體與 owns 關係
  1. 新增 `code/dataIQ/data/team.json`,放入 Pretraining 與 Inference 團隊。
  2. 替每個 Project 增加 `teamId` 外鍵。
  3. 在 `ontology.json` 增加 Team entity type 與 `Team → Project` 的 `owns` 關係。
  4. 在 `data-bindings.json` 加入 Team 資料源與 relationship binding。
python mcp/server.py --selftest
python -c "
import sys; sys.path.insert(0,'mcp')
import server as s, json
print(json.dumps(
  s.get_related('Team','TEAM-01','owns'),
  ensure_ascii=False, indent=2
))
"
完成標準:只修改宣告式資料與綁定,不新增查詢程式碼,也能查到 Team 的專案。
LAB 02 · CONNECT

把本體變成可調用的工具

MCP 把本體查詢轉為模型可發現、可調用的標準工具。後端未來換成 Fabric IQ,智能體側不必改寫。

30 分鐘MCPGitHub Copilot動手:top_n
01直接調用既有 MCP 工具
cd code
python -c "
import sys; sys.path.insert(0,'mcp')
import server as s, json
print(json.dumps(
  s.aggregate('Project','budget','sum','status'),
  indent=2
))
print(json.dumps(
  s.get_related('Project','PRJ-002','funds'),
  indent=2
))
"

觀察 `get_related` 可以反向遍歷;數字聚合由伺服器完成,不交給模型算。

02把 stdio MCP 註冊到客戶端

VS Code 使用 `.vscode/mcp.json` 的 `servers`;Claude Code 使用根目錄 `.mcp.json` 的 `mcpServers`,並建議指向虛擬環境 Python 的絕對路徑。

echo "$PWD/.venv/bin/python"
echo "$PWD/code/mcp/server.py"

claude mcp add frontier-ontology -s project -- \
  "$PWD/.venv/bin/python" \
  "$PWD/code/mcp/server.py"

claude mcp list
03用 Copilot 新增 top_n 工具

要求 Copilot 參照 `aggregate` 風格新增 `top_n(entity_type, value_field, n=3, descending=True)`,並人工檢查三個邊界:

  • 用 `STORE.resolve_entity()` 處理大小寫與未知實體。
  • 錯誤回傳結構化 `{"error": ...}`,而不是讓服務崩潰。
  • 排序前過濾非數字欄位。
python -c "
import sys; sys.path.insert(0,'mcp')
import server as s, json
print(json.dumps(s.top_n('Project','budget',2), indent=2))
print(s.top_n('Nope','budget'))
"
完成標準:最高預算專案排序正確,未知實體回傳 error,重啟 MCP 後客戶端能看到新工具。
LAB 03 · REASON

兩個智能體分工協作

AssistantAgent 負責 grounded 查詢,DataAnalystAgent 負責把結構化數字轉成圖表;交接契約決定流程穩定性。

35 分鐘Agent FrameworkFoundryMonty CodeAct
01閱讀順序工作流與身份設定

查看 `workflow.py` 的 `SequentialBuilder` 與 MCP 生命週期,再看 `config.py` 如何以同一個 `DefaultAzureCredential` 同時支援本地登入與雲端工作負載身份。

02先離線自檢,再跑端到端
cd code/agents
python test_workflow.py

python test_workflow.py --live \
  "What is the total budget by program status? Draw a bar chart."

確認答案包含 active=25500000、done=2400000,且 `ontology_charts/` 產生 PNG。

03挑戰跨兩跳聚合
python test_workflow.py --live \
  "What is the total committed engineering effort per funding pool? Draw a bar chart."

預期 FP-001 = 1560 小時、FP-002 = 240 小時。觀察助理如何多次調用工具完成跨域遍歷。

04動手:破壞並修復交接契約
  1. 暫時刪除 Assistant 指示中要求輸出 `label=value` 的規則。
  2. 同一問題執行多次,觀察分析師間歇性畫錯或無法畫圖。
  3. 恢復契約,再替 Analyst 增加「總體組成優先 pie」的偏好。
完成標準:能說明智能體之間傳遞的是對話內容,而明確的結構化交接規則讓流程穩定。
LAB 04 · BUILD

做成 Copilot 應用

把工作流包成 FastAPI 與聊天頁面,讓非技術使用者可以提問、看圖,並把結論寄給干係人。

20 分鐘FastAPIHTML/CSS/JSACS Email
01啟動應用
cd code/agents
uvicorn api:app --port 8000

開啟 `http://127.0.0.1:8000/`,API 與靜態網站由同一個程序提供。

02依序測試四階問題
  1. 哪些專案正在推進?
  2. 哪個資金池在支撐哪些專案?
  3. 按專案狀態統計預算並畫柱狀圖。
  4. 每個資金池名下的總投入工時?

第 4 題會多次調用工具,速度較慢;答案必須與 self-test 的數字一致。

03查看 transcript 與寄送結果
curl -s -X POST http://127.0.0.1:8000/ask \
  -H "Content-Type: application/json" \
  -d '{"question":"Which programs does the compute capital pool fund?"}' \
  | python -m json.tool

比較 AssistantAgent 與 DataAnalystAgent 的 transcript。若 ACS 已設定,可在回答下方填入地址寄送文字與圖表。

完成標準:頁面可問答、顯示圖表;未設定 ACS 時清楚回傳 503,而不是假裝寄送成功。
LAB 05-1 · RUN

資源受限版:只部署 Web 應用

不建立 AKS、ACR、身份或模型服務,只把自己的 Web 前端部署到 Azure Container Apps,並重用講師維護的共享 Agent API 與 MCP。

15 分鐘Container Apps共享服務0–1 副本
01建立個人 Web 設定
cd code/cloud
cp workshop-web.env.example workshop-web.env

編輯 `WEB_APP_NAME`,只能使用小寫字母、數字與連字號,長度 3–32,且不可與同學重複。

export WEB_APP_NAME=iq-web-your-alias
source workshop-web.env
02部署 Web Container App
bash scripts/deploy-web-only.sh

腳本會檢查共享 ACA、ACR、Agent API 與遠端 MCP,使用既有托管身份拉取映像,建立或原地更新個人 App,並限制為 0–1 副本、0.25 CPU / 0.5 GiB。

03瀏覽器與設定驗證
  1. 用腳本輸出的 HTTPS URL 開啟網站。
  2. 詢問 compute capital pool 支援哪些專案。
  3. 詢問依狀態統計預算並要求圖表。
az containerapp show \
  -g "$RG" \
  -n "$WEB_APP_NAME" \
  --query '{
    image:properties.template.containers[0].image,
    backend:properties.template.containers[0].env[?name==`AGENTS_BACKEND_URL`].value | [0],
    minReplicas:properties.template.scale.minReplicas,
    maxReplicas:properties.template.scale.maxReplicas
  }' -o json
完成標準:文字與圖表都來自共享後端,瀏覽器網址始終是自己的 Container App,副本限制為 0–1。
04課後只清理自己的 App
az containerapp delete \
  -g "$RG" \
  -n "$WEB_APP_NAME" \
  --yes

刪除前確認名稱是自己的 App;不可刪除講師的共享環境、Agent API、MCP 或其他學員資源。

03 · TAKEAWAYS

帶走的不只是 Demo。
是一套可重用的方法。

回到自己的業務域後,你可以用同一條路徑處理客戶與訂單、設備與工單,或任何需要跨系統理解關係的場景。

01MODEL

畫出核心實體

定義 3–5 個關鍵業務概念與它們的關係。

02CONNECT

綁定資料來源

把語意模型映射到實際資料,不把 join 寫死。

03EXPOSE

用 MCP 暴露能力

讓任意智能體或 Copilot 都能調用相同工具。

04OPERATE

可信地上雲

服務端聚合、明確錯誤與可縮放的公開入口。