Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 5 — Nhịp tim: Planning loop và mô hình ReAct

Đã đọc 0/8 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Planning loop là nhịp tim của agent: cơ chế lặp giúp nó suy nghĩ, hành động, quan sát, và lặp lại đến khi đạt mục tiêu. Mô hình phổ biến nhất là ReAct (Reasoning + Acting) — đan xen suy luận và hành động.

ReAct là gì?

Mỗi vòng lặp, agent sinh ra một bộ ba:

Thought (Nghĩ):      Mình cần gì tiếp theo?
Action (Hành động):  Gọi tool nào, tham số gì?
Observation (Quan sát): Kết quả tool trả về là gì?
... lặp lại cho đến khi ...
Final Answer:        Đủ dữ kiện → trả lời.

Điểm hay của ReAct: suy luận được viết ra thành text trước khi hành động, nên agent "nghĩ trước khi làm", ít gọi tool bừa, và bạn debug được đường tư duy.

Ví dụ ReAct đầy đủ

Mục tiêu: "Thành phố nào trong 3 chi nhánh có doanh thu cao nhất?"

Thought: Cần dữ liệu doanh thu 3 chi nhánh. Query DB.
Action:  sql_query("SELECT city, revenue FROM branches")
Observation: [HN: 4.2, HCM: 5.1, ĐN: 2.0]
Thought: HCM cao nhất (5.1). Đã đủ, không cần tool nữa.
Final Answer: TP.HCM có doanh thu cao nhất (5.1 tỷ).

Agent tự quyết định số bước — có bài toán 1 vòng, có bài toán 10 vòng.

Vòng lặp ở dạng pseudocode

def run_agent(goal, max_steps=8):
    history = [system_prompt, goal]
    for step in range(max_steps):
        response = llm(history, tools)          # model nghĩ + đề nghị action
        if response.is_final:                    # tiêu chí dừng 1
            return response.answer
        result = execute_tool(response.tool,     # code thực thi
                              response.args)
        history.append(response.thought)
        history.append(result)                   # observation vào memory
    return "Đã đạt giới hạn bước."                # tiêu chí dừng 2 (an toàn)

Hai điều bắt buộc: một điều kiện dừng khi xong và một giới hạn số bước (max_steps) để không lặp vô tận.

Các bước triển khai một ReAct loop

  • Ghép system prompt + mục tiêu làm history khởi đầu.
  • Vòng for có max_steps (đừng dùng while không giới hạn).
  • Mỗi vòng: gọi LLM kèm danh sách tools.
  • Nếu LLM báo final → trả kết quả, thoát.
  • Nếu LLM gọi tool → code thực thi, đưa observation trở lại history.
  • Cắt/tóm history nếu dài (áp dụng Bài 4).
  • Log lại mỗi Thought/Action/Observation để debug.

Khung tư duy: khi nào ReAct hợp lý?

ReAct mạnh khi bước tiếp theo phụ thuộc kết quả bước trước (khám phá, tra cứu nhiều nguồn). Nếu bạn biết trước toàn bộ kế hoạch, mô hình plan-execute (Bài 6) hiệu quả hơn vì ít lời gọi LLM.

Checklist một ReAct loop an toàn

  • [ ] Có max_steps (giới hạn cứng).
  • [ ] Có điều kiện dừng khi đạt mục tiêu.
  • [ ] Observation được đưa lại vào history.
  • [ ] Có cắt/tóm history khi dài.
  • [ ] Log đầy đủ Thought/Action/Observation.
  • [ ] Xử lý trường hợp tool lỗi (đưa lỗi lại cho model).

Sai lầm thường gặp

  • Quên max_steps: agent kẹt trong vòng lặp, gọi tool đi tool lại, đốt token. Đây là lỗi tốn tiền nhất.
  • Không đưa observation lại cho model: model không thấy kết quả, lặp lại action y hệt.
  • Để agent tự quyết định dừng mà không có chốt chặn cứng: một điểm dừng "mềm" (model tự nói xong) chưa đủ; phải có max_steps cứng.
  • Không log Thought: khi agent làm sai, bạn không biết nó "nghĩ" sai ở đâu.
  • Nhồi cả log thô của tool vào history: tràn context sau vài vòng. Cắt gọn observation.
ReAct linh hoạt nhưng "vừa đi vừa nghĩ". Bài 6 giới thiệu plan-execute — nghĩ xong hết rồi mới làm.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi