Chuyển đến nội dung chính

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.
· 15 phút đọc

Khám phá cùng AI

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 chain

print(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

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 stream
for chunk in stream_chain.stream({"topic": "Explain PID in 2 lines"}):
    print(chunk, end="")

Đ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

class TaskPlan(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())

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

@tool
def multiply(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

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 -> history
def get_history(session_id: str):
    if session_id not in 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))

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.

Đồ thị cơ bản

Sẽ dễ hiểu hơn nếu ta cùng đi qua một ví dụ: 

pip install langgraph langchain-openai
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.
class State(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.
def model_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)

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()))

Visualization of Graph 1. Image by Author.

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 state
class State(TypedDict):
    messages: Annotated[List, add_messages]

llm = ChatOpenAI(model="gpt-4o-mini")

def answer_node(state: State):
    # Normal answer using the whole chat history.
    return {"messages": [llm.invoke(state["messages"]) ]}

def clarify_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 function
def route(state: State):
    # Look for the latest human message and count words.
    last_human = next((m for m in reversed(state["messages"]) if m.type == "human"), None)
    if not last_human:
        return "clarify"
    words = len(str(last_human.content).split())
    return "answer" if words >= 3 else "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

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:

Visualization of Graph 2. Image by Author.

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.

Để 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: Trace example in LangSmith. Image taken from Official Website - https://www.langchain.com/langsmith

Có nhiều lý do nhà phát triển dùng LangSmith:

  1. Trace chain/agent phức tạp end-to-end (đầu vào, đầu ra, độ trễ, lỗi)
  2. Đá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
  3. Giám sát lưu lượng thật; phát hiện hồi quy; so sánh phiên bản
  4. Cắm-và-chạy với LangChain/LangGraph
  5. 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. 
  6. Có thể dùng trong bất kỳ ngôn ngữ/lớp công nghệ - JavaScript, TypeScript, Python

Để 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ì

  • LangChain: Dùng để xây ứng dụng LLM từ các mảnh mô-đun như prompt, model, tool và memory.
  • LangGraph: Dùng để điều phối workflow phức tạp, có trạng thái, phân nhánh/lặp dựa trên thành phần LangChain.
  • LangSmith: Dùng để quan sát, đánh giá và kiểm thử ứng dụng LLM (nhắc lại: không phụ thuộc framework).
  • LangFlow: Trình chỉnh sửa trực quan để thiết kế và dựng mẫu luồng bằng kéo‑thả.

Thành phần chính

  • LangChain: Chain, Runnable, LCEL.
  • LangGraph: Node, edge, state, router, checkpointer, tool.
  • LangSmith: Trace, run, dataset, evaluator, project.
  • LangFlow: Canvas với các thành phần (loader, LLM, retriever, tool) và kết nối.

Cấu trúc workflow

  • LangChain: Tuyến tính hoặc DAG, chủ yếu tiến về trước.
  • LangGraph: Đồ thị đầy đủ với chu kỳ, phân nhánh, lặp, tạm dừng.
  • LangSmith: Không phải framework thực thi, nó bọc các lần chạy để ghi log/đánh giá.
  • LangFlow: Đồ thị trực quan, thường được xuất ra mã LangChain.

Quản lý trạng thái

  • LangChain: Thường ngầm hoặc cục bộ theo thành phần.
  • LangGraph: Trạng thái trung tâm, tường minh được xâu qua các node. Điều này cho phép lưu bền/checkpointing - tức ta có thể lưu chat trong bộ nhớ.
  • LangSmith: Lưu metadata của lần chạy, đầu vào/ra, chỉ số và phản hồi.
  • LangFlow: Cấu hình thành phần được lưu trong JSON flow.

Luồng điều khiển

  • LangChain: Nhánh/retry hạn chế.
  • LangGraph: Hỗ trợ hạng nhất cho điều kiện, retry, con người trong vòng lặp.
  • LangSmith: Không có luồng điều khiển, chỉ cung cấp đánh giá/cảnh báo.
  • LangFlow: Phân nhánh trực quan; ngữ nghĩa chính xác phụ thuộc backend xuất ra.

Dễ sử dụng

  • LangChain: API đơn giản.
  • LangGraph: Đường cong học tập dốc hơn.
  • LangSmith: Dễ kích hoạt qua biến môi trường.
  • LangFlow: Dễ bắt đầu nhất theo cách trực quan và tuyệt vời cho đội ngũ/workshop, đặc biệt người không viết mã.

Phù hợp nhất cho

  • LangChain: Dựng mẫu, logic tuyến tính, ứng dụng nhanh.
  • LangGraph: Ứng dụng bền bỉ, phức tạp, chạy lâu/đa tác nhân.
  • LangSmith: Quan sát, gỡ lỗi, kiểm thử hồi quy, A/B eval.
  • LangFlow: Dựng mẫu trực quan, duyệt với bên liên quan, xuất mã.

Khi nào dùng cái nào

  • Bắt đầu với LangChain nếu workflow tuyến tính/dựng mẫu.
  • Chuyển sang LangGraph nếu cần phân nhánh, retry, lưu bền.
  • Phủ thêm LangSmith khi kiểm thử/gỡ lỗi hoặc đưa vào sản xuất.
  • Dùng LangFlow cho workshop, người không viết mã, hoặc phác thảo kiến trúc.

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.

Câu hỏi thường gặp về LangChain vs LangGraph

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.

Vaibhav Mehra

Tác giả

Vaibhav Mehra

Chủ đề

Liên quan