Human-in-the-loop: Cách dùng LangGraph để AI hỏi ý kiến sếp trước khi gửi email quan trọng

AI Hunter

Member
Tự động hóa là tốt, nhưng tự động hóa "mù quáng" là thảm họa.
Bạn không bao giờ muốn AI tự ý gửi email xin lỗi khách hàng với nội dung: "Xin lỗi vì sự ngu dốt của công ty chúng tôi" (do AI bị hallucinate).

Để đưa ứng dụng ra thực tế (Production), bạn cần **Human-in-the-loop (HITL)** - cơ chế cho phép con người can thiệp vào giữa quy trình của AI để kiểm duyệt, chỉnh sửa hoặc phê duyệt.

Human-in-the-loop Cách dùng LangGraph để AI hỏi ý kiến sếp trước khi gửi email quan trọng.jpg

LangGraph hỗ trợ việc này cực kỳ mượt mà thông qua cơ chế **Checkpointer** và **Interrupt**.

1. Cơ chế "Pause & Resume"​

Khác với code bình thường chạy một mạch từ A đến Z, LangGraph có thể:
1. Chạy đến bước B.
2. Lưu lại toàn bộ trạng thái (Save State) vào bộ nhớ.
3. **Dừng lại (Suspend)** chờ lệnh.
4. Khi con người bấm nút -> Khôi phục trạng thái cũ -> Chạy tiếp bước C.

2. Bài toán: AI viết Email và Sếp duyệt​

Chúng ta sẽ dựng một luồng đơn giản:
* **Node 1 (AI):** Soạn thảo email dựa trên yêu cầu.
* **--- PAUSE (Human Review) ---**
* **Node 2 (Tool):** Gửi email đi.

3. Triển khai Code (Python)​


Bước 1: Setup Môi trường & State
Chúng ta cần `MemorySaver` để lưu trạng thái khi tạm dừng.

Python:
from typing import TypedDict
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver # Quan trọng!

# State lưu nội dung email
class State(TypedDict):
    request: str
    email_draft: str
    feedback: str

Bước 2: Định nghĩa các Node

Python:
def draft_email_node(state: State):
    print("🤖 AI đang viết email...")
    # Giả lập AI viết (thực tế bạn gọi OpenAI ở đây)
    draft = f"Gửi {state['request']}, chúng tôi đồng ý giảm giá 50%."
    return {"email_draft": draft}

def send_email_node(state: State):
    print(f"📧 Đang gửi email: {state['email_draft']}")
    print("✅ Đã gửi thành công!")
    return

Bước 3: Dựng Graph với `interrupt_before`
Đây là dòng code quan trọng nhất. Chúng ta bảo LangGraph: "Hãy dừng lại trước khi chạy node `send_email`".

Python:
workflow = StateGraph(State)

workflow.add_node("writer", draft_email_node)
workflow.add_node("sender", send_email_node)

workflow.set_entry_point("writer")
workflow.add_edge("writer", "sender")
workflow.add_edge("sender", END)

# Cấu hình Checkpointer (để nhớ trạng thái)
checkpointer = MemorySaver()

# Compile Graph với ngắt (Interrupt)
app = workflow.compile(
    checkpointer=checkpointer,
    interrupt_before=["sender"] # <--- CHÌA KHÓA Ở ĐÂY
)

Bước 4: Chạy thực tế (Mô phỏng quy trình duyệt)

Python:
# Thread ID để định danh phiên làm việc (Session)
thread = {"configurable": {"thread_id": "session_1"}}

# --- LẦN CHẠY 1: AI VIẾT ---
print("--- BẮT ĐẦU ---")
app.invoke({"request": "Khách hàng A"}, config=thread)

# Lúc này, Graph đã chạy xong 'writer' và DỪNG LẠI trước 'sender'.
# Bạn có thể kiểm tra trạng thái hiện tại:
current_state = app.get_state(thread)
print(f"👀 Sếp đang xem draft: '{current_state.values['email_draft']}'")

# --- QUYẾT ĐỊNH CỦA SẾP ---
decision = input("Sếp có duyệt không? (y/n/edit): ")

if decision == "y":
    # --- LẦN CHẠY 2: GỬI ĐI ---
    # `None` nghĩa là tiếp tục chạy từ điểm dừng
    print("👍 Sếp đã duyệt. Tiếp tục chạy...")
    app.stream(None, config=thread)

elif decision == "edit":
    # Sếp sửa lại nội dung trước khi gửi
    new_draft = "Gửi Khách hàng A, chúng tôi giảm giá 10% thôi."
    # Cập nhật lại State trong bộ nhớ
    app.update_state(thread, {"email_draft": new_draft})
   
    print("✏️ Đã sửa nội dung. Tiếp tục gửi...")
    app.stream(None, config=thread)

else:
    print("❌ Sếp hủy kèo. Không gửi nữa.")

4. Ứng dụng mở rộng​

Kỹ thuật này không chỉ dùng để duyệt email. Bạn có thể dùng cho:
  • Viết Code: AI viết code -> Human review (sửa lỗi) -> AI chạy test.
  • Tư vấn pháp lý/y tế: AI đưa ra lời khuyên -> Chuyên gia xác nhận -> Gửi cho user.
  • Xử lý ngoại lệ: Nếu AI gặp lỗi lạ -> Dừng lại báo Dev -> Dev sửa state -> Cho chạy tiếp (Không cần chạy lại từ đầu).

Kết luận​

Human-in-the-loop là cầu nối tin cậy giữa con người và máy móc. Với LangGraph, việc thêm "nút tạm dừng" này chỉ tốn đúng 1 dòng code cấu hình, nhưng giá trị an toàn mà nó mang lại cho doanh nghiệp là vô giá.
 
Back
Top