ReAct Agent là gì? Cách AI kết hợp suy luận và hành động

ReAct Agent là gì? Cách AI kết hợp suy luận và hành động

Sự bế tắc của các mô hình ngôn ngữ tĩnh và nhu cầu cấp thiết về khả năng hành động

Kể từ khi các mô hình ngôn ngữ lớn (Large Language Models – LLMs) như GPT-4, Claude và Gemini xuất hiện, chúng ta đã chứng kiến sự biến chuyển ngoạn mục trong cách máy tính hiểu và tạo sinh ngôn ngữ. Các mô hình này thể hiện vốn hiểu biết bách khoa, khả năng viết văn trôi chảy và kỹ năng tóm tắt tài liệu xuất sắc. Tuy nhiên, khi đưa LLM vào giải quyết các bài toán kinh doanh phức tạp trong thế giới thực, các kỹ sư phần mềm nhanh chóng chạm phải một bức tường vô hình.

Bức tường đó chính là bản chất thụ động và khép kín của mô hình ngôn ngữ tĩnh. Một LLM thuần túy chỉ có thể làm việc với tri thức đã được nén vào trọng số tham số (parametric knowledge) tại thời điểm kết thúc huấn luyện. Nó hoàn toàn cô lập với thực tại: không biết hôm nay thời tiết ra sao, không thể tra cứu giá cổ phiếu mới nhất, không có quyền truy cập vào cơ sở dữ liệu khách hàng CRM, và không thể tự thực thi một phép tính phức tạp mà không mắc lỗi số học.

Để khắc phục sự cô lập này, cộng đồng nghiên cứu AI ban đầu chia thành hai trường phái riêng biệt. Trường phái thứ nhất tập trung vào việc nâng cao năng lực suy luận nội tại thông qua kỹ thuật Chain-of-Thought (CoT – Chuỗi suy nghĩ). Bằng cách thúc đẩy mô hình “suy nghĩ từng bước”, CoT cải thiện đáng kể khả năng giải toán và suy luận logic. Tuy nhiên, CoT vẫn hoàn toàn “mù lòa” trước thế giới bên ngoài; khi gặp thông tin chưa biết, nó rất dễ tự tin bịa đặt số liệu (hallucination).

Trường phái thứ hai đi theo hướng Action-only (chỉ hành động), tức là trao cho mô hình khả năng gọi các công cụ ngoại vi như công cụ tìm kiếm web hay API phần mềm (tiêu biểu như WebGPT hoặc SayCan thế hệ đầu). Dẫu vậy, hướng đi này cũng bộc lộ khiếm khuyết lớn: mô hình hành động một cách máy móc, thiếu khả năng phân tích ngữ cảnh, không biết cách lập kế hoạch dài hạn và dễ dàng rơi vào bẫy lặp vô tận khi gặp dữ liệu nhiễu.

Chính sự bế tắc của hai hướng tiếp cận đơn lẻ đã thúc đẩy sự ra đời của một bước tiến mang tính cách mạng: ReAct Framework. Bằng cách kết hợp hài hòa giữa Suy luận (Reasoning) và Hành động (Acting), ReAct đã trở thành xương sống cho thế hệ AI Agent tự chủ hiện đại. Để hiểu rõ hơn bức tranh toàn cảnh về cách các tác tử thông minh đang biến đổi công nghệ, bạn đọc có thể tham khảo thêm tại chuyên mục AI Agent trên TrungTien.net.

ReAct Agent là gì? Giải mã bài báo nghiên cứu nền tảng của Yao et al.

ReAct là từ viết tắt ghép giữa Reasoning (Lập luận / Suy luận) và Acting (Hành động). Đây là một mô hình kiến trúc nhận thức cho phép các mô hình ngôn ngữ lớn luân phiên tạo ra các chuỗi suy luận logic nội tại song song với việc kích hoạt các hành động tương tác với môi trường bên ngoài để giải quyết một mục tiêu cụ thể.

Khái niệm ReAct lần đầu tiên được giới thiệu chính thức trong bài báo khoa học mang tính bước ngoặt có tiêu đề: “ReAct: Synergizing Reasoning and Acting in Language Models”. Công trình này được thực hiện bởi nhóm tác giả gồm Shunyu Yao và Karthik Narasimhan từ Đại học Princeton, phối hợp cùng các nhà nghiên cứu hàng đầu tại Google Research (Brain Team) như Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran và Yuan Cao. Bài báo được công bố vào tháng 10 năm 2022 và xuất bản chính thức tại hội nghị quốc tế danh giá ICLR 2023 (International Conference on Learning Representations).

Khởi nguồn cảm hứng của ReAct xuất phát từ chính cơ chế nhận thức tự nhiên của con người. Khi một người đối mặt với một vấn đề phức tạp trong cuộc sống hàng ngày – chẳng hạn như nấu một món ăn mới hoặc chẩn đoán sự cố động cơ xe hơi – chúng ta không bao giờ hành động một cách hoàn toàn bản năng, và cũng không bao giờ chỉ ngồi yên suy nghĩ thuần túy trong đầu rồi hy vọng bài toán tự biến mất.

Thay vào đó, con người liên tục thực hiện một điệu vũ nhịp nhàng giữa suy ngẫm và tương tác:

  • Chúng ta mở tủ lạnh để kiểm tra nguyên liệu hiện có (Hành động & Quan sát).
  • Chúng ta tự nhủ trong đầu: “Mình còn thiếu trứng và sốt cà chua, cần phải đặt hàng qua ứng dụng giao hàng siêu tốc” (Suy luận).
  • Chúng ta cầm điện thoại mở app và bấm đặt hai món đồ đó (Hành động).
  • Chúng ta nhìn thấy thông báo tài xế đang giao hàng và dự kiến đến sau 15 phút (Quan sát).
  • Chúng ta tiếp tục tính toán: “Trong 15 phút này, mình nên sơ chế hành tây và luộc mì trước để tiết kiệm thời gian” (Suy luận).

Nhóm nghiên cứu của Yao et al. đã nhận thấy rằng: nếu mô phỏng chính xác sự kết hợp biện chứng này vào mô hình ngôn ngữ lớn, chúng ta sẽ tạo ra một hệ thống có khả năng tự sửa lỗi phi thường. Trong ReAct, suy luận định hướng hành động (Reasoning guides Acting) giúp mô hình biết rõ mình đang làm gì và cần tìm kiếm điều gì. Đồng thời, kết quả của hành động neo chặt suy luận vào thực tế (Acting grounds Reasoning), loại bỏ triệt để hiện tượng ảo giác do suy đoán mò mẫm.

Chi tiết chu trình nhận thức Thought – Action – Observation (T-A-O Loop)

Trái tim của mọi ReAct Agent chính là chu trình khép kín mang tên Thought – Action – Observation (T-A-O Loop). Đây là một vòng lặp phản hồi nhiều bước (multi-turn loop) diễn ra liên tục cho đến khi tác tử đạt được kết quả cuối cùng hoặc thỏa mãn điều kiện dừng. Hãy cùng mổ xẻ từng giai đoạn trong chu trình này.

1. Thought (Suy nghĩ nội tại và Lập luận logic)

Giai đoạn Thought là nơi mô hình ngôn ngữ lớn tạo ra các dòng suy nghĩ nội tâm (inner monologue) bằng ngôn ngữ tự nhiên. Khác với các mô hình thông thường chỉ trực tiếp đưa ra câu trả lời cho người dùng, ReAct yêu cầu mô hình phải dành một khoảng không gian văn bản để tự phân tích tình huống hiện tại.

Trong bước Thought, Agent thường thực hiện các tác vụ nhận thức quan trọng sau:

  • Phân rã bài toán (Task Decomposition): Chia nhỏ câu hỏi lớn phức tạp thành các mục tiêu con đơn giản hơn có thể giải quyết từng bước một.
  • Đánh giá tri thức hiện hữu: Nhận diện xem những dữ liệu nào đã có sẵn trong ngữ cảnh và những thông tin then chốt nào còn thiếu để hoàn thành mục tiêu.
  • Xây dựng giả thuyết và chiến lược: Quyết định xem bước tiếp theo nên làm gì, công cụ nào là phù hợp nhất trong kho công cụ được cung cấp và tham số nào cần truyền vào.
  • Phân tích kết quả quan sát trước đó: Đọc lại dữ liệu trả về từ hành động ở vòng lặp trước, đánh giá xem kết quả đó có giải quyết được thắc mắc hay không, hoặc có xuất hiện lỗi cần điều chỉnh hướng đi hay không.

2. Action (Hành động tương tác với môi trường)

Sau khi giai đoạn Thought kết thúc với một quyết định rõ ràng, Agent tiến hành phát ra một Action. Action là một chỉ lệnh có cấu trúc cụ thể, tuân thủ theo một quy ước định dạng định trước để hệ thống phần mềm bao ngoài (Agent Runtime) có thể nhận diện và thực thi.

Mỗi Action chuẩn tắc trong kiến trúc ReAct bao gồm hai thành phần cốt lõi:

  • Action Name (Tên công cụ): Định danh chính xác công cụ cần triệu hồi từ danh sách công cụ đã đăng ký (ví dụ: Search, DatabaseQuery, Calculator, PythonInterpreter, SendEmail).
  • Action Input (Tham số đầu vào): Chuỗi tham số truyền vào công cụ để thực thi nhiệm vụ cụ thể (ví dụ: từ khóa tìm kiếm, câu lệnh SQL, biểu thức toán học hoặc đoạn mã nguồn).

Khi Agent xuất ra cú pháp hành động, luồng sinh văn bản của LLM sẽ tạm thời dừng lại. Hệ thống máy chủ sẽ bắt lấy Action này và chuyển giao cho môi trường thực thi ngoại vi xử lý.

3. Observation (Quan sát phản hồi từ môi trường)

Observation là giai đoạn tiếp nhận dữ liệu phản hồi từ thế giới thực. Dữ liệu này không phải do mô hình ngôn ngữ tự tưởng tượng ra, mà là kết quả khách quan được trả về bởi công cụ ngoại vi sau khi thực hiện Action.

Phản hồi từ Observation có thể tồn tại dưới rất nhiều hình thức đa dạng:

  • Một đoạn văn bản tóm tắt trích xuất từ kết quả tìm kiếm của Google hoặc Bing.
  • Một bảng dữ liệu JSON chứa thông tin đơn hàng từ cơ sở dữ liệu PostgreSQL.
  • Một con số chính xác thu được từ phép tính số học của thư viện toán học.
  • Một thông báo lỗi (Error message) như HTTP 404 Not Found hoặc lỗi cú pháp SQL Syntax Error.

Chuỗi dữ liệu Observation này ngay lập tức được hệ thống ghép nối vào lịch sử hội thoại (Context History) của LLM. Khi đó, toàn bộ ngữ cảnh mới gồm câu hỏi ban đầu, Thought 1, Action 1 và Observation 1 sẽ được gửi lại cho LLM để kích hoạt vòng lặp tiếp theo.

4. Cơ chế phản hồi và Điểm dừng (Termination Condition)

Chu trình Thought – Action – Observation tiếp tục vận hành tuần tự theo dạng mắt xích. Ở mỗi bước lặp, Agent tích lũy thêm bằng chứng thực tế và dần thu hẹp khoảng cách đến câu trả lời cuối cùng.

Vòng lặp sẽ chính thức kết thúc khi một trong hai điều kiện sau được thỏa mãn:

  • Hoàn thành mục tiêu: Trong bước Thought, Agent nhận thấy rằng toàn bộ dữ liệu cần thiết đã được thu thập đầy đủ và chính xác. Khi đó, thay vì phát ra một Action mới, Agent sẽ phát ra từ khóa Final Answer: kèm theo câu trả lời hoàn chỉnh cho người dùng.
  • Chạm ngưỡng an toàn (Safety Boundary): Nếu Agent vượt quá số vòng lặp tối đa được thiết lập trước (Max Iterations) hoặc chạm giới hạn thời gian (Timeout), hệ thống sẽ chủ động ngắt vòng lặp để ngăn ngừa việc lãng phí tài nguyên và chi phí API.

Ví dụ minh họa chi tiết: Từng bước ReAct giải bài toán đa chặng (Multi-hop QA)

Để thấy rõ sức mạnh vượt trội của ReAct Agent so với các mô hình thông thường, chúng ta hãy cùng phân tích một kịch bản thực tế với câu hỏi kiểm tra tri thức đa chặng (Multi-hop Reasoning) đòi hỏi kết hợp giữa tra cứu sự kiện lịch sử, xác minh thông tin nhân sự và tính toán khoảng cách thời gian.

Câu hỏi đặt ra cho Agent: “Bộ phim nào đã đoạt giải Oscar cho Phim hay nhất tại lễ trao giải lần thứ 96 năm 2024, đạo diễn của bộ phim đó sinh năm bao nhiêu, và vị đạo diễn này sinh ra sau sự kiện con người lần đầu đặt chân lên Mặt Trăng bao nhiêu năm?”

Dưới đây là bản ghi vết thực thi thực tế (Execution Trace) từng bước của ReAct Agent:

Question: Bộ phim nào đã đoạt giải Oscar Phim hay nhất 2024, đạo diễn sinh năm nào, và sinh sau sự kiện Mặt Trăng bao nhiêu năm?

Thought 1: Câu hỏi này có 3 phần cần giải quyết tuần tự:
1. Tìm tên bộ phim đoạt giải Oscar Phim hay nhất tại lễ trao giải lần thứ 96 năm 2024 và tên đạo diễn của phim.
2. Tìm năm sinh của vị đạo diễn đó.
3. Tìm năm con người lần đầu tiên đặt chân lên Mặt Trăng, sau đó tính khoảng cách số năm chênh lệch.
Trước tiên, mình cần tra cứu kết quả giải Oscar 2024.
Action: Search
Action Input: phim đoạt giải Oscar Phim hay nhất năm 2024 đạo diễn

Observation 1: Tại lễ trao giải Oscar lần thứ 96 diễn ra vào ngày 10 tháng 3 năm 2024, bộ phim "Oppenheimer" đã xuất sắc giành giải thưởng Phim hay nhất (Best Picture). Bộ phim được đạo diễn bởi Christopher Nolan, người cũng đồng thời giành giải Đạo diễn xuất sắc nhất.

Thought 2: Mình đã xác định được bộ phim là "Oppenheimer" và đạo diễn là Christopher Nolan. Bây giờ mình cần tìm năm sinh chính xác của Christopher Nolan và năm diễn ra sự kiện tàu Apollo 11 hạ cánh đưa con người lần đầu đặt chân lên Mặt Trăng.
Action: Search
Action Input: Christopher Nolan ngày sinh và năm con người lần đầu đặt chân lên Mặt Trăng Apollo 11

Observation 2: Christopher Nolan sinh ngày 30 tháng 7 năm 1970 tại Westminster, Luân Đôn, Vương quốc Anh. Sự kiện con người lần đầu tiên đổ bộ lên Mặt Trăng được thực hiện bởi phi vụ Apollo 11 của NASA vào ngày 20 tháng 7 năm 1969, khi phi hành gia Neil Armstrong bước những bước chân đầu tiên trên bề mặt Mặt Trăng.

Thought 3: Mình đã có đầy đủ hai mốc thời gian:
- Năm sinh của Christopher Nolan: 1970.
- Năm con người lần đầu đặt chân lên Mặt Trăng: 1969.
Bây giờ mình cần tính khoảng cách chênh lệch số năm: 1970 trừ 1969. Mình sẽ gọi công cụ máy tính số học để đảm bảo tính chuẩn xác tuyệt đối.
Action: Calculator
Action Input: 1970 - 1969

Observation 3: 1

Thought 4: Phép tính cho kết quả là 1. Christopher Nolan sinh vào tháng 7 năm 1970, tức là khoảng 1 năm và 10 ngày sau sự kiện lịch sử Apollo 11 vào tháng 7 năm 1969. Mình đã có đầy đủ bằng chứng thực tế cho tất cả các vế của câu hỏi ban đầu. Bây giờ mình sẽ tổng hợp câu trả lời cuối cùng.
Final Answer: 
1. Bộ phim đoạt giải Oscar cho Phim hay nhất tại lễ trao giải lần thứ 96 (năm 2024) là "Oppenheimer".
2. Đạo diễn của bộ phim là Christopher Nolan, ông sinh ngày 30 tháng 7 năm 1970.
3. Sự kiện con người lần đầu tiên đặt chân lên Mặt Trăng (phi vụ Apollo 11) diễn ra vào ngày 20 tháng 7 năm 1969. Do đó, đạo diễn Christopher Nolan sinh ra sau sự kiện lịch sử này đúng 1 năm (chính xác là 1 năm và 10 ngày).

Nếu bạn đưa câu hỏi này cho một chatbot AI thông thường không có kiến trúc ReAct, mô hình rất có thể sẽ nhớ nhầm năm tổ chức Oscar lần thứ 96, nhầm lẫn giữa năm phát hành phim (2023) và năm trao giải (2024), hoặc nhầm lẫn trong phép trừ ngày tháng. Với ReAct, mỗi bước khẳng định đều đi kèm một hành động đối soát dữ liệu thực tế, loại bỏ hoàn toàn khả năng sai lệch thông tin.

So sánh chuyên sâu: ReAct vs Chain-of-Thought (CoT) vs Act-only

Để hiểu rõ vị thế vượt trội của ReAct trong ngành khoa học máy tính, chúng ta cần so sánh trực tiếp cơ chế này với hai tiền bối kiến trúc quan trọng: Chain-of-Thought (chỉ suy luận) và Action-only (chỉ hành động).

1. Chain-of-Thought (CoT-only): Tư duy xuất sắc nhưng bị cô lập

Phương pháp Chain-of-Thought (CoT) là một bước nhảy vọt của kỹ thuật Prompt Engineering khi cho phép mô hình ngôn ngữ tạo ra các bước suy luận trung gian trước khi trả lời. CoT cực kỳ hiệu quả trong các bài toán toán học trừu tượng hoặc các câu đố logic đòi hỏi nhiều bước biến đổi ký hiệu.

Tuy nhiên, tử huyệt của CoT nằm ở chỗ: nó hoàn toàn khép kín trong bộ nhớ tĩnh (Static Parametric Memory). Nếu một thông tin không có trong tập dữ liệu huấn luyện hoặc đã thay đổi theo thời gian, mô hình sẽ không có cách nào tự tra cứu. Tệ hại hơn, khi bước suy luận đầu tiên bị sai lệch một chi tiết nhỏ, lỗi sai đó sẽ khuếch đại qua các bước suy luận tiếp theo (Error Propagation), dẫn đến một kết luận hoàn toàn sai lầm nhưng được ngụy trang dưới một vỏ bọc logic có vẻ rất chặt chẽ.

2. Action-only (Act-only): Nhanh nhạy với thực tại nhưng thiếu tầm nhìn

Trái ngược với CoT, kiến trúc Action-only tập trung vào việc cấp quyền cho mô hình gọi công cụ liên tục để tương tác với môi trường bên ngoài. Ví dụ tiêu biểu là các trợ lý web thế hệ đầu: nhận câu hỏi, gõ tìm kiếm, bấm vào đường link, đọc nội dung và trả lời.

Thế nhưng, việc thiếu vắng các chuỗi suy luận nội tại khiến hệ thống Act-only trở nên mù quáng:

  • Không có khả năng tổng hợp sâu: Khi kết quả tìm kiếm trả về một trang tài liệu dài hàng nghìn từ, Act-only không biết cách tự đúc kết những điểm mấu chốt để phục vụ cho các bước sau.
  • Rơi vào vòng lặp vô tận: Khi một câu lệnh tìm kiếm không ra kết quả mong muốn, Act-only thường lặp đi lặp lại cùng một câu lệnh hoặc chỉ thay đổi vụn vặt từ khóa vì nó không có bước Thought để nhìn nhận thất bại và đổi chiến lược.
  • Khó theo dõi trạng thái nhiệm vụ: Trong các bài toán phức tạp kéo dài 5-10 bước, Act-only nhanh chóng quên mất mục tiêu cốt lõi ban đầu của người dùng.

3. ReAct: Sự kết hợp hoàn hảo giữa hai thế giới

ReAct giải quyết triệt để các nhược điểm trên bằng cách thiết lập mối quan hệ tương hỗ bền vững. Reasoning đóng vai trò là “hoa tiêu” dẫn đường cho Action, quyết định xem khi nào cần hành động, hành động ở đâu và phân tích ý nghĩa của dữ liệu thu về. Ngược lại, Action đóng vai trò là “mỏ neo” vững chắc cho Reasoning, cung cấp bằng chứng thực tế khách quan để giữ cho các bước suy luận luôn bám sát chân lý.

Trong các thử nghiệm thực nghiệm trên các bộ dữ liệu đo chuẩn quốc tế nổi tiếng như HotpotQA (hỏi đáp đa chặng) và FEVER (kiểm chứng thông tin), công trình của Yao et al. đã chứng minh rằng ReAct không chỉ đạt tỷ lệ chính xác cao hơn vượt bậc so với CoT và Act-only, mà còn loại bỏ gần như hoàn toàn các lỗi ảo giác phổ biến trong các mô hình ngôn ngữ lớn.

Bảng so sánh tổng hợp các kiến trúc suy luận của AI Agent

Dưới đây là bảng đối chiếu chi tiết giữa bốn trường phái kiến trúc tác tử phổ biến nhất hiện nay, giúp bạn dễ dàng lựa chọn giải pháp tối ưu cho hệ thống của mình:

Tiêu chí so sánh Chain-of-Thought (CoT) Action-only (Act-only) ReAct Framework Plan-and-Solve / Reflexion
Truy cập dữ liệu thời gian thực Không thể (bị giới hạn trong tri thức tĩnh) Có (gọi API / Search liên tục) Có (kết hợp công cụ theo nhu cầu suy luận) Có (thực thi theo kế hoạch phân rã)
Năng lực hoạch định chiến lược Khá tốt (nội tại, trừu tượng) Kém (hành động phản xạ cục bộ) Rất tốt (liên tục điều chỉnh theo quan sát) Tuyệt vời (lập kế hoạch tổng thể trước khi làm)
Mức độ minh bạch (Explainability) Trung bình (chỉ thấy suy nghĩ nội tâm) Thấp (chỉ thấy các lệnh gọi API thô) Rất cao (thấy cả suy nghĩ, hành động và dữ liệu) Rất cao (thấy rõ kế hoạch và các bước tự phản tư)
Khả năng tự sửa sai (Error Recovery) Kém (dễ bị lan truyền lỗi suy luận) Kém (dễ kẹt vòng lặp vô tận) Xuất sắc (dựa vào Observation để đổi hướng) Xuất sắc (tự đánh giá và viết lại kế hoạch)
Rủi ro ảo giác (Hallucination) Rất cao khi thiếu tri thức nền Thấp đối với dữ liệu tra cứu Rất thấp (được neo chặt bằng dữ liệu thực) Cực thấp (có bước phản tư kiểm chứng)
Chi phí Token & Độ trễ Thấp, tốc độ phản hồi nhanh Trung bình, phụ thuộc tốc độ API Cao hơn (do tích lũy ngữ cảnh nhiều vòng) Rất cao (đòi hỏi nhiều lượt gọi LLM lớn)
Độ phức tạp triển khai Rất đơn giản (chỉ cần thiết kế prompt) Trung bình (cần tích hợp API) Chuẩn mực (hỗ trợ sẵn trên LangChain / LlamaIndex) Phức tạp (cần điều phối luồng trạng thái nâng cao)

Hướng dẫn hiện thực hóa ReAct Agent với LangChain và Python

Sau khi đã nắm vững lý thuyết nền tảng, chúng ta sẽ bắt tay vào thực hành xây dựng một ReAct Agent hoàn chỉnh bằng ngôn ngữ Python. Chúng ta sẽ sử dụng LangChain – khung làm việc (framework) phổ biến nhất hiện nay cho việc phát triển các ứng dụng dựa trên LLM.

1. Cấu trúc Prompt mẫu chuẩn của ReAct

Để LLM hiểu được nó phải đóng vai một tác tử ReAct, chúng ta cần cung cấp một bản hướng dẫn hệ thống (System Prompt) chuẩn mực. Prompt này định nghĩa danh sách các công cụ có sẵn, quy định cú pháp nghiêm ngặt của chu trình T-A-O, và thiết lập điểm dừng khi có kết quả.

Dưới đây là cấu trúc Prompt kinh điển được sử dụng phổ biến trong LangChain Hub:

Answer the following questions as best you can. You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}
Thought:{agent_scratchpad}

2. Mã nguồn Python triển khai ReAct Agent thực tế

Trong ví dụ dưới đây, chúng ta sẽ xây dựng một ReAct Agent có khả năng hỗ trợ tài chính và chăm sóc khách hàng. Agent được trang bị hai công cụ: một công cụ tra cứu lịch sử mua hàng từ cơ sở dữ liệu khách hàng, và một công cụ máy tính số học an toàn để tính toán chính xác số tiền hoàn lại.

# -*- coding: utf-8 -*-
"""
Chuong trinh khoi tao ReAct Agent voi LangChain va Python
Chuyen muc: AI Agent tren TrungTien.net
"""

import os
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 1. Dinh nghia cac cong cu (Tools) ma Agent duoc phep su dung
@tool
def lookup_customer_order(customer_id: str) -> str:
    """Tra cuu thong tin don hang va gia tri mua hang cua khach hang dua vao Ma khach hang (Customer ID)."""
    # Gia lap co so du lieu noi bo cua doanh nghiep
    mock_db = {
        "KH-8821": "Khach hang Nguyen Van A, Don hang #ORD-2024: Mua 01 May tinh xach tay Dell, gia tri goc 1200 USD, phi van chuyen 30 USD, da thanh toan.",
        "KH-9932": "Khach hang Tran Thi B, Don hang #ORD-2025: Mua 02 Man hinh LG, gia tri goc 500 USD, ma giam gia 50 USD, da thanh toan."
    }
    customer_id_clean = customer_id.strip().upper()
    return mock_db.get(customer_id_clean, f"Khong tim thay thong tin cho ma khach hang: {customer_id}")

@tool
def safe_financial_calculator(expression: str) -> str:
    """Thuc hien phep tinh so hoc tai chinh chinh xac. Dau vao la bieu thuc toan hoc nhu: 1200 - 30 hoac (500 * 0.1) + 20."""
    try:
        # Su dung bo danh gia phep toan an toan
        allowed_chars = set("0123456789+-*/(). ")
        if not all(c in allowed_chars for c in expression):
            return "Loi: Bieu thuc chua ky tu khong hop le."
        result = eval(expression, {"__builtins__": None}, {})
        return str(round(result, 2))
    except Exception as e:
        return f"Loi tinh toan: {str(e)}"

# 2. Tap hop danh sach cac cong cu
tools = [lookup_customer_order, safe_financial_calculator]

# 3. Thiet lap Prompt Template chuan cho ReAct Agent
template = """Ban la mot tro ly cham soc khach hang thong minh va can trong.
Hay tra loi cau hoi cua nguoi dung mot cach chinh xac nhat bang cach ket hop giua suy luan va hanh dong.
Ban co quyen truy cap vao cac cong cu sau day:

{tools}

Hay tuan thu tuyet doi theo dinh dang sau:

Question: Cau hoi dau vao ma ban can giai quyet
Thought: Ban luon luon suy nghi can than ve viec can lam tiep theo
Action: Hanh dong can thuc hien, phai la mot trong so [{tool_names}]
Action Input: Tham so dau vao cho hanh dong do
Observation: Ket qua tra ve tu hanh dong do
... (chu trinh Thought/Action/Action Input/Observation nay co the lap lai nhieu lan neu can)
Thought: Toi da co du thong tin de dua ra cau tra loi cuoi cung
Final Answer: Cau tra loi hoan chinh, lich su va day du cho nguoi dung

Bat dau!

Question: {input}
Thought:{agent_scratchpad}"""

prompt = PromptTemplate.from_template(template)

# 4. Khoi tao mo hinh ngon ngu lon (LLM)
# Khuyen nghi su dung gpt-4o, gpt-4-turbo hoac claude-3-5-sonnet de dam bao tuan thu dinh dang tot nhat
llm = ChatOpenAI(
    model="gpt-4o",
    temperature=0.0
)

# 5. Khoi tao ReAct Agent va bo dieu phoi AgentExecutor
agent = create_react_agent(llm, tools, prompt)

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,                     # In toan bo chu trinh T-A-O ra man hinh de kiem tra
    handle_parsing_errors=True,        # Tu dong yeu cau model sua loi neu parse sai cu phap
    max_iterations=6                   # Gioi han toi da 6 vong lap de phong ngua ket vong lap
)

# 6. Chay thu nghiem mot yeu cau thuc te
if __name__ == "__main__":
    user_query = "Khach hang ma KH-8821 muon tra hang va yeu cau hoan tien san pham. Theo chinh sach, phi van chuyen khong duoc hoan lai va khach hang phai chiu phi xu ly kho 5% tren gia tri goc cua san pham. Hay tinh so tien chinh xac khach hang se nhan lai duoc la bao nhieu USD?"
    
    print("=== DANG XU LY TRUY VAN RE-ACT AGENT ===")
    response = agent_executor.invoke({"input": user_query})
    print("
=== KET QUA CUOI CUNG ===")
    print(response["output"])

3. Cơ chế hoạt động ngầm của AgentExecutor và OutputParser

Khi bạn chạy đoạn mã trên, điều kỳ diệu nào đang diễn ra phía sau hậu trường? Đó chính là sự phối hợp ăn ý giữa ba thành phần kỹ thuật cốt lõi:

  • Stream Token & Regex Parsing: Trong lúc LLM đang sinh văn bản, bộ phận OutputParser liên tục sử dụng biểu thức chính quy (Regex) để rà quét các từ khóa đặc thù như Action: và Action Input:. Ngay khi phát hiện ra một cấu trúc hành động hoàn chỉnh, hệ thống sẽ phát tín hiệu ngắt (stop sequence) để LLM dừng sinh văn bản tiếp.
  • Tool Dispatcher: AgentExecutor đọc tên công cụ trong trường Action, tìm kiếm hàm Python tương ứng trong danh sách công cụ đã đăng ký, truyền tham số trong Action Input vào hàm và thực thi.
  • Context Appending: Kết quả trả về của hàm Python được bọc vào chuỗi tiền tố Observation: và được tự động nối vào trường agent_scratchpad. Khi đó, toàn bộ câu chuyện từ đầu đến thời điểm hiện tại được gửi lại cho LLM để thực hiện lượt suy nghĩ kế tiếp.

Phân tích ưu điểm vượt trội và các giới hạn kỹ thuật cần khắc phục

Bất kỳ một giải pháp công nghệ nào cũng tồn tại hai mặt: những thế mạnh vượt trội giúp khai phóng giá trị mới và những thách thức kỹ thuật đòi hỏi các kỹ sư phải dày công tối ưu. ReAct Agent cũng không phải là ngoại lệ.

Những ưu điểm vượt trội của ReAct Framework

  • Tính minh bạch và khả năng giải thích xuất sắc (Explainability & Auditability): Trong các hệ sinh thái AI “hộp đen”, người dùng thường không biết tại sao mô hình lại đưa ra kết luận như vậy. Với ReAct, toàn bộ quá trình lập luận và các nguồn dữ liệu được sử dụng đều được phơi bày rõ ràng qua từng bước Thought và Observation. Điều này đặc biệt quan trọng đối với các lĩnh vực đòi hỏi tính tuân thủ pháp lý cao như tài chính, y tế và pháp luật.
  • Triệt tiêu ảo giác thông qua cơ chế neo tri thức (Grounding): Bằng cách buộc mô hình phải tương tác với các công cụ tra cứu thực tế trước khi khẳng định một thông tin, ReAct giảm thiểu tối đa tình trạng AI tự bịa đặt dữ liệu hoặc đưa ra các số liệu sai lệch.
  • Khả năng tự phục hồi và thích ứng linh hoạt (Error Resilience): Khi một Action bị thất bại (ví dụ: API trả về lỗi mạng hoặc cơ sở dữ liệu không tìm thấy bản ghi), bước Thought tiếp theo sẽ tự động phân tích nguyên nhân lỗi và tìm kiếm một giải pháp thay thế, thay vì dừng lại hoặc văng lỗi cho người dùng cuối.
  • Khả năng mở rộng vô hạn (Extensibility): ReAct Agent hoạt động theo nguyên lý Plug-and-Play. Bạn có thể dễ dàng bổ sung thêm hàng chục công cụ mới vào kho công cụ (từ việc gửi tin nhắn Slack, chạy script bash trên server, cho đến tra cứu tài liệu nội bộ qua vector database) mà không cần phải huấn luyện lại bất kỳ trọng số nào của mô hình ngôn ngữ lớn.

Những giới hạn kỹ thuật và thách thức trong thực tế

  • Chi phí Token gia tăng lũy tiến (Token Overhead): Do cơ chế gửi lại toàn bộ lịch sử Thought, Action và Observation qua từng vòng lặp, độ dài ngữ cảnh (Context Window) phình to rất nhanh. Nếu một tác tử phải thực hiện 5-7 bước lặp và mỗi Observation chứa văn bản dài, chi phí token API cho mỗi truy vấn có thể cao gấp 5 đến 10 lần so với một lệnh gọi LLM thông thường.
  • Độ trễ phản hồi lớn (High Latency): Mỗi chu trình T-A-O là một chuỗi các thao tác tuần tự: gọi LLM sinh suy nghĩ và hành động, chờ mạng internet gọi API ngoại vi, nhận kết quả rồi lại gọi tiếp LLM. Do đó, thời gian để Agent hoàn thành một nhiệm vụ phức tạp thường dao động từ 5 đến 30 giây, không phù hợp cho các trải nghiệm giao diện người dùng đòi hỏi phản hồi tức thì dưới 1 giây.
  • Nguy cơ kẹt trong vòng lặp vô tận (Stuck in Infinite Loop): Nếu các công cụ trả về kết quả mơ hồ, mâu thuẫn hoặc prompt hướng dẫn chưa đủ chặt chẽ, Agent có thể rơi vào trạng thái bế tắc: liên tục suy nghĩ quanh quẩn và thực hiện lặp đi lặp lại một hành động mà không thể tiến tới Final Answer.
  • Đòi hỏi năng lực cao từ mô hình nền (Model Reasoning Threshold): ReAct yêu cầu mô hình ngôn ngữ phải vừa có năng lực suy luận trừu tượng tốt, vừa phải tuân thủ nghiêm ngặt định dạng cú pháp. Các mô hình mã nguồn mở nhỏ (dưới 7B – 13B tham số) thường rất dễ phá vỡ định dạng hoặc sinh ra các hành động vô nghĩa, đòi hỏi các nhà phát triển phải sử dụng các mô hình lớn đắt tiền như GPT-4o, Claude 3.5 Sonnet hoặc Llama 3 70B.

4 Ứng dụng thực tế đột phá của ReAct Agent trong doanh nghiệp

Nhờ khả năng kết hợp nhuần nhuyễn giữa tư duy logic và hành động thực thi, ReAct Agent đang được triển khai mạnh mẽ trong nhiều lĩnh vực kinh doanh trọng yếu, mang lại năng suất đột phá cho doanh nghiệp.

1. Chăm sóc khách hàng thông minh và Xử lý khiếu nại đa hệ thống

Trong các sàn thương mại điện tử hoặc công ty công nghệ lớn, các yêu cầu khiếu nại của khách hàng thường liên quan đến nhiều hệ thống phần mềm khác nhau. Một ReAct Agent có thể tự động tiếp nhận tin nhắn của khách hàng: “Tôi đã đặt hàng cách đây 4 ngày nhưng chưa nhận được, mã đơn hàng là #DH-1029, tôi muốn đổi địa chỉ nhận hàng và yêu cầu giao gấp”.

Agent sẽ vận hành chu trình T-A-O: Thought 1 (nhận diện mã đơn hàng) -> Action 1 (tra cứu trạng thái trên hệ thống OMS) -> Observation 1 (đơn hàng đang ở kho trung chuyển) -> Thought 2 (kiểm tra xem đơn hàng đã xuất kho chưa để xác định quyền đổi địa chỉ) -> Action 2 (gọi API cập nhật địa chỉ mới trên hệ thống vận chuyển) -> Observation 2 (thành công) -> Final Answer (gửi tin nhắn thông báo chi tiết, lịch sự và trấn an khách hàng).

2. Trợ lý Phân tích Dữ liệu kinh doanh và Báo cáo tài chính (BI & Data Analytics)

Thay vì các nhà quản lý phải chờ đợi đội ngũ kỹ sư dữ liệu viết mã SQL và xuất báo cáo trong nhiều ngày, ReAct Agent đóng vai trò là một chuyên gia phân tích dữ liệu túc trực 24/7. Khi giám đốc hỏi: “Doanh thu bán lẻ tháng này tăng hay giảm so với tháng trước, và nhóm sản phẩm nào có tỷ lệ hoàn trả hàng cao nhất?”

Agent sẽ tự động suy luận để viết các câu lệnh SQL truy vấn vào Data Warehouse (Snowflake, BigQuery), đọc dữ liệu trả về, sau đó gọi công cụ Python để tính toán phần trăm biến động và vẽ biểu đồ trực quan, trước khi đúc kết một bản tóm tắt chiến lược cho ban giám đốc.

3. Nghiên cứu thị trường chuyên sâu và Kiểm chứng thông tin (Deep Research)

Trong công tác nghiên cứu thị trường, việc đọc hàng trăm bài báo và báo cáo phân tích đối thủ cạnh tranh tiêu tốn rất nhiều thời gian của chuyên viên. ReAct Agent có thể nhận một chủ đề lớn, tự động phân rã thành các câu hỏi tra cứu nhỏ, tìm kiếm trên nhiều nguồn tin tức uy tín, đối chiếu chéo số liệu giữa các báo cáo tài chính công khai, loại bỏ thông tin rác và xuất ra một tài liệu tổng quan toàn diện với đầy đủ nguồn trích dẫn kiểm chứng.

4. Tự động hóa vận hành hạ tầng đám mây và AIOps (Site Reliability Engineering)

Trong ngành kỹ thuật phần mềm, khi một dịch vụ đám mây gặp sự cố (ví dụ hệ thống microservice báo lỗi HTTP 500), ReAct Agent có thể đóng vai trò là kỹ sư trực ban phản ứng nhanh. Agent sẽ kết nối vào hệ thống giám sát (Datadog, Grafana), tra cứu log lỗi trên ElasticSearch, phân tích chuỗi lỗi để xác định nguyên nhân (ví dụ: tràn bộ nhớ heap do rò rỉ bộ nhớ), tự động gửi lệnh khởi động lại container trên Kubernetes và viết báo cáo tóm tắt sự cố (Post-mortem) vào kênh Slack nội bộ của đội ngũ kỹ sư.

Kinh nghiệm thực chiến tối ưu hóa ReAct Agent trong môi trường Production

Việc chạy thử nghiệm ReAct Agent trên môi trường phát triển (Development) tương đối đơn giản, nhưng để đưa một hệ thống tác tử vào phục vụ hàng triệu người dùng trong môi trường Production thực tế đòi hỏi sự chuẩn bị kỹ lưỡng về mặt kiến trúc. Dưới đây là những kinh nghiệm thực chiến đắt giá:

  • Cắt tỉa và Tóm tắt dữ liệu quan sát (Observation Truncation & Summarization): Đừng bao giờ nhồi toàn bộ mã HTML của một trang web hay một file JSON nặng hàng Megabyte vào Observation. Hãy sử dụng các hàm tiền xử lý để lọc ra các trường dữ liệu quan trọng nhất, hoặc dùng một mô hình ngôn ngữ nhỏ giá rẻ (như GPT-4o-mini hoặc Claude 3.5 Haiku) để tóm tắt dữ liệu trước khi nạp vào context của ReAct Agent chính.
  • Cài đặt chốt chặn an toàn (Circuit Breakers): Luôn luôn thiết lập tham số max_iterations (thường từ 4 đến 6 bước) và max_execution_time (tối đa 30-45 giây). Điều này đảm bảo rằng ngay cả khi Agent rơi vào tình huống bế tắc, hệ thống vẫn sẽ ngắt kết nối an toàn và trả về thông báo phù hợp cho người dùng thay vì đốt cạn ngân sách API.
  • Kết hợp ReAct với Tool Calling bản quyền (Native Function Calling): Mặc dù bài báo gốc của ReAct sử dụng chuỗi văn bản tự do thông qua Prompting, nhưng trong môi trường thực tế hiện nay, việc kết hợp ReAct với tính năng Function Calling / Tool Calling tích hợp sẵn của OpenAI, Anthropic hay Google sẽ giúp việc phân tách cấu trúc Action và Action Input đạt độ chính xác gần như tuyệt đối 100%, loại bỏ triệt để các lỗi parse cú pháp văn bản.
  • Giám sát và Truy vết toàn diện (Agent Tracing & Observability): Tích hợp ngay các công cụ giám sát chuyên dụng cho AI Agent như LangSmith, Langfuse hoặc Arize Phoenix. Việc ghi lại chi tiết từng bước Thought, Action, thời gian phản hồi của từng Tool và lượng token tiêu thụ sẽ giúp bạn nhanh chóng phát hiện các điểm nghẽn hiệu năng và tối ưu hóa hệ thống liên tục.

Câu hỏi thường gặp (FAQ) về ReAct Agent

Dưới đây là lời giải đáp cho những câu hỏi thường gặp nhất của các nhà phát triển và doanh nghiệp khi tiếp cận ReAct Framework:

1. ReAct Agent khác gì so với kỹ thuật Function Calling (Tool Calling) thông thường?

Function Calling là một tính năng cấp thấp ở tầng mô hình, cho phép LLM xuất ra dữ liệu định dạng JSON để gọi một hàm cụ thể. Trong khi đó, ReAct là một mô hình kiến trúc nhận thức ở tầng cao hơn. Function Calling đơn thuần chỉ giải quyết bài toán “làm thế nào để gọi hàm chuẩn xác”, còn ReAct giải quyết bài toán “tại sao phải gọi hàm đó, gọi xong thì phân tích kết quả thế nào và bước đi tiếp theo là gì thông qua chuỗi suy luận Thought”. Hiện nay, các hệ thống tiên tiến thường sử dụng chính Function Calling làm cơ chế thực thi cho pha Action trong vòng lặp ReAct.

2. Khi nào nên sử dụng ReAct Agent thay vì mô hình RAG truyền thống?

Mô hình RAG (Retrieval-Augmented Generation) truyền thống hoạt động theo đường thẳng một chiều: nhận câu hỏi, tìm kiếm các đoạn văn bản liên quan trong cơ sở dữ liệu vector, ghép vào prompt và trả lời một lần duy nhất. RAG phù hợp cho các câu hỏi tra cứu thông tin tĩnh, đơn giản. Ngược lại, bạn nên sử dụng ReAct Agent khi bài toán mang tính đa chặng (multi-hop), đòi hỏi phải kết hợp nhiều nguồn dữ liệu khác nhau, cần tính toán số học, hoặc cần tương tác làm thay đổi trạng thái hệ thống (như ghi dữ liệu vào CRM, gửi email, gọi webhook).

3. Những mô hình ngôn ngữ (LLM) nào hoạt động hiệu quả nhất với ReAct Agent?

Để vận hành ReAct Agent ổn định, mô hình nền tảng cần có năng lực lập luận xuất sắc và tuân thủ định dạng chặt chẽ. Các mô hình thương mại hàng đầu hiện nay bao gồm GPT-4o, Claude 3.5 Sonnet và Gemini 1.5 Pro. Nếu bạn muốn triển khai mô hình mã nguồn mở trên hạ tầng riêng (On-premise), các lựa chọn tối ưu nhất hiện nay là Meta Llama 3 (phiên bản 70B hoặc 405B) và Qwen 2.5 (phiên bản 72B).

4. Làm thế nào để kiểm soát chi phí token khi vận hành ReAct Agent ở quy mô lớn?

Để kiểm soát chi phí, bạn có thể áp dụng chiến lược kết hợp đa mô hình (Model Cascading): sử dụng mô hình nhỏ và rẻ (như GPT-4o-mini hoặc Claude 3.5 Haiku) cho các bước lặp trung gian đòi hỏi tác vụ đơn giản, và chỉ triệu hồi mô hình lớn (như GPT-4o hoặc Claude 3.5 Sonnet) cho các bước phân tích phức tạp hoặc bước sinh Final Answer. Ngoài ra, việc giới hạn số vòng lặp tối đa và rút gọn kích thước dữ liệu Observation là bắt buộc.

5. ReAct Agent có thể tự động viết và thực thi mã nguồn Python được không?

Hoàn toàn có thể. Khi bạn cung cấp một công cụ Python Code Interpreter chạy trong môi trường hộp cát (Sandbox) an toàn (như Docker hoặc E2B), ReAct Agent có thể tự động viết mã Python, thực thi mã trong Action, đọc kết quả in ra (stdout) hoặc thông báo lỗi trong Observation, sau đó suy luận tiếp để sửa mã hoặc trả lời câu hỏi. Đây chính là cách thức vận hành của tính năng Advanced Data Analysis trên ChatGPT.

6. Sau ReAct, những mô hình tác tử AI nào đang được xem là bước tiến hóa tiếp theo?

Mặc dù ReAct là nền tảng vững chắc, cộng đồng AI đã phát triển thêm các kiến trúc tiến hóa hơn để giải quyết các bài toán siêu phức tạp. Đáng chú ý nhất là: Plan-and-Solve (lập toàn bộ kế hoạch tổng thể trước rồi mới thực thi từng bước), Reflexion (bổ sung bộ nhớ phản tư dài hạn và tự đánh giá điểm số chất lượng), và LATS (Language Agent Tree Search) (kết hợp ReAct với thuật toán tìm kiếm cây Monte Carlo để khám phá nhiều kịch bản hành động song song).

Lời kết: Khai phóng tiềm năng tự chủ cùng ReAct Agent

ReAct không đơn thuần chỉ là một kỹ thuật prompt hay một bài báo khoa học mang tính học thuật thuần túy; nó là một triết lý thiết kế nền tảng đánh dấu bước chuyển mình mang tính lịch sử của trí tuệ nhân tạo. Bằng cách thiết lập cây cầu nối vững chắc giữa tư duy trừu tượng và hành động thực tế, ReAct đã đưa AI vượt ra khỏi giới hạn của một cỗ máy đàm thoại thụ động để trở thành những tác tử số tự chủ, tháo vát và đáng tin cậy.

Việc thấu hiểu bản chất của chu trình Thought – Action – Observation cùng các kỹ thuật triển khai thực tiễn sẽ là hành trang vô giá cho mọi lập trình viên, kỹ sư dữ liệu và nhà lãnh đạo công nghệ trong làn sóng phát triển mới. Kỷ nguyên của các trợ lý AI biết suy nghĩ thấu đáo và biết hành động chuẩn xác đã chính thức bắt đầu.

Để tiếp tục cập nhật những kiến thức chuyên sâu, các hướng dẫn lập trình thực chiến và các bài phân tích công nghệ mới nhất về thế giới tác tử thông minh, mời bạn đọc theo dõi thường xuyên tại chuyên mục AI Agent trên TrungTien.net. Hãy cùng chúng tôi làm chủ công nghệ và kiến tạo tương lai số ngay hôm nay!

tiennguyen25

Leave a Reply

Your email address will not be published. Required fields are marked *