Giới thiệu về LangGraph

Dưới đây là một bài viết giới thiệu về LangGraph, được trình bày theo kiểu bài viết chia sẻ kiến thức công nghệ, phù hợp cho  tài liệu kỹ thuật.

Giới thiệu về LangGraph

 LangGraph Tạo LLM Workflow dễ dàng như vẽ đồ thị

Trong thời đại của trí tuệ nhân tạo và mô hình ngôn ngữ lớn (LLM), việc xây dựng các workflow phức tạp để xử lý ngôn ngữ tự nhiên đang trở nên ngày càng quan trọng. Tuy nhiên, quản lý các chuỗi tác vụ, rẽ nhánh logic, và vòng lặp trong quá trình tương tác với LLM có thể nhanh chóng trở nên phức tạp. Đây chính là lý do LangGraph ra đời.

 

LangGraph là gì?

LangGraph là một thư viện mã nguồn mở được phát triển dựa trên LangChain, cho phép bạn xây dựng các đồ thị trạng thái (stateful graphs) cho các ứng dụng sử dụng LLM. Thay vì chỉ chạy một chuỗi cố định các bước, LangGraph cho phép bạn xây dựng các quy trình linh hoạt hơn, bao gồm:

LangGraph mang lại cách tiếp cận kết hợp giữa Lập trình khai báo(declarative) và Lập trình mệnh lệnh(imperative), giúp bạn dễ dàng hình dung và kiểm soát luồng dữ liệu và trạng thái trong quá trình xử lý.

Vì sao nên sử dụng LangGraph?

Dễ hiểu, dễ hình dung

Bạn xây dựng workflow như một đồ thị gồm các nút (nodes), mỗi nút thực hiện một tác vụ cụ thể, như gọi API, xử lý dữ liệu, tương tác với LLM, hay rẽ nhánh theo điều kiện.

Tái sử dụng và mở rộng tốt

Mỗi nút trong LangGraph là một function, nên bạn dễ dàng viết lại, mở rộng hoặc chia sẻ logic giữa các ứng dụng khác nhau.

Tích hợp chặt chẽ với LangChain

LangGraph kế thừa sức mạnh từ LangChain nên bạn có thể dễ dàng kết hợp với các PromptTemplate, Agents, Memory, hay Tools trong hệ sinh thái LangChain.


Cách hoạt động của LangGraph

Cấu trúc cơ bản của một LangGraph bao gồm:

Ví dụ đơn giản về đồ thị gồm 3 node:

from langgraph.graph import StateGraph, END

# Định nghĩa trạng thái
class MyState(TypedDict):
    input: str
    output: str

# Định nghĩa node
def process_input(state):
    result = state["input"].upper()
    return {"output": result}

# Tạo đồ thị
builder = StateGraph(MyState)
builder.add_node("process", process_input)
builder.set_entry_point("process")
builder.set_finish_point("process", END)
graph = builder.compile()

# Chạy đồ thị
result = graph.invoke({"input": "hello"})
print(result)

Ứng dụng thực tế

LangGraph rất phù hợp cho các bài toán phức tạp với LLM như:

 

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

Vì sao LangGraph ra đời và Graph có ý nghĩa gì

Khi các ứng dụng xây dựng trên mô hình ngôn ngữ lớn (LLM) ngày càng trở nên phức tạp – từ chatbot đơn giản đến hệ thống tự động hóa tác vụ – thì nhu cầu về cách điều phối luồng suy nghĩ, trạng thái, và hành động của LLMs cũng tăng theo.

Đó là lý do vì sao LangGraph ra đời.

LangGraph là một framework kết hợp LLMs với cấu trúc đồ thị trạng thái (stateful graphs), giúp tạo ra các ứng dụng có khả năng:

I. Tại sao lại là LangGraph?

1. Giới hạn của mô hình agent truyền thống (LangChain Agents)

Các agents trong LangChain rất linh hoạt, nhưng đôi khi:

Kết quả là khi xây dựng các ứng dụng phức tạp như AutoGPT, trợ lý đa tác vụ, hệ thống hỏi đáp nhiều bước... developer phải viết rất nhiều code xử lý luồng hoặc hack workaround.

2. LangGraph: Giải pháp điều phối LLM theo kiểu đồ thị trạng thái

LangGraph đưa ra một kiến trúc mới, nơi quá trình suy nghĩ và hành động của LLM được mô hình hóa như một đồ thị (graph).

Mỗi node trong đồ thị:

 Lợi ích chính:

Tính năng Ý nghĩa
Có trạng thái Lưu giữ thông tin giữa các bước
Có vòng lặp Hỗ trợ dễ dàng quá trình phản xạ (reflection), retry, sửa lỗi
Modular Mỗi node độc lập, dễ tái sử dụng
Dễ debug Có thể quan sát từng node và hướng đi trong quá trình xử lý
Tùy chọn luồng Có thể dùng LLM để quyết định đi hướng nào trong graph

 

II. Tại sao lại dùng từ “Graph”?

1. Graph = Đồ thị trạng thái có hướng

LangGraph sử dụng  lý thuyết đồ thị (directed graph) như một cách để mô hình hóa quy trình tư duy của một agent.

 Trong graph:

Graph này giống như flowchart thông minh, nhưng được điều khiển bởi LLM.

2. Graph giúp dễ hình dung quy trình phức tạp

Dưới dạng graph, developer có thể:

Ví dụ:

[User Input]
    ↓
[LLM hiểu yêu cầu]
    ↓
[Chọn hành động] ──→ [Dùng công cụ] ──→ [Tóm tắt kết quả]
    ↑                                  ↓
 [Thiếu dữ liệu?] ←──────[Kiểm tra đủ chưa?]

III. Khi nào nên dùng LangGraph?

LangGraph cực kỳ phù hợp khi bạn xây dựng:

Multi-step reasoning (suy luận nhiều bước)
Agents có khả năng reflection / retry / repair
Workflow có trạng thái (stateful flows)
Hệ thống cần kiểm soát logic chặt chẽ
Quy trình có loop, branching hoặc fallback logic

Ví dụ ứng dụng:

❓ Câu hỏi ✅ Trả lời
Vì sao LangGraph? Vì các ứng dụng LLM ngày càng phức tạp, cần khả năng điều phối, giữ trạng thái, và xử lý logic phức tạp.
Vì sao "Graph"? Vì LangGraph mô hình hóa tư duy của agent dưới dạng đồ thị trạng thái có hướng — giúp kiểm soát, mở rộng, debug dễ dàng hơn.

Lập trình khai báo(declarative) và Lập trình mệnh lệnh(imperative)

Lập trình khai báo(declarative) và Lập trình mệnh lệnh(imperative) là hai phong cách lập trình khác nhau — chúng phản ánh cách bạn mô tả công việc mà máy tính cần thực hiện

I. Lập trình khai báo(declarative) 

# Declarative (giống kiểu functional programming)
result = [x * 2 for x in data if x > 10]

Hoặc ví dụ quen thuộc hơn:

SELECT * FROM users WHERE age > 18;

Bạn không nói “lặp qua từng dòng, kiểm tra tuổi”, mà chỉ nói “hãy lấy dữ liệu theo điều kiện”.

II. Lập trình mệnh lệnh(imperative)

III. Trong LangGraph thì sao?

LangGraph kết hợp cả hai phong cách:

 Ví dụ:

builder.add_node("process", process_input)  # declarative
def process_input(state):                   # imperative
    return {"output": state["input"].upper()}

Tóm lại:

LangGraph giúp bạn tận dụng sức mạnh kết hợp: vừa dễ hình dung (declarative), vừa dễ điều khiển (imperative).

Phong cách Bạn mô tả... Ưu điểm Nhược điểm
Imperative CÁCH máy tính phải làm Kiểm soát chi tiết Dễ rối với quy trình phức tạp
Declarative CÁI GÌ bạn muốn đạt được Gọn, dễ hiểu Khó kiểm soát từng bước nhỏ

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

So sánh LangGraph và LangChain

image.png

Với sự phát triển nhanh chóng của các mô hình ngôn ngữ lớn như GPT, Claude, Mistral..., các thư viện như LangChainLangGraph ra đời để giúp lập trình viên dễ dàng xây dựng ứng dụng sử dụng LLM. Nhưng giữa hai cái tên quen thuộc này, bạn nên chọn cái nào? Hoặc khi nào nên dùng cả hai?

Bài viết này sẽ giúp bạn hiểu rõ sự khác biệt, điểm mạnh, và cách sử dụng của LangChainLangGraph.

I. Tổng quan

Đặc điểm LangChain LangGraph
Mục tiêu Tạo pipeline (chuỗi) LLM logic Tạo workflow (đồ thị trạng thái) phức tạp
Cấu trúc Tuyến tính (linear chain / agent) Đồ thị trạng thái có vòng lặp, rẽ nhánh
Mô hình dữ liệu Stateless (không lưu trạng thái) Stateful (quản lý trạng thái qua nhiều bước)
Tích hợp LLM Rất mạnh, nhiều tools tích hợp Kế thừa từ LangChain
Độ linh hoạt Cao với chuỗi đơn giản hoặc agents Rất cao với workflow phức tạp
Sử dụng chính Chatbot, Q&A, Retrieval, Agents Bot đa bước, phân nhánh logic, memory flows

II. Kiến trúc hoạt động

LangChain

LangChain cung cấp một tập hợp các abstractions như:

Mỗi chain là tuyến tính — dữ liệu đi từ đầu đến cuối qua từng bước.

Ưu điểm: Dễ dùng, dễ hiểu, setup nhanh.
Nhược điểm: Hạn chế khi bạn muốn rẽ nhánh, lặp lại, hoặc xử lý logic phức tạp.

LangGraph

LangGraph đưa kiến trúc lên tầm cao hơn: bạn không chỉ nối các bước, bạn vẽ ra một đồ thị trạng thái. Trong đó:

LangGraph kế thừa toàn bộ các công cụ từ LangChain như LLMChain, PromptTemplate, Tool, Memory, Agent,… nhưng nâng cấp khả năng tổ chức luồng xử lý lên mức workflow engine.

Ưu điểm: Xử lý logic phức tạp, hỗ trợ đa chiều, có vòng lặp.
Nhược điểm: Khó hơn để bắt đầu, yêu cầu hiểu về state và luồng.

III. Khi nào dùng LangChain?

Dùng LangChain khi bạn:

Ví dụ: Lấy nội dung từ một file, tóm tắt nó bằng GPT, rồi gửi email.

IV. Khi nào dùng LangGraph?

Dùng LangGraph khi bạn:

Ví dụ:
Hệ thống kiểm tra đơn hàng:

  1. Người dùng gửi mã đơn →

  2. Hệ thống kiểm tra trạng thái đơn →

  3. Nếu đơn đang giao: gửi thông báo;

  4. Nếu đơn bị huỷ: hỏi lý do → ghi log → gửi xác nhận.

Bạn khó làm điều này gọn gàng với LangChain, nhưng LangGraph làm rất tốt.

V. Có thể dùng kết hợp không?

Hoàn toàn có thể!
LangGraph thực tế được xây dựng trên nền LangChain, nên bạn có thể dùng LLMChain, RetrievalChain, Agents, PromptTemplate bên trong các node của LangGraph.

Ví dụ: Một node trong đồ thị LangGraph có thể gọi một LangChain Agent để xử lý một phần công việc.

VI. So sánh ngắn gọn qua ví dụ

 LangChain (linear):

chain = SimpleSequentialChain(chains=[chain1, chain2])
result = chain.run("Hello world")

LangGraph (graph):

builder = StateGraph()
builder.add_node("step1", step1)
builder.add_node("step2", step2)
builder.add_edge("step1", "step2")
builder.set_entry_point("step1")
graph = builder.compile()
graph.invoke({"input": "Hello world"})

VII. Kết luận

Nếu bạn cần... Hãy chọn...
Xây dựng nhanh một chuỗi xử lý 🟢 LangChain
Quản lý nhiều trạng thái phức tạp 🟢 LangGraph
Làm chatbot đơn giản 🟢 LangChain
Làm agent với hành vi linh hoạt 🟢 LangGraph
Kết hợp các công cụ và logic rẽ nhánh 🟢 LangGraph

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

Tác nhân điều phối(Agentic) trong ứng dụng mô hình ngôn ngữ lớn (LLMs)

Với sự phát triển mạnh mẽ của các mô hình ngôn ngữ lớn (LLMs), chúng ta có thể xây dựng nhiều loại ứng dụng khác nhau. Trong đó, hai hướng tiếp cận nổi bật là:

Vậy đâu là sự khác biệt, điểm mạnh – điểm yếu, và bạn nên chọn loại nào cho dự án của mình?

I. Định nghĩa

1. Non-Agentic LLM App là gì?

Đây là các ứng dụng chạy theo logic tuyến tính, được xác định rõ ràng. Mỗi bước được lập trình cụ thể, LLM chỉ làm từng nhiệm vụ một cách tường minh.

 Đặc điểm:

Ví dụ:

summary = llm("Tóm tắt đoạn văn sau...")

2. Agentic LLM App là gì?

Là ứng dụng mà trong đó LLM hoạt động như một "agent" (tác nhân) — có khả năng:

Đặc điểm:

Ví dụ:

II. So sánh chi tiết

Đặc điểm Non-Agentic Agentic
Mục tiêu Xử lý 1 nhiệm vụ đơn giản hoặc theo kịch bản Tự động hóa nhiều bước, xử lý tác vụ mở
Luồng xử lý Tuyến tính, xác định trước Rẽ nhánh, điều kiện, có thể điều phối vòng lặp
Khả năng lập kế hoạch ❌ Không Có (có thể lên kế hoạch và thực thi từng bước)
Khả năng chọn công cụ phù hợp ❌ Không Có thể chọn tool/action phù hợp theo ngữ cảnh
Tính linh hoạt Trung bình – cao Rất cao
Dễ debug, kiểm soát  Rất dễ ❌ Phức tạp hơn do có hành vi tự động
Hiệu suất Nhanh hơn, ít token hơn Chậm hơn, tốn token hơn do phải lập kế hoạch
Khả năng sử dụng thực tế Rất tốt với quy trình ổn định Tốt với quy trình phức tạp hoặc cần tự thích nghi

3. Minh họa đơn giản

Tác vụ: “Hãy tìm thông tin về Elon Musk và tóm tắt”

Non-Agentic:

Agentic:

4. Công nghệ hỗ trợ

Tính năng Non-Agentic Agentic
Thư viện phổ biến LangChain, Transformers LangChain Agents, LangGraph, AutoGPT
Công cụ gọi ngoài (Tools) Có, nhưng gọi tường minh LLM tự chọn công cụ thông minh
Bộ nhớ (Memory) Đơn giản hoặc không có Quan trọng để theo dõi trạng thái
Loop / Retry logic Phải lập trình thủ công Agent có thể tự thực hiện

5. Khi nào nên dùng loại nào?

Trường hợp Nên chọn
Xử lý một bước (dịch, tóm tắt, phân loại) ✅ Non-Agentic
Luồng cố định, logic rõ ràng ✅ Non-Agentic
Tác vụ phức tạp, cần suy luận nhiều bước ✅ Agentic
Cần tương tác nhiều hệ thống / API / Tool ✅ Agentic
Trợ lý AI hoặc hệ thống hỗ trợ quyết định ✅ Agentic
Ưu tiên tốc độ, đơn giản, tiết kiệm tài nguyên ✅ Non-Agentic

6. Tổng kết

Tiêu chí Non-Agentic App Agentic App
Đơn giản ❌ (phức tạp hơn)
Linh hoạt
Tự chủ
Dễ kiểm soát
Tác vụ phức tạp
Sử dụng tool ngoài Có nhưng hạn chế Mạnh mẽ, linh hoạt

Không có lựa chọn "tốt hơn tuyệt đối" — bạn cần chọn dựa trên mức độ phức tạp của bài toán, khả năng chấp nhận rủi ro, và yêu cầu logic xử lý.

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

Cấp độ hành vi của tác nhân(Agentic) trong ứng dụng LLM

image.png

LLMs như GPT, Claude, hay Gemini, ngày càng nhiều ứng dụng được xây dựng theo kiến trúc agentic – tức là cho phép mô hình "suy nghĩ", lập kế hoạch, và tự ra quyết định. Nhưng không phải ứng dụng nào cũng cần mức độ agentic giống nhau.

Vì vậy, khái niệm Cấp độ hành vi của tác nhân(Degrees of Agentic Behavior) ra đời – mô tả các cấp độ từ đơn giản đến phức tạp mà một hệ thống có thể thể hiện hành vi như một tác nhân (agent).

Agentic Behavior là gì?

"Agentic behavior" đề cập đến khả năng hành động một cách có mục đích của mô hình – không chỉ trả lời từng lệnh một, mà còn:

Ví dụ, thay vì chỉ trả lời “không biết”, một agentic app có thể:

“Tôi không có thông tin trong cơ sở dữ liệu. Tôi sẽ tìm kiếm trên web, tóm tắt, rồi trình bày kết quả.”

5 Cấp độ Hành vi Agentic (Degrees of Agentic Behavior)

Chúng ta có thể chia hành vi agentic thành năm cấp độ, từ đơn giản (non-agentic) đến phức tạp (autonomous agents):


Level 0 – Không có hành vi tác nhân(Non-Agentic)

🔹 Chỉ thực hiện một hành động theo prompt đã lập trình sẵn.
🔹 Không có logic điều phối, không lập kế hoạch.

Ví dụ:

response = llm("Hãy tóm tắt đoạn văn sau...")

Dùng cho:

Level 1 – Tăng cường bằng công cụ - Sử dụng công cụ một bước(Tool-Enhanced - Single-step Tool Use)

🔹 Ứng dụng có thể sử dụng một công cụ bên ngoài, nhưng người lập trình phải chỉ định rõ khi nào dùng tool nào.

Ví dụ:

if "search" in user_input:
    result = web_search_tool(query)
else:
    result = llm(user_input)

Dùng cho:


Level 2 – Các tác nhân phản ứng - Sử dụng công cụ động(Reactive Agents - Dynamic Tool Use)

🔹 LLM tự quyết định khi nào cần dùng công cụ nào
🔹 Các công cụ (tools) được mô tả bằng prompt hoặc API
🔹 LLM chọn hành động tốt nhất dựa trên ngữ cảnh hiện tại

Ví dụ: LLM tự chọn Calculator để tính toán thay vì chỉ đoán kết quả.

Dùng LangChain Agents, OpenAI Function Calling, hoặc LangGraph Nodes.

Dùng cho:


Level 3 – Các tác nhân tự phản hồi hoặc thực hiện vòng lặp (Reflective / Iterative)

🔹 Agent có khả năng tự phản hồi (self-reflect) và thực hiện vòng lặp xử lý đến khi đạt được mục tiêu
🔹 Có thể lập kế hoạch, thực hiện hành động, kiểm tra lại, và sửa lỗi

Ví dụ:

if "search" in user_input:
    result = web_search_tool(query)
else:
    result = llm(user_input)

Dùng Looping Graphs trong LangGraph hoặc Agent Executors có khả năng hồi quy.

Dùng cho:


Level 4 – Các tác nhân tự chủ đa mục tiêu (Autonomous Multi-goal Agents)

🔹 Agent có khả năng:

Ví dụ: AutoGPT, BabyAGI, OpenDevin

Có thể chạy nhiều vòng lặp, tự lưu trạng thái và chuyển hướng kế hoạch khi có lỗi.

Dùng cho:

So sánh nhanh

Cấp độ Tên gọi Mức độ tự chủ Có lập kế hoạch Có hành vi phản xạ Dùng cho tác vụ phức tạp
0

Không có hành vi tác nhân

(Non-agentic)
1

Tăng cường bằng công cụ

(Tool-enhanced)
2

Các tác nhân phản ứng

(Reactive agents)
✅ (mức vừa)
3

Các tác nhân tự phản hồi hoặc thực hiện vòng lặp

(Reflective/Iterative agents)
✅✅ ✅✅
4

Các tác nhân tự chủ đa mục tiêu

(Autonomous agents)
✅✅✅ ✅✅ ✅✅ ✅✅✅

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

LangGraph Studio, giới thiệu, cài đặt và cách dùng

Giới thiệu LangGraph Studio – Trình quan sát & phát triển Agentic Graphs

I. LangGraph Studio là gì?

LangGraph Studio là một công cụ giao diện đồ họa (GUI) giúp bạn:

Nó giống như một "developer console" dành riêng cho LangGraph, giúp bạn hiểu và kiểm soát quá trình suy luận và hành động của mô hình AI một cách rõ ràng, trực quan.

II. Tại sao nên dùng LangGraph Studio?

Vấn đề khi không có Studio LangGraph Studio giúp
❌ Debug khó vì agent ẩn trong LLM Hiển thị chi tiết từng bước, trạng thái
❌ Khó hiểu LLM đang đi hướng nào Hiển thị flow trực quan
❌ Phát triển agent lặp đi lặp lại Test từng phần trực tiếp
❌ Không biết LLM nghĩ gì Hiển thị prompt, output, action, tool dùng

III. Cài đặt LangGraph Studio

LangGraph Studio được tích hợp sẵn trong thư viện langgraph. Để cài đặt và sử dụng, bạn chỉ cần:

1. Cài đặt thư viện:

pip install langgraph[dev]

Hoặc nếu bạn đã có langgraph:

pip install -U "langgraph[dev]"

dev extras sẽ cài thêm các gói phục vụ cho Studio như fastapi, uvicorn, jupyter, v.v.

IV. Cách dùng LangGraph Studio

LangGraph Studio hiện hỗ trợ hai cách chính để sử dụng:


1. Chạy dưới dạng local app (FastAPI server)

Bạn có thể thêm dòng sau vào project của bạn để chạy Studio như một app mini:

from langgraph.studio import start_trace_server

start_trace_server()

Mặc định server chạy tại http://localhost:4000

Khi bạn chạy graph của mình, Studio sẽ tự động ghi lại luồng xử lý, trạng thái, inputs/outputs, và hiển thị trên giao diện web.

2 . Tích hợp trong Jupyter Notebook

Nếu bạn đang làm việc trong Jupyter (hoặc Google Colab), bạn có thể dùng:

from langgraph.studio.jupyter import trace_graph

with trace_graph(graph) as session:
    result = session.invoke(input_data)

Tính năng này giúp bạn:

from langgraph.graph import StateGraph
from langgraph.studio import start_trace_server

# Define some simple node functions
def say_hello(state):
    print("Hello!")
    return state

def ask_name(state):
    state["name"] = "Alice"
    return state

# Build graph
builder = StateGraph(dict)
builder.add_node("hello", say_hello)
builder.add_node("ask", ask_name)
builder.set_entry_point("hello")
builder.add_edge("hello", "ask")

graph = builder.compile()

# Start studio server
start_trace_server()

# Run
graph.invoke({})

Khi chạy đoạn code này, bạn có thể truy cập http://localhost:4000 để thấy luồng hello → ask cùng với trạng thái và log chi tiết.

VI. Các tính năng nổi bật

Tính năng Mô tả
Flow Graph View Hiển thị đồ thị agent và luồng thực tế đã đi qua
Prompt Viewer Hiển thị đầy đủ prompt mà LLM nhận được
Input/Output Log Xem tất cả input và output của từng bước
Multi-run Comparison So sánh nhiều phiên bản chạy graph khác nhau
Token usage & Cost (tương lai) Theo dõi chi phí sử dụng OpenAI, Anthropic,...
 Node debug Hiển thị error và traceback nếu có lỗi ở một node

VII. Khi nào nên dùng LangGraph Studio?

VIII. Tổng kết

Câu hỏi Trả lời
LangGraph Studio là gì? Là công cụ GUI để quan sát và phát triển LangGraph Agents một cách trực quan và có thể debug.
Làm gì được với nó? Theo dõi prompt, response, trạng thái, tool call... từng bước trong graph
Cài đặt ra sao? pip install langgraph[dev]
Chạy ở đâu? Trong local (FastAPI) hoặc trong Jupyter Notebook

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft