Tối đa hoá sức mạnh của LLM bằng việc sử dụng ReAct agent
I. Mở đầu:
Chào mọi người! Chắc hẳn các bạn đã quen thuộc với việc sử dụng các mô hình ngôn ngữ lớn (LLM) để hỗ trợ trong công việc và cuộc sống hàng ngày. Tuy nhiên, có thể nhiều người trong chúng ta mới chỉ dừng lại ở việc đặt câu hỏi và nhận câu trả lời đơn giản từ các mô hình này. Điều đó thật sự là một sự lãng phí, bởi tiềm năng và sức mạnh của những công nghệ này còn nhiều hơn thế rất nhiều.
Hôm nay, mình sẽ giới thiệu cho mọi người một phương pháp độc đáo mang tên ReAct. Đây là sự kết hợp tinh tế giữa hai yếu tố: Reasoning (Khả năng suy luận của các mô hình LLM) và Action (Thực hiện các hành động tương tác với môi trường bên ngoài nhằm hoàn thành một tác vụ cụ thể). Phương pháp này không chỉ giúp các mô hình LLM đưa ra những quyết định chính xác hơn mà còn hỗ trợ giải quyết những vấn đề phức tạp và thậm chí có khả năng tự sửa chữa những lỗi sai từ các hành động trước đó.
Oke. Trước khi đi vào chi tiết về cách mà ReAct hoạt động, mình cũng muốn nói qua về mặt ý tưởng của phương pháp này. Thực chất thì phương pháp này được lấy cảm hứng từ cách mà con người chúng ta thực hiện một nhiệm vụ nào đó bằng cách kết hợp hài hoà giữa việc suy nghĩ và hành động.
Ở đây, sẽ có một ví dụ cho mọi người dễ hiểu:
Ví dụ: Giả sử, chúng ta cần nấu một món canh
- Suy nghĩ 1: Tôi cần phải chuẩn bị các nguyên liệu như: rau, thịt và muối. Và sau đây tôi cần bắc một nồi nước sôi
- Hành động 1: Bắc một nồi nước sôi lên bếp.
- Quan sát 1: Nước đã sôi.
- Suy nghĩ 2: Sau khi nước đã sôi, tôi cần cho thịt rau và muối vào nồi.
- Hành động 2: Bỏ thịt, rau và muối vào nồi.
- Quan sát 2: Nước quá ít dẫn tới món canh đang bị mặn.
- Suy nghĩ 3: Ôi trời má, mình cần phải bỏ thêm nước vào để cứu vãn cái nồi canh này
- Hành động 3: Bỏ thêm nước vào nồi
- Quan sát 3: Nước đã đủ món canh nom có vẻ ngon!
- Suy nghĩ 4: Sau khi đã xong, mình cần phải đợi khoảng 15p cho tới khi món canh này chính
- Hành động 4: Đợi 15p
- Quan sát 4: Món canh đã chín.
- Status: Hoàn thành!
II. ReAct agent
ReAct agent components:
Như đã đề cập tới trước đó, ReAct agent được lấy cảm hứng từ sự phối hợp giữa "action" và "reasoning", cho phép con người học các nhiệm vụ mới và đưa ra quyết định hoặc lý luận.
1. Reasoning:
Phương pháp Chain-of-Thought (CoT) là một kỹ thuật trong việc sử dụng các mô hình ngôn ngữ, giúp chúng thực hiện việc reasoning và giải quyết các vấn đề phức tạp bằng cách chia nhỏ yêu cầu đầu vào thành nhiều bước tư duy logic. Điều này cho phép mô hình lên kế hoạch và giải quyết từng phần của nhiệm vụ một cách tuần tự, từ đó đạt được kết quả cuối cùng một cách chính xác hơn.
- Chia nhỏ vấn đề: Khi gặp một nhiệm vụ phức tạp, thay vì giải quyết nó trong một bước duy nhất, phương pháp CoT chia nhiệm vụ đó thành nhiều bước nhỏ hơn, mỗi bước xử lý một khía cạnh của vấn đề.
- Tư duy tuần tự: Mỗi bước trong chuỗi tư duy sẽ dựa trên kết quả của bước trước đó. Bằng cách này, mô hình có thể xây dựng một chuỗi lý luận logic từ đầu đến cuối.
Ví dụ có một câu hỏi: Một cửa hàng bán một sản phẩm với giá 100 đô la. Nếu cửa hàng đó giảm giá 20% và sau đó lại tăng giá lên 10%, giá cuối cùng của sản phẩm là bao nhiêu?
Chain-of-Thought:
- Bước 1 - Tính giá sau khi giảm 20%: Nếu giá ban đầu là 100 đô la và cửa hàng giảm giá 20%, ta tính giá sau khi giảm: đô la.
- Bước 2 - Tính giá sau khi tăng 10%: Sau khi giảm, giá sản phẩm là 80 đô la. Bây giờ cửa hàng tăng giá lên 10%: đô la
- Kết luận: Giá cuối cùng của sản phẩm sau khi giảm và tăng giá là đô la.
2. Tools:
Các công cụ được sử dụng để tương tác với môi trường bên ngoài và thu thập thông tin. Chúng có thể là bất cứ thứ gì có thể là API tìm kiếm để tìm kiếm thông tin bên ngoài hoặc công cụ toán học để thực hiện các phép tính. Việc lựa chọn công cụ phụ thuộc vào nhiệm vụ cụ thể mà khi đó LLM sẽ reasoning và đưa ra quyết định.
Tiếp tục với ví dụ bên trên, khi đó chúng ta sẽ xây dựng các tools tính toán như Add tool, Subtract tool, Multiply tool.
Khi đó, trong bước 1 sẽ cần thực hiện 2 phép tính toán và . Như vậy Action ở đây là cần gọi Subtract tool và Multiply tool để thực hiện tính toán và hoàn thành bước 1.
Ở bước thứ 2 tương tự sẽ cần gọi hai tool là Add tool và Multiply tool.
3. ReAct prompting:
ReAct Prompting—ReAct prompting là một kỹ thuật được sử dụng để hướng dẫn LLM tạo ra các reasoning trace và actions. Thành phần này rất quan trọng đối với khả năng dynamic reasoning của mô hình ReAct agent.
Bên dưới là một ví dụ về một ReAct prompt.
You are designed to help with a variety of tasks, from answering questions to providing summaries to other types of analyses.
## Tools
You have access to a wide variety of tools. You are responsible for using the tools in any sequence you deem appropriate to complete the task at hand.
This may require breaking the task into subtasks and using different tools to complete each subtask.
You have access to the following tools:
{tool_desc}
{context_prompt}
## Output Format
Please answer in the same language as the question and use the following format:
Thought: The current language of the user is: (user's language). I need to use a tool to help me answer the question.
Action: tool name (one of {tool_names}) if using a tool.
Action Input: the input to the tool, in a JSON format representing the kwargs (e.g. {{"input": "hello world", "num_beams": 5}})
Please ALWAYS start with a Thought.
Please use a valid JSON format for the Action Input. Do NOT do this {{'input': 'hello world', 'num_beams': 5}}.
If this format is used, the user will respond in the following format:
Observation: tool response
You should keep repeating the above format till you have enough information to answer the question without using any more tools. At that point, you MUST respond in the one of the following two formats:
Thought: I can answer without using any more tools. I'll use the user's language to answer
Answer: [your answer here (In the same language as the user's question)]
Thought: I cannot answer the question with the provided tools.
Answer: [your answer here (In the same language as the user's question)]
## Current Conversation
Below is the current conversation consisting of interleaving human and assistant messages.
How ReAct agent work?
Đầu tiên, ReAct agent sẽ nhận vào một task do User yêu cầu. Sau đó, ReAct prompts LLM tạo ra các reasoning trace và actions cho task đó. Các Action sẽ tương tác với các env và trả về kết quả như một Observation (Sự quan sát). Công việc này sẽ được lặp đi lặp lại cho tới khi task được hoàn thành.
Ưu và nhược điểm của ReAct:
Ưu điểm:
- Cải thiện khả năng suy luận và ra quyết định — ReACT tăng cường khả năng suy luận của LLM, cho phép họ tương tác với môi trường theo cách giống con người hơn. Điều này đặc biệt có lợi trong các nhiệm vụ suy luận chuyên sâu về kiến thức và các nhiệm vụ ra quyết định, trong đó mô hình điều hướng các môi trường mô phỏng.
- Tích hợp với các tools bên ngoài — ReAct cho phép LLM giao tiếp với các công cụ bên ngoài, thu thập thông tin bổ sung từ các nguồn bên ngoài. Sự tích hợp này có lợi cho các ứng dụng thực tế.
- Sự tương tác giữa Lý luận và Hành động — Mô hình ReAct cho phép có sự tương tác lớn hơn giữa các reasoning trace và actions. Các reasoning trace giúp mô hình tạo ra, theo dõi và cập nhật các kế hoạch hành động cũng như xử lý các trường hợp ngoại lệ, trong khi các actions cho phép nó giao tiếp và thu thập thêm thông tin từ các nguồn bên ngoài.
- Khả năng thích ứng và phục hồi — ReAct chứng minh khả năng tự động sửa lỗi và thích ứng theo thời gian thực, cải thiện độ tin cậy và khả năng phục hồi tổng thể của hệ thống.
- Hiệu suất được cải thiện — ReAct nâng cao hiệu suất của LLM bằng cách nhắc chúng suy luận trước khi đưa ra câu trả lời. Điều này dẫn đến kết quả chính xác hơn vì suy luận đóng vai trò là nền tảng để xây dựng câu trả lời.
Nhược điểm:
Ngoài những ưu điểm kể trên, mình còn nhận thấy ReAct cũng còn một số hạn chế như:
- Limit tokens: Do bản chất của ReAct là liên tục reasoning và action, việc này sẽ dẫn tới càng về các reasoning step sau số lượng tokens càng tăng một cách nhanh chóng. Nó dẫn tới việc mô hình đôi khi bị quên đi những gì nó đã được hướng dẫn, hoặc với những mô hình trả phí như OpenAI GPT thì chi phí sẽ rất cao.
- Limit time: Do việc phải liên tục reasoning và action, nên đôi khi, câu trả lời sẽ mất khá nhiều thời gian để hoàn thành. Một số paper đã sinh ra để giải quyết vấn đề này. Ví dụ như CodeAct sinh ra để hạn chế việc gọi action quá nhiều lần.
III. ReAct agent Usage
Nguyên lý hoạt động ReAct trong LlamaIndex:
Ở dưới đây, mình sẽ sử dụng ReAct agent đã được tích hợp sẵn bên trong LlamaIndex làm Framework. Về mặt nguyên lý hoạt động. ReAct agent trong LlamaIndex sẽ có 2 đối tượng chính.
- AgentRunner: Con này sẽ thực hiện quản lý bộ nhớ (chat history), cập nhật trạng thái của task...v...v.
- AgentWorker: Con này sẽ là con ReAct, nó có nhiệm vụ nhận task từ AgentRunner, và thực hiện task đó bằng cách reasoning và action. Sau khi hoàn thành, sẽ tiếp tục trả về trạng thái cho AgentRunner quản lý, nếu cần thêm reasoning step để hoàn thành task thì sẽ tiếp tục vòng lặp. Ngược lại, sẽ trả về trạng thái hoàn thành và đưa ra câu trả lời.
Code một ReAct basic:
Đầu tiên, tiến hành import một vài class cần thiết:
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.llms import ChatMessage
from llama_index.core.tools import BaseTool, FunctionTool
Tiếp theo, thực hiện build hai tools đó là multiply và add.
def multiply(a: int, b: int) -> int:
"""Multiply two integers and returns the result integer"""
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
def add(a: int, b: int) -> int:
"""Add two integers and returns the result integer"""
return a + b
add_tool = FunctionTool.from_defaults(fn=add)
Tiếp đến là khởi tạo llm model và ReAct agent, ở đây sử dụng là GPT-3.5, các bạn cũng có thể thử với các mô hình LLM free khác.
llm = OpenAI(model="gpt-3.5-turbo-instruct")
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
Như có thể quan sát được, thì câu hỏi của chúng ta sẽ cần tới 2 reasoning step: thứ nhất là thực hiện tính toán giữa 2 và 4. Tiếp đến sẽ thực hiện tính toán kết quả 2 và 4 với 20.
response = agent.chat("What is 20+(2*4)? Calculate step by step ")
Result:
Thought: I need to use a tool to help me answer the question.
Action: multiply
Action Input: {"a": 2, "b": 4}
Observation: 8
Thought: I need to use a tool to help me answer the question.
Action: add
Action Input: {"a": 20, "b": 8}
Observation: 28
Thought: I can answer without using any more tools.
Answer: 28
Như có thể thấy thì với ví dụ đơn giản này, ReAct đã hoạt động rất tốt và đưa ra câu trả lời chính xác là 28.
Kết luận:
Như vậy thì mình đã giới thiệu cho mọi người một phương pháp khá hay, có thể tận dụng được tối đa sức mạnh của các mô hình LLM. Các bạn có thể sử dụng nó thoả sức sáng tạo, như xây dựng một Coder Agent, Một content creator agent...v..v. Tuy nhiên, ReAct vẫn còn một số hạn chế như history dài, hoặc thời gian trả lời lâu. Cám ơn mọi người đã đọc bài chia sẻ của mình nhé, nếu thấy hay hãy cho mình xin 1 upvote heng ^^
References:
ReAct: Synergizing Reasoning and Acting in Language Models
All Rights Reserved