iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
AI Engineering

地端 AI 建築學系列 第 23 篇

23 LangChain DeepAgent (2) 核心模組(上)

  • 分享至 

  • xImage
  •  

上一篇我們認識了 DeepAgent 的基本骨架:一個內建檔案系統、子代理(subagent)機制與任務規劃能力的「開箱即用」深度代理框架。但骨架終究只是骨架,要讓 Agent 真正能在地端環境裡完成有意義的工作,還需要五個關鍵拼圖:

  1. Tools — 讓 Agent 能對外採取行動的手
  2. Backends — 決定 Agent 工作空間長什麼樣子、資料存在哪裡的地基
  3. Skills — 把「怎麼做」封裝成可重複使用的知識包
  4. Memory — 讓 Agent 能跨對話記得事情的長期記憶
  5. Summarization Middleware — 避免 context window 爆掉的壓縮機制

本篇先整理前兩塊 — Tools 與 Backends,全部搭配 Ollama 地端模型 ornith-1.5:9b 示範,讓大家看到即使不依賴雲端 API,也能組出 Agent 的行動力與工作空間。剩下的 Skills、Memory、Summarization 留到下一篇再分享。


Tools:賦予 Agent 操作能力

DeepAgent 的工具系統分成三層:自訂工具、內建 harness 工具、MCP 工具。三者可以同時存在,透過 create_deep_agent 的 tools= 參數統一掛載。

自訂工具(Custom Tools)

任何 Python callable — 不論是純函式、@tool 裝飾過的 LangChain 工具,還是 tool dict,都可以直接丟進 tools=。DeepAgent 會從函式簽名與 docstring 自動推斷 schema,多數情況下不需要額外定義。

from typing import Literal
from deepagents import create_deep_agent

def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
):
    """執行網路搜尋"""
    # 這裡串接你自己的搜尋 API(Tavily、SearXNG 皆可)
    ...

agent = create_deep_agent(
    model="ollama:ornith-1.5:9b",
    tools=[internet_search],
)

內建 harness 工具

每個 DeepAgent 出廠就自帶一組檔案操作與委派任務的工具,這些工具不需要另外註冊:

工具 說明
ls 列出目錄檔案
read_file 讀取檔案內容(支援分頁與多模態)
write_file 建立或覆寫檔案
edit_file 對檔案做精確字串替換
delete 刪除檔案或遞迴刪除目錄(需 deepagents>=0.7)
glob 依 glob pattern 尋找檔案
grep 搜尋檔案內容
execute 執行 shell 指令(僅限 sandbox backend)
task 派任務給子代理

若想再加上任務規劃能力,可以選用 TodoListMiddleware 讓 Agent 具備 write_todos 工具。

MCP 工具:接上任何外部服務

DeepAgent 對 Model Context Protocol(MCP)有原生支援,這代表你可以把 Agent 接到資料庫、瀏覽器、內部系統等任意 MCP Server,而不用為每個服務手刻整合程式碼。

先安裝擴充套件:

pip install "langchain[mcp]"

接著透過 MCPAdapter 把 MCP Server 暴露的工具全部載入:

import asyncio
from deepagents import create_deep_agent
from langchain.mcp import MCPAdapter

async def main():
    config = {"mcpServers": {"my_server": {"url": "http://localhost:8000/mcp"}}}
    async with MCPAdapter(config) as adapter:
        tools = await adapter.list_tools()
        agent = create_deep_agent(
            model="ollama:ornith-1.5:9b",
            tools=tools,
        )
        await agent.ainvoke(
            {"messages": [{"role": "user", "content": "幫我用 MCP server 查一下資料"}]},
            config={"configurable": {"thread_id": "1"}},
        )

asyncio.run(main())

小結:Tools 決定 Agent「能做什麼」。地端場景下,把內部服務(Ollama 本地模型管理、地端資料庫、內部 API)包成 MCP Server 或自訂工具,就能讓 Agent 安全地在你的私有網路裡行動。


Backends:Agent 工作空間的隔離層

如果說 Tools 是 Agent 的手,Backend 就是 Agent 站立的地板。DeepAgent 的檔案類工具(ls、read_file、write_file、edit_file、delete、glob、grep)全部透過一個可替換的 Backend 介面運作——這正是「工作空間隔離」的核心機制。

常見的內建 Backend

Backend 特性 適用場景
StateBackend(預設) 存在 LangGraph state 裡,thread 內持久,跨 thread 不共享 Agent 的暫存草稿區
FilesystemBackend 直接讀寫地端真實磁碟 本機開發 CLI、CI/CD
StoreBackend 存在 LangGraph store,可跨 thread 持久化 長期記憶、跨對話設定
ContextHubBackend 存在 LangSmith Context Hub repo Skill/Agent 版本控管
Sandbox(如 LangSmith Sandbox) 隔離容器內執行,含 execute 工具 需要跑程式碼的任務
LocalShellBackend 直接在主機執行 shell,無隔離 僅限受信任的本機開發環境
CompositeBackend 依路徑前綴路由到不同 Backend 混合短期/長期儲存的最靈活方案

用 CompositeBackend 打造隔離工作空間

實務上最常見的做法是用 CompositeBackend 當路由器:一般暫存資料留在 StateBackend(用完即丟),但 /workspace/ 底下的專案檔案落地到真實磁碟,/memories/ 則寫進可跨對話存取的 StoreBackend。

from deepagents import create_deep_agent
from deepagents.backends import CompositeBackend, StateBackend, FilesystemBackend

agent = create_deep_agent(
    model="ollama:ornith-1.5:9b",
    backend=CompositeBackend(
        default=StateBackend(),
        routes={
            "/workspace/": FilesystemBackend(root_dir="/data/project", virtual_mode=True),
        },
    ),
)

這樣設計的好處是:Agent 產生的中間結果(offload 的大型工具輸出、對話紀錄)不會混進你的專案資料夾,/workspace/ 以外的一切都停留在 ephemeral state。

安全警告:地端部署一定要留意

官方文件對 FilesystemBackend 與 LocalShellBackend 給了明確警告:

  • Agent 可以讀取任何可存取路徑下的檔案,包含 .env、API 金鑰等機密
  • 檔案修改是不可逆的
  • LocalShellBackend 開放 execute 工具後,等於讓 Agent 對主機有近乎完整的 shell 權限

在地端建置生產級 Agent 時,建議:

  1. 一律搭配 virtual_mode=True,把路徑存取限制在 root_dir 內
  2. 對敏感操作啟用 Human-in-the-Loop(HITL)中介層做人工核准
  3. 需要執行程式碼的任務改用 sandbox backend,而非直接開放主機 shell

用 Permissions 收斂寫入權限

Backend 之上還有一層 Permissions,能宣告式地限制哪些路徑只能讀不能寫:

from deepagents import create_deep_agent, FilesystemPermission

agent = create_deep_agent(
    model="ollama:ornith-1.5:9b",
    backend=CompositeBackend(
        default=StateBackend(),
        routes={"/policies/": StoreBackend(namespace=lambda rt: (rt.context.org_id,))},
    ),
    permissions=[
        FilesystemPermission(operations=["write"], paths=["/policies/**"], mode="deny"),
    ],
)

小結:Backend 決定 Agent「資料存在哪裡、誰能看到、誰能改」。地端部署尤其要把「暫存」與「落地磁碟」分開設計,避免內部資料外洩或被覆寫。


銜接下一篇

有了 Tools(能做什麼)與 Backends(資料放哪、誰能碰),Agent 已經具備行動力與安全的工作空間。但這樣的 Agent 還不知道「複雜任務該怎麼做」,也記不住「跨對話該記得什麼」,更撐不住「又長又貴的對話」。下一篇會接著分享 Skills、Memory、Summarization Middleware,把這套地端 Agent 架構補完整。


上一篇
22 LangChain DeepAgent (1) 你也能做出龍蝦跟 Hermes Agent
下一篇
24 LangChain DeepAgent (3) 核心模組(下)
系列文
地端 AI 建築學 共 28 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言