Cạm bẫy của các Chuỗi AI Tuyến tính
Hầu hết các nhà phát triển bắt đầu bằng cách xây dựng các chuỗi tuyến tính (linear chains) đơn giản. Một prompt được đưa vào, LLM xử lý nó và một phản hồi được đưa ra. Điều này hiệu quả với các chatbot cơ bản hoặc công cụ tóm tắt. Tuy nhiên, các chuỗi tuyến tính sẽ sụp đổ khi bạn cố gắng xây dựng các agent cấp chuyên nghiệp cần thu thập dữ liệu tài liệu, xác minh sự thật hoặc yêu cầu sự cho phép của con người trước khi tác động vào cơ sở dữ liệu production.
Bạn sẽ nhanh chóng thấy mình rơi vào “địa ngục if-else”. Việc quản lý lịch sử hội thoại và kết quả đầu ra của công cụ bằng các hàm Python tiêu chuẩn tạo ra một cơn ác mộng spaghetti code. Nếu không có một cấu trúc tốt hơn, agent của bạn có thể mất dấu mục tiêu hoặc bị kẹt trong một vòng lặp vô tận khi gọi cùng một API đang bị lỗi.
Tại sao các Chuỗi Truyền thống Thất bại trong Production
Các framework LLM tiêu chuẩn thường coi các tương tác như một Đồ thị có hướng không chu trình (Directed Acyclic Graph – DAG). Trong mô hình này, logic chỉ tiến về phía trước. Nhưng các nhiệm vụ thực tế thường có tính chu kỳ. Một agent cần lặp lại nếu một công cụ trả về lỗi 429 Rate Limit hoặc nếu người dùng cung cấp phản hồi cho một bản nháp.
Nếu không có một state tập trung, bạn sẽ phải truyền các đối tượng JSON nặng 50KB giữa các hàm và hy vọng không có gì bị lỗi. Việc quản lý “memory” trở thành một công việc thủ công tẻ nhạt là nối các chuỗi vào một danh sách. LangGraph giải quyết vấn đề này bằng cách coi việc điều phối agent như một máy trạng thái (state machine) chính thức thay vì một con đường một chiều.
Mô hình Tư duy LangGraph: Node, Edge và State
Hãy coi LangGraph như một bản thiết kế cho bộ não của agent. Sau khi triển khai nhiều agent lên production, tôi nhận thấy framework này cung cấp sự ổn định mà các script thuần túy còn thiếu. Nó buộc bạn phải xác định ba thành phần cốt lõi:
- State: Đây là nguồn dữ liệu tin cậy duy nhất (single source of truth). Nó thường là một
TypedDictchứa dữ liệu hiện tại. Mọi node trong đồ thị đều có thể đọc và cập nhật bộ nhớ dùng chung này. - Nodes: Đây là các hàm Python riêng biệt. Một node có thể gọi GPT-4o, trong khi node khác truy vấn cơ sở dữ liệu PostgreSQL.
- Edges: Những đường nối này xác định đường đi. Các cạnh có điều kiện (conditional edges) đóng vai trò như người điều phối giao thông, quyết định xem nên đi đến công cụ tiếp theo hay kết thúc nhiệm vụ dựa trên đầu ra của LLM.
Thực hành: Xây dựng một Stateful Agent với sự Giám sát của Con người
Hãy cùng xây dựng một agent yêu cầu sự đồng ý của con người trước khi hoàn tất câu trả lời. Mô hình này rất thiết yếu cho các môi trường quan trọng như báo cáo tài chính hoặc tư vấn y tế, nơi độ chính xác 100% là mục tiêu hàng đầu.
1. Thiết lập Môi trường
Bắt đầu bằng việc cài đặt các thư viện cốt lõi. Bạn sẽ cần phiên bản mới nhất của langgraph và langchain-openai.
pip install langgraph langchain_openai
2. Định nghĩa State dùng chung
State theo dõi cuộc hội thoại. Chúng ta sử dụng kiểu Annotated với một hàm reducer. Điều này đảm bảo rằng các phản hồi LLM mới được thêm vào lịch sử thay vì ghi đè lên các tin nhắn trước đó.
from typing import Annotated, TypedDict
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
# Hàm 'add_messages' xử lý logic gộp các tin nhắn mới
messages: Annotated[list, add_messages]
3. Thiết kế các Node
Các node nên có tính module. Trong ví dụ này, một node xử lý logic và một node khác đóng vai trò là điểm kiểm soát để con người xem xét.
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o", temperature=0)
def call_model(state: AgentState):
response = model.invoke(state['messages'])
return {"messages": [response]}
def human_approval_node(state: AgentState):
# Đây đóng vai trò là trình giữ chỗ cho việc tạm dừng giao diện người dùng
print("--- ĐANG CHỜ CON NGƯỜI PHÊ DUYỆT ---")
return state
4. Kết nối Đồ thị
Bây giờ chúng ta kết nối các thành phần. Chúng ta sử dụng MemorySaver để lưu trữ state. Tham số interrupt_before là thành phần quan trọng; nó tạm dừng thực thi để con người có thể kiểm tra công việc của agent.
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.add_node("human_review", human_approval_node)
workflow.set_entry_point("agent")
workflow.add_edge("agent", "human_review")
workflow.add_edge("human_review", END)
memory = MemorySaver()
app = workflow.compile(checkpointer=memory, interrupt_before=["human_review"])
Xử lý Lỗi và Thử lại (Retries)
Các API trong môi trường production thường xuyên gặp lỗi. LangGraph cho phép bạn xử lý những sự cố này một cách linh hoạt. Thay vì bao bọc mọi thứ trong một khối try-except khổng lồ, bạn có thể điều hướng luồng đến một “Retry Node” cụ thể.
Nếu một công cụ trả về lỗi hết thời gian kết nối (connection timeout), đồ thị có thể tự động lặp lại node công cụ đó. Bạn thậm chí có thể bao gồm một thông báo “chờ (cooldown)” trong state để báo cho LLM: “Cơ sở dữ liệu đang bận; hãy đợi 5 giây trước khi thử lại.” Khả năng lặp lại này giúp hệ thống của bạn linh hoạt hơn đáng kể so với một script thông thường.
Quản lý Lưu trữ State (Persistence)
Duy trì ngữ cảnh qua nhiều phiên người dùng là một trở ngại phổ biến. Bằng cách sử dụng checkpointer, LangGraph tự động lưu tiến trình của agent sau mỗi lần thực thi node. Nếu server của bạn khởi động lại hoặc người dùng quay lại sau hai ngày, bạn có thể tiếp tục đúng luồng đó bằng cách sử dụng thread_id.
config = {"configurable": {"thread_id": "session_88"}}
# Agent chạy cho đến khi gặp điểm dừng 'human_review'
app.invoke({"messages": [("user", "Hãy soạn thảo một bản tóm tắt pháp lý")]}, config)
# Sau đó, khi con người đã xác nhận bản thảo, tiếp tục bằng cách truyền None
app.invoke(None, config)
Tinh chỉnh Workflow
Xây dựng các agent phức tạp là một quá trình lặp đi lặp lại. Hãy bắt đầu với một đồ thị đơn giản gồm hai node. Khi logic cơ bản đã vững chắc, hãy thêm phần xử lý lỗi và các điểm kiểm duyệt human-in-the-loop. Việc cố gắng xây dựng một đồ thị 15 node ngay từ ngày đầu tiên thường dẫn đến hàng giờ debug đau khổ.
LangGraph cung cấp framework cần thiết để biến một bản demo mong manh thành một phần mềm đáng tin cậy. Bằng cách coi AI của bạn như một máy trạng thái, bạn có toàn quyền kiểm soát luồng logic. Các ứng dụng của bạn sẽ trở nên dễ dự đoán, dễ debug và sẵn sàng đáp ứng yêu cầu của người dùng thực tế.

