Chuyển tới nội dung chính

Agent và mô hình ReAct

Suốt bốn buổi trước, ta đi từ một prompt rời rạc tới một skill đóng gói gọn gàng, tái dùng được. Nhưng dù skill có tốt tới đâu, nó vẫn chỉ là văn bản hướng dẫn: mô hình đọc, sinh ra câu trả lời, rồi dừng. Người dùng phải tự đọc kết quả, tự chạy thử, tự sửa, rồi hỏi lại. Buổi cuối này trả lời câu hỏi tự nhiên tiếp theo: làm sao để AI tự lặp lại vòng đó, tự kiểm tra việc mình làm, và tự quyết định bước kế tiếp? Đó chính là ý tưởng của agent.

Hãy nhớ lại một buổi tối gỡ lỗi đồ án. Bạn chạy chương trình, thấy báo lỗi, dán lỗi vào ô chat, đọc gợi ý, sửa một dòng, chạy lại, lại lỗi khác, lại dán vào. Mười lăm vòng như vậy và bạn chỉ là người khuân dữ liệu qua lại: mô hình nghĩ, còn bạn làm chân tay. Buổi này nói về việc gỡ chính bạn ra khỏi cái vòng đó, và về cái giá phải trả khi làm vậy, vì ngay khi mô hình được phép tự chạy lệnh và tự sửa tệp, sai sót của nó không còn dừng ở màn hình nữa.

Thử ngay: một phiên agent thật, bước qua từng vòng

Agent làm việc theo vòng ReAct: mỗi vòng gồm một Suy nghĩ, một Hành động gọi công cụ, rồi một Quan sát kết quả trả về; mục Mô hình ReAct phía dưới sẽ mổ xẻ từng bước. Trước hết cứ xem nó chạy đã.

Dưới đây là một agent kỹ sư phần mềm được giao sửa một lỗi chia cho không trong một tệp Python. Bấm Sau để theo dõi nó đi trọn vòng ReAct: từ đọc hiểu mã, tìm nguyên nhân gốc, sửa, tới chạy lại kiểm thử và finish(). Để ý ở mỗi vòng chỉ có đúng một hành động, và Suy nghĩ luôn dẫn dắt hành động đó.

Mục tiêuSửa lỗi chia cho không trong hàm average() ở src/stats.py, đảm bảo bộ kiểm thử đạt rồi nộp bản vá.
Vòng 1/4
Vòng 1
Suy nghĩ
Cần hiểu tổng thể trước khi sửa. Tôi sẽ liệt kê cây thư mục để biết mã nguồn và kiểm thử nằm ở đâu.
Hành động
run_command("ls -R")
Quan sát
Thấy src/stats.py và tests/test_stats.py. Lỗi báo nằm ở hàm average().

Khi đọc bất kỳ agent nào, hãy luôn tìm ba câu trả lời: nó được phép làm gì (bộ công cụ), nó suy nghĩ theo nguyên tắc nào (phần prompt), và nó dừng khi nào (điều kiện kết thúc). Chính công cụ finish() là điều kiện dừng của vòng lặp: agent chỉ gọi nó khi đã chạy hết kiểm thử và xác nhận lỗi đã được vá. Nếu thiếu một công cụ dừng rõ ràng như vậy, agent sẽ không biết khi nào nên ngừng.

Agent là gì

Khi bạn dán một prompt vào ô chat và nhận về một câu trả lời, đó là một lượt hỏi đáp: vào một lần, ra một lần. Một skill làm cho lượt hỏi đáp đó chuẩn hoá và tái dùng được, nhưng bản chất vẫn là một lượt. Agent thì khác: nó không dừng sau một câu trả lời mà tiếp tục hành động trong môi trường, quan sát kết quả, rồi tự quyết bước tiếp theo, cho tới khi đạt mục tiêu.

Một agent là sự kết hợp của ba thành phần:

  1. Prompt: phần hướng dẫn vai trò, mục tiêu, nguyên tắc và quy trình, đúng những gì đã học suốt bốn buổi.
  2. Công cụ (tools): tập hành động agent được phép làm trên môi trường thật, ví dụ đọc tệp, ghi tệp, chạy lệnh.
  3. Vòng lặp (loop): mỗi lượt agent suy nghĩ, gọi một công cụ, nhận kết quả, rồi tự quyết làm tiếp hay dừng.

Nói gọn: agent = prompt + công cụ + vòng lặp tự quyết.

Điểm cốt lõi nằm ở chữ tự quyết. Trong một lượt hỏi đáp, con người là người quyết định bước kế tiếp. Trong một agent, chính mô hình đọc kết quả vừa nhận được và tự chọn hành động tiếp theo. Vai trò con người chuyển từ thao tác từng bước sang giao mục tiêu rồi giám sát.

Ghi nhớ

Một prompt giỏi không tự nó thành agent. Agent cần thêm hai thứ mà prompt thuần không có: bàn tay để chạm vào môi trường (công cụ) và nhịp tim để lặp lại (vòng lặp). Thiếu công cụ, mô hình chỉ nói; thiếu vòng lặp, mô hình chỉ nói một lần.

Công cụ biến lời nói thành hành động

Công cụ là cây cầu giữa văn bản và thế giới thật. Mỗi công cụ có một tên, một danh sách tham số, và một mô tả ngắn để mô hình biết khi nào nên gọi. Ví dụ một công cụ read_file(path) cho phép agent đọc nội dung một tệp; một công cụ run_tests() cho phép agent chạy bộ kiểm thử và nhận về kết quả đạt hay trượt. Khi mô hình quyết định gọi một công cụ, hệ thống bên ngoài thực thi công cụ đó rồi trả kết quả về cho mô hình ở lượt sau. Bản thân mô hình không tự chạy được gì; nó chỉ phát ra ý định gọi công cụ, còn việc thực thi do phần khung (harness) quanh nó đảm nhận.

Vậy agent dựa vào đâu để chọn đúng công cụ? Câu trả lời nghe rất quen: dựa vào mô tả của công cụ, đúng như một skill được kích hoạt nhờ trường description. Mô hình đọc mô tả, so với việc đang cần làm, rồi phát ra ý định gọi công cụ khớp nhất. Hệ quả thực dụng: một công cụ có mô tả mơ hồ sẽ bị gọi nhầm hoặc bị bỏ quên, y hệt một skill có description mơ hồ. Nếu agent cứ chạy lệnh trong khi lẽ ra chỉ cần đọc tệp, thủ phạm thường không phải mô hình kém, mà là bộ công cụ mô tả cẩu thả hoặc chồng lấn nhau tới mức chính mô hình cũng không phân biệt nổi.

Vòng lặp giữ cho công việc chạy tới đích

Vòng lặp là phần làm agent khác hẳn một chatbot. Sau mỗi lần gọi công cụ, kết quả được nối vào lịch sử hội thoại và mô hình được hỏi lại: dựa trên những gì vừa thấy, bước tiếp theo là gì? Quá trình này lặp lại cho tới khi mô hình quyết định nhiệm vụ đã xong, thường bằng cách gọi một công cụ kết thúc đặc biệt là finish(), hoặc cho tới khi chạm một giới hạn an toàn do con người đặt ra, ví dụ số vòng tối đa.

Đặt cạnh nhau ba cách dùng AI mà ta đã đi qua trong cả khoá để thấy rõ khác biệt:

Khía cạnhHỏi đáp một lượtSkillAgent
Số lượtMộtMột (đã chuẩn hoá)Nhiều, tự lặp
Chạm môi trườngKhôngKhôngCó, qua công cụ
Ai quyết bước kếCon ngườiCon ngườiMô hình tự quyết
Tái dùngThấpCaoCao
Rủi roThấpThấpCao, cần kiểm soát

Agent đổi lấy sức mạnh bằng rủi ro: càng cho mô hình tự quyết và chạm vào môi trường thật, ta càng phải đầu tư vào kiểm soát.

Mô hình ReAct

Cách phổ biến nhất để tổ chức vòng lặp của một agent là mô hình ReAct, ghép từ hai chữ Reasoning (suy luận) và Acting (hành động). Ý tưởng rất gần với cách một người làm việc cẩn thận: nghĩ một chút, làm một việc, nhìn kết quả, rồi lại nghĩ tiếp.

ReAct tổ chức mỗi vòng làm việc của agent thành ba bước nối tiếp:

  • Suy nghĩ (Thought): mô hình diễn giải tình huống hiện tại, soi lại quan sát trước đó, đặt giả thuyết và chọn bước kế tiếp.
  • Hành động (Action): mô hình gọi đúng một công cụ với tham số cụ thể.
  • Quan sát (Observation): hệ thống thực thi công cụ và trả kết quả về cho mô hình.

Ba bước này lặp lại: mỗi Quan sát nuôi cho Suy nghĩ của vòng sau, cho tới khi agent gọi finish() để kết thúc.

Sức mạnh của ReAct là ở chỗ phần Suy nghĩ được viết ra thành lời chứ không ẩn đi. Nhờ vậy mô hình tự ràng buộc mình phải lập luận trước khi hành động, còn con người giám sát thì đọc được lý do của từng hành động. Đây cũng là lý do ReAct dễ gỡ lỗi hơn nhiều so với một agent chỉ phát ra hành động mà không giải thích.

Giới hạn và rủi ro

Một agent tự chạy vòng lặp và chạm được vào tệp, lệnh, mạng thì mạnh hơn hẳn một chatbot, nhưng cũng nguy hiểm hơn hẳn. Mỗi sai sót của mô hình không còn nằm trên màn hình mà có thể biến thành một hành động thật trên máy của bạn.

Bốn rủi ro cần luôn cảnh giác
  • Ảo giác (hallucination): mô hình bịa tên hàm, tên tệp, kết quả kiểm thử. Trong vòng lặp, một ảo giác thành tiền đề sai cho mọi vòng sau.
  • Nhầm tương quan với nhân quả: thấy sửa một dòng thì kiểm thử qua, agent vội cho là đã tìm đúng gốc, dù chỉ che triệu chứng.
  • Vòng lặp vô tận: thiếu điều kiện dừng, agent sửa rồi hỏng, sửa lại rồi hỏng, đốt tài nguyên mà không tới đích.
  • Hành động phá huỷ: một lệnh xoá hay ghi đè sai chỗ có thể hỏng không hồi phục. Agent không có trực giác về hậu quả.

Hai biện pháp gần như bắt buộc khi cho agent tự chạy:

  • Sandbox: chạy agent trong môi trường cô lập (bản sao kho mã, máy ảo, thư mục sao lưu) để sai sót không lan ra hệ thống thật.
  • Con người giám sát (human in the loop): agent phải xin xác nhận trước mọi bước khó đảo ngược, và luôn có một trần số vòng cùng một tiêu chí dừng tường minh.

Ngoài ra còn hai giới hạn cố hữu mà agent thừa hưởng nguyên vẹn từ mô hình. Một là thiên kiến (bias): mô hình học từ dữ liệu của con người nên có thể lặp lại các định kiến trong đó. Hai là mốc kiến thức (cutoff): mô hình chỉ biết tới thời điểm dữ liệu huấn luyện dừng lại, nên với thư viện mới hay sự kiện gần đây nó dễ trả lời lỗi thời mà vẫn nói chắc nịch.

Quy tắc đơn giản cho sinh viên

Chừng nào bạn chưa thật sự hiểu một agent sẽ làm gì, đừng cho nó quyền ghi đè hay xoá trên dữ liệu thật của bạn. Hãy bắt đầu bằng các công cụ chỉ đọc, rồi mới mở dần quyền ghi khi đã tin tưởng.

Giám sát và phê duyệt hành động nguy hiểm

Câu "con người giám sát" nghe hay nhưng phải cụ thể hoá thì mới dùng được. Cách làm quen thuộc là chia công cụ thành ba nhóm theo mức nguy hiểm. Nhóm chỉ đọc (đọc tệp, liệt kê thư mục, chạy kiểm thử): cho agent gọi tự do, vì sai thì cũng chỉ tốn một vòng. Nhóm đảo ngược được (ghi tệp trong một nhánh git riêng hoặc thư mục sao lưu): cho gọi tự do nhưng bạn phải xem lại toàn bộ thay đổi trước khi giữ. Nhóm khó đảo ngược (xoá tệp, ghi đè cơ sở dữ liệu, gửi thư, đẩy mã lên kho chung, tiêu tiền): agent phải dừng xin phê duyệt.

Và khi phê duyệt, hãy đọc đúng lệnh sắp chạy, đừng đọc lời tóm tắt của agent. Agent có thể tóm tắt việc mình sắp làm một cách hoàn toàn thiện chí mà vẫn lệch so với lệnh thật, vì tóm tắt và hành động là hai văn bản khác nhau. Ngoài ra luôn đặt trần số vòng lặp: hết trần thì agent phải dừng và báo cáo, không được tự nới.

Khi nào không nên dùng agent

Agent không phải bậc tiến hoá cao hơn của prompt, nó chỉ là một đánh đổi khác. Có những lúc dùng agent là chọn sai công cụ.

  • Việc chỉ có một bước. Dịch một đoạn, tóm tắt một bài, sửa một câu. Vòng lặp không đem lại gì mà chỉ thêm chỗ để hỏng.
  • Việc không có cách kiểm chứng tự động. Sức mạnh của agent nằm ở chỗ nó tự quan sát kết quả rồi tự sửa. Nếu không có bộ kiểm thử, không có trình biên dịch, không có cách nào máy tự biết đúng sai, thì agent chỉ đang tự khen mình qua nhiều vòng.
  • Việc mà sai một lần là hỏng thật. Thao tác trên dữ liệu duy nhất không sao lưu, trên kho mã chung của nhóm, trên tài khoản thật. Ở đây hãy để con người bấm nút.
  • Việc bạn chưa tự làm được lần nào. Bạn không đọc nổi hành động của agent thì bạn không giám sát được nó. Học cách làm thủ công trước, tự động hoá sau.
Ba lỗi thường gặp khi chạy agent
  • Tin phần Suy nghĩ như tin bằng chứng. Một lập luận trôi chảy không chứng minh hành động đã đúng. Chỉ có Quan sát từ công cụ thật mới là bằng chứng.
  • Cho quá nhiều công cụ. Bộ công cụ càng chồng lấn, mô hình càng dễ chọn nhầm. Ít công cụ, mô tả rõ, mỗi cái một việc.
  • Bỏ qua trần số vòng. Không có trần thì một agent kẹt vòng lặp sẽ sửa rồi hỏng, hỏng rồi sửa, cho tới khi bạn phát hiện ra thì đã tốn cả buổi.

Bài tập

Bài 1. Xếp nhóm nguy hiểm cho bộ công cụ

Đề. Một agent trợ lý đồ án có năm công cụ: read_file, run_tests, write_file, git_push, delete_file. Xếp chúng vào ba nhóm nguy hiểm và nói agent được phép làm gì với từng nhóm.

Lời giải. Chỉ đọc: read_filerun_tests, cho gọi tự do. Đảo ngược được: write_file, với điều kiện agent làm trên một nhánh git riêng, và bạn xem lại toàn bộ thay đổi trước khi giữ. Khó đảo ngược: git_pushdelete_file, agent phải dừng xin phê duyệt, và bạn đọc đúng lệnh sắp chạy chứ không đọc lời tóm tắt của nó.

Bài 2. Agent hay chỉ cần một prompt

Đề. Việc nào nên giao cho agent? (a) Dịch phần tóm tắt bài báo sang tiếng Việt. (b) Sửa cho tới khi toàn bộ kiểm thử của một dự án Python đạt. (c) Viết lại phần mở đầu báo cáo cho gọn hơn.

Lời giải. Việc (a) và (c) chỉ cần một prompt: một bước, và không có cách nào để máy tự kiểm chứng kết quả, nên vòng lặp chỉ thêm rủi ro. Việc (b) hợp với agent, vì nó nhiều bước và có tiêu chí đúng sai mà máy tự kiểm được: kiểm thử đạt hay trượt. Chính điều kiện đó làm cho vòng Suy nghĩ, Hành động, Quan sát trở nên có ý nghĩa.

Câu hỏi tự kiểm

Kiểm tra nhanh: agent và mô hình ReAct0/4 đúngchưa trả lời
  1. 1Công thức gọn của một agent là gì?
  2. 2Trong ReAct, bước "Quan sát" (Observation) là gì?
  3. 3Khi phê duyệt một hành động khó đảo ngược của agent, bạn nên dựa vào đâu?
  4. 4Việc nào KHÔNG hợp giao cho agent?

Tóm tắt

Agent bằng prompt cộng công cụ cộng vòng lặp tự quyết. Nó chọn công cụ dựa vào mô tả của công cụ, đúng như skill được kích hoạt nhờ description. ReAct tổ chức mỗi vòng thành Suy nghĩ, Hành động, Quan sát, và viết phần Suy nghĩ ra thành lời để cả mô hình lẫn người giám sát cùng đọc được lý do. Đổi lại sức mạnh đó là rủi ro: ảo giác thành tiền đề sai, vòng lặp vô tận, hành động không đảo ngược được. Vì vậy hãy chạy trong sandbox, phân nhóm công cụ theo mức nguy hiểm, phê duyệt tay cho nhóm nguy hiểm nhất, và biết những lúc không nên dùng agent.