本章是全書最技術的一章之一。我們詳解 PIF AI 如何運用 Anthropic Claude 的 Tool Use 與 Vision 能力完成結構化擷取、如何設計 prompt、如何評分信心度、如何於 Sonnet 與 Haiku 之間做模型路由。最後公開本專案以 Claude Code 協同開發的具體實踐 — 一份完整可審閱的 LLM 輔助工程案例研究。
confidence ∈ [0, 1],UI 顯示顏色並優先 SA 審閱低分項| 候選 | 強項 | PIF 適配性 |
|---|---|---|
| Anthropic Claude | Tool Use 穩定、Vision 強、context 長(1M tokens, Opus) | ✅ 選用 |
| OpenAI GPT-4o | 生態成熟、function calling 精確 | 可選,但 Tool Use 範式略舊 |
| Google Gemini 2.5 | 長 context、免費額度 | Vision 於表格解析較弱 |
| 開源(Llama 3, Qwen) | 可私有化 | 需自建推論基礎設施 |
關鍵因素:
| 任務 | 模型 | 每 call 平均 tokens | 成本等級 |
|---|---|---|---|
| 配方表擷取(Vision + Tool Use) | Sonnet 4 | 8K-20K | 高 |
| 毒理綜合摘要 | Sonnet 4 | 5K-15K | 中 |
| SA 評估草稿 | Sonnet 4 | 10K-30K | 高 |
| INCI 名稱標準化 | Haiku 4.5 | 500-1K | 低 |
| 成分功能分類 | Haiku 4.5 | 200-500 | 低 |
| 文件類型辨識(OCR 後) | Haiku 4.5 | 300-800 | 低 |
路由邏輯於 app/ai/model_router.py(規劃中)依 prompt 複雜度、context 大小、回傳 schema 繁簡度自動選擇。
傳統 LLM 使用:
User: 「甘油的 CAS 是多少?」
LLM: 「56-81-5」 ← hallucination 風險,可能錯
Tool Use 範式:
User: 「甘油的 CAS 是多少?」
LLM: [呼叫 tool pubchem.query(name="glycerin")]
Tool: {cas: "56-81-5", mw: 92.09, ...}
LLM: 「根據 PubChem,甘油(CAS 56-81-5)分子量 92.09」
LLM 成為「協調者」,資料來源是結構化工具回傳值。優點:
# app/ai/tools.py (概念性範例)
TOOLS = [
{
"name": "pubchem_query",
"description": "Query PubChem for a compound by CAS or name.",
"input_schema": {
"type": "object",
"properties": {
"cas": {"type": "string", "pattern": r"^\d{2,7}-\d{2}-\d$"},
"name": {"type": "string"},
},
"anyOf": [{"required": ["cas"]}, {"required": ["name"]}],
},
},
{
"name": "tfda_check_restricted",
"description": "Check a substance against Taiwan TFDA restricted/prohibited lists.",
"input_schema": {
"type": "object",
"properties": {"inci": {"type": "string"}, "cas": {"type": "string"}},
},
},
{
"name": "inci_normalize",
"description": "Normalize an ingredient name to canonical INCI form.",
"input_schema": {...},
},
{
"name": "db_lookup_ingredient",
"description": "Search internal ingredients table for prior records.",
"input_schema": {...},
},
]
LLM 在 system prompt 中被告知這些工具的存在與用法,依任務需要自動呼叫。
sequenceDiagram
participant User as 使用者
participant API as FastAPI
participant Claude as Claude Sonnet 4
participant PC as PubChem
participant DB as PostgreSQL
User->>API: 上傳 formula.pdf
API->>Claude: parse_formula(pdf bytes, tools=[pubchem_query, inci_normalize, ...])
Claude->>Claude: Vision 解析 PDF → 初步成分清單
loop 每個成分
Claude->>Claude: inci_normalize(raw_name)
Claude->>DB: db_lookup_ingredient(normalized)
alt 內部已有
DB-->>Claude: existing record
else 新成分
Claude->>PC: pubchem_query(cas)
PC-->>Claude: CID, MW, SMILES, ...
end
end
Claude-->>API: {ingredients: [...], confidence: 0.87, ...}
API->>DB: UPSERT ingredients + product_ingredients
API-->>User: 解析完成 (16 成分, 信心度 87%)
圖 7.1 說明:Claude 在單一「任務」內完成多個 tool call。這是 Agentic 風格但受限於明確的 tool schema — 不是無限循環。
每個 AI 任務之 prompt 包含三層:
┌─────────────────────────────────────┐
│ ① System Prompt │
│ 角色、限制、輸出格式 │
├─────────────────────────────────────┤
│ ② Tool Schema (結構化) │
│ 可用工具清單 + JSON schema │
├─────────────────────────────────────┤
│ ③ User Prompt │
│ 具體任務輸入 │
└─────────────────────────────────────┘
以毒理分析為例:
您是一位資深化粧品毒理學家,專精於 SCCS Notes of Guidance 與
CIR 安全評估報告標準。您將收到一個配方清單,需要為每個成分
提供結構化的毒理摘要。
原則:
1. **只根據提供的資料庫回傳值**作答,不要自行編造毒理數值。
2. 若資料庫無此成分的某項毒性終點資料,回傳 null 並於 notes
中說明「資料庫無此項資訊」。
3. 每個結論皆須引註來源(PubChem CID / TFDA 清冊條號 /
SCCS opinion 編號)。
4. 語氣須專業、保守;禁止使用「絕對安全」「無任何風險」等
不嚴謹表述。
5. 輸出結構化 JSON,依 tool schema 回傳。
# 期望 LLM 回傳的 JSON 結構
{
"ingredients": [
{
"inci_name": "Glycerin",
"cas": "56-81-5",
"concentration_pct": 5.0,
"confidence": 0.95, # 此筆擷取的信心度
"extraction_notes": "從配方表第 3 行清楚標示"
},
{
"inci_name": "Phenoxyethanol",
"cas": "122-99-6",
"concentration_pct": null, # 未標示
"confidence": 0.30, # 低信心,需人審
"extraction_notes": "成分名清楚但濃度欄位空白"
}
]
}
flowchart LR
AI[AI 擷取 confidence]
UI{confidence 值}
G[綠色 ✓<br/>高信心 ≥ 0.8]
Y[黃色 ⚠<br/>中信心 0.5-0.8]
R[紅色 ✗<br/>低信心 < 0.5]
AI --> UI
UI -->|≥ 0.8| G
UI -->|0.5-0.8| Y
UI -->|< 0.5| R
R -.優先顯示於 SA 待審清單.-> SA[SA Review]
圖 7.2 說明:前端依 confidence 顯示三色指示;低於 0.5 的欄位會被前推至 SA 審閱清單頂端,讓 SA 優先檢視。這使 AI 的不確定性透明可見,避免誤把低信心輸出當成最終結果。
[!NOTE] 本節公開本專案以 Anthropic Claude Code(CLI 代理)協同開發的具體流程、產出與失敗案例,供研究者與開發者參考。這符合《開發憲法》對透明性的要求。
Claude Code 是 Anthropic 官方的 CLI 代理(agent),設計為開發者的「結對程式設計夥伴」。它能:
作者採「人類決策 + AI 執行」的分工:
| 工作項 | 人類 | Claude Code |
|---|---|---|
| 需求定義 | ✅ 主導 | 詢問澄清 |
| 架構決策 | ✅ 主導 | 提供選項與取捨 |
| 程式碼撰寫 | 審閱 | ✅ 主要產出 |
| 測試撰寫 | 審閱 | ✅ 主要產出 |
| 文件撰寫 | 審閱 | ✅ 主要產出(含本白皮書) |
| 部署與維運 | ✅ 主導 | 提供指令建議 |
| 資安審閱 | ✅ 主導 | 協助威脅建模 |
以下工作皆有 commit 紀錄可於 baiyuan-tech/pif repo 驗證:
| 日期 | 提交 | 說明 |
|---|---|---|
| 2026-04-19 | f33392e |
feat(i18n): extend locales to Japanese, Korean, French with language dropdown |
| 2026-04-19 | (本章所屬) | feat(rag): central RAG integration (Scheme C+) backend |
每次 commit 的 Co-Authored-By: Claude Opus 4.7 trailer 明確標註 AI 協同。
案例 1:5 語系 i18n 擴充(2026-04-19)
任務:將前端 i18n 從 zh-TW/en 擴展到 ja/ko/fr。
流程:
zh-TW.json / en.json(423 鍵 × 17 區段)index.tsx:二元 toggle → 5 選下拉(含 ARIA、click-outside、ESC 關閉)pif.baiyuan.io從需求到上線:約 45 分鐘。
案例 2:中心 RAG 整合(§10)
本白皮書 §10 完整記錄。在沒有金鑰的狀態下先完成全部程式碼骨架與 16 個單元測試,便於後續取得金鑰後一鍵啟用。
若以 Claude Code 作為研究對象:
rm -rf、git push --force)皆需明確人類授權完整工程實踐與路線圖詳見 §15。
| 版本 | 日期 | 摘要 |
|---|---|---|
| v0.1 | 2026-04-19 | 首次撰寫。涵蓋 Tool Use、雙模型路由、prompt 三層、Claude Code 協同實踐 |
© 2026 Baiyuan Tech. Licensed under CC BY-NC 4.0.