Khóa học
Hãy tưởng tượng bạn đang xây dựng một ứng dụng LLM phức tạp với nhiều tác nhân. Điều này rất thú vị, nhưng cũng đi kèm không ít thách thức: quản lý trạng thái của các tác nhân, điều phối cách họ tương tác, và xử lý lỗi hiệu quả. Đây chính là lúc LangGraph phát huy tác dụng.
LangGraph là một thư viện trong hệ sinh thái LangChain được thiết kế để giải quyết trực diện những thách thức này. LangGraph cung cấp một khung làm việc để định nghĩa, phối hợp và thực thi nhiều tác nhân LLM (hoặc chuỗi) theo cách có cấu trúc.
Nó đơn giản hóa quá trình phát triển bằng cách cho phép tạo ra các đồ thị vòng lặp, vốn rất cần thiết để phát triển môi trường chạy cho tác nhân. Với LangGraph, chúng ta có thể dễ dàng xây dựng các hệ thống đa tác nhân vững chắc, có khả năng mở rộng và linh hoạt.
Nếu bạn muốn tìm hiểu thêm về hệ sinh thái LangChain, tôi gợi ý bài giới thiệu về LangChain này. Bạn cũng có thể xem video hướng dẫn LangGraph của chúng tôi bên dưới.
LangGraph là gì?
LangGraph cho phép chúng ta tạo các ứng dụng có trạng thái, đa tác nhân sử dụng LLM một cách dễ dàng nhất. Nó mở rộng khả năng của LangChain, bổ sung khả năng tạo và quản lý các đồ thị vòng lặp, yếu tố then chốt để phát triển môi trường chạy tác nhân tinh vi. Các khái niệm cốt lõi của LangGraph gồm: cấu trúc đồ thị, quản lý trạng thái và điều phối.
Cấu trúc đồ thị
Hãy hình dung ứng dụng của bạn như một đồ thị có hướng. Trong LangGraph, mỗi nút đại diện cho một tác nhân LLM, và các cạnh là kênh giao tiếp giữa các tác nhân đó. Cấu trúc này cho phép quy trình làm việc rõ ràng và dễ quản lý, nơi mỗi tác nhân thực hiện nhiệm vụ cụ thể và chuyển thông tin cho các tác nhân khác khi cần.
Quản lý trạng thái
Một trong những điểm nổi bật của LangGraph là khả năng quản lý trạng thái tự động. Tính năng này cho phép chúng ta theo dõi và lưu giữ thông tin xuyên suốt nhiều tương tác. Khi các tác nhân thực hiện nhiệm vụ, trạng thái được cập nhật động, đảm bảo hệ thống duy trì ngữ cảnh và phản hồi phù hợp với đầu vào mới.
Điều phối
LangGraph đảm bảo các tác nhân được thực thi theo đúng thứ tự và mọi thông tin cần thiết được trao đổi mượt mà. Việc điều phối này rất quan trọng với các ứng dụng phức tạp, nơi nhiều tác nhân phải cùng hợp tác để đạt mục tiêu chung. Bằng cách quản lý luồng dữ liệu và trình tự thao tác, LangGraph cho phép nhà phát triển tập trung vào logic cấp cao của ứng dụng thay vì sa vào chi tiết điều phối tác nhân.
Vì sao chọn LangGraph?
Như đã đề cập, LangGraph mang lại nhiều lợi ích đáng kể cho nhà phát triển làm việc với các ứng dụng LLM phức tạp. Dưới đây là một số lợi ích thực tế mà LangGraph đem lại.
Đơn giản hóa phát triển
LangGraph trừu tượng hóa sự phức tạp liên quan đến quản lý trạng thái và điều phối tác nhân. Điều này có nghĩa là nhà phát triển có thể định nghĩa quy trình và logic mà không phải lo về các cơ chế nền tảng đảm bảo tính nhất quán dữ liệu và thứ tự thực thi đúng. Sự đơn giản hóa này tăng tốc quá trình phát triển và giảm khả năng xảy ra lỗi. Thật sự là một bước ngoặt!
Tính linh hoạt
Với LangGraph, nhà phát triển có sự linh hoạt để định nghĩa logic tác nhân và giao thức giao tiếp riêng. Điều này cho phép tạo ra các ứng dụng tùy biến cao, phù hợp các tình huống cụ thể. Dù bạn cần một chatbot xử lý nhiều loại yêu cầu hay một hệ thống đa tác nhân đảm nhận các tác vụ phức tạp, LangGraph cung cấp công cụ để bạn xây đúng thứ mình cần. Trao cho bạn quyền chủ động sáng tạo.
Khả năng mở rộng
LangGraph được xây dựng để hỗ trợ thực thi các ứng dụng đa tác nhân quy mô lớn. Kiến trúc vững chắc của nó có thể xử lý lượng tương tác cao và quy trình phức tạp, cho phép phát triển các hệ thống có thể mở rộng cùng nhu cầu của bạn. Điều này khiến nó phù hợp cho các ứng dụng cấp doanh nghiệp và những kịch bản yêu cầu hiệu năng, độ tin cậy cao.
Khả năng chịu lỗi
Độ tin cậy là cân nhắc cốt lõi trong thiết kế của LangGraph. Thư viện bao gồm các cơ chế xử lý lỗi một cách êm ái, đảm bảo ứng dụng của bạn vẫn hoạt động ngay cả khi một số tác nhân gặp sự cố. Khả năng chịu lỗi này rất quan trọng để duy trì sự ổn định và bền bỉ của các hệ thống đa tác nhân phức tạp. Sự an tâm chỉ cách một tính năng.
Bắt đầu với LangGraph
Hãy xem cách thiết lập LangGraph và các khái niệm cơ bản.
Cài đặt
Để cài đặt LangGraph, bạn có thể dùng pip:
pip install -U langgraph
Khái niệm cơ bản
Nút (Node): Nút đại diện cho một đơn vị công việc trong LangGraph. Thông thường chúng là các hàm Python thực hiện một tác vụ cụ thể, như:
- Tương tác với một LLM
- Gọi một công cụ hoặc API
- Thực hiện một thao tác xử lý dữ liệu
- Nhận đầu vào từ người dùng
- Thực thi logic nghiệp vụ
Trong LangGraph, bạn có thể thêm nút bằng cú pháp graph.add_node(name, value).
Cạnh (Edge): Cạnh là kênh giao tiếp giữa các nút. Chúng xác định luồng thông tin và thứ tự thực thi. Bạn có thể thêm cạnh bằng cú pháp graph.add_edge(node1, node2).
Trạng thái (State): Trạng thái là một đối tượng trung tâm được các nút trong đồ thị cập nhật theo thời gian. Nó quản lý trạng thái nội bộ của ứng dụng và có thể được ghi đè hoặc bổ sung tùy yêu cầu. Trạng thái có thể lưu trữ như:
- Lịch sử hội thoại: Danh sách tin nhắn giữa tác nhân và người dùng.
- Dữ liệu ngữ cảnh: Thông tin liên quan đến tác vụ hoặc tương tác hiện tại.
- Biến nội bộ: Cờ, bộ đếm hoặc biến khác để theo dõi tiến độ và hành vi của tác nhân.
Xây dựng một ứng dụng LangGraph đơn giản
Dưới đây là ví dụ tuần tự các bước để tạo một ứng dụng chatbot cơ bản bằng LangGraph.
Bước 1: Định nghĩa StateGraph
Định nghĩa một đối tượng StateGraph để cấu trúc chatbot như một máy trạng thái. State là một lớp kiểu được định nghĩa với một khóa duy nhất messages thuộc kiểu List và sử dụng hàm add_messages() để nối thêm tin nhắn mới thay vì ghi đè.
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
class State(TypedDict):
# messages have the type "list".
# The add_messages function appends messages to the list, rather than overwriting them
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
Bước 2: Khởi tạo một LLM và thêm nó làm nút Chatbot
Tại đây, chúng ta khởi tạo mô hình AzureChatOpenAI và tạo một hàm chatbot đơn giản nhận các tin nhắn trạng thái làm đầu vào và tạo ra phản hồi (sau đó được nối vào trạng thái).
Hàm chatbot này được thêm vào đồ thị như một nút có tên “chatbot”.
from langchain_openai import AzureChatOpenAI
llm = AzureChatOpenAI(
openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
)
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
‘’’The first argument is the unique node name
# The second argument is the function or object that will be called whenever the node is used.’’’
graph_builder.add_node("chatbot", chatbot)
Bước 3: Thiết lập các cạnh
Vì chúng ta đang xây một chatbot đơn giản, chúng ta đặt nút chatbot làm cả điểm vào và điểm kết thúc của đồ thị để chỉ định nơi bắt đầu và kết thúc quy trình.
# Set entry and finish points
graph_builder.set_entry_point("chatbot")
graph_builder.set_finish_point("chatbot")
Bước 4: Biên dịch và trực quan hóa đồ thị
Biên dịch đồ thị để tạo một đối tượng CompiledGraph, và tùy chọn, chúng ta có thể trực quan hóa cấu trúc đồ thị bằng đoạn mã dưới đây:
graph = graph_builder.compile()
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
pass

Bước 5: Chạy chatbot
Cuối cùng, chúng ta triển khai một vòng lặp liên tục nhắc người dùng nhập liệu, xử lý qua đồ thị và in phản hồi của trợ lý. Vòng lặp thoát khi người dùng nhập "quit", "exit" hoặc "q".
# Run the chatbot
while True:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
for event in graph.stream({"messages": [("user", user_input)]}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
Các tính năng nâng cao của LangGraph
Giờ chúng ta đã nắm cơ bản, hãy xem một số tính năng nâng cao.
Loại nút tùy chỉnh
LangGraph cho phép bạn tạo các loại nút tùy chỉnh để hiện thực logic tác nhân phức tạp. Điều này mang lại sự linh hoạt và kiểm soát hành vi ứng dụng của bạn.
from typing import Annotated
from langchain_anthropic import ChatAnthropic
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
class MyCustomNode:
def __init__(self, llm):
self.llm = llm
def __call__(self, state):
# Implement your custom logic here
# Access the state and perform actions
messages = state["messages"]
response = self.llm.invoke(messages)
return {"messages": [response]}
graph_builder = StateGraph(State)
llm = ChatAnthropic(model="claude-3-haiku-20240307")
custom_node = MyCustomNode(llm)
graph_builder.add_node("custom_node", custom_node)
Ở đây, chúng ta định nghĩa lớp MyCustomNode đóng gói logic tùy chỉnh và tương tác với LLM. Đây là cách có cấu trúc và dễ bảo trì hơn để triển khai hành vi nút phức tạp.
Các loại cạnh
LangGraph hỗ trợ nhiều loại cạnh để xử lý các mẫu giao tiếp khác nhau giữa các nút. Một loại hữu ích là cạnh có điều kiện, cho phép ra quyết định dựa trên đầu ra của một nút.
Để tạo một cạnh có điều kiện, bạn cần ba thành phần:
- Nút thượng nguồn: Đầu ra của nút quyết định bước tiếp theo.
- Một hàm: Hàm này đánh giá đầu ra của nút thượng nguồn và xác định nút kế tiếp sẽ thực thi, trả về một chuỗi đại diện cho quyết định.
- Một ánh xạ: Ánh xạ này liên kết các kết quả có thể có của hàm với các nút tương ứng sẽ được thực thi.
Ví dụ bằng giả mã:
graph.add_conditional_edge(
"model",
should_continue,
{
"end": END,
"continue": "tools"
}
)
Ở đây, sau khi nút “model” được gọi, chúng ta có thể thoát đồ thị ("end") và trả về cho người dùng, hoặc tiếp tục ("continue") và gọi một công cụ — tùy thuộc vào quyết định của người dùng!
Quản lý trạng thái
LangGraph cung cấp các kỹ thuật quản lý trạng thái mạnh mẽ, bao gồm sử dụng cơ sở dữ liệu ngoài như SQLite, PostgreSQL và MongoDB, hoặc các giải pháp lưu trữ đám mây như Amazon S3, Google Cloud Storage và Azure Blob Storage để lưu trữ và truy xuất trạng thái tác nhân, tăng độ tin cậy và khả năng mở rộng.
Ví dụ sử dụng cơ sở dữ liệu SQLite để quản lý trạng thái:
from langgraph.checkpoint.sqlite import SqliteSaver
# Connect to the SQLite database
memory = SqliteSaver.from_conn_string(":memory:")
# Compile the graph with the checkpointer
graph = graph_builder.compile(checkpointer=memory)
Xử lý lỗi
LangGraph cũng cung cấp các cơ chế xử lý lỗi:
- Ngoại lệ: Các hàm nút có thể ném ngoại lệ để báo lỗi trong quá trình thực thi. Bạn có thể bắt và xử lý các ngoại lệ này để tránh đồ thị bị sập.
- Cơ chế thử lại: Bạn có thể triển khai logic thử lại trong các nút để xử lý lỗi nhất thời, như sự cố mạng hoặc thời gian chờ API.
- Ghi log: Sử dụng ghi log để lưu lỗi và theo dõi quá trình thực thi của đồ thị.
Ứng dụng thực tế của LangGraph
LangGraph có thể được dùng để xây dựng nhiều loại ứng dụng.
Chatbot
LangGraph lý tưởng để phát triển các chatbot tinh vi có thể xử lý đa dạng yêu cầu người dùng. Bằng cách tận dụng nhiều tác nhân LLM, các chatbot này có thể xử lý truy vấn ngôn ngữ tự nhiên, cung cấp phản hồi chính xác và chuyển đổi mượt mà giữa các chủ đề hội thoại. Khả năng quản lý trạng thái và điều phối tương tác đảm bảo chatbot duy trì ngữ cảnh và mang lại trải nghiệm nhất quán.
Tác nhân tự trị
Với các ứng dụng đòi hỏi ra quyết định tự động, LangGraph cho phép tạo ra các tác nhân có thể tự thực hiện nhiệm vụ dựa trên đầu vào người dùng và logic định sẵn.
Những tác nhân này có thể thực thi quy trình phức tạp, tương tác với hệ thống khác và thích ứng linh hoạt với thông tin mới. Khung làm việc có cấu trúc của LangGraph đảm bảo mỗi tác nhân vận hành hiệu quả, phù hợp cho các tác vụ như hỗ trợ khách hàng tự động, xử lý dữ liệu và giám sát hệ thống.
Hệ thống đa tác nhân
LangGraph vượt trội khi xây dựng ứng dụng nơi nhiều tác nhân hợp tác để đạt mục tiêu chung. Ví dụ, trong hệ thống quản lý chuỗi cung ứng, các tác nhân khác nhau có thể quản lý tồn kho, xử lý đơn hàng và điều phối giao hàng. Khả năng điều phối của LangGraph đảm bảo mỗi tác nhân giao tiếp hiệu quả, chia sẻ thông tin và ra quyết định đồng bộ. Điều này giúp vận hành hiệu quả hơn và cải thiện hiệu năng toàn hệ thống.
Công cụ tự động hóa quy trình
Với LangGraph, việc tự động hóa quy trình và nghiệp vụ trở nên đơn giản. Có thể thiết kế các tác nhân thông minh xử lý các tác vụ như xử lý tài liệu, quy trình phê duyệt và phân tích dữ liệu. Bằng cách định nghĩa quy trình rõ ràng và tận dụng quản lý trạng thái của LangGraph, các công cụ này có thể thực thi chuỗi hành động phức tạp mà không cần can thiệp thủ công, giảm lỗi và tăng năng suất.
Hệ thống gợi ý
Các hệ thống gợi ý cá nhân hóa có thể hưởng lợi lớn từ khả năng của LangGraph. Bằng cách sử dụng nhiều tác nhân để phân tích hành vi người dùng, sở thích và dữ liệu ngữ cảnh, các hệ thống này có thể đưa ra gợi ý phù hợp cho sản phẩm, nội dung hoặc dịch vụ. Tính linh hoạt của LangGraph cho phép tích hợp nhiều nguồn dữ liệu và thuật toán, nâng cao độ chính xác và mức độ liên quan của gợi ý.
Môi trường học tập cá nhân hóa
Trong các nền tảng giáo dục, LangGraph có thể được dùng để tạo môi trường học tập thích ứng, đáp ứng phong cách và nhu cầu học riêng của từng người. Nhiều tác nhân có thể đánh giá tiến độ học tập, cung cấp bài tập tùy chỉnh và đưa ra phản hồi theo thời gian thực. Tính có trạng thái của LangGraph đảm bảo hệ thống lưu giữ thông tin về hiệu suất và sở thích của từng người học, từ đó mang lại trải nghiệm giáo dục cá nhân hóa và hiệu quả hơn.
Kết luận
LangGraph giúp đơn giản hóa đáng kể việc phát triển các ứng dụng LLM phức tạp bằng cách cung cấp một khung có cấu trúc để quản lý trạng thái và điều phối tương tác giữa các tác nhân.
Những phát triển tiềm năng cho LangGraph bao gồm tích hợp với các thành phần khác của LangChain, hỗ trợ các mô hình LLM mới, và giới thiệu môi trường chạy tác nhân tiên tiến hơn từ giới học thuật.
Nếu bạn muốn tìm hiểu thêm về phát triển ứng dụng trong hệ sinh thái LangChain, tôi gợi ý khóa học về phát triển ứng dụng LLM với LangChain.
Ryan là trưởng nhóm khoa học dữ liệu, chuyên xây dựng các ứng dụng AI sử dụng LLM. Anh là nghiên cứu sinh Tiến sĩ về Xử lý Ngôn ngữ Tự nhiên và Đồ thị Tri thức tại Imperial College London, nơi anh cũng hoàn thành bằng Thạc sĩ Khoa học Máy tính. Ngoài lĩnh vực khoa học dữ liệu, anh viết bản tin Substack hàng tuần, The Limitless Playbook, nơi anh chia sẻ một ý tưởng có thể áp dụng ngay từ các tư tưởng gia hàng đầu thế giới và đôi khi viết về những khái niệm cốt lõi của AI.
