資料都在。缺的是關係。
一家高速擴張的 AI frontier company,交付側已經大量使用 AI,運營側卻仍靠人工拉表。預算、專案與工作流各自在不同系統,關係只存在於人的腦中。
資源稀缺
算力與預算是最緊的約束,經營會必須隨時回答錢花在哪、還剩多少。
關係分散
FundingPool、Project、Task 分別存在,卻沒有系統描述它們如何互相連接。
決策要快
跨兩跳再聚合的問題,不能等分析師隔天交付,也不能讓模型自行猜數字。
- 01哪些專案正在推進?單一實體過濾
- 02PRJ-001 還有哪些工作未完成?一跳關係遍歷
- 03哪個資金池支撐哪些專案、總預算多少?關係遍歷 + 聚合
- 04每個資金池名下的總投入工時?跨域兩跳 + 聚合
Understand → Reason
→ Build → Run
本體讓系統讀懂業務,MCP 把能力標準化,Agent Framework 組織推理,Container Apps 提供人人可用的入口。
登入 Azure 與配置模型憑據
後續實驗同時使用 Azure Developer CLI 與 Azure 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."
讓系統讀得懂業務
用 ontology 宣告 FundingPool、Project、Task 與它們的關係;語意放在本體,物理鍵放在 data binding。
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` 查看關係如何映射外鍵。
03執行本體 self-test
cd code
python mcp/server.py --selftest
確認 3 個實體、2 個關係,且 active / done 預算聚合結果正確。
04動手:新增 Team 實體與 owns 關係
- 新增 `code/dataIQ/data/team.json`,放入 Pretraining 與 Inference 團隊。
- 替每個 Project 增加 `teamId` 外鍵。
- 在 `ontology.json` 增加 Team entity type 與 `Team → Project` 的 `owns` 關係。
- 在 `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
))
"
把本體變成可調用的工具
MCP 把本體查詢轉為模型可發現、可調用的標準工具。後端未來換成 Fabric IQ,智能體側不必改寫。
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'))
"
兩個智能體分工協作
AssistantAgent 負責 grounded 查詢,DataAnalystAgent 負責把結構化數字轉成圖表;交接契約決定流程穩定性。
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動手:破壞並修復交接契約
- 暫時刪除 Assistant 指示中要求輸出 `label=value` 的規則。
- 同一問題執行多次,觀察分析師間歇性畫錯或無法畫圖。
- 恢復契約,再替 Analyst 增加「總體組成優先 pie」的偏好。
做成 Copilot 應用
把工作流包成 FastAPI 與聊天頁面,讓非技術使用者可以提問、看圖,並把結論寄給干係人。
01啟動應用
cd code/agents
uvicorn api:app --port 8000
開啟 `http://127.0.0.1:8000/`,API 與靜態網站由同一個程序提供。
02依序測試四階問題
- 哪些專案正在推進?
- 哪個資金池在支撐哪些專案?
- 按專案狀態統計預算並畫柱狀圖。
- 每個資金池名下的總投入工時?
第 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 已設定,可在回答下方填入地址寄送文字與圖表。
資源受限版:只部署 Web 應用
不建立 AKS、ACR、身份或模型服務,只把自己的 Web 前端部署到 Azure Container Apps,並重用講師維護的共享 Agent API 與 MCP。
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瀏覽器與設定驗證
- 用腳本輸出的 HTTPS URL 開啟網站。
- 詢問 compute capital pool 支援哪些專案。
- 詢問依狀態統計預算並要求圖表。
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
04課後只清理自己的 App
az containerapp delete \
-g "$RG" \
-n "$WEB_APP_NAME" \
--yes
刪除前確認名稱是自己的 App;不可刪除講師的共享環境、Agent API、MCP 或其他學員資源。
帶走的不只是 Demo。
是一套可重用的方法。
回到自己的業務域後,你可以用同一條路徑處理客戶與訂單、設備與工單,或任何需要跨系統理解關係的場景。
畫出核心實體
定義 3–5 個關鍵業務概念與它們的關係。
綁定資料來源
把語意模型映射到實際資料,不把 join 寫死。
用 MCP 暴露能力
讓任意智能體或 Copilot 都能調用相同工具。
可信地上雲
服務端聚合、明確錯誤與可縮放的公開入口。