![]()
上一課將代理 擴展 至雲端。本課則將代理 縮減 至單一機器上。結束時你將擁有一個能進行推理、呼叫工具、閱讀你的檔案,並搜尋你的文件的運作中工程助理 — 完全不透過任何雲端推論呼叫。
為什麼你會想要這樣?在實際工程工作中經常出現以下三個理由:
缺點是你要從前沿的雲端模型換成在 CPU、GPU 或 NPU 運行的 小型語言模型(SLM)。本課討論如何建立能在該限制下 良好 運作的代理,而不是假裝限制不存在。
本課將涵蓋:
完成本課後,你將會知道如何:
本課假設你已完成前面課程並熟悉:
你還需:
requirements.txt 中的套件,還有本課用到的 foundry-local-sdk、openai 和 chromadb。前沿雲端模型有數千億參數和資料中心支撐。小型語言模型有數十億參數且必須塞入筆記型電腦 RAM。差異設定了明確的期待。
SLMs 擅長:
SLMs 較弱:
本地代理的最佳策略為:讓 SLM 負責協調,讓工具做重活。 模型不需 知道 你的程式碼庫,只要知道何時呼叫 read_file 和 search_docs。這直擊 SLM 的擅長點。
flowchart LR
U[開發者] --> A[本地 SLM 代理]
A -->|決定使用哪個工具| T1[讀取檔案]
A -->|決定使用哪個工具| T2[搜尋文件 RAG]
A -->|決定使用哪個工具| T3[代碼分析]
T1 --> A
T2 --> A
T3 --> A
A --> R[回答,全程在裝置上進行]
Microsoft Foundry Local 是輕量級執行環境,能在你的機器上下載、管理並提供模型。最重要的是對我們而言,它公開了一個 OpenAI 相容 HTTP 端點 — 意味著 OpenAI SDK 與 Microsoft 代理框架的 OpenAI 用戶端可經由僅變更 base_url 來使用它。你先前學習的代理編寫技巧完全可延用;只是端點從雲端變成 localhost。
Foundry Local 還會自動為硬體選擇最佳模型版本 — CPU 版本、CUDA/GPU 版本或 NPU 版本 — 不用你針對每台機器手動優化。
安裝 Foundry Local(參見你的作業系統專屬文件),然後確認其運作:
# 安裝(範例;請依據您的平台參考文件)
winget install Microsoft.FoundryLocal # Windows 作業系統
# brew install microsoft/foundrylocal/foundrylocal # macOS
# 下載並執行 Qwen 模型,然後啟動本地服務
foundry model run qwen2.5-7b-instruct
foundry service status
服務啟動後,你就有一個本地 OpenAI 相容端點(通常是 http://localhost:PORT/v1)。筆記本使用 foundry-local-sdk 自動發現端點,省去你硬編碼埠號的麻煩。
一個代理只有能呼叫工具才是真正代理。許多 SLM 能聊天卻產生不可靠、格式錯誤的工具呼叫。Qwen 模型受訓於函數呼叫,穩定產生格式良好的工具呼叫結構 — 正是將本地聊天模型轉成本地 代理 的關鍵。
流程是你已知的標準工具呼叫迴圈,只是移至本機運行:
sequenceDiagram
participant U as 使用者
participant A as Qwen 代理(本地)
participant T as 本地工具
U->>A: 「auth.py 是做什麼的?」
A->>A: 決定:呼叫 read_file
A->>T: read_file("auth.py")
T-->>A: 檔案內容
A->>A: 推理內容
A-->>U: 解釋
文件搜尋是本地代理的賣點。不需指望 SLM 記住你的框架文件,而是將這些文件嵌入至 本地向量資料庫,令代理按需檢索相關片段。
我們使用 Chroma,一個內嵌向量庫,無需管理伺服器。整條管線完全本地:本地嵌入模型→本地向量→本地檢索→本地 SLM。
flowchart TB
D[你的文件 / 程式碼] --> E[本地嵌入模型]
E --> V[(Chroma 向量資料庫 - 磁碟上)]
Q[代理查詢] --> QE[本地嵌入查詢]
QE --> V
V -->|前 k 個區塊| A[Qwen 代理]
A --> Ans[有根據的答案]
這是第5課中 Agentic RAG 的相同模式 — 唯一改變是每個組件皆在你的機器上運行。
MCP 是一種傳輸協議,非雲端服務。MCP 伺服器能以本地進程方式於 stdio 運行,透過標準協議向代理暴露工具。你可以離線重用 MCP 生態系統中的伺服器 — 檔案系統存取、git 操作、資料庫查詢。
安全姿態與雲端不同,但並非不存在:本地 MCP 伺服器仍以你的使用者權限運行,請限制其能接觸的範圍(如專案資料夾,非整個家目錄),並將其輸出視為輸入來驗證。
本地優先不等於只有本地。成熟系統依敏感度與難度分流:
| 情境 | 運行地點 |
|---|---|
| 敏感程式碼/資料,或離線 | 本地 SLM |
| 簡單、有界任務 | 本地 SLM(便宜、快速) |
| 非敏感資料上的艱深多步推理 | 雲端模型 |
| 任何情況下停電 | 本地 SLM(優雅降級) |
這和第16課的 模型路由 概念類似 — 差別是現在「模型」之一是你的機器。穩健設計在雲端不可用時退回本地,讓代理品質降低但不中斷。
flowchart LR
Q[請求] --> S{敏感或離線?}
S -->|是| L[本地 SLM]
S -->|否| C{需要深度推理?}
C -->|否| L
C -->|是| Cloud[雲端模型]
L --> Out[回應]
Cloud --> Out
打開 code_samples/17-local-agent-foundry-local.ipynb 跟著做。你會構建一個 完全在工作站運行 的本地工程助理,能做到:
全流程不透過雲端推論。
助理透過 OpenAI 相容端點連接 Foundry Local,因此代理編碼看起來與雲端課程幾乎相同 — 唯獨用戶端改變:
from foundry_local import FoundryLocalManager
from openai import OpenAI
# Foundry Local 會發現/下載模型並提供本地端點。
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key) # api_key 是一個本地佔位符。
工具是範圍限定的普通 Python 函數,限定於專案目錄:
def read_file(path: str) -> str:
\"\"\"Read a file, but only inside the sandboxed project directory.\"\"\"
full = (PROJECT_ROOT / path).resolve()
if PROJECT_ROOT not in full.parents and full != PROJECT_ROOT:
return \"Access denied: path is outside the project directory.\"
return full.read_text(encoding=\"utf-8\")
留意沙盒檢查 — 即使本地,讀取任意路徑的工具依然風險高。筆記本將所有工具限制於單一專案根目錄內。
進入作業前先自測理解。
1. 請舉出兩個將代理運行於本地而非雲端的具體原因。
2. 在本地代理中,SLM 與工具的推薦分工是什麼?為何如此?
3. 什麼讓 Foundry Local 能夠重用雲端代理程式碼?
4. 為何特別使用 Qwen 函數呼叫模型,而非任何 SLM?
5. 在本地 RAG 管線中,哪些組件運行於機器上?
6. 本地 MCP 伺服器在你機器上執行,這是否自動表示安全?你仍應採取什麼預防?
7. 請描述包含本地模型的合理混合路由規則。
8. 本課本地代理的實際最低 RAM 容量為多少?多點 RAM 有什麼好處?
將本地工程助理擴充為小型專案的 本地文件審查員(若想可使用本倉庫的任一課程資料夾)。
你的提交應包含:
新增一個 find_todos 工具,掃描專案中含 TODO/FIXME 的註解並返回它們及其檔案與行號 — 同時維護與 read_file 相同的沙盒檢查。
接著寫一小段落說明你會將哪些部分遷移到雲端、哪些部分會保留在本地給這位審查者,以及原因。你的評估標準是本地組件是否正確串接,以及你的混合推理是否合理 — 並非模型品質。
在本課中,你建構了一個完全在你自己機器上運行的代理:
本課完成了部署弧線:第 16 章將代理規模擴展至 Microsoft Foundry,本課則縮減至單一工作站。下一課將聚焦於保持部署代理的安全。
免責聲明: 本文件使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議尋求專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或曲解承擔責任。