Skip to content
Lesson 12/12 · Prompt engineering từ cơ bản đến trung cấp (DAIR.AI)

ReAct prompting

ReAct cho LLM sinh xen kẽ chuỗi suy luận và hành động theo tác vụ, kết quả trên tác vụ tri thức và ra quyết định, và ví dụ dùng ReAct với LangChain.

This content is currently available in Vietnamese only.

Intermediate@shine190410 min read

Yao et al., 2022 giới thiệu một framework tên ReAct, trong đó LLM được dùng để sinh cả chuỗi suy luận (reasoning trace) lẫn hành động theo tác vụ (task-specific action) một cách xen kẽ. Bài này giải thích ReAct hoạt động thế nào và hiệu quả ra sao.

Tổng quan

Sinh chuỗi suy luận cho phép model hình thành, theo dõi và cập nhật kế hoạch hành động, thậm chí xử lý ngoại lệ. Bước hành động cho phép giao tiếp và thu thập thông tin từ nguồn bên ngoài như cơ sở tri thức hoặc môi trường.

Framework ReAct có thể cho phép LLM tương tác với tool bên ngoài để lấy thêm thông tin, dẫn tới câu trả lời đáng tin cậy và đúng sự kiện hơn.

Kết quả cho thấy ReAct có thể vượt nhiều baseline hàng đầu trên các tác vụ ngôn ngữ và ra quyết định. ReAct cũng giúp con người dễ diễn giải và tin tưởng LLM hơn. Nhìn chung, các tác giả thấy cách tốt nhất là dùng ReAct kết hợp chain-of-thought (CoT), cho phép dùng cả kiến thức nội tại lẫn thông tin bên ngoài thu được trong quá trình suy luận.

Cách hoạt động

ReAct được lấy cảm hứng từ sự cộng hưởng giữa "hành động" và "suy luận", thứ giúp con người học tác vụ mới, ra quyết định hoặc suy luận.

Chain-of-thought (CoT) prompting đã cho thấy khả năng của LLM trong việc tạo chuỗi suy luận để trả lời các câu hỏi về số học, suy luận thường thức và các tác vụ khác (Wei et al., 2022). Nhưng việc không truy cập được thế giới bên ngoài hoặc không cập nhật được kiến thức có thể dẫn tới các vấn đề như ảo giác về sự kiện và lan truyền lỗi.

ReAct là một mô hình tổng quát kết hợp suy luận và hành động với LLM. ReAct prompt cho LLM sinh chuỗi suy luận bằng lời và hành động cho một tác vụ. Điều này cho phép hệ thống suy luận linh hoạt để tạo, duy trì và điều chỉnh kế hoạch hành động, đồng thời cho phép tương tác với môi trường bên ngoài (ví dụ Wikipedia) để đưa thêm thông tin vào quá trình suy luận. Hình dưới đây cho thấy một ví dụ ReAct và các bước khác nhau để thực hiện hỏi đáp.

Ví dụ ReAct

Nguồn ảnh: Yao et al., 2022

Trong ví dụ trên, chúng ta đưa vào một prompt như câu hỏi sau từ HotpotQA:

code
Aside from the Apple Remote, what other devices can control the program Apple Remote was originally designed to interact with?

Lưu ý rằng các ví dụ trong ngữ cảnh cũng được thêm vào prompt, nhưng ở đây được lược bỏ cho đơn giản. Có thể thấy model sinh ra các quỹ đạo giải tác vụ (Thought, Act). Obs tương ứng với observation (quan sát) từ môi trường đang tương tác (ví dụ công cụ tìm kiếm). Về bản chất, ReAct có thể truy xuất thông tin để hỗ trợ suy luận, còn suy luận giúp xác định cần truy xuất gì tiếp theo.

ReAct prompting

Để minh hoạ ReAct prompting hoạt động thế nào, chúng ta hãy theo một ví dụ trong bài báo.

Bước đầu tiên là chọn các trường hợp từ một tập huấn luyện (ví dụ HotPotQA) và soạn các quỹ đạo theo định dạng ReAct. Chúng được dùng làm ví dụ few-shot trong prompt. Các quỹ đạo gồm nhiều bước thought-action-observation như trong hình trên. Các suy nghĩ dạng tự do được dùng cho nhiều việc như phân rã câu hỏi, trích xuất thông tin, suy luận thường thức/số học, định hướng cách tìm kiếm và tổng hợp câu trả lời cuối cùng.

Đây là ví dụ về các ví dụ mẫu trong prompt ReAct (lấy từ bài báo và rút gọn còn một ví dụ cho đơn giản):

code
Question What is the elevation range for the area that the eastern sector of the
Colorado orogeny extends into?
Thought 1 I need to search Colorado orogeny, find the area that the eastern sector
of the Colorado orogeny extends into, then find the elevation range of the
area.
Action 1 Search[Colorado orogeny]
Observation 1 The Colorado orogeny was an episode of mountain building (an orogeny) in
Colorado and surrounding areas.
Thought 2 It does not mention the eastern sector. So I need to look up eastern
sector.
Action 2 Lookup[eastern sector]
Observation 2 (Result 1 / 1) The eastern sector extends into the High Plains and is called
the Central Plains orogeny.
Thought 3 The eastern sector of Colorado orogeny extends into the High Plains. So I
need to search High Plains and find its elevation range.
Action 3 Search[High Plains]
Observation 3 High Plains refers to one of two distinct land regions
Thought 4 I need to instead search High Plains (United States).
Action 4 Search[High Plains (United States)]
Observation 4 The High Plains are a subregion of the Great Plains. From east to west, the
High Plains rise in elevation from around 1,800 to 7,000 ft (550 to 2,130
m).[3]
Thought 5 High Plains rise in elevation from around 1,800 to 7,000 ft, so the answer
is 1,800 to 7,000 ft.
Action 5 Finish[1,800 to 7,000 ft]
...

Lưu ý rằng các loại tác vụ khác nhau dùng thiết lập prompt khác nhau. Với các tác vụ mà suy luận là quan trọng nhất (ví dụ HotpotQA), quỹ đạo giải tác vụ dùng nhiều bước thought-action-observation. Với các tác vụ ra quyết định gồm rất nhiều bước hành động, suy nghĩ được dùng thưa thớt.

Video kèm bài: ReAct trên YouTube.

Kết quả trên tác vụ cần nhiều kiến thức

Bài báo trước hết đánh giá ReAct trên các tác vụ suy luận cần nhiều kiến thức như hỏi đáp (HotPotQA) và kiểm chứng sự kiện (Fever). PaLM-540B được dùng làm model nền để prompt.

Kết quả ReAct trên HotPotQA và Fever

Nguồn ảnh: Yao et al., 2022

Kết quả prompt trên HotPotQA và Fever với các phương pháp prompt khác nhau cho thấy ReAct nhìn chung tốt hơn Act (chỉ hành động) ở cả hai tác vụ.

Cũng có thể thấy ReAct vượt CoT trên Fever nhưng kém CoT trên HotpotQA. Bài báo có phân tích lỗi chi tiết. Tóm lại:

  • CoT bị ảo giác về sự kiện
  • Ràng buộc cấu trúc của ReAct làm giảm sự linh hoạt khi xây dựng các bước suy luận
  • ReAct phụ thuộc nhiều vào thông tin nó truy xuất; kết quả tìm kiếm không có ích làm suy luận của model đi chệch và khó phục hồi, xây dựng lại suy nghĩ

Các phương pháp prompt kết hợp và cho phép chuyển qua lại giữa ReAct và CoT+Self-Consistency nhìn chung vượt mọi phương pháp prompt khác.

Kết quả trên tác vụ ra quyết định

Bài báo cũng báo cáo kết quả cho thấy hiệu năng của ReAct trên tác vụ ra quyết định. ReAct được đánh giá trên hai benchmark là ALFWorld (trò chơi dạng văn bản) và WebShop (môi trường website mua sắm trực tuyến). Cả hai đều là môi trường phức tạp, cần suy luận để hành động và khám phá hiệu quả.

Lưu ý rằng prompt ReAct được thiết kế khác cho các tác vụ này, nhưng vẫn giữ cùng ý tưởng cốt lõi là kết hợp suy luận và hành động. Dưới đây là ví dụ một bài toán ALFWorld dùng ReAct prompting.

Ví dụ ReAct trên ALFWorld

Nguồn ảnh: Yao et al., 2022

ReAct vượt Act trên cả ALFWorld và Webshop. Act, không có suy nghĩ nào, không phân rã đúng được mục tiêu thành mục tiêu con. Suy luận có vẻ mang lại lợi thế cho ReAct ở loại tác vụ này, nhưng các phương pháp dựa trên prompt hiện nay vẫn còn xa mới đạt hiệu năng của chuyên gia con người trên các tác vụ này.

Xem bài báo để biết kết quả chi tiết hơn.

Dùng ReAct với LangChain

Dưới đây là ví dụ tổng quan về cách ReAct prompting hoạt động trong thực tế. Ví dụ dùng OpenAI cho LLM và LangChain, vì LangChain đã có sẵn chức năng tận dụng framework ReAct để xây agent thực hiện tác vụ bằng cách kết hợp sức mạnh của LLM và các tool khác nhau.

Trước hết, cài và import các thư viện cần thiết:

python
%%capture
# update or install the necessary libraries
!pip install --upgrade openai
!pip install --upgrade langchain
!pip install --upgrade python-dotenv
!pip install google-search-results

# import libraries
import openai
import os
from langchain.llms import OpenAI
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from dotenv import load_dotenv
load_dotenv()

# load API keys; you will need to obtain these if you haven't yet
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["SERPER_API_KEY"] = os.getenv("SERPER_API_KEY")

Giờ chúng ta có thể cấu hình LLM, các tool sẽ dùng và agent cho phép tận dụng framework ReAct cùng LLM và tool. Lưu ý ví dụ dùng một API tìm kiếm để tìm thông tin bên ngoài và dùng LLM làm tool toán.

python
llm = OpenAI(model_name="text-davinci-003" ,temperature=0)
tools = load_tools(["google-serper", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

Sau khi cấu hình xong, chúng ta có thể chạy agent với câu hỏi/prompt mong muốn. Để ý rằng ở đây không cần đưa ví dụ few-shot như cách giải thích trong bài báo.

python
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")

Quá trình thực thi chuỗi trông như sau:

yaml
> Entering new AgentExecutor chain...
 I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power.
Action: Search
Action Input: "Olivia Wilde boyfriend"
Observation: Olivia Wilde started dating Harry Styles after ending her years-long engagement to Jason Sudeikis — see their relationship timeline.
Thought: I need to find out Harry Styles' age.
Action: Search
Action Input: "Harry Styles age"
Observation: 29 years
Thought: I need to calculate 29 raised to the 0.23 power.
Action: Calculator
Action Input: 29^0.23
Observation: Answer: 2.169459462491557

Thought: I now know the final answer.
Final Answer: Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23 power is 2.169459462491557.

> Finished chain.

Đầu ra nhận được như sau:

code
"Harry Styles, Olivia Wilde's boyfriend, is 29 years old and his age raised to the 0.23 power is 2.169459462491557."

Ví dụ được phỏng theo tài liệu LangChain, công lao thuộc về họ. Người học được khuyến khích thử các tổ hợp tool và tác vụ khác nhau.

Notebook cho đoạn code này có tại: react.ipynb.

Nguồn