|
| 1 | +# Sử dụng Agent trong LlamaIndex |
| 2 | + |
| 3 | +Hãy nhớ Alfred, agent quản gia đáng tin cậy của chúng ta từ những bài trước chứ? Giờ đây anh ấy sắp được nâng cấp! |
| 4 | +Sau khi đã hiểu về các Tools có sẵn trong LlamaIndex, ta có thể trang bị thêm khả năng mới cho Alfred để phục vụ tốt hơn. |
| 5 | + |
| 6 | +Nhưng trước khi tiếp tục, hãy cùng ôn lại cách hoạt động của một agent như Alfred. |
| 7 | +Từ Chương 1, ta đã học được: |
| 8 | + |
| 9 | +> Agent là hệ thống sử dụng model AI để tương tác với môi trường nhằm đạt được mục tiêu do người dùng định nghĩa. Nó kết hợp khả năng lý luận, lập kế hoạch và thực thi hành động (thông qua các Tools bên ngoài) để hoàn thành nhiệm vụ. |
| 10 | +
|
| 11 | +LlamaIndex hỗ trợ **ba loại agent chính**: |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +1. `Function Calling Agents` - Loại này làm việc với các model AI có thể gọi các function cụ thể |
| 16 | +2. `ReAct Agents` - Có thể hoạt động với bất kỳ AI nào có endpoint chat hoặc text để xử lý các tác vụ lý luận phức tạp |
| 17 | +3. `Advanced Custom Agents` - Sử dụng các phương pháp phức tạp hơn để xử lý các workflow phức tạp |
| 18 | + |
| 19 | +<Tip>Tìm hiểu thêm về các agent nâng cao tại <a href="https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/agent/workflow/base_agent.py">BaseWorkflowAgent</a></Tip> |
| 20 | + |
| 21 | +## Khởi tạo Agent |
| 22 | + |
| 23 | +<Tip> |
| 24 | +Bạn có thể theo dõi code trong <a href="https://huggingface.co/agents-course/notebooks/blob/main/unit2/llama-index/agents.ipynb" target="_blank">notebook này</a> và chạy thử qua Google Colab. |
| 25 | +</Tip> |
| 26 | + |
| 27 | +Để tạo agent, ta bắt đầu bằng cách cung cấp cho nó **một tập hợp các function/Tools xác định khả năng hoạt động**. |
| 28 | +Hãy xem cách tạo agent với một số Tools cơ bản. Tại thời điểm viết bài, agent sẽ tự động sử dụng API function calling (nếu có sẵn) hoặc vòng lặp ReAct agent tiêu chuẩn. |
| 29 | + |
| 30 | +Các LLM hỗ trợ API tools/functions còn khá mới, nhưng chúng cung cấp cách mạnh mẽ để gọi Tools bằng cách tránh prompt cụ thể và cho phép LLM tạo lệnh gọi Tools dựa trên schema được cung cấp. |
| 31 | + |
| 32 | +ReAct agents cũng giỏi xử lý các tác vụ lý luận phức tạp và có thể làm việc với bất kỳ LLM nào có khả năng chat hoặc hoàn thiện văn bản. Chúng chi tiết hơn và hiển thị lý luận đằng sau các hành động được thực hiện. |
| 33 | + |
| 34 | +```python |
| 35 | +from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI |
| 36 | +from llama_index.core.agent.workflow import AgentWorkflow |
| 37 | +from llama_index.core.tools import FunctionTool |
| 38 | + |
| 39 | +# định nghĩa một Tool mẫu - chú thích kiểu, tên function và docstring đều được đưa vào schema |
| 40 | +def multiply(a: int, b: int) -> int: |
| 41 | + """Nhân hai số nguyên và trả về kết quả dạng số nguyên""" |
| 42 | + return a * b |
| 43 | + |
| 44 | +# khởi tạo llm |
| 45 | +llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct") |
| 46 | + |
| 47 | +# khởi tạo agent |
| 48 | +agent = AgentWorkflow.from_tools_or_functions( |
| 49 | + [FunctionTool.from_defaults(multiply)], |
| 50 | + llm=llm |
| 51 | +) |
| 52 | +``` |
| 53 | + |
| 54 | +**Agent mặc định không lưu trữ trạng thái (stateless)**, việc ghi nhớ các tương tác trước được thực hiện thông qua object `Context` |
| 55 | +Điều này hữu ích nếu bạn muốn tạo agent cần ghi nhớ ngữ cảnh như chatbot duy trì ngữ cảnh qua nhiều tin nhắn hoặc trình quản lý tác vụ cần theo dõi tiến trình. |
| 56 | + |
| 57 | +```python |
| 58 | +# không lưu trạng thái |
| 59 | +response = await agent.run("2 nhân 2 bằng mấy?") |
| 60 | + |
| 61 | +# lưu trạng thái |
| 62 | +from llama_index.core.workflow import Context |
| 63 | + |
| 64 | +ctx = Context(agent) |
| 65 | + |
| 66 | +response = await agent.run("Tên tôi là Bob.", ctx=ctx) |
| 67 | +response = await agent.run("Tên tôi là gì nhỉ?", ctx=ctx) |
| 68 | +``` |
| 69 | + |
| 70 | +Bạn sẽ thấy agent trong `LlamaIndex` là async (bất đồng bộ) vì chúng sử dụng toán tử `await` của Python. Nếu bạn mới làm quen với async code hoặc cần ôn lại, hãy xem [hướng dẫn async xuất sắc này](https://docs.llamaindex.ai/en/stable/getting_started/async_python/). |
| 71 | + |
| 72 | +Giờ ta đã nắm được kiến thức cơ bản, hãy cùng xem cách sử dụng các Tools phức tạp hơn trong agent. |
| 73 | + |
| 74 | +## Tạo RAG Agent với QueryEngineTools |
| 75 | + |
| 76 | +**Agentic RAG (Tìm kiếm và tạo ra câu trả lời mang tính tác nhân) là cách mạnh mẽ để sử dụng agent trả lời câu hỏi về dữ liệu.** Ta có thể cung cấp nhiều Tools cho Alfred để hỗ trợ trả lời câu hỏi. |
| 77 | +Thay vì tự động trả lời dựa trên tài liệu, Alfred có thể quyết định sử dụng bất kỳ Tool nào khác để đưa ra câu trả lời. |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +Việc **biến `QueryEngine` thành một Tool** cho agent rất dễ dàng. |
| 82 | +Khi làm vậy, ta cần **định nghĩa tên và mô tả**. LLM sẽ sử dụng thông tin này để sử dụng Tool chính xác. |
| 83 | +Hãy xem cách tải `QueryEngineTool` từ `QueryEngine` đã tạo trong [phần components](components.mdx). |
| 84 | + |
| 85 | +```python |
| 86 | +from llama_index.core.tools import QueryEngineTool |
| 87 | + |
| 88 | +query_engine = index.as_query_engine(llm=llm, similarity_top_k=3) # như đã trình bày trong phần Components in LlamaIndex |
| 89 | + |
| 90 | +query_engine_tool = QueryEngineTool.from_defaults( |
| 91 | + query_engine=query_engine, |
| 92 | + name="name", |
| 93 | + description="a specific description", |
| 94 | + return_direct=False, |
| 95 | +) |
| 96 | +query_engine_agent = AgentWorkflow.from_tools_or_functions( |
| 97 | + [query_engine_tool], |
| 98 | + llm=llm, |
| 99 | + system_prompt="Bạn là trợ lý hữu ích có quyền truy cập vào cơ sở dữ liệu mô tả nhân vật. " |
| 100 | +) |
| 101 | +``` |
| 102 | + |
| 103 | +## Tạo hệ thống đa agent |
| 104 | + |
| 105 | +Lớp `AgentWorkflow` cũng hỗ trợ trực tiếp hệ thống đa agent. Bằng cách đặt tên và mô tả cho từng agent, hệ thống duy trì một speaker chính, mỗi agent có khả năng chuyển quyền điều khiển cho agent khác. |
| 106 | + |
| 107 | +Bằng cách thu hẹp phạm vi của từng agent, ta có thể giúp tăng độ chính xác tổng thể khi phản hồi tin nhắn người dùng. |
| 108 | + |
| 109 | +**Agent trong LlamaIndex cũng có thể được sử dụng trực tiếp như Tools** cho các agent khác, phục vụ các kịch bản tùy chỉnh phức tạp hơn. |
| 110 | + |
| 111 | +```python |
| 112 | +from llama_index.core.agent.workflow import ( |
| 113 | + AgentWorkflow, |
| 114 | + FunctionAgent, |
| 115 | + ReActAgent, |
| 116 | +) |
| 117 | + |
| 118 | +# Định nghĩa một số Tools |
| 119 | +def add(a: int, b: int) -> int: |
| 120 | + """Cộng hai số.""" |
| 121 | + return a + b |
| 122 | + |
| 123 | + |
| 124 | +def subtract(a: int, b: int) -> int: |
| 125 | + """Trừ hai số.""" |
| 126 | + return a - b |
| 127 | + |
| 128 | + |
| 129 | +# Tạo cấu hình agent |
| 130 | +# LƯU Ý: ta có thể dùng FunctionAgent hoặc ReActAgent ở đây. |
| 131 | +# FunctionAgent hoạt động với các LLM có API gọi function. |
| 132 | +# ReActAgent hoạt động với mọi LLM. |
| 133 | +calculator_agent = ReActAgent( |
| 134 | + name="calculator", |
| 135 | + description="Thực hiện các phép toán cơ bản", |
| 136 | + system_prompt="Bạn là trợ lý máy tính. Hãy dùng Tools cho mọi phép toán.", |
| 137 | + tools=[add, subtract], |
| 138 | + llm=llm, |
| 139 | +) |
| 140 | + |
| 141 | +query_agent = ReActAgent( |
| 142 | + name="info_lookup", |
| 143 | + description="Tra cứu thông tin về XYZ", |
| 144 | + system_prompt="Sử dụng Tool để truy vấn hệ thống RAG trả lời thông tin về XYZ", |
| 145 | + tools=[query_engine_tool], |
| 146 | + llm=llm |
| 147 | +) |
| 148 | + |
| 149 | +# Tạo và chạy workflow |
| 150 | +agent = AgentWorkflow( |
| 151 | + agents=[calculator_agent, query_agent], root_agent="calculator" |
| 152 | +) |
| 153 | + |
| 154 | +# Chạy hệ thống |
| 155 | +response = await agent.run(user_msg="5 cộng 3 bằng mấy?") |
| 156 | +``` |
| 157 | + |
| 158 | +<Tip>Chưa đủ kiến thức? Bạn có thể khám phá thêm về agent và Tools trong LlamaIndex qua <a href="https://docs.llamaindex.ai/en/stable/examples/agent/agent_workflow_basic/">Hướng dẫn cơ bản về AgentWorkflow</a> hoặc <a href="https://docs.llamaindex.ai/en/stable/understanding/agent/">Tài liệu học Agent</a>, nơi bạn có thể đọc thêm về streaming, tuần tự hóa context và human-in-the-loop!</Tip> |
| 159 | + |
| 160 | +Giờ đây khi đã hiểu cơ bản về agent và Tools trong LlamaIndex, hãy cùng xem cách sử dụng LlamaIndex để **tạo các workflow có thể cấu hình và quản lý được!** |
0 commit comments