+3

[Practical Series] Planning - Key pattern in Agents

Mở đầu

Với sự phát triển vượt bậc của các mô hình ngôn ngữ lớn (LLMs), từ độ chính xác đến mức độ lý luận càng ngày càng cao thì hệ thống đa tác nhân (LLM agents) càng ngày càng được chú trọng và mang lại những lợi ích vượt trội hơn so với các mô hình ngôn ngữ lớn (LLM) thông thường. Một trong những bài viết khá tổng quan về LLM agents mọi người có thể đọc ở đây

Tóm tắt một chút thì một agent sẽ bao gồm 4 thành phần như sau:

LLM agent components

  • Agent / Brain : Đây là thành phần chính của agent, chịu trách nhiệm xử lý thông tin, đưa ra quyết định và hành động dựa trên dữ liệu và mục tiêu. Agent/brain sử dụng các mô hình trí tuệ nhân tạo (AI) để mô phỏng khả năng suy luận, học hỏi và thích ứng.
  • Tools: Đây là các công cụ hoặc API mà agent có thể sử dụng để thực hiện các hành động cụ thể. Ví dụ, các công cụ này có thể bao gồm API để tra cứu thông tin, tương tác với hệ thống khác, hoặc thực hiện các tác vụ phức tạp như phân tích dữ liệu.
  • Memory: Memory giúp agent lưu trữ thông tin từ các tương tác trước đó để sử dụng trong tương lai. Nó có thể bao gồm thông tin về môi trường, trạng thái của các tác vụ, hoặc dữ liệu về các lựa chọn trước đây của agent.
  • Planning: Đây là quá trình mà agent sử dụng để lập kế hoạch hành động nhằm đạt được mục tiêu. Planning liên quan đến việc dự đoán kết quả của các hành động tiềm năng và lựa chọn hành động tốt nhất dựa trên các tiêu chí đã định trước.

Cả 4 thành phần trên cùng nhau hoạt động để tạo nên một hệ thống agent hoàn chỉnh, có khả năng thực hiện các nhiệm vụ phức tạp một cách tự động và hiệu quả.

Planning

  • Như đã trình bày ở trên, một trong những ưu điểm khiến cho Agent có thể giải quyết các vấn đề phức tạp là khả năng suy luận và và quá trình lập kế hoạch. Ví dụ như trong ReAct Agent sử dụng phương pháp tiếp cận có cấu trúc để phân tích đầu vào thành một tập hợp các lệnh gọi hàm và suy nghĩ nhằm để lý giải đưa ra câu trả lời cuối cùng. Cấu trúc như sau :

    • "Thought" - Suy nghĩ diễn giải dựa trên thông tin đầu vào và ngữ cảnh,
    • "Action" - Hành động dựa trên Thought trước đó (thường sẽ sử dụng tool ở đây),
    • "Observation" - Quan sát hay kết quả của hành động trước đó (thường là kết quả của việc sử dụng tools).
  • Nhiệm vụ chính của Planning là "break down" - chia nhỏ đầu vào thành một tập hợp các nhiệm vụ con. Mỗi nhiệm vụ con được biểu diễn bởi thông tin đầu vào, kết quả mong muốn và tất cả các nhiệm vụ phụ thuộc nào cần được hoàn thành trước. (mọi người có thể đọc bài này ở trên viblo trình bày khá dễ hiểu về ReAct Agent. )

Một chút về Structured Planning Agent trong LlamaIndex.

  • Ở đây mình sử dụng chọn StructuredPlanningAgent trong LLamaIndex vì framework này nó update liên tục và có nhiều cái hay ho có thể mày mò xem từ luồng đến prompt truyền sang LLms.

Flow StructuredPlanningAgent

  • Flow của nó sẽ như sau Query (đầu vào) sẽ được planner chia thành nhiều task nhỏ (sub-task) hơn, từng task này sẽ được thực hiện và cập nhật lại cho planner, thực hiện cho đến khi có thể hoàn thành yêu cầu đầu vào.
  • Để thực hiện được điều đó thì StructuredPlanningAgent sẽ có 2 prompt chính : Initial PromptRefine Prompt
    • Initial prompt : dùng để khởi tạo nhiệm vụ con (end-to-end plan) để giải quyết input đầu vào.
    • Refine prompt: dùng để cập nhật lại những kế nhiệm vụ con còn lại cho đến nhiệm vụ cuối cùng để giải quyết được yêu cầu đầu vào.
DEFAULT_INITIAL_PLAN_PROMPT = """\
Think step-by-step. Given a task and a set of tools, create a comprehesive, end-to-end plan to accomplish the task.
Keep in mind not every task needs to be decomposed into multiple sub-tasks if it is simple enough.
The plan should end with a sub-task that satisfies the overall task.

The tools available are:
{tools_str}

Overall Task: {task}
"""

DEFAULT_PLAN_REFINE_PROMPT = """\
Think step-by-step. Given an overall task, a set of tools, and completed sub-tasks, update (if needed) the remaining sub-tasks so that the overall task can still be completed.
The plan should end with a sub-task that satisfies the overall task.
If the remaining sub-tasks are sufficient, you can skip this step.

The tools available are:
{tools_str}

Overall Task:
{task}

Completed Sub-Tasks + Outputs:
{completed_outputs}

Remaining Sub-Tasks:
{remaining_sub_tasks}
"""

Code khởi tạo agent


from llama_index.core.agent import (
    StructuredPlannerAgent,
    FunctionCallingAgentWorker,
    ReActAgentWorker,
)

# create the function calling worker for reasoning
worker = FunctionCallingAgentWorker.from_tools(
    [lyft_tool, uber_tool], verbose=True
)

# wrap the worker in the top-level planner
agent = StructuredPlannerAgent(
    worker, tools=[lyft_tool, uber_tool], verbose=True
)

response = agent.chat(
    "Summarize the key risk factors for Lyft and Uber in their 2021 10-K filings."
)

init task and refine task

plan_id = agent.create_plan(
    "Summarize the key risk factors for Lyft and Uber in their 2021 10-K filings."
)

# response 
"""
===== Sub Task Extract Lyft Risk Factors =====
Expected output:  A detailed list of key risk factors for Lyft from its 2021 10-K filing.
Dependencies:  []
===== Sub Task Extract Uber Risk Factors =====
Expected output:  A detailed list of key risk factors for Uber from its 2021 10-K filing.
Dependencies:  []
===== Sub Task Summarize Risk Factors =====
Expected output:  A comprehensive summary of the key risk factors for Lyft and Uber from their 2021 10-K filings.
Dependencies:  ['Extract Lyft Risk Factors', 'Extract Uber Risk Factors']
"""
# refine the plan
agent.refine_plan(
    "Summarize the key risk factors for Lyft and Uber in their 2021 10-K filings.",
    plan_id,
)

# response 
"""
=== Refined plan ===
Summarize Risk Factors:
Summarize the key risk factors for both Lyft and Uber based on the extracted information from their 2021 10-K filings. -> A comprehensive summary of the key risk factors for Lyft and Uber from their 2021 10-K filings.
deps: ['Extract Lyft Risk Factors', 'Extract Uber Risk Factors']
"""
  • Từ đây chúng ta thấy con Agent đã tạo ra được plan đồng thời cũng có khả năng refine lại plan để hoàn thành yêu cầu đầu vào.

Kết luận

Qua đây thì chúng ta cũng đã thấy được khả năng và sự phát triển mạnh mẽ của LLm trong các nhiệm vụ phức tạp. Hẹn gặp mọi người trong bài viết tiếp theo của Practical Series.

References


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí