LangGraph + Ertas
使用 LangGraph 建構正式上線等級的代理——這是基於圖的編排框架,具備稽核軌跡、checkpoint 與有狀態工作流程,並完全相容於 Ertas 訓練的本地模型。
Overview
LangGraph 是 LangChain 代理的正式上線等級繼任者,專為在生產環境中執行代理的營運需求而設計:明確的狀態機、可長時保存的 checkpoint、稽核軌跡,以及人類介入的中斷點。LangChain 較舊的代理抽象使用隱式的 ReAct 風格迴圈,而 LangGraph 則要求你將代理定義為由狀態與轉移構成的有向圖——這項前期成本,會在大幅改善的可除錯性、可恢復性以及在生產條件下的可靠性上得到回報。到了 2026 年初,LangGraph 在 GitHub 星標數上已超越 CrewAI,現已成為 Python 生態系中主導性的正式上線代理框架。
基於圖的設 計帶來扁平代理迴圈不易實現的能力:具結構化彙整的並行分支執行、依中間狀態的條件路由、可讓代理跨小時或跨日暫停與恢復的 checkpoint,以及讓你能從任何狀態重播代理執行的 rollback 點。對於需要處理長時運行工作流程、整合人類核可步驟,或從基礎設施故障中恢復的企業部署而言,LangGraph 越來越成為相較於更簡單方案的預設選擇。
How Ertas Integrates
Ertas 訓練的模型透過與 LangChain 相同的 provider 介面與 LangGraph 協同運作——這兩個框架共享其底層的 LLM 抽象。在 Ertas Studio 微調模型並部署至 OpenAI 相容端點(Ollama、vLLM 或 Ertas Cloud)後,你可以設定一個指向該端點的 LangChain ChatOpenAI 或 ChatOllama 實例,再將該 LLM 傳入你的 LangGraph 節點。每個呼叫 LLM 的節點都會使用你的 Ertas 訓練模型,而 LangGraph 的編排功能(checkpoint、分支、人類介入)無論底層 LLM 介面背後是哪個模型都會透明地運作。
對於正式上線部署,LangGraph + Ertas 的組合同時解決兩個問題。LangGraph 處理營運面向:工作流程的耐久性、稽核日誌與可靠性。Ertas 處理品質面向:以特定領域的模型專屬化獲得遠比通用模型更好的任務表現。最終結果是既具良好工程設計(耐久、可除錯、可恢復)又經良好訓練(領域專屬、準確、快速)的代理。對於在受監管產業——醫療、金融、法律——建構代理的團隊而言,這種組合特別具吸引力,因為 LangGraph 的稽核能力與 Ertas 的本地部署一同滿足多數合規需求而不需妥協。
Getting Started
- 1
於 Ertas Studio 微調領域模型
訓練一個擷取你領域專業的模型。針對 LangGraph 工作流程,含明確推理步驟與工具使用軌跡的訓練資料能產生最佳結果。
- 2
部署至 OpenAI 相容端點
匯出為 GGUF 並透過 Ollama、vLLM 或 Ertas Cloud 提供服務。LangGraph 透過 LangChain provider 抽象呼叫任何標準 chat-completion 端點。
- 3
安裝 LangGraph 並設定你的 LLM
安裝 langgraph 與 LangChain provider 套件(langchain-openai 或 langchain-ollama)。建立指向你 Ertas 推論端點的 LLM 實例。
- 4
將你的代理定義為一張圖
將工作流程建模為有向圖:以節點代表每個步驟、以邊代表轉移,並以條件邏輯處理路由。在需要的地方加入 checkpoint 以保存耐久狀態與人類介入的中斷點。
- 5
以 LangGraph Cloud 或自託管方式部署
將你的圖部署至 LangGraph Cloud 取得託管編排,或使用 LangGraph Server 自託管。兩種選項都能與自託管的 Ertas 推論協同運作。
from typing import TypedDict, Literal
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
# Point LangGraph at your Ertas-trained model
llm = ChatOpenAI(
base_url="http://localhost:11434/v1",
model="ertas-claims-adjuster-14b",
api_key="not-needed",
temperature=0.1,
)
class ClaimState(TypedDict):
claim_id: str
claim_data: dict
classification: str
requires_review: bool
decision: str
def classify(state: ClaimState):
response = llm.invoke(f"Classify this claim: {state['claim_data']}")
return {"classification": response.content}
def route(state: ClaimState) -> Literal["auto_approve", "human_review"]:
return "human_review" if state["requires_review"] else "auto_approve"
# Build the graph
graph = StateGraph(ClaimState)
graph.add_node("classify", classify)
graph.add_node("auto_approve", lambda s: {"decision": "approved"})
graph.add_node("human_review", lambda s: {"decision": "pending_review"})
graph.set_entry_point("classify")
graph.add_conditional_edges("classify", route, {
"auto_approve": "auto_approve",
"human_review": "human_review",
})
graph.add_edge("auto_approve", END)
graph.add_edge("human_review", END)
# Compile with persistent checkpointing
app = graph.compile(checkpointer=MemorySaver())
# Run with full audit trail
result = app.invoke(
{"claim_id": "C-12345", "claim_data": {...}},
config={"configurable": {"thread_id": "claim-12345"}},
)Benefits
- 明確的狀態機在可除錯性上遠勝隱式代理迴圈
- 可長時保存的 checkpoint——代理可跨小時、跨日或跨基礎設施故障暫停與恢復
- 每次狀態轉移的稽核軌跡可支援受監管產業的合規需求
- 人類介入的中斷點可自然處理核可工作流程
- 具結構化結果彙整的並行分支執行
- 結合 LangGraph 的編排與 Ertas 的領域專屬化,打造正式上線等級的代理
Related Resources
Fine-Tuning
GGUF
Inference
LoRA
Getting Started with Ertas: Fine-Tune and Deploy Custom AI Models
Fine-Tune AI Models Without Writing Code
Running AI Models Locally: The Complete Guide to Local LLM Inference
Privacy-Conscious AI Development: Fine-Tune in the Cloud, Run on Your Terms
AutoGen
CrewAI
LangChain
Ollama
vLLM
Ertas for Healthcare
Ertas for Customer Support
Ertas for Legal
Ertas for AI Automation Agencies
Ship AI that runs on your users' devices.
Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.