Human-in-the-Loop

Human-in-the-Loop (HITL) là kỹ thuật cho phép con người can thiệp vào các bước xử lý của hệ thống AI — xác nhận, chỉnh sửa hoặc bổ sung thông tin — trước khi hệ thống tiếp tục. Kỹ thuật phù hợp với các tác vụ quan trọng hoặc có độ rủi ro cao, nơi LLM không phải lúc nào cũng đưa ra quyết định chính xác, chẳng hạn việc duyệt trước khi agent thực thi một tool nhạy cảm.

LangGraph và LangChain

LangChain là framework xây dựng ứng dụng dùng LLM, cung cấp interface tiêu chuẩn cho RAG, Chains, Agents, Memory và tích hợp với nhiều vector store, LLM. LangGraph là thư viện mở rộng trên LangChain để xây dựng AI agent phức tạp theo kiến trúc đồ thị: ứng dụng được mô hình hóa thành các node (gọi LLM, gọi tool, chờ phản hồi) và edge điều hướng dữ liệu, hỗ trợ luồng có trạng thái (stateful), vòng lặp, branching và stream. Tool theo chuẩn MCP có thể được bọc thành Tool của LangChain qua thư viện langchain-mcp-adapters rồi bind vào model để agent gọi trong quá trình reasoning.

Cơ chế interrupt

flowchart TD
    Begin([START]) --> CM["call_model"]
    CM --> SC{"should_continue:<br/>model goi tool?"}
    SC -->|"Co, goi interrupt()"| H{"Nguoi dung duyet?"}
    H -->|"Command resume=True"| TN["tool_node"]
    H -->|"Command resume=False"| F["final"]
    SC -->|"Khong"| F
    TN --> CM
    F --> Done([END])

LangGraph hiện thực HITL bằng hàm interrupt(). Khi một node gọi interrupt() với một giá trị JSON-serializable, graph lưu trạng thái qua persistence layer, tạm dừng thực thi và trả quyền điều khiển về cho ứng dụng bên ngoài, chờ vô thời hạn cho tới khi được resume. Ứng dụng hiển thị yêu cầu xác nhận cho người dùng rồi re-invoke graph bằng Command(resume=...); giá trị truyền vào trở thành giá trị trả về của lời gọi interrupt() bên trong node, và luồng tiếp tục từ điểm đã dừng.

```python

bên trong node: tạm dừng graph và chờ người dùng

permit = interrupt(f”Cho phép gọi tool {tool_name}?”)

phía ứng dụng: tiếp tục graph với giá trị người dùng cung cấp

graph.invoke(Command(resume=True), config) ``` Cơ chế này tương tự ngắt (interrupt) trong hệ điều hành: khi tiến trình bị gián đoạn, CPU lưu trạng thái, xử lý sự kiện rồi tiếp tục thực thi sau đó.

Vì khi resume execution bắt đầu lại từ đầu node và việc khớp resume value là theo chỉ số (index-based), các lời gọi interrupt() phải xuất hiện theo cùng một thứ tự ở mỗi lần chạy; không nên bỏ qua có điều kiện hoặc lặp interrupt() bằng logic không xác định (non-deterministic).