Sửa lỗi GraphRecursionError: Ngăn chặn vòng lặp vô hạn trong Agent LangGraph

intermediate🧠 AI Tools2026-05-23| Python 3.9+, LangGraph 0.1.x, LangChain Core

Error Message

langgraph.errors.GraphRecursionError: Recursion limit of 25 reached without hitting a stop condition. You can increase the limit by setting the `recursion_limit` config key.
#langgraph#langchain#agents#python#gỡ lỗi

Vòng lặp vô hạn gây tốn kém chi phíMọi thứ đang chạy trơn tru cho đến khi một truy vấn phức tạp khiến agent của bạn rơi vào vòng xoáy đệ quy. Nhật ký (logs) của bạn đột nhiên tràn ngập traceback và kết thúc bằng một điểm dừng đột ngột. Agent đã không hoàn thành nhiệm vụ; nó đã chạm tới hạn mức an toàn được thiết kế để bảo vệ túi tiền của bạn.

langgraph.errors.GraphRecursionError: Recursion limit of 25 reached without hitting a stop condition.

Hãy coi lỗi này như một cầu dao tài chính. Theo mặc định, LangGraph sẽ chấm dứt bất kỳ graph nào vượt quá 25 lần chuyển đổi node. Điều này ngăn chặn một LLM đang bị nhầm lẫn tiêu tốn hàng chục đô la phí API do lặp đi lặp lại vô hạn giữa hai công cụ.

Tại sao Graph của bạn lại chạm giới hạn?Hãy xác định nguyên nhân gốc rễ trước khi bắt đầu thay đổi cấu hình. Bạn có thể đang gặp phải một trong hai tình huống sau:

  • Kịch bản A: Các tác vụ có độ phức tạp cao. Agent đang hoạt động chính xác, nhưng khối lượng công việc quá lớn. Một agent nghiên cứu duyệt qua 10 nguồn khác nhau và tổng hợp báo cáo có thể thực sự cần đến 40 hoặc 50 bước.- Kịch bản B: Bẫy Logic. Graph của bạn bị lỗi. Node A gọi Node B, sau đó lại kích hoạt ngược lại Node A. Điều này xảy ra khi LLM "ảo tưởng" (hallucinates) kết quả đầu ra của công cụ hoặc logic cạnh điều kiện (conditional edge) của bạn không nhận diện được tín hiệu kết thúc.## Cách sửa nhanh: Tăng giới hạnNếu agent của bạn thực sự cần thêm không gian để xử lý, bạn có thể tăng giới hạn trong khi gọi hàm (invocation). Mặc dù mặc định là 25, các pipeline RAG phức tạp thường yêu cầu tăng lên 50 hoặc 100.

Cấu hình cho mỗi lần gọi (Invoke)Truyền một đối tượng config khi gọi invoke hoặc stream. Đây là cách an toàn nhất để xử lý các khối lượng công việc khác nhau.

# Tăng recursion_limit lên 50 cho lần gọi cụ thể này
config = {"recursion_limit": 50}

inputs = {"messages": [("user", "Tóm tắt xu hướng của 100 phiếu hỗ trợ gần nhất")]}

try:
    response = app.invoke(inputs, config=config)
    print(response)
except Exception as e:
    print(f"Bắt được lỗi: {e}")

Sửa lỗi triệt để: Kiểm tra Logic vòng lặpViệc che giấu triệu chứng sẽ không giúp ích gì nếu agent của bạn bị kẹt. Nếu một graph chạm mốc 100 bước, việc tăng nó lên 200 chỉ làm tăng gấp đôi chi phí mà không giải quyết được vấn đề.

1. Kiểm tra các Cạnh điều kiện (Conditional Edges)Vòng lặp thường ẩn nấp trong router should_continue. Nếu LLM tạo ra một lệnh gọi công cụ nhưng mã của bạn không chuyển sang node tools, agent sẽ bị mắc kẹt trong "suy nghĩ" của chính nó.

def should_continue(state: AgentState):
    messages = state['messages']
    last_message = messages[-1]
    
    # Nếu LLM đang bị 'vòng lặp', nó có thể không bao giờ đạt tới điều kiện này
    if last_message.tool_calls:
        return "tools"
    if "FINAL ANSWER" in last_message.content:
        return "end"
    return "agent" # Cảnh báo: Điều này có thể gây ra vòng lặp vô hạn

2. Theo dõi số lần lặp trong StateĐừng chỉ dựa vào bộ đếm nội bộ của LangGraph. Hãy thêm một số nguyên iterations vào AgentState của bạn. Điều này cho phép bạn xây dựng một node "thoát hiểm an toàn" để kích hoạt bản tóm tắt tiến trình khi agent rõ ràng đang gặp khó khăn sau 10 lần thử.

3. Trực quan hóa quỹ đạo với LangSmithTrực quan hóa đường đi là cách nhanh nhất để phát hiện vòng lặp. Hãy bật LANGCHAIN_TRACING_V2=true và kiểm tra trace. Tìm kiếm mô hình 'Agent-Action-Agent' nơi nội dung tin nhắn không thay đổi. Điều này thường có nghĩa là kết quả đầu ra của công cụ không đáp ứng yêu cầu của LLM, khiến nó phải thử lại cùng một hành động thất bại đó.

Xác minh: Xác nhận việc sửa lỗiChạy trường hợp kiểm thử cụ thể đã thất bại trước đó và theo dõi số lượng bước. Nếu bạn đã tăng giới hạn, agent bây giờ sẽ hoàn thành nhiệm vụ. Nếu bạn đã sửa lỗi logic, số lần chuyển đổi node sẽ duy trì ở mức thấp.

  • Theo dõi luồng Node: Sử dụng app.stream() để in tên mọi node trong quá trình thực thi.- Kiểm tra độ sâu lịch sử: Theo dõi len(state['messages']) để đảm bảo nó không tăng trưởng theo cấp số nhân.Trong môi trường production, luôn bao bọc các lệnh gọi LangGraph trong khối try/except. Việc bắt lỗi GraphRecursionError một cách cụ thể cho phép bạn trả về một thông báo hữu ích như "Tôi đang bị kẹt, đây là những gì tôi đã tìm thấy cho đến nay" thay vì lỗi 500 chung chung.

Related Error Notes