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), mức độ chính xác và khả năng lý luận ngày càng cao đã dẫn đến sự chú ý lớn dành cho hệ thống đa tác nhân (LLM agents). Những hệ thống này mang lại nhiều lợi ích đáng kể so với các mô hình ngôn ngữ lớn truyền thống. Một bài viết tổng quan về LLM agents mà mọi người có thể tham khảo có sẵn tại đây.
Thành phần của một Agent
Một agent bao gồm 4 thành phần chính:
- Agent / Brain: Đây là thành phần chính chịu trách nhiệm xử lý thông tin, đưa ra quyết định và thực hiện 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ể. Chúng có thể bao gồm API để tra cứu thông tin, tương tác với các hệ thống khác hay thực hiện các tác vụ phức tạp như phân tích dữ liệu.
- Memory: Phần này 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. Memory có thể bao gồm thông tin về môi trường, trạng thái 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 bao gồm 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í đã được xác định.
Tất cả 4 thành phần này cùng hoạt động để tạo ra 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 yếu tố chính giúp agent giải quyết các vấn đề phức tạp là khả năng suy luận và quá trình lập kế hoạch. Ví dụ, trong ReAct Agent, phương pháp tiếp cận có cấu trúc được sử dụng để phân tích đầu vào thành nhiều lệnh gọi hàm và suy nghĩ nhằm đưa ra câu trả lời cuối cùng. Cấu trúc này bao gồm:
- "Thought" - Suy nghĩ diễn giải từ thông tin đầu vào và ngữ cảnh.
- "Action" - Hành động dựa trên suy nghĩ (thường sử dụng tools ở đây).
- "Observation" - Quan sát hay kết quả của hành động trước đó (thường là kết quả từ việc sử dụng tools).
Nhiệm vụ chính của Planning là "break down" - chia nhỏ đầu vào thành các nhiệm vụ con. Mỗi nhiệm vụ này được biểu diễn bởi thông tin đầu vào, kết quả mong muốn và các nhiệm vụ phụ thuộc cần được hoàn thành trước.
Structured Planning Agent trong LlamaIndex
Ở đây, tôi đã chọn StructuredPlanningAgent trong LLamaIndex bởi vì framework này được cập nhật liên tục và có nhiều tính năng thú vị để khám phá, từ luồng đến prompt gửi tới LLMs.
Quy trình hoạt động của nó như sau: Query (đầu vào) sẽ được planner chia thành nhiều task nhỏ (sub-task). Mỗi task sẽ được thực hiện và cập nhật lại cho planner, cho đến khi yêu cầu đầu vào được hoàn thành.
Để thực hiện việc lập kế hoạch này, StructuredPlanningAgent sẽ sử dụng hai prompt chính là Initial Prompt và Refine Prompt:
- Initial Prompt: Dùng để khởi tạo nhiệm vụ con (end-to-end plan) nhằm giải quyết đầu vào.
- Refine Prompt: Dùng để cập nhật các nhiệm vụ con còn lại cho đến khi hoàn thành yêu cầu đầu vào.
Khởi tạo agent
python
from llama_index.core.agent import (
StructuredPlannerAgent,
FunctionCallingAgentWorker,
ReActAgentWorker,
)
# tạo worker để gọi hàm cho suy luận
worker = FunctionCallingAgentWorker.from_tools(
[lyft_tool, uber_tool], verbose=True
)
# bọc worker vào planner cấp cao
agent = StructuredPlannerAgent(
worker, tools=[lyft_tool, uber_tool], verbose=True
)
response = agent.chat(
"Tóm tắt các yếu tố rủi ro chính của Lyft và Uber trong báo cáo 10-K năm 2021."
)
Tạo nhiệm vụ và cập nhật nhiệm vụ
python
plan_id = agent.create_plan(
"Tóm tắt các yếu tố rủi ro chính của Lyft và Uber trong báo cáo 10-K năm 2021."
)
# phản hồi
"""
===== Nhiệm vụ phụ: Trích xuất yếu tố rủi ro của Lyft =====
Kết quả mong đợi: Danh sách chi tiết về các yếu tố rủi ro của Lyft từ báo cáo 10-K năm 2021.
Phụ thuộc: []
===== Nhiệm vụ phụ: Trích xuất yếu tố rủi ro của Uber =====
Kết quả mong đợi: Danh sách chi tiết về các yếu tố rủi ro của Uber từ báo cáo 10-K năm 2021.
Phụ thuộc: []
===== Nhiệm vụ phụ: Tóm tắt các yếu tố rủi ro =====
Kết quả mong đợi: Tóm tắt toàn diện về các yếu tố rủi ro của Lyft và Uber trong báo cáo 10-K năm 2021.
Phụ thuộc: ['Trích xuất yếu tố rủi ro của Lyft', 'Trích xuất yếu tố rủi ro của Uber']
"""
# tinh chỉnh kế hoạch
agent.refine_plan(
"Tóm tắt các yếu tố rủi ro chính của Lyft và Uber trong báo cáo 10-K năm 2021.",
plan_id,
)
# phản hồi
"""
=== Kế hoạch đã tinh chỉnh ===
Tóm tắt các yếu tố rủi ro:
Tóm tắt các yếu tố rủi ro của cả Lyft và Uber dựa trên thông tin được trích xuất từ báo cáo 10-K năm 2021. -> Tóm tắt toàn diện về các yếu tố rủi ro của Lyft và Uber trong báo cáo 10-K năm 2021.
phụ thuộc: ['Trích xuất yếu tố rủi ro của Lyft', 'Trích xuất yếu tố rủi ro của Uber']
"""
Từ đây, chúng ta có thể thấy agent đã tạo ra một kế hoạch đồng thời cũng có khả năng tinh chỉnh kế hoạch để hoàn thành yêu cầu đầu vào.
Kết luận
Qua bài viết này, chúng ta đã nhận thấy khả năng và sự phát triển mạnh mẽ của LLM trong việc giải quyết các nhiệm vụ phức tạp. Hẹn gặp lại mọi người trong bài viết tiếp theo của chuỗi Practical Series.
Tài liệu tham khảo
- LLama Index: Structured Planner
source: viblo