LangGraph 0.4 ฉบับปฏิบัติ: ออกแบบ Multi-Agent Workflow ด้วย Python ปี 2026

คู่มือใช้งาน LangGraph 0.4 สร้าง Multi-Agent Workflow ด้วย Python ปี 2026 ครอบคลุม StateGraph, Supervisor Pattern, Human-in-the-loop ผ่าน interrupt(), Streaming และ deploy ขึ้น LangGraph Cloud พร้อมโค้ดที่ก๊อปไปรันได้ทันที

LangGraph 0.4 Multi-Agent Python (2026)

อัปเดตล่าสุด: 5 มิถุนายน 2026

LangGraph คือเฟรมเวิร์ก Python แบบ Graph-based สำหรับสร้าง Multi-Agent Workflow ที่มี State และคุมการไหลของงานได้แม่นยำ โดยใช้แนวคิด StateGraph ซึ่ง Node แต่ละจุดคือฟังก์ชันที่อ่าน/เขียน State ร่วมกัน ส่วน Edge เป็นเงื่อนไขชี้ว่า Agent ตัวไหนจะทำงานต่อ ในปี 2026 LangGraph เวอร์ชัน 0.4 กลายเป็นมาตรฐานโดยพฤตินัยของ LangChain สำหรับงาน orchestrate Agent หลายตัว เพราะรองรับ checkpointing, streaming token, human-in-the-loop และ deploy ขึ้น LangGraph Cloud ได้ในคำสั่งเดียว บทความนี้ผมจะพาทำตั้งแต่โครงสร้างพื้นฐานไปจนถึง Supervisor Pattern พร้อมโค้ดที่ก๊อปไปรันได้ทันที

  • LangGraph 0.4 (เปิดตัว Q1 2026) ใช้แนวคิด StateGraph ที่ Node เป็นฟังก์ชัน Python และ Edge เป็นเงื่อนไข routing ทำให้ debug ง่ายกว่า AgentExecutor แบบเดิมของ LangChain
  • Supervisor Pattern เป็นรูปแบบ Multi-Agent ที่นิยมที่สุดในปี 2026 มี Agent ตัวกลางคอย route งานไปยัง Worker Agent เฉพาะทาง เช่น Researcher, Coder, Reviewer
  • Checkpointer (PostgresSaver / SqliteSaver) ทำให้ Workflow มี Persistence หยุด resume, time-travel debug และทำ Human-in-the-loop ได้
  • LangGraph Cloud (GA เมษายน 2026) deploy graph เป็น API พร้อม horizontal scaling, persistence และ observability ผ่าน LangSmith
  • Pattern หลักที่ใช้งานจริง ได้แก่ Supervisor, Hierarchical Teams, Plan-and-Execute, Reflection Loop เลือกตามความซับซ้อนของงาน
  • เครื่องมือเสริม คือ interrupt() สำหรับ pause รอ user, Command สำหรับ jump ข้ามโหนด, และ Send สำหรับ map-reduce แบบขนาน

LangGraph คืออะไร และต่างจาก LangChain Agent อย่างไร

LangGraph คือไลบรารี orchestration ที่พัฒนาโดยทีม LangChain เปิดตัวครั้งแรกต้นปี 2024 และมาถึงเวอร์ชัน 0.4 ในต้นปี 2026 หลักการพื้นฐานคือมองทุก Agentic Workflow เป็น กราฟแบบมีทิศทาง (Directed Graph) โดย Node คือหน่วยประมวลผล (ฟังก์ชันธรรมดา หรือ LLM call) และ Edge คือเส้นทางที่กำหนดว่าหลัง Node นี้จะไปต่อที่ไหน อาจเป็นเส้นทางตายตัวหรือ Conditional Edge ที่ตัดสินใจตาม State ปัจจุบัน

ความแตกต่างจาก AgentExecutor แบบเดิมของ LangChain คือ LangGraph ให้คุณคุม flow ทุกขั้นตอนเอง ไม่ใช่ปล่อยให้ LLM ตัดสินใจล้วน ๆ ใน loop เดียวที่มองไม่เห็นว่าเกิดอะไรขึ้นข้างใน นี่คือเหตุผลที่ทีม production จริงในปี 2026 ตั้งแต่ Klarna, Replit จนถึง LinkedIn ย้ายจาก AgentExecutor มา LangGraph เกือบหมด เพราะต้องการ determinism และความสามารถใน debug ตามอ่านได้ที่ LangChain Blog

คุณสมบัติเด่นที่ทำให้ LangGraph เหมาะกับงาน production มีดังนี้:

  • Persistence Layer checkpoint State ทุก step ลง SQLite/Postgres ทำให้ resume งานที่ค้างได้
  • Streaming stream ทั้ง token, step, และ state update ออกมาแบบ real-time
  • Human-in-the-loop pause กราฟตรงไหนก็ได้ รอ user อนุมัติแล้วค่อย resume
  • Time-travel debugging กลับไป step ก่อนหน้าและ branch ออกได้
  • Parallel execution รัน Node หลายตัวพร้อมกันด้วย Send

ติดตั้งและเซ็ตอัปโปรเจกต์ LangGraph 0.4

LangGraph 0.4 ต้องการ Python 3.10 ขึ้นไป และทำงานคู่กับ LLM provider ใดก็ได้ ในตัวอย่างเราจะใช้ Claude Sonnet 4.6 (รุ่นยอดนิยมสำหรับงาน Agent กลางปี 2026) ผ่าน langchain-anthropic เริ่มจากติดตั้งแพ็กเกจกัน

# สร้าง venv และติดตั้ง dependency
python -m venv .venv
source .venv/bin/activate

pip install \
  "langgraph>=0.4.0" \
  "langchain-anthropic>=0.3.0" \
  "langchain-core>=0.3.0" \
  "langgraph-checkpoint-sqlite>=2.0.0" \
  python-dotenv

# ตั้งค่า API key
export ANTHROPIC_API_KEY="sk-ant-..."

โครงสร้างโปรเจกต์ขั้นต่ำที่ผมแนะนำสำหรับปี 2026 หน้าตาประมาณนี้

my-agent/
├── agent/
│   ├── __init__.py
│   ├── state.py        # TypedDict ของ State
│   ├── nodes.py        # ฟังก์ชัน Node แต่ละตัว
│   ├── graph.py        # ประกอบ StateGraph
│   └── tools.py        # Tool ที่ Agent เรียกใช้
├── langgraph.json      # config สำหรับ LangGraph Cloud
├── .env
└── pyproject.toml

StateGraph: หัวใจของ LangGraph

StateGraph คือคลาสหลักที่ใช้ประกอบกราฟ มันต้องการ Type ของ State ที่ทุก Node จะแชร์กัน นิยมประกาศเป็น TypedDict หรือ Pydantic Model ตัวอย่าง State ของ Agent ที่ตอบคำถามพร้อมเครื่องมือค้นหา

from typing import Annotated, TypedDict
from langgraph.graph.message import add_messages
from langchain_core.messages import BaseMessage

class AgentState(TypedDict):
    # add_messages คือ reducer: append message ใหม่ลงรายการเดิม
    messages: Annotated[list[BaseMessage], add_messages]
    iterations: int   # นับว่าวนลูปกี่รอบแล้ว
    final_answer: str | None

คำสำคัญคือ Annotated[..., add_messages] ซึ่งเป็น "reducer" บอก LangGraph ว่าถ้า Node ส่ง messages กลับมา ให้ append เข้าไป ไม่ใช่ overwrite ทับ ฟิลด์อื่นที่ไม่มี reducer จะถูกเขียนทับเสมอ นี่คือจุดที่ผมและหลายคนพลาดในครั้งแรก (ผมเคย debug อยู่หลายชั่วโมงเพราะลืม annotate field เดียว)

ต่อมาประกอบ Graph อย่างง่าย โดยมี Node สองตัว call_model เรียก Claude และ should_continue เป็นเงื่อนไขว่าจะหยุดหรือวนต่อ

from langgraph.graph import StateGraph, START, END
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage, AIMessage

model = ChatAnthropic(model="claude-sonnet-4-6", temperature=0)

def call_model(state: AgentState) -> dict:
    response = model.invoke(state["messages"])
    return {
        "messages": [response],
        "iterations": state["iterations"] + 1,
    }

def should_continue(state: AgentState) -> str:
    if state["iterations"] >= 3:
        return END
    last = state["messages"][-1]
    if isinstance(last, AIMessage) and "DONE" in last.content:
        return END
    return "call_model"

builder = StateGraph(AgentState)
builder.add_node("call_model", call_model)
builder.add_edge(START, "call_model")
builder.add_conditional_edges("call_model", should_continue)

graph = builder.compile()

# ทดลองรัน
result = graph.invoke({
    "messages": [HumanMessage(content="อธิบาย Transformer แบบสั้น แล้วลงท้ายด้วย DONE")],
    "iterations": 0,
    "final_answer": None,
})
print(result["messages"][-1].content)

สังเกตว่า add_conditional_edges รับฟังก์ชันที่ return ชื่อ Node ถัดไป ทำให้คุณเขียน routing logic ได้อิสระแบบ Python ปกติ ดู API เต็ม ๆ ได้ที่ LangGraph Documentation ของทางการ ซึ่งอัปเดตค่อนข้างถี่

Supervisor Pattern: สร้าง Multi-Agent Workflow ตัวจริง

เมื่องานซับซ้อนขึ้น Agent ตัวเดียวที่ต้องทำทุกอย่างมักจะ hallucinate และ context พังเร็ว คำตอบคือแบ่งงานเป็น Worker Agent เฉพาะทาง โดยมี Supervisor Agent ตัวกลางคอย route งาน รูปแบบนี้คือสิ่งที่ทีม Anthropic ใช้สร้าง Multi-Agent Research System ที่เผยแพร่กลางปี 2024 และยังเป็นมาตรฐานในปี 2026

ตัวอย่างต่อไปนี้สร้าง 3 Agent ได้แก่ Researcher ค้นข้อมูล, Coder เขียนโค้ดสรุป, Reviewer ตรวจคุณภาพ โดยมี Supervisor route ระหว่างกัน อ่านแนวคิดต้นฉบับเพิ่มเติมได้ที่ Anthropic Research ก่อนนำมาสร้างเป็นโค้ดจริง

from typing import Literal
from langchain_core.messages import SystemMessage
from langgraph.types import Command

MEMBERS = ["researcher", "coder", "reviewer"]
OPTIONS = MEMBERS + ["FINISH"]

SUPERVISOR_PROMPT = f'''คุณคือ Supervisor ดูแลทีมที่ประกอบด้วย: {MEMBERS}.
รับ user request, มอบหมายงานทีละขั้นให้สมาชิก, ตรวจผลลัพธ์,
แล้วเลือก next worker หรือตอบ FINISH เมื่อจบ.
ตอบเฉพาะหนึ่งใน: {OPTIONS}'''

def supervisor_node(state: AgentState) -> Command[Literal[*MEMBERS, "__end__"]]:
    messages = [SystemMessage(content=SUPERVISOR_PROMPT)] + state["messages"]
    response = model.with_structured_output(
        {"type": "object", "properties": {"next": {"enum": OPTIONS}}, "required": ["next"]}
    ).invoke(messages)
    goto = response["next"]
    if goto == "FINISH":
        return Command(goto="__end__")
    return Command(goto=goto, update={"iterations": state["iterations"] + 1})

def make_worker(name: str, system_prompt: str):
    def worker(state: AgentState) -> Command[Literal["supervisor"]]:
        msgs = [SystemMessage(content=system_prompt)] + state["messages"]
        response = model.invoke(msgs)
        response.name = name
        return Command(
            goto="supervisor",
            update={"messages": [response]},
        )
    return worker

researcher = make_worker("researcher",
    "คุณคือนักวิจัย. รวบรวมข้อเท็จจริงจาก background knowledge ของคุณ. ตอบกระชับ.")
coder = make_worker("coder",
    "คุณคือ Python coder. แปลงข้อมูลที่ researcher ส่งมาเป็นโค้ดที่รันได้.")
reviewer = make_worker("reviewer",
    "คุณคือ reviewer. ตรวจความถูกต้องของโค้ดและข้อมูล. ถ้าผ่านบอก APPROVED.")

team = StateGraph(AgentState)
team.add_node("supervisor", supervisor_node)
team.add_node("researcher", researcher)
team.add_node("coder", coder)
team.add_node("reviewer", reviewer)
team.add_edge(START, "supervisor")

team_graph = team.compile()

คีย์ตรงนี้คือคลาส Command ที่เปิดตัวใน LangGraph 0.2 ซึ่ง Node สามารถ อัปเดต state และระบุ goto ปลายทาง ในการ return ครั้งเดียว ทำให้ Supervisor Pattern ที่ก่อนหน้านี้ต้องใช้ conditional edge แยกออกมา เขียนได้กระชับขึ้นมาก หากคุณเคยอ่านบทความเกี่ยวกับ ระบบ Agentic RAG ค้นหาข้อมูลอัจฉริยะ ของเรา จะเห็นว่า pattern นี้นำมาประกอบกับ retrieval engine ได้ตรง ๆ โดยเปลี่ยน Researcher เป็น Node ที่เรียก vector store

Human-in-the-Loop ด้วย interrupt() และ Checkpointer

ในงาน production จริง โดยเฉพาะ workflow ที่กระทบเงินหรือข้อมูลลูกค้า ต้องมีจุดให้คนอนุมัติก่อน Agent จะทำต่อ LangGraph 0.4 ทำเรื่องนี้ผ่าน 2 ส่วน คือ Checkpointer และฟังก์ชัน interrupt()

Checkpointer คือ backend ที่เก็บ snapshot ของ State หลังทุก step ตัวอย่าง SqliteSaver สำหรับ dev และ PostgresSaver สำหรับ production

from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.types import interrupt, Command

checkpointer = SqliteSaver.from_conn_string("checkpoints.db")

def approve_step(state: AgentState) -> dict:
    # หยุด graph รอ input จากภายนอก
    decision = interrupt({
        "question": "อนุมัติให้ส่งอีเมลฉบับนี้ไหม?",
        "draft": state["messages"][-1].content,
    })
    if decision == "approve":
        return {"messages": [AIMessage(content="ส่งอีเมลแล้ว")]}
    return {"messages": [AIMessage(content="ยกเลิกตามคำขอ")]}

builder = StateGraph(AgentState)
builder.add_node("draft", call_model)
builder.add_node("approval", approve_step)
builder.add_edge(START, "draft")
builder.add_edge("draft", "approval")
builder.add_edge("approval", END)

graph = builder.compile(checkpointer=checkpointer)

# รันรอบแรก, จะหยุดที่ interrupt
config = {"configurable": {"thread_id": "user-42"}}
state = graph.invoke({"messages": [HumanMessage("ร่างเมลขอใบเสนอราคา")], "iterations": 0, "final_answer": None}, config)

# ภายหลังเมื่อ user กดปุ่ม Approve ใน UI
graph.invoke(Command(resume="approve"), config)

ทุกครั้งที่ interrupt() ถูกเรียก กราฟจะ หยุดและ persist state ลง checkpointer คุณสามารถปิดเครื่องแล้วกลับมา invoke(Command(resume=...), config) ที่เครื่องอื่นได้ ตราบใดที่ thread_id ตรงกัน รูปแบบนี้คือสิ่งที่ทำให้สร้าง agentic workflow ที่ปลอดภัยได้จริง (ผมเคยใช้กับ workflow อนุมัติเบิกจ่ายในโปรเจกต์ก่อน รอ approver กดปุ่มข้ามวันก็ยัง resume ต่อได้)

Streaming, Observability และ Deploy ขึ้น LangGraph Cloud

การ stream output ของ Agent เพื่อแสดงผลแบบ real-time ใน UI ทำได้หลายระดับ

โหมด streamเห็นอะไรเหมาะกับ
stream_mode="values"state เต็มหลังทุก nodeUI ที่ render state diagram
stream_mode="updates"เฉพาะ field ที่เปลี่ยนlogging, debug
stream_mode="messages"token-by-token ของ LLMChat UI แบบ ChatGPT
stream_mode="debug"event ละเอียดทุกอย่างtracing, profiling
# stream token แบบ Chat UI
async for event in graph.astream_events(
    {"messages": [HumanMessage("เล่าเรื่อง AI Agent หน่อย")], "iterations": 0, "final_answer": None},
    config={"configurable": {"thread_id": "u1"}},
    version="v2",
):
    if event["event"] == "on_chat_model_stream":
        chunk = event["data"]["chunk"]
        print(chunk.content, end="", flush=True)

สำหรับ observability ทีม LangChain ผลักดันให้ใช้ LangSmith เป็น tracing backend หลัก เปิดใช้ได้ด้วยการ set env เพียง 2-3 ตัว

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_pt_...
export LANGSMITH_PROJECT="my-agent-prod"

เมื่อพร้อม deploy จริง LangGraph Cloud (GA เมษายน 2026) deploy ได้ในคำสั่งเดียวด้วย CLI langgraph deploy โดยอ่าน config จาก langgraph.json หลังเสร็จคุณจะได้ HTTPS endpoint ที่รองรับ streaming, thread management และ horizontal scaling ทันที เปรียบเทียบรูปแบบ deploy กับ MCP ได้ที่บทความ คู่มือสร้าง MCP Server ด้วย Python ที่ผมเขียนไว้ก่อนหน้า

ข้อผิดพลาดที่พบบ่อยและวิธีหลีกเลี่ยง

จากประสบการณ์ช่วยทีมต่าง ๆ ย้ายจาก AgentExecutor มา LangGraph ในปี 2025-2026 ผมเจอ pitfall ซ้ำ ๆ ดังนี้

  1. ลืม reducer ใน State ทำให้ messages ถูก overwrite ทุก node เห็น context หาย แก้ด้วย Annotated[list, add_messages] เสมอ
  2. ใช้ recursion limit default (25) สำหรับ Supervisor Pattern ที่ Worker หลายตัว ควรเพิ่มเป็น 50-100 ผ่าน config={"recursion_limit": 50}
  3. ไม่ใส่ thread_id ทำให้ checkpoint รวมกันมั่ว ทุกการ invoke production ต้องมี thread_id เฉพาะของ session
  4. เก็บ tool result เป็น string ยาว ๆ ใน state context window พุ่งเร็ว ใช้ RemoveMessage หรือ summarize ทุก N รอบ
  5. ใช้ Pydantic Model หนัก ๆ เป็น State serialize/deserialize ช้า ใช้ TypedDict ก็พอสำหรับ 90% ของงาน
  6. ไม่ทดสอบ Graph แยกจาก LLM ใช้ FakeMessagesListChatModel mock LLM ตอน unit test เพื่อให้ deterministic

หากต้องการเพิ่ม tool calling แบบ structured ให้กับ Worker Agent อ่าน pattern เพิ่มเติมที่บทความ Claude Tool Use สำหรับ AI Agent ปี 2026 ของเรา ซึ่งใช้งานคู่กับ LangGraph ได้ทันทีโดยห่อ ChatAnthropic.bind_tools()

คำถามที่พบบ่อย

LangGraph ต่างจาก CrewAI และ AutoGen อย่างไร?

LangGraph ให้คุณคุม flow ระดับ low-level ผ่าน graph ทำให้ debug และ test ได้แม่นกว่า ในขณะที่ CrewAI/AutoGen เน้น abstraction ระดับสูง (Role, Crew) ที่เริ่มง่ายแต่ปรับแต่ง flow ยากเมื่อระบบโต ปี 2026 ทีมที่ทำ production มักเลือก LangGraph เพราะมี checkpointing และ human-in-the-loop ในตัว

ต้องใช้ LangChain คู่กับ LangGraph เสมอไหม?

ไม่จำเป็น คุณใช้ LangGraph กับ LLM provider ตรง ๆ ได้ (เช่น Anthropic SDK, OpenAI SDK) เพียงต้องห่อ output เป็น BaseMessage เอง แต่การใช้ langchain-anthropic หรือ langchain-openai ช่วยให้ tool binding, structured output และ streaming เซ็ตอัปง่ายขึ้นมาก

จะทำ Multi-Agent ใน production ต้องใช้ Postgres หรือ SQLite ก็พอ?

สำหรับ production ที่มีหลาย worker process แนะนำ Postgres เพราะ SqliteSaver ไม่ปลอดภัยกับ concurrent write จากหลาย process Postgres ยังมี advisory locks ที่ LangGraph ใช้ป้องกัน race condition ตอน resume ด้วย

LangGraph รองรับ model อะไรบ้าง?

รองรับทุก model ที่ implement interface BaseChatModel ของ LangChain ได้แก่ Claude (Anthropic), GPT (OpenAI), Gemini (Google), Llama 3/4 ผ่าน Ollama, Mistral, รวมถึง open-weight model บน vLLM และ TGI สลับ model ทำได้โดยเปลี่ยน import บรรทัดเดียว

จะ migrate จาก AgentExecutor มา LangGraph ยากแค่ไหน?

หาก Agent เดิมเป็น ReAct loop ธรรมดา ใช้ create_react_agent ของ LangGraph แทนได้ทันที (ประมาณ 10 บรรทัด) แต่หากมี custom callback หรือ memory ซับซ้อน ควรออกแบบ StateGraph ใหม่จากศูนย์ ใช้เวลาประมาณ 1-3 วันสำหรับระบบขนาดกลาง

Editorial Team
เกี่ยวกับผู้เขียน Editorial Team

Our team of expert writers and editors.