LangChain vs LangGraph vs LangSmith vs LangFlow: Giải thích những khác biệt chính
So sánh LangChain, LangGraph, LangSmith và LangFlow. Tìm hiểu vai trò, điểm mạnh và thời điểm dùng mỗi công cụ để xây dựng ứng dụng AI sẵn sàng cho sản xuất.
Bài viết này cung cấp so sánh chính thức, đặt cạnh nhau về LangChain và LangGraph, cũng như vị trí của LangSmith và LangFlow. Chúng ta sẽ xây dựng trên các khái niệm đã đề cập trong những bài viết DataCamp khác và bàn về thời điểm chọn mỗi framework để triển khai hệ thống AI agentic sẵn sàng cho sản xuất. Nếu bạn muốn khởi đầu thực hành với LangChain, tôi khuyến nghị khóa Developing LLM Applications with LangChain.
TL;DR
Trước khi vào chi tiết, dưới đây là tóm lược nhanh về cách LangChain, LangGraph, LangSmith và LangFlow kết hợp và khi nào bạn có thể chọn mỗi công cụ.
LangChain: Nền tảng, xây quy trình LLM dạng mô-đun (prompt, tool, memory, retriever) bằng API đơn giản như LCEL. Phù hợp để dựng mẫu và ứng dụng tuyến tính.
LangGraph: Bộ điều phối, quản lý quy trình phức tạp, có trạng thái, phân nhánh với retry, vòng lặp và lưu bền. Tốt nhất cho hệ thống đa tác nhân, bền bỉ, sẵn sàng sản xuất.
LangSmith: Lớp quan sát, tracing, đánh giá và giám sát ứng dụng LLM không phụ thuộc framework. Tốt nhất cho gỡ lỗi, kiểm thử hồi quy và theo dõi chất lượng.
LangFlow: Trình dựng trực quan, giao diện kéo-thả để nhanh chóng dựng mẫu luồng và xuất ra mã. Phù hợp cho đội ngũ, workshop và người không viết mã.
Kinh nghiệm nhanh: Bắt đầu với LangChain, chuyển sang LangGraph khi workflow lớn dần, thêm LangSmith để quan sát, dùng LangFlow khi cần lặp nhanh hoặc cộng tác.
Giới thiệu về LangChain và LangGraph
Các mô hình ngôn ngữ lớn (LLM) rất tốt với những prompt đơn lẻ. Điều này khá hiển nhiên ở thời điểm hiện tại vì chúng ta dùng các mô hình này rất thường xuyên.
Tuy nhiên, ứng dụng thực tế cần workflow: lấy dữ liệu, suy luận, gọi tool, hỏi tiếp, retry khi lỗi và đôi khi tạm dừng để con người duyệt. Vì vậy, bạn sẽ thường xuyên nghe về hai framework: LangChain và LangGraph. Chúng cùng hệ sinh thái và thường phối hợp, nhưng giải quyết các phần khác nhau của vấn đề:
LangChain giúp chúng ta xây dựng các bước
LangGraph giúp chúng ta điều phối các bước này khi mọi thứ trở nên phức tạp.
Nói về hệ sinh thái, chúng ta cũng sẽ bàn về LangSmith (dành cho nhiệm vụ quan sát/đánh giá) và LangFlow (trình dựng trực quan kéo‑thả), vì chúng cũng thuộc hệ sinh thái này.
Lược sử hệ sinh thái LangChain (2022–2025)
Hợp lý khi bắt đầu bằng một chút lịch sử về hệ sinh thái LangChain; nó đã trở thành framework hàng đầu cho AI agentic, và hiểu cách nó phát triển sẽ giúp thấy vì sao LangGraph, LangSmith và LangFlow quan trọng.
2022 — LangChain ra đời: LangChain được ra mắt mã nguồn mở tháng 10/2022 bởi Harrison Chase và đội ngũ. Nhanh chóng trở thành framework chủ đạo để hợp thành ứng dụng LLM, do đó thu hút cộng đồng và tích hợp tăng trưởng nhanh.
2023 — Từ phổ biến đến nền tảng: LangChain chuẩn hóa các trừu tượng cốt lõi và bổ sung LCEL (LangChain Expression Language) cho kiểu ghép nối dạng ống. Một cách triển khai chain như dịch vụ qua API cũng được tạo ra, gọi là LangServe. Công ty phía sau LangChain gọi vốn để thúc đẩy hệ sinh thái.
2023–2024 — Quan sát được bổ sung với LangSmith: Giữa 2023 và ra mắt rộng rãi đầu 2024, LangSmith giới thiệu tracing, đánh giá và giám sát thống nhất để các nhóm gỡ lỗi, kiểm thử chain/agent và theo dõi chất lượng theo thời gian.
2024 — Điều phối với LangGraph: Để hỗ trợ ứng dụng chạy lâu, nhiều bước/tác nhân, LangGraph giới thiệu runtime đồ thị với trạng thái tường minh, bộ định tuyến/nhánh, vòng lặp, retry và checkpointer để lưu bền. Đây là framework thiết yếu vì đặt nền móng cho agent bền bỉ, sẵn sàng sản xuất. Các cập nhật sau đó mở rộng tùy biến và tích hợp với nhà cung cấp LLM khác, gồm cả Ollama (model mã nguồn mở).
2024–2025 — Dựng trực quan với LangFlow. Trình soạn thảo trực quan LangFlow phát triển nhanh (các bản phát hành lớn đến cuối 2024 và Tuần ra mắt 2025), cho phép nhóm kéo‑thả các thành phần LLM, lặp nhanh và xuất luồng ra mã. Đây là bước quan trọng vì bắt đầu cho phép người không viết mã cũng có thể xây AI Agent vững chắc.
2025 — Hướng tới nền tảng agent được quản lý. LangChain công bố các cột mốc lớn: Functional API cho LangGraph, mẫu agent dựng sẵn, và LangGraph Platform để triển khai và quản lý agent có trạng thái ở quy mô lớn. Đây cũng là bước then chốt, vì cho phép nhà phát triển vận hành agent tin cậy trong sản xuất.
Giới thiệu ngắn về LangChain và LangGraph
Giờ hãy đào sâu vào hệ sinh thái cốt lõi, bắt đầu với LangChain và LangGraph.
LangChain là framework mô-đun để xây dựng ứng dụng dựa trên LLM. Nó cung cấp các khối dựng - prompt, model, memory, tool, retriever - và cách đơn giản để xâu chuỗi chúng thành pipeline bằng API Runnable/LCEL (sẽ bàn ngay). Tôi thích ví nó như bộ gạch Lego cho các mẫu LLM phổ biến như RAG, hỏi‑đáp, chatbot và agent dùng tool.
LangGraph là lớp điều phối dựa trên đồ thị mới hơn, xây trên các thành phần LangChain. Thay vì một chuỗi bước thẳng, ứng dụng được mô hình hóa thành node (tức hành động) và edge (tức chuyển tiếp), với một đối tượng trạng thái tường minh chảy qua đồ thị. Chúng ta sẽ bàn sâu hơn, nhưng trước mắt, hãy nhớ thiết kế này khiến việc phân nhánh (đi các nhánh khác nhau), lặp (hỏi làm rõ cho đến khi tự tin), retry (khi tool/model lỗi), và tạm dừng để con người xem xét trở nên tự nhiên; đúng nhu cầu cho agent chạy lâu, cấp sản xuất.
Giờ bạn có thể đặt câu hỏi:
“Tại sao phải so sánh chúng?”
Vấn đề là: dù chia sẻ thành phần, chúng hướng đến mức độ phức tạp khác nhau:
LangChain vượt trội ở workflow nhanh, tuyến tính. Ví dụ: Tải PDF → chia khối → nhúng → truy xuất → trả lời. Bạn có thể dựng mẫu trong vài phút.
LangGraph vượt trội khi logic phải thích ứng. Ví dụ: Nếu độ tự tin < 0,7 → hỏi làm rõ (lặp); nếu thanh toán thất bại → retry với backoff; nếu yêu cầu có rủi ro → tạm dừng để con người duyệt. Các hành vi này là hạng nhất trong đồ thị.
Thực tế, nhiều nhà phát triển bắt đầu với LangChain để kiểm chứng ý tưởng, rồi nâng cấp sang LangGraph khi thêm phân nhánh, xử lý lỗi, phối hợp đa tác nhân hoặc độ bền.
LangChain là gì?
Giờ chúng ta sẽ đi sâu vào LangChain, hiểu cách dùng và viết mã ứng dụng. Lưu ý lần nữa: LangChain là thư viện cho phép xây nền tảng cho workflow LLM tuần tự.
LCEL
Đầu tiên, tôi muốn giải thích LCEL là gì. LCEL hay LangChain Expression Language đơn giản là cách kết nối các khối bằng ống (|). Mỗi khối có thể là prompt, model, retriever hoặc parser. Khi nối chúng, ta được một chain có thể chạy lặp lại, giúp viết mã hiệu quả hơn.
Hãy xem vài ví dụ.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_messages([("system","You are concise."),("human","{question}")])
chain = prompt | llm | StrOutputParser()# This is our chainprint(chain.invoke({"question":"Give me 3 focus tips."}))# making a single call
qs =[{"question": q}for q in["One tactic for RAG?","Explain LCEL in 1 line."]]print(chain.batch(qs))# many calls at onceĐược hỗ trợ bởi
Theo tôi, đoạn mã trên cho thấy cách đơn giản nhất để dùng LCEL. Ta tạo một mẫu prompt luôn có thông điệp hệ thống (“you are concise”) và chừa chỗ cho câu hỏi của người dùng. Thông điệp hệ thống như hướng dẫn cho LLM để nó phản hồi/hành động theo cách cụ thể. Sau đó ta nối template này với model OpenAI - GPT-4o-mini.
Cuối cùng, tôi thêm một output parser, về cơ bản chuyển phản hồi thành văn bản thuần.
Giờ đến phần quan trọng nhất: Toán tử | là thứ gắn các khối này thành một pipeline.
Tôi cũng muốn nói về invoke() và batch(). Khi gọi chain.invoke(...), pipeline chạy một lần: template điền câu hỏi, model tạo câu trả lời và parser trả về văn bản sạch.
Tuy nhiên, khi gọi chain.batch(...), cùng một chain chạy trên nhiều đầu vào cùng lúc, nhanh hơn nhiều so với lặp từng cái. Thực tế, điều này giúp chuyển từ một lời gọi đơn sang xử lý cả tập dữ liệu gần như không cần thêm mã.
Tôi muốn minh họa thêm một ví dụ:
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
stream_chain =(ChatPromptTemplate.from_template("{topic}")| ChatOpenAI(model="gpt-4o-mini")| StrOutputParser())# Simple streamfor chunk in stream_chain.stream({"topic":"Explain PID in 2 lines"}):print(chunk, end="")Được hỗ trợ bởi
Đoạn này khá giống ví dụ đầu tiên nhưng thay vì chỉ gọi một lần, ta dùng streaming. Với .stream(...), model không đợi đến khi cả câu trả lời sẵn sàng. Thay vào đó, nó gửi các mảnh văn bản khi được tạo ra, và ta in theo thời gian thực.
Điều cốt lõi cần nhớ là LCEL là hệ “ống và khối” đơn giản cho phép gắn prompt, model, tool và parser với nhau và lập tức tạo thành một chain mà ta có thể chạy, batch hoặc stream mà không cần mã phụ.
Đầu ra có cấu trúc bằng Pydantic
Đầu ra có cấu trúc là thành phần sống còn của AI agent. Nghĩa là thay vì trả về văn bản dài và lộn xộn, agent đưa câu trả lời dưới dạng rõ ràng như JSON, bảng hoặc danh sách. Điều này giúp cả máy tính và con người dễ đọc, sử dụng và kết nối với công cụ khác.
Một trong những framework chính dùng trong ngành cho mục đích này là Pydantic.
from pydantic import BaseModel, Field
from typing import List
from langchain_openai import ChatOpenAI
classTaskPlan(BaseModel):
title:str
steps: List[str]= Field(..., min_items=3, description="actionable steps")
structured = ChatOpenAI(model="gpt-4o-mini").with_structured_output(TaskPlan)
plan = structured.invoke("Plan a 20-minute deep-work session for AI Agent notes.")print(plan.model_dump())Được hỗ trợ bởi
Trong ví dụ này, phương thức .with_structured_output() là phần quan trọng, vì nó yêu cầu LLM xuất đầu ra theo mẫu Pydantic ta tạo. Ở hậu trường, LangChain đảm bảo câu trả lời của agent là JSON hợp lệ khớp khuôn, rồi chuyển thành đối tượng Python có thể dùng ngay.
Vì vậy, thay vì văn bản rối, ta nhận được thứ như TaskPlan(title="...", steps=["...", "...", "..."]). Điều này đặc biệt hữu dụng khi dùng Tool.
Gọi tool trong LangChain
Tool quan trọng vì chúng mở rộng năng lực của LLM để hoàn thành tác vụ mà trước đó nó không thể, như tìm kiếm Internet.
Điều tôi thích nhất về tool là LangChain (và nhiều framework agentic khác) cung cấp tool dựng sẵn gọi là Built-In Tools khá dễ dùng. Hơn nữa, chúng ta cũng có thể tự tạo tool bằng decorator @tool, báo cho LangChain biết đây là một loại hàm đặc biệt.
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
@tooldefmultiply(a:int, b:int)->int:"""This tool multiplies two numbers."""return a * b
llm = ChatOpenAI(model="gpt-4o-mini")
llm_tools = llm.bind_tools([multiply])# exposing the tools to the model
resp = llm_tools.invoke("What is 9*5? If needed, use a tool.")print(resp.tool_calls or resp.content)# model may emit a tool call with argumentsĐược hỗ trợ bởi
Trong đoạn mã trên, bạn thấy tôi tạo một tool rất đơn giản, nhận hai số và trả về tích của chúng. Để cho model nội bộ (ở đây là GPT-4o-mini) truy cập các tool này, ta dùng phương thức llm.bind_tools() và truyền danh sách tool, phơi bày tool cho model.
Bộ nhớ hội thoại
Memory cũng rất quan trọng khi xây AI agent. Agent có bộ nhớ có thể ghi nhớ từ các cuộc trò chuyện trước, như điều ta đã hỏi, sở thích, hay điều gì hiệu quả hoặc không. Không có memory, mỗi lần tương tác như gặp người hoàn toàn mới — ta phải lặp lại ngữ cảnh cơ bản, rất bất tiện.
Trong LangChain, memory nghĩa là lưu tin nhắn cũ hoặc sự kiện vào kho (bộ nhớ, cơ sở dữ liệu hoặc vector store). Khi agent chạy lại, nó có thể lấy memory đó để phản hồi nhất quán và thông minh hơn.
Có hai loại chính: bộ nhớ ngắn hạn (tin nhắn gần đây trong cùng phiên chat) và bộ nhớ dài hạn (sự kiện hay sở thích được nhớ xuyên suốt nhiều phiên). Lưu ý phiên là một cuộc hội thoại hoặc cửa sổ tương tác đơn lẻ, nơi agent theo dõi những gì đã nói cho đến khi kết thúc.
Ngắn hạn giữ ngữ cảnh trong một cuộc trò chuyện, còn dài hạn giúp agent dần trở nên cá nhân hóa và hữu ích hơn theo thời gian.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistory
prompt = ChatPromptTemplate.from_messages([("system","Be brief"),
MessagesPlaceholder(variable_name="history"),("human","{input}")])
chain = prompt | ChatOpenAI(model="gpt-4o")
store ={}# session_id -> historydefget_history(session_id:str):if session_id notin store:
store[session_id]= InMemoryChatMessageHistory()return store[session_id]
with_history = RunnableWithMessageHistory(
chain,lambda cfg: get_history(cfg["configurable"]["session_id"]),
input_messages_key="input",
history_messages_key="history",)
cfg ={"configurable":{"session_id":"u1"}}print(with_history.invoke({"input":"My name is Vaibhav."}, config=cfg))print(with_history.invoke({"input":"What is my name?"}, config=cfg))Được hỗ trợ bởi
Trong cell trên, mã trước hết tạo một chat chain có thể nhớ tin nhắn trước đó trong một phiên. Prompt có placeholder cho lịch sử, và RunnableWithMessageHistory tự động điền đúng cuộc hội thoại mỗi lần. store lưu lịch sử cho các phiên khác nhau.
Lưu ý, ta nên dùng memory cẩn trọng. Ta cần quyết định và viết mã cho điều gì đáng lưu, khi nào lưu và bao nhiêu sẽ truyền lại vào prompt. Vấn đề là, quá nhiều memory có thể làm chậm hoặc vượt giới hạn, nhưng cân bằng đúng sẽ giúp agent hữu dụng hơn nhiều.
LangGraph là gì?
Giờ ta chuyển sang framework agentic còn lại - LangGraph.
Để giải thích LangGraph một cách đơn giản, tôi dùng một phép so sánh: Lưu đồ Ba lô.
Hãy hình dung LangGraph như một lưu đồ nhỏ cho ứng dụng AI của bạn. Mỗi hộp (gọi là node) là một hàm Python nhỏ làm một việc. Các mũi tên (edge) chỉ hộp nào chạy tiếp theo. Một chiếc ba lô dữ liệu nhỏ (“state”) di chuyển trong lưu đồ, để mỗi node có thể đọc và bổ sung vào đó. Ví dụ, trong app chat, ba lô thường là danh sách tin nhắn đang chảy.
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# This is the backpack that moves through the graph.classState(TypedDict):# To add messages to the state
messages: Annotated[List, add_messages]
llm = ChatOpenAI(model="gpt-4o")# This is a node that asks the model and adds the reply to the backpack.defmodel_node(state: State):
reply = llm.invoke(state["messages"])return{"messages":[reply]}# Building the graph
graph = StateGraph(State)
graph.add_node("model", model_node)
graph.add_edge(START,"model")
graph.add_edge("model", END)# Building and running once
app = graph.compile()
result = app.invoke({"messages":[HumanMessage(content="Explain LangGraph in one sentence.")]})print(result["messages"][-1].content)Được hỗ trợ bởi
Hãy cùng đi qua mã. Ở đây, ta xây app LangGraph đơn giản nhất có thể. Trạng thái như chiếc ba lô, mang tin nhắn đi qua đồ thị. Ta định nghĩa bằng State, cho LangGraph biết luôn giữ danh sách tin nhắn chat đang chảy.
Tiếp theo là node, chỉ là một hàm đơn, model_node, nhìn vào ba lô, gửi tin nhắn đến LLM và trả về phản hồi. LangGraph sẽ tự động thêm phản hồi này trở lại vào ba lô.
Bản thân đồ thị là lưu đồ nhỏ: START → model → END. Khi ta biên dịch, LangGraph chuyển bản vẽ này thành app có thể chạy.
Cuối cùng, ta chạy app (không phải đồ thị - mà là đồ thị đã biên dịch) với một ba lô đã chứa tin nhắn của người dùng.
Để hỗ trợ hình dung, ta có thể chạy mã này để xem đồ thị:
from IPython.display import Image, display
display(Image(app.get_graph().draw_mermaid_png()))Được hỗ trợ bởi
Xin lưu ý, chỉ vì có hình trực quan không có nghĩa là đồ thị sẽ chạy! Có thể có lỗi logic cần xử lý trước.
Đồ thị phân nhánh
Hãy tiến xa hơn đến Phân nhánh, một thành phần quan trọng (nhưng dễ) của hệ thống Agentic vững chắc. Nó cho phép agent tự do hơn trong lựa chọn, biến workflow thành hệ thống agentic.
Xem mã sau:
from typing import TypedDict, Annotated, List
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage
# Defining the stateclassState(TypedDict):
messages: Annotated[List, add_messages]
llm = ChatOpenAI(model="gpt-4o-mini")defanswer_node(state: State):# Normal answer using the whole chat history.return{"messages":[llm.invoke(state["messages"])]}defclarify_node(state: State):# LLm asking for a short follow-up to get enough detail (clarifying)return{"messages":[AIMessage(content="Could you share a bit more so I can be precise?")]}# Router functiondefroute(state: State):# Look for the latest human message and count words.
last_human =next((m for m inreversed(state["messages"])if m.type=="human"),None)ifnot last_human:return"clarify"
words =len(str(last_human.content).split())return"answer"if words >=3else"clarify"
graph = StateGraph(State)
graph.add_node("answer", answer_node)
graph.add_node("clarify", clarify_node)# Adding a conditional edge to connect the router function
graph.add_conditional_edges(START, route,{"answer":"answer","clarify":"clarify"})
graph.add_edge("answer", END)
graph.add_edge("clarify", END)
app = graph.compile()# Compiling the graphĐược hỗ trợ bởi
Phần lớn tương tự agent đầu tiên, ngoại trừ cạnh có điều kiện. Điều này cho phép ta cung cấp cho hệ thống các tuyến khác nhau dựa trên phán đoán của LLM. Về trực quan, hệ thống trông như sau:
Với sức mạnh của cạnh có điều kiện, chúng ta có thể xây hệ thống agentic khá vững với kiến thức hiện có. Nếu bạn muốn hướng dẫn toàn diện hơn, tôi khuyên xem video hướng dẫn LangGraph của tôi.
Gần đây cũng có bổ sung mới cho LangGraph gọi là LangGraph Studio, và tôi rất khuyến nghị hướng dẫn LangGraph Studio này.
LangFlow là gì?
Mặc dù LangChain và LangGraph là hai thư viện hầu hết nhà phát triển lựa chọn trong họ Lang, tôi cho rằng cũng đáng nói ngắn gọn về LangFlow.
Hãy nghĩ về LangFlow như một canvas kéo‑thả cho ứng dụng LLM. Mỗi node = một bước (prompt, model, tool, retriever, vector DB, xử lý file, v.v.). Ta nối các node thành một flow, rồi chạy, xuất hoặc triển khai. Nó tuyệt vời cho lặp nhanh và đặc biệt hữu ích khi cộng tác với người không viết mã, cũng như biến ý tưởng thành agent hoạt động nhanh chóng.
Đúng là nó không tiên tiến bằng LangGraph và LangChain khi xây agent; tuy nhiên, có vài lý do để dùng:
Trình dựng trực quan để phác thảo luồng nhanh
Trao khả năng tạo hệ thống agentic cho người không viết mã
Chạy ở mọi nơi: web, và nay có LangFlow Desktop cho phát triển cục bộ
Xuất/nhập luồng dạng JSON và phục vụ dưới dạng API
Tuyệt vời cho giảng dạy, workshop và nguyên mẫu nhanh không cần nhiều mã
Xuất ra mã: bàn giao cho kỹ sư khi đã ổn định.
Tôi giả định bạn là người không viết mã, nên bạn nên dùng LangFlow khi đang khám phá phương án kiến trúc (biến thể RAG, dùng tool, v.v.) và muốn so sánh nhanh hoặc cần truyền đạt thiết kế trực quan cho bên liên quan.
Thư viện cuối cùng tôi muốn đề cập là LangSmith. LangSmith là lớp quan sát + đánh giá cho ứng dụng LLM. Nó cung cấp tracing (cho phép xem mọi bước, gọi tool, token, lỗi), đánh giá (tập dữ liệu, chấm điểm tự động & con người tham gia) và giám sát/cảnh báo (theo dõi trôi dạt, hồi quy). Ví dụ về một trace trong LangSmith có thể thấy bên dưới:
Có nhiều lý do nhà phát triển dùng LangSmith:
Trace chain/agent phức tạp end-to-end (đầu vào, đầu ra, độ trễ, lỗi)
Đánh giá thay đổi một cách an toàn với tập dữ liệu + chấm điểm tự động/con người
Giám sát lưu lượng thật; phát hiện hồi quy; so sánh phiên bản
Cắm-và-chạy với LangChain/LangGraph
Không phụ thuộc framework, nghĩa là LangSmith có thể dùng với LangChain, LangGraph, hoặc stack hoàn toàn khác.
Có thể dùng trong bất kỳ ngôn ngữ/lớp công nghệ - JavaScript, TypeScript, Python
Sự khác biệt chính giữa LangChain và LangGraph là gì?⌄
LangChain phù hợp cho quy trình tuyến tính đơn giản, còn LangGraph là lớp dựa trên đồ thị cho các luồng phức tạp, có trạng thái, phân nhánh/lặp với khả năng kiểm soát mạnh.
Tôi có cần LangChain để dùng LangGraph không?⌄
LangGraph được xây dựng trên hệ sinh thái LangChain (model, tool, memory). Thông thường, ta dùng cùng nhau, với LangGraph đảm nhận phần điều phối.
Khi nào tôi nên thêm LangSmith?⌄
Ngay khi vượt qua giai đoạn thử nghiệm nhanh. LangSmith cung cấp tracing, gỡ lỗi, đánh giá và phân tích cho cả chain và graph.
Có bắt buộc dùng LangFlow không?⌄
Không, là tùy chọn, nhưng hữu ích cho dựng mẫu trực quan và giảng dạy, hoặc cho người không viết mã.
Công cụ nào tốt hơn cho hệ thống đa tác nhân?⌄
LangGraph. Khả năng quản lý trạng thái và luồng điều khiển giúp phối hợp đa tác nhân và chiến lược khôi phục dễ quản lý hơn, dù đường cong học tập dốc hơn.
Bài viết này cung cấp so sánh chính thức, đặt cạnh nhau về LangChain và LangGraph, cũng như vị trí của LangSmith và LangFlow. Chúng ta sẽ xây dựng trên các khái niệm đã đề cập trong những bài viết DataCamp khác và bàn về thời điểm chọn mỗi framework để triển khai hệ thống AI agentic sẵn sàng cho sản xuất. Nếu bạn muốn khởi đầu thực hành với LangChain, tôi khuyến nghị khóa Developing LLM Applications with LangChain.
TL;DR
Trước khi vào chi tiết, dưới đây là tóm lược nhanh về cách LangChain, LangGraph, LangSmith và LangFlow kết hợp và khi nào bạn có thể chọn mỗi công cụ.
Kinh nghiệm nhanh: Bắt đầu với LangChain, chuyển sang LangGraph khi workflow lớn dần, thêm LangSmith để quan sát, dùng LangFlow khi cần lặp nhanh hoặc cộng tác.
Giới thiệu về LangChain và LangGraph
Các mô hình ngôn ngữ lớn (LLM) rất tốt với những prompt đơn lẻ. Điều này khá hiển nhiên ở thời điểm hiện tại vì chúng ta dùng các mô hình này rất thường xuyên.
Tuy nhiên, ứng dụng thực tế cần workflow: lấy dữ liệu, suy luận, gọi tool, hỏi tiếp, retry khi lỗi và đôi khi tạm dừng để con người duyệt. Vì vậy, bạn sẽ thường xuyên nghe về hai framework: LangChain và LangGraph. Chúng cùng hệ sinh thái và thường phối hợp, nhưng giải quyết các phần khác nhau của vấn đề:
Nói về hệ sinh thái, chúng ta cũng sẽ bàn về LangSmith (dành cho nhiệm vụ quan sát/đánh giá) và LangFlow (trình dựng trực quan kéo‑thả), vì chúng cũng thuộc hệ sinh thái này.
Lược sử hệ sinh thái LangChain (2022–2025)
Hợp lý khi bắt đầu bằng một chút lịch sử về hệ sinh thái LangChain; nó đã trở thành framework hàng đầu cho AI agentic, và hiểu cách nó phát triển sẽ giúp thấy vì sao LangGraph, LangSmith và LangFlow quan trọng.
Giới thiệu ngắn về LangChain và LangGraph
Giờ hãy đào sâu vào hệ sinh thái cốt lõi, bắt đầu với LangChain và LangGraph.
LangChain là framework mô-đun để xây dựng ứng dụng dựa trên LLM. Nó cung cấp các khối dựng - prompt, model, memory, tool, retriever - và cách đơn giản để xâu chuỗi chúng thành pipeline bằng API Runnable/LCEL (sẽ bàn ngay). Tôi thích ví nó như bộ gạch Lego cho các mẫu LLM phổ biến như RAG, hỏi‑đáp, chatbot và agent dùng tool.
LangGraph là lớp điều phối dựa trên đồ thị mới hơn, xây trên các thành phần LangChain. Thay vì một chuỗi bước thẳng, ứng dụng được mô hình hóa thành node (tức hành động) và edge (tức chuyển tiếp), với một đối tượng trạng thái tường minh chảy qua đồ thị. Chúng ta sẽ bàn sâu hơn, nhưng trước mắt, hãy nhớ thiết kế này khiến việc phân nhánh (đi các nhánh khác nhau), lặp (hỏi làm rõ cho đến khi tự tin), retry (khi tool/model lỗi), và tạm dừng để con người xem xét trở nên tự nhiên; đúng nhu cầu cho agent chạy lâu, cấp sản xuất.
Giờ bạn có thể đặt câu hỏi:
“Tại sao phải so sánh chúng?”
Vấn đề là: dù chia sẻ thành phần, chúng hướng đến mức độ phức tạp khác nhau:
Thực tế, nhiều nhà phát triển bắt đầu với LangChain để kiểm chứng ý tưởng, rồi nâng cấp sang LangGraph khi thêm phân nhánh, xử lý lỗi, phối hợp đa tác nhân hoặc độ bền.
LangChain là gì?
Giờ chúng ta sẽ đi sâu vào LangChain, hiểu cách dùng và viết mã ứng dụng. Lưu ý lần nữa: LangChain là thư viện cho phép xây nền tảng cho workflow LLM tuần tự.
LCEL
Đầu tiên, tôi muốn giải thích LCEL là gì. LCEL hay LangChain Expression Language đơn giản là cách kết nối các khối bằng ống (|). Mỗi khối có thể là prompt, model, retriever hoặc parser. Khi nối chúng, ta được một chain có thể chạy lặp lại, giúp viết mã hiệu quả hơn.
Hãy xem vài ví dụ.
Theo tôi, đoạn mã trên cho thấy cách đơn giản nhất để dùng LCEL. Ta tạo một mẫu prompt luôn có thông điệp hệ thống (“you are concise”) và chừa chỗ cho câu hỏi của người dùng. Thông điệp hệ thống như hướng dẫn cho LLM để nó phản hồi/hành động theo cách cụ thể. Sau đó ta nối template này với model OpenAI - GPT-4o-mini.
Cuối cùng, tôi thêm một output parser, về cơ bản chuyển phản hồi thành văn bản thuần.
Giờ đến phần quan trọng nhất: Toán tử | là thứ gắn các khối này thành một pipeline.
Tôi cũng muốn nói về
invoke()vàbatch(). Khi gọichain.invoke(...), pipeline chạy một lần: template điền câu hỏi, model tạo câu trả lời và parser trả về văn bản sạch.Tuy nhiên, khi gọi
chain.batch(...), cùng một chain chạy trên nhiều đầu vào cùng lúc, nhanh hơn nhiều so với lặp từng cái. Thực tế, điều này giúp chuyển từ một lời gọi đơn sang xử lý cả tập dữ liệu gần như không cần thêm mã.Tôi muốn minh họa thêm một ví dụ:
Đoạn này khá giống ví dụ đầu tiên nhưng thay vì chỉ gọi một lần, ta dùng streaming. Với
.stream(...), model không đợi đến khi cả câu trả lời sẵn sàng. Thay vào đó, nó gửi các mảnh văn bản khi được tạo ra, và ta in theo thời gian thực.Điều cốt lõi cần nhớ là LCEL là hệ “ống và khối” đơn giản cho phép gắn prompt, model, tool và parser với nhau và lập tức tạo thành một chain mà ta có thể chạy, batch hoặc stream mà không cần mã phụ.
Đầu ra có cấu trúc bằng Pydantic
Đầu ra có cấu trúc là thành phần sống còn của AI agent. Nghĩa là thay vì trả về văn bản dài và lộn xộn, agent đưa câu trả lời dưới dạng rõ ràng như JSON, bảng hoặc danh sách. Điều này giúp cả máy tính và con người dễ đọc, sử dụng và kết nối với công cụ khác.
Một trong những framework chính dùng trong ngành cho mục đích này là Pydantic.
Trong ví dụ này, phương thức
.with_structured_output()là phần quan trọng, vì nó yêu cầu LLM xuất đầu ra theo mẫu Pydantic ta tạo. Ở hậu trường, LangChain đảm bảo câu trả lời của agent là JSON hợp lệ khớp khuôn, rồi chuyển thành đối tượng Python có thể dùng ngay.Vì vậy, thay vì văn bản rối, ta nhận được thứ như
TaskPlan(title="...", steps=["...", "...", "..."]). Điều này đặc biệt hữu dụng khi dùng Tool.Gọi tool trong LangChain
Tool quan trọng vì chúng mở rộng năng lực của LLM để hoàn thành tác vụ mà trước đó nó không thể, như tìm kiếm Internet.
Điều tôi thích nhất về tool là LangChain (và nhiều framework agentic khác) cung cấp tool dựng sẵn gọi là Built-In Tools khá dễ dùng. Hơn nữa, chúng ta cũng có thể tự tạo tool bằng decorator
@tool, báo cho LangChain biết đây là một loại hàm đặc biệt.Trong đoạn mã trên, bạn thấy tôi tạo một tool rất đơn giản, nhận hai số và trả về tích của chúng. Để cho model nội bộ (ở đây là GPT-4o-mini) truy cập các tool này, ta dùng phương thức
llm.bind_tools()và truyền danh sách tool, phơi bày tool cho model.Bộ nhớ hội thoại
Memory cũng rất quan trọng khi xây AI agent. Agent có bộ nhớ có thể ghi nhớ từ các cuộc trò chuyện trước, như điều ta đã hỏi, sở thích, hay điều gì hiệu quả hoặc không. Không có memory, mỗi lần tương tác như gặp người hoàn toàn mới — ta phải lặp lại ngữ cảnh cơ bản, rất bất tiện.
Trong LangChain, memory nghĩa là lưu tin nhắn cũ hoặc sự kiện vào kho (bộ nhớ, cơ sở dữ liệu hoặc vector store). Khi agent chạy lại, nó có thể lấy memory đó để phản hồi nhất quán và thông minh hơn.
Có hai loại chính: bộ nhớ ngắn hạn (tin nhắn gần đây trong cùng phiên chat) và bộ nhớ dài hạn (sự kiện hay sở thích được nhớ xuyên suốt nhiều phiên). Lưu ý phiên là một cuộc hội thoại hoặc cửa sổ tương tác đơn lẻ, nơi agent theo dõi những gì đã nói cho đến khi kết thúc.
Ngắn hạn giữ ngữ cảnh trong một cuộc trò chuyện, còn dài hạn giúp agent dần trở nên cá nhân hóa và hữu ích hơn theo thời gian.
Trong cell trên, mã trước hết tạo một chat chain có thể nhớ tin nhắn trước đó trong một phiên. Prompt có placeholder cho lịch sử, và
RunnableWithMessageHistorytự động điền đúng cuộc hội thoại mỗi lần. store lưu lịch sử cho các phiên khác nhau.Lưu ý, ta nên dùng memory cẩn trọng. Ta cần quyết định và viết mã cho điều gì đáng lưu, khi nào lưu và bao nhiêu sẽ truyền lại vào prompt. Vấn đề là, quá nhiều memory có thể làm chậm hoặc vượt giới hạn, nhưng cân bằng đúng sẽ giúp agent hữu dụng hơn nhiều.
LangGraph là gì?
Giờ ta chuyển sang framework agentic còn lại - LangGraph.
Để giải thích LangGraph một cách đơn giản, tôi dùng một phép so sánh: Lưu đồ Ba lô.
Hãy hình dung LangGraph như một lưu đồ nhỏ cho ứng dụng AI của bạn. Mỗi hộp (gọi là node) là một hàm Python nhỏ làm một việc. Các mũi tên (edge) chỉ hộp nào chạy tiếp theo. Một chiếc ba lô dữ liệu nhỏ (“state”) di chuyển trong lưu đồ, để mỗi node có thể đọc và bổ sung vào đó. Ví dụ, trong app chat, ba lô thường là danh sách tin nhắn đang chảy.
Đồ thị cơ bản
Sẽ dễ hiểu hơn nếu ta cùng đi qua một ví dụ:
Hãy cùng đi qua mã. Ở đây, ta xây app LangGraph đơn giản nhất có thể. Trạng thái như chiếc ba lô, mang tin nhắn đi qua đồ thị. Ta định nghĩa bằng
State,cho LangGraph biết luôn giữ danh sách tin nhắn chat đang chảy.Tiếp theo là node, chỉ là một hàm đơn,
model_node, nhìn vào ba lô, gửi tin nhắn đến LLM và trả về phản hồi. LangGraph sẽ tự động thêm phản hồi này trở lại vào ba lô.Bản thân đồ thị là lưu đồ nhỏ:
START → model → END. Khi ta biên dịch, LangGraph chuyển bản vẽ này thành app có thể chạy.Cuối cùng, ta chạy app (không phải đồ thị - mà là đồ thị đã biên dịch) với một ba lô đã chứa tin nhắn của người dùng.
Để hỗ trợ hình dung, ta có thể chạy mã này để xem đồ thị:
Xin lưu ý, chỉ vì có hình trực quan không có nghĩa là đồ thị sẽ chạy! Có thể có lỗi logic cần xử lý trước.
Đồ thị phân nhánh
Hãy tiến xa hơn đến Phân nhánh, một thành phần quan trọng (nhưng dễ) của hệ thống Agentic vững chắc. Nó cho phép agent tự do hơn trong lựa chọn, biến workflow thành hệ thống agentic.
Xem mã sau:
Phần lớn tương tự agent đầu tiên, ngoại trừ cạnh có điều kiện. Điều này cho phép ta cung cấp cho hệ thống các tuyến khác nhau dựa trên phán đoán của LLM. Về trực quan, hệ thống trông như sau:
Với sức mạnh của cạnh có điều kiện, chúng ta có thể xây hệ thống agentic khá vững với kiến thức hiện có. Nếu bạn muốn hướng dẫn toàn diện hơn, tôi khuyên xem video hướng dẫn LangGraph của tôi.
Gần đây cũng có bổ sung mới cho LangGraph gọi là LangGraph Studio, và tôi rất khuyến nghị hướng dẫn LangGraph Studio này.
LangFlow là gì?
Mặc dù LangChain và LangGraph là hai thư viện hầu hết nhà phát triển lựa chọn trong họ Lang, tôi cho rằng cũng đáng nói ngắn gọn về LangFlow.
Hãy nghĩ về LangFlow như một canvas kéo‑thả cho ứng dụng LLM. Mỗi node = một bước (prompt, model, tool, retriever, vector DB, xử lý file, v.v.). Ta nối các node thành một flow, rồi chạy, xuất hoặc triển khai. Nó tuyệt vời cho lặp nhanh và đặc biệt hữu ích khi cộng tác với người không viết mã, cũng như biến ý tưởng thành agent hoạt động nhanh chóng.
Đúng là nó không tiên tiến bằng LangGraph và LangChain khi xây agent; tuy nhiên, có vài lý do để dùng:
Tôi giả định bạn là người không viết mã, nên bạn nên dùng LangFlow khi đang khám phá phương án kiến trúc (biến thể RAG, dùng tool, v.v.) và muốn so sánh nhanh hoặc cần truyền đạt thiết kế trực quan cho bên liên quan.
Để tìm hiểu thêm về LangFlow và hoàn thành một dự án như xây Tutor, tôi rất khuyến nghị hướng dẫn LangFlow kèm dự án demo.
LangSmith là gì?
Thư viện cuối cùng tôi muốn đề cập là LangSmith. LangSmith là lớp quan sát + đánh giá cho ứng dụng LLM. Nó cung cấp tracing (cho phép xem mọi bước, gọi tool, token, lỗi), đánh giá (tập dữ liệu, chấm điểm tự động & con người tham gia) và giám sát/cảnh báo (theo dõi trôi dạt, hồi quy). Ví dụ về một trace trong LangSmith có thể thấy bên dưới:
Có nhiều lý do nhà phát triển dùng LangSmith:
Để biết thêm về LangSmith, tôi rất khuyến nghị giới thiệu chi tiết về LangSmith và hướng dẫn LangSmith Agent Builder.
LangChain vs LangGraph vs LangSmith vs LangFlow
Trong phần này, tôi muốn so sánh cả bốn thư viện để bạn hiểu rõ chúng là gì và khi nào dùng.
Chúng là gì
Thành phần chính
Cấu trúc workflow
Quản lý trạng thái
Luồng điều khiển
Dễ sử dụng
Phù hợp nhất cho
Khi nào dùng cái nào
Bảng so sánh
Bảng dưới đây so sánh LangChain, LangGraph, LangSmith và LangFlow:
Hạng mục
LangChain
LangGraph
LangSmith
LangFlow
Chúng là gì
Framework để xây ứng dụng LLM từ các mảnh mô-đun (prompt, model, tool, memory).
Bộ điều phối workflow phức tạp, có trạng thái (phân nhánh, lặp, lưu bền) xây trên LangChain.
Nền tảng quan sát, đánh giá và kiểm thử không phụ thuộc framework cho ứng dụng LLM.
Trình chỉnh sửa kéo‑thả trực quan để thiết kế và dựng mẫu luồng.
Thành phần chính
Chain, Runnable, LCEL
Node, edge, state, router, checkpointer, tool
Trace, run, dataset, evaluator, project
Canvas với các thành phần (loader, LLM, retriever, tool) + kết nối
Cấu trúc workflow
Tuyến tính hoặc DAG, chủ yếu tiến về trước
Đồ thị đầy đủ với chu kỳ, phân nhánh, lặp, tạm dừng
Không phải framework thực thi; bọc các lần chạy để ghi log & đánh giá
Đồ thị trực quan, có thể xuất ra mã LangChain
Quản lý trạng thái
Ngầm hoặc cục bộ theo thành phần
Trạng thái trung tâm, tường minh được xâu qua các node; hỗ trợ lưu bền & checkpointing (ví dụ: bộ nhớ chat).
Lưu metadata lần chạy, đầu vào/ra, chỉ số, phản hồi
Cấu hình thành phần lưu trong JSON flow
Luồng điều khiển
Nhánh/retry hạn chế
Hỗ trợ hạng nhất cho điều kiện, retry, con người trong vòng lặp
Không có (tập trung vào đánh giá, không phải thực thi)
Phân nhánh trực quan; ngữ nghĩa phụ thuộc backend xuất ra
Dễ sử dụng
API đơn giản
Đường cong học tập dốc
Rất dễ bật (biến môi trường)
Dễ bắt đầu nhất theo cách trực quan; thân thiện đội nhóm & người không viết mã
Phù hợp nhất cho
Dựng mẫu, logic tuyến tính, ứng dụng nhanh
Ứng dụng bền bỉ, phức tạp, chạy lâu hoặc đa tác nhân
Quan sát, gỡ lỗi, kiểm thử hồi quy, A/B evaluations
Dựng mẫu trực quan, duyệt với bên liên quan và xuất ra mã LangChain
Kết luận
Chúng ta đã đề cập và so sánh 4 thư viện này khá sâu, nhưng dĩ nhiên còn nhiều điều để học nhằm trở thành Kỹ sư AI nâng cao với các thư viện này. Vì vậy, tôi rất khuyến nghị các khóa như Hệ thống RAG với LangChain và xây dựng Hệ thống Agentic với LangChain.