Suy luận và hành động (ReAct)

Kỹ thuật ReAct Prompting là một phương pháp tiên tiến trong việc sử dụng các mô hình ngôn ngữ lớn (LLMs) để thực hiện các nhiệm vụ đòi hỏi suy luận phức tạp và khả năng tương tác linh hoạt. ReAct là viết tắt của Reasoning and Acting, nghĩa là “Suy luận và Hành động”. Kỹ thuật này kết hợp hai quá trình chính: suy luận logic và thực hiện hành động cụ thể, nhằm mục đích cải thiện hiệu quả và độ chính xác trong việc giải quyết các vấn đề.

Giải thích chi tiết về ReAct Prompting

  1. Mục tiêu của ReAct Prompting:
    • Tăng cường khả năng suy luận: Giúp mô hình ngôn ngữ không chỉ dừng lại ở việc tạo ra văn bản mà còn có thể thực hiện suy luận phức tạp, đưa ra các quyết định dựa trên logic.
    • Thực hiện hành động: Mô hình không chỉ suy luận mà còn có thể thực hiện các hành động cụ thể dựa trên suy luận đó, giúp giải quyết các nhiệm vụ đòi hỏi tính tương tác và xử lý nhiều bước.
  2. Cách hoạt động của ReAct Prompting:
    • Kết hợp suy luận và hành động: Trong một nhiệm vụ cụ thể, mô hình sẽ luân phiên giữa việc suy luận (đưa ra các giả thuyết, phân tích tình huống) và thực hiện các hành động cụ thể (như tìm kiếm thông tin, thực hiện tính toán).
    • Chuỗi tương tác: Mô hình tạo ra một chuỗi các bước bao gồm suy luận và hành động. Ví dụ, trong một nhiệm vụ yêu cầu giải quyết vấn đề, mô hình có thể:
      • Đầu tiên, suy luận để hiểu rõ vấn đề và đề xuất các bước cần làm.
      • Sau đó, thực hiện các bước hành động như truy vấn thông tin hoặc tính toán kết quả.
      • Cuối cùng, kết hợp các thông tin và kết quả thu được để đưa ra câu trả lời hoặc giải pháp.
  3. Ví dụ về ReAct Prompting:
    • Nhiệm vụ giải quyết bài toán: Mô hình được yêu cầu giải một bài toán phức tạp. Đầu tiên, nó sẽ suy luận để xác định các công thức cần sử dụng. Sau đó, nó sẽ thực hiện các bước tính toán cụ thể và cuối cùng là tổng hợp các kết quả để đưa ra đáp án chính xác.
    • Nhiệm vụ tìm kiếm thông tin: Mô hình cần tìm kiếm thông tin từ nhiều nguồn khác nhau. Đầu tiên, nó sẽ suy luận để xác định từ khóa tìm kiếm chính xác. Sau đó, nó thực hiện hành động truy vấn tìm kiếm trên internet và cuối cùng là phân tích và tổng hợp thông tin thu được để trả lời câu hỏi.
  4. Ưu điểm của ReAct Prompting:
    • Linh hoạt và đa năng: Kết hợp suy luận và hành động giúp mô hình xử lý tốt các nhiệm vụ đa bước và phức tạp.
    • Cải thiện độ chính xác: Khả năng suy luận giúp mô hình đưa ra các quyết định logic và chính xác hơn trong quá trình thực hiện nhiệm vụ.
    • Hiệu quả cao: Việc thực hiện các hành động cụ thể sau khi suy luận giúp mô hình không chỉ dự đoán mà còn thực thi các bước cần thiết để đạt được mục tiêu.

Ví dụ về ReAct

Nhiệm vụ: Giải quyết bài toán logic: “Bạn có ba cốc nước, một cốc đầy nước nóng, một cốc đầy nước lạnh và một cốc rỗng. Làm thế nào để trộn nước từ hai cốc đầu tiên để có nước ấm trong cốc rỗng?”

Bạn là một chuyên gia giải quyết vấn đề logic. Hãy suy nghĩ từng bước để tìm ra cách trộn nước nóng và nước lạnh để tạo ra nước ấm trong cốc rỗng. Sau đó, mô tả từng hành động cụ thể cần thực hiện để đạt được điều đó.

1. **Suy luận (Reasoning):** Hãy phân tích bài toán và đưa ra các bước suy nghĩ logic để tìm ra giải pháp.

2. **Hành động (Acting):** Dựa trên suy luận của bạn, mô tả chi tiết các bước hành động cụ thể để thực hiện giải pháp.

---

**Bài toán:** Bạn có ba cốc nước, một cốc đầy nước nóng, một cốc đầy nước lạnh và một cốc rỗng. Làm thế nào để trộn nước từ hai cốc đầu tiên để có nước ấm trong cốc rỗng?

**Suy luận:**
- Nước ấm là kết quả của việc trộn nước nóng và nước lạnh.
- Để tạo ra nước ấm, cần phải đổ một lượng nước nóng và nước lạnh theo tỷ lệ thích hợp vào cốc rỗng.

**Hành động:**
1. Đổ một nửa cốc nước nóng vào cốc rỗng.
2. Đổ một nửa cốc nước lạnh vào cốc rỗng.
3. Khuấy đều để nước nóng và nước lạnh trộn lẫn với nhau, tạo thành nước ấm.

---

Hãy bắt đầu với bước suy luận của bạn:

Kết quả Đầu ra từ Mô hình:

  1. Suy luận (Reasoning):
    • Để tạo ra nước ấm, cần trộn nước nóng và nước lạnh với nhau theo một tỷ lệ phù hợp.
    • Nước nóng và nước lạnh nên được trộn với nhau theo tỷ lệ 1:1 để tạo ra nước ấm trung bình.
    • Cốc rỗng sẽ là nơi để trộn nước từ hai cốc còn lại.
  2. Hành động (Acting):
    • Bước 1: Lấy cốc rỗng và đặt nó trước mặt.
    • Bước 2: Đổ một nửa lượng nước từ cốc nước nóng vào cốc rỗng. (Đảm bảo rằng cốc nước nóng chứa đúng lượng nước cần thiết).
    • Bước 3: Đổ một nửa lượng nước từ cốc nước lạnh vào cốc rỗng. (Lượng nước lạnh phải tương đương với lượng nước nóng đã đổ vào).
    • Bước 4: Dùng một thìa khuấy đều nước trong cốc rỗng để đảm bảo nước nóng và nước lạnh được trộn lẫn hoàn toàn.
    • Bước 5: Kiểm tra nhiệt độ của nước trong cốc rỗng để đảm bảo nó đã trở thành nước ấm.

Tóm tắt Kết quả:

  • Bạn đã đổ một nửa cốc nước nóng và một nửa cốc nước lạnh vào cốc rỗng.
  • Sau khi khuấy đều, bạn đã có nước ấm trong cốc rỗng.

Sử dụng ReAct của LanChain

Dưới đây là một ví dụ nâng cao hơn về cách hoạt động của phương pháp nhắc nhở ReAct trong ứng dụng thực tế. Chúng tôi sẽ sử dụng OpenAI cho LLM và framework LangChain vì nó đã có sẵn chức năng tận dụng khung ReAct để xây dựng các tác nhân thực hiện nhiệm vụ bằng cách kết hợp sức mạnh của LLM và các công cụ khác nhau.

Trước tiên, hãy cài đặt các thư viện cần thiết:

%%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")

Bây giờ chúng ta có thể định cấu hình LLM, các công cụ chúng ta sẽ sử dụng và tác nhân cho phép chúng ta tận dụng khung ReAct cùng với LLM và các công cụ. Lưu ý rằng chúng ta sẽ sử dụng API tìm kiếm để tìm kiếm thông tin bên ngoài và LLM làm công cụ toán học.

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, giờ đây chúng ta có thể chạy tác nhân với truy vấn/lời nhắc mong muốn.

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

Việc thực hiện chuỗi trông như sau:

> 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 chúng tôi nhận được như sau:

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

Kết luận

ReAct Prompting là một kỹ thuật mạnh mẽ trong việc sử dụng mô hình ngôn ngữ lớn để giải quyết các nhiệm vụ phức tạp. Bằng cách kết hợp suy luận logic và hành động cụ thể, kỹ thuật này giúp cải thiện đáng kể khả năng và hiệu quả của mô hình trong việc thực hiện các nhiệm vụ đòi hỏi nhiều bước và sự linh hoạt. ReAct Prompting mở ra nhiều tiềm năng ứng dụng trong các lĩnh vực như giải quyết vấn đề, tìm kiếm thông tin, và nhiều nhiệm vụ yêu cầu xử lý phức tạp khác.