LangGraph Introduction
Data Mastery Series — Episode 50: Next-Level Chat with Document
LangGraph Introduction
Data Mastery Series — Episode 50: Next-Level Chat with Document

📌 Connect with me and follow our journey: Linkedin, Facebook
LangChain คืออะไร?
LangChain คือ Framework ที่ช่วยให้ Developer เชื่อมต่อ Large Language Model (LLM) เข้ากับแหล่งข้อมูลต่าง ๆ เช่น เอกสาร, API หรือฐานข้อมูล เพื่อสร้างแอปพลิเคชันที่สามารถ สื่อสารกับผู้ใช้งานด้วยภาษาธรรมชาติ ได้อย่างมีประสิทธิภาพ
Figure: Retrieval Augmented Generation (RAG)
LangGraph คืออะไร?
LangGraph คือ Framework ใหม่ที่พัฒนาขึ้นจาก LangChain โดยออกแบบมาเพื่อช่วยให้สร้าง Agent Workflow แบบมีสถานะ (stateful agents) ได้สะดวกยิ่งขึ้น ด้วยแนวคิด Graph-based Programming
เปรียบเทียบให้เห็นภาพ:
- LangChain คือชุดเลโก้
- LangGraph คือคู่มือประกอบเลโก้ให้กลายเป็นระบบที่ซับซ้อนและเป็นขั้นเป็นตอน
หรืออีกนัยหนึ่ง:
- LangGraph = LangChain + ระบบจัดการ Flow และ State สำหรับ Agent
ด้วย LangGraph คุณสามารถสร้าง Agent ที่:
- ✅ ตัดสินใจตามเงื่อนไข
- 🔁 สลับขั้นตอนการทำงาน
- 🧠 จดจำบริบทข้ามรอบการสนทนา
- 🧩 ผสานการใช้งานหลาย Tools ได้อย่างยืดหยุ่น
1. เริ่มต้นใช้งาน LangGraph
มาดูตัวอย่างการใช้งานเบื้องต้นของ LangGraph ร่วมกับ LangChain เพื่อสร้าง Agent ที่สามารถรับข้อความและตอบกลับอย่างง่าย
1️⃣ Define State
เราจะเริ่มจากการกำหนดรูปแบบของ State ซึ่งเป็นข้อมูลที่ถูกส่งผ่านและเปลี่ยนแปลงระหว่าง Node ต่าง ๆ ใน Workflow
class State(TypedDict):
messages: Annotated[List[BaseMessage], "add_messages"]
ตัวแปร messages คือ list ของข้อความ (เช่น HumanMessage, AIMessage) ที่ถูกสะสมไว้ตลอดการทำงานของ Agent
2️⃣ เตรียมเครื่องมือ เช่น LLM หรือ Functions
llm = ChatOpenAI(model="gpt-4o", temperature=0, api_key=OPENAI_API_KEY)
def chatbot(state: State):
return {
"messages": [llm.invoke(state["messages"])]
}
เราสร้างฟังก์ชัน chatbot ซึ่งรับข้อความจาก state แล้วส่งให้ LLM ประมวลผล และเก็บคำตอบกลับมาในรูปแบบใหม่
3️⃣ สร้าง Graph: เพิ่ม Node และเชื่อม Edge
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
ในขั้นตอนนี้ เราประกาศ Node ชื่อ chatbot และเชื่อมต่อจากจุดเริ่มต้น (START) ไปยัง chatbot และไปยังจุดสิ้นสุด (END)
4️⃣ (Optional) แสดงกราฟแบบภาพ
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
pass
เมื่อรันโค้ดนี้ LangGraph จะสร้างแผนภาพ Mermaid ให้ดูโครงสร้างของ Graph ได้
📌 ตัวอย่างภาพ: โครงสร้างของ Graph ที่เราสร้าง

Figure: โครงสร้างของ Graph กรณีเริ่มต้นใช้งาน LangGraph
5️⃣ Run และดูผลลัพธ์

Figure: ผลลัพธ์ — เริ่มต้นใช้งาน LangGraph
จะเห็นได้ว่า Chatbot สามารถตอบคำถามได้ปกติเหมือนการใช้ LangChain ทั่วไป
อย่างไรก็ตาม หากลองถามคำถามเกี่ยวกับข้อมูลปัจจุบันหรือข้อมูลที่อยู่นอกขอบเขตของโมเดล LLM เช่น “อยากทราบผลบอล อาร์เซน่อล เสมอ เบรนท์ฟอร์ด ของวันที่ 13/4/2025” (วันที่เขียน Blog นี้) จะพบว่า LLM ไม่สามารถตอบได้ เพราะไม่มีการเชื่อมต่อข้อมูลจากโลกภายนอก
2. การเพิ่ม Search Tool ให้กับ Agent
เพื่อให้ Agent สามารถตอบคำถามเกี่ยวกับข้อมูลล่าสุดหรือโลกภายนอกได้ เราสามารถผสาน Search Tool เข้าไปใน Workflow ได้
1️⃣ เพิ่ม Search Tool (เช่น Tavily)
สร้าง Search Tool
search_tool = TavilySearchResults(max_results=2, tavily_api_key=TAVILY_API_KEY)
tools = [search_tool]
ผูก Tool เข้ากับ LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0, api_key=OPENAI_API_KEY)
llm_with_tools = llm.bind_tools(tools)
สร้าง Node สำหรับ Tool
tool_node = ToolNode(tools=tools)
2️⃣ ปรับโครงสร้าง Graph
ในขั้นตอนนี้เราจะเพิ่ม Node สำหรับ Tool และกำหนดเงื่อนไขในการสลับการทำงานระหว่าง LLM และ Tool
graph_builder = StateGraph(State)
เพิ่ม Node สำหรับ LLM และ Tool
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("tools", tool_node)
เงื่อนไขสำหรับการเลือกว่าจะใช้ Tool หรือจบการทำงาน
def tools_condition(state: State) -> str:
messages = state.get("messages", [])
if not messages:
return "end" # กรณีไม่มีข้อความเลย → จบ workflow
last_message = messages[-1]
# ถ้า LLM มีการเรียกใช้ Tool (tool_calls) → ส่งไปที่ Node tools
if isinstance(last_message, AIMessage) and last_message.tool_calls:
return "tools"
return "end" # ถ้าไม่มีก็จบที่ END
กำหนด Flow ของ Graph
graph_builder.add_edge(START, "chatbot")
กำหนดเงื่อนไขจาก chatbot → tools หรือ end
graph_builder.add_conditional_edges(
"chatbot",
condition=tools_condition,
path_map={
"tools": "tools",
"end": END
}
)
หลังใช้ Tool เสร็จ ให้กลับไปที่ chatbot เพื่อสรุปผล
graph_builder.add_edge("tools", "chatbot")
Compile Graph ให้พร้อมใช้งาน
graph = graph_builder.compile()
3️⃣ (Optional) แสดงกราฟแบบภาพ

Figure: โครงสร้างของ Graph กรณีเพิ่ม Search Tool
4️⃣ Run และดูผลลัพธ์

Figure: Result of case 2: กรณีเพิ่ม Search Tool
เมื่อรัน Chatbot ที่มี Tool เสริมเข้ามาสามารถตอบคำถามได้
3. เสริมพลัง Agent ด้วย Memory
แม้ว่า Agent ของเราจะสามารถค้นหาข้อมูลและตอบคำถามได้จากทั้งโมเดลและ Search Tool แล้ว แต่หากไม่มี Memory ก็จะไม่สามารถ “จดจำบทสนทนา” หรือ รักษาบริบทระหว่างรอบการโต้ตอบ ได้
LangGraph รองรับการเพิ่ม memory ได้อย่างง่ายดายผ่านการใช้ checkpointer ซึ่งช่วยให้ Agent สามารถเก็บสถานะการสนทนาและนำกลับมาใช้ต่อได้ในรอบถัดไป
1️⃣ เพิ่ม Memory เข้าไปใน Workflow
เพิ่มการสร้าง memory object
memory = MemorySaver()
เพิ่มการผูก memory เข้าไปในการ Compile Graph
graph = graph_builder.compile(checkpointer=memory)
เพิ่มการกำหนด Thread ID สำหรับระบุตัวตนของ session
config = {
"configurable": {
"thread_id": "1" # เปลี่ยน thread_id ได้ตามผู้ใช้แต่ละคน
}
}
2️⃣ Run และดูผลลัพธ์

Figure: Result of case 3: กรณีเพิ่ม Memory
เมื่อรัน Agent ด้วย memory จะพบว่า:
- สามารถ ตอบคำถามจากข้อมูลล่าสุด ได้ผ่าน Search Tool
- และยังสามารถ จำประโยคก่อนหน้า เพื่อให้การสนทนาไหลลื่นและมีความต่อเนื่องมากยิ่งขึ้น
ตลอดบทความนี้ เราได้เรียนรู้วิธีใช้ LangGraph เพื่อสร้าง Agent ที่ตอบสนองได้อย่างชาญฉลาด ตั้งแต่การเริ่มต้นด้วย LLM พื้นฐาน → การผสาน Search Tool เพื่อดึงข้อมูลจากภายนอก → ไปจนถึงการเพิ่ม Memory ให้ Agent จดจำบทสนทนาได้อย่างต่อเนื่อง เสริมความสามารถให้ใกล้เคียงกับมนุษย์มากขึ้นในแต่ละรอบของการสนทนา
ในตอนถัดไป เราจะยกระดับสิ่งที่เรียนรู้ทั้งหมดไปสู่ Agentic RAG — การผสานความสามารถของ Retrieval-Augmented Generation เข้ากับเอกสารจริง ฝากติดตามกันด้วยนะครับ ^__^
Data Science Explore the world of data science with Donato_Story
Dashboard Discover the power of data visualization with Donato_Story
Donato_Journey Join me on my journey (Thai version)
Course_Review Discover the training courses with Donato_Story (Thai version)
Let’s Connect!
Your thoughts and feedback are invaluable. Feel free to share them in the comments or connect with me on
- Medium: medium.com/donato-story
- Facebook: web.facebook.com/DonatoStory
- Linkedin: linkedin.com/in/nattapong-thanngam
Originally published on Medium
Related
Corrective RAG
Data Mastery Series — Episode 53: RAG ที่ “คิด” ก่อน “ตอบ” และ “แก้ไข” เมื่อผิดพลาด
Hierarchical Multi-Agent Systems
Data Mastery Series — Episode 59: การสร้างระบบ AI ทีมงานด้วย Supervisor Agent กับทีมย่อย
LLM Note 2
Data Mastery Series — Episode 47: Summarization Techniques and Advanced RAG
LLM Note 4
Data Mastery Series — Episode 49: Understanding RAG Taxonomy