Xây dựng các Đặc vụ AI bằng ADK: Hỗ trợ bằng các công cụ

1. Trước khi bắt đầu

Chào mừng bạn đến với phần thứ hai của loạt video "Xây dựng các tác nhân AI bằng ADK"! Trong chuỗi lớp học lập trình thực hành này, bạn sẽ bắt đầu hành trình thú vị để tạo ra tác nhân AI thông minh của riêng mình bằng Bộ công cụ phát triển tác nhân (ADK) của Google.

Lớp học lập trình này tiếp nối từ lớp học lập trình cơ bản về ADK. Chúng tôi giả định rằng bạn đã hoàn tất các bước thiết lập cần thiết và đã tạo thành công tác nhân trợ lý cá nhân bằng ADK tại thời điểm này, vì vậy chúng tôi sẽ không lặp lại các bước thiết lập đó ở đây.

Khi kết thúc lớp học lập trình này, bạn sẽ trang bị cho trợ lý cá nhân của mình các công cụ cho nhiều mục đích, tiến thêm một bước để mở rộng trong các phần tiếp theo của loạt bài này khi chúng ta biến trợ lý đó thành một Hệ thống đa tác nhân (MAS) tinh vi.

Điều kiện tiên quyết

Kiến thức bạn sẽ học được

  • Cung cấp cho tác nhân của bạn các kỹ năng mới bằng cách tạo các hàm Python tuỳ chỉnh dưới dạng công cụ.
  • Kết nối tác nhân của bạn với thông tin theo thời gian thực bằng các công cụ tích hợp sẵn như Google Tìm kiếm.
  • Cấu trúc một tác nhân đa công cụ bằng cách tạo các tác nhân phụ chuyên biệt cho các tác vụ phức tạp.
  • Tích hợp các công cụ từ các khung AI phổ biến như LangChain để nhanh chóng mở rộng các chức năng.

Bạn cần có

  • Máy tính hoạt động và Wi-Fi đáng tin cậy
  • Một trình duyệt, chẳng hạn như Chrome, để truy cập vào Google Cloud Console
  • Một Dự án trên Google Cloud đã bật tính năng thanh toán
  • Có trí tò mò và ham học hỏi

2. Giới thiệu

Trong lớp học lập trình cơ bản về ADK, bạn đã tạo một tác nhân trợ lý cá nhân có bộ não LLM mạnh mẽ. Tuy nhiên, có thể bạn đã nhận thấy những hạn chế của mô hình này: mô hình không thể truy cập vào thông tin được tạo sau ngày huấn luyện và không thể tương tác với các dịch vụ bên ngoài. Giống như một trợ lý thông minh, hiểu biết bị mắc kẹt trong thư viện mà không có điện thoại hoặc Internet.

Để nhân viên hỗ trợ của chúng ta thực sự hữu ích, chúng ta cần cung cấp cho nhân viên đó các công cụ.

Hãy coi các công cụ như việc cấp cho trợ lý thông minh đó quyền truy cập vào thế giới bên ngoài: máy tính, trình duyệt web hoặc quyền truy cập vào một cơ sở dữ liệu cụ thể của công ty. Trong ADK, công cụ là một đoạn mã theo mô-đun, cho phép tác nhân thực hiện các hành động cụ thể như tra cứu dữ liệu theo thời gian thực hoặc gọi một API bên ngoài. Việc sử dụng các công cụ giúp AI đàm thoại có khả năng vượt xa một cuộc trò chuyện đơn thuần.

ADK cung cấp 3 danh mục công cụ:

  1. Công cụ chức năng: Các công cụ tuỳ chỉnh mà bạn phát triển để đáp ứng các yêu cầu riêng của ứng dụng, chẳng hạn như các hàm và tác nhân được xác định trước.
  2. Công cụ tích hợp: Các công cụ có sẵn do khung cung cấp cho các thao tác phổ biến, chẳng hạn như Google Tìm kiếm và Thực thi mã.
  3. Công cụ của bên thứ ba: Các thư viện bên ngoài phổ biến như Serper và các công cụ của LangChain và CrewAI.

Để tìm hiểu thêm về cách sử dụng Công cụ với ADK Agents, hãy xem tài liệu chính thức. Trong lớp học lập trình này, chúng ta sẽ thêm các công cụ để biến tác nhân đơn giản của mình thành một trợ lý du lịch cá nhân có năng lực. Bắt đầu nào!

3. Thêm một Công cụ hàm

Tiếp tục từ phiên trước, bạn sẽ có một trợ lý cá nhân đang chạy thông qua giao diện web.

7b779b9601941a12.png

Giả sử bạn đang chuẩn bị cho chuyến đi đến Nhật Bản vào tháng tới và cần kiểm tra tỷ giá hối đoái hiện tại. Hỏi nhân viên hỗ trợ:

What is the exchange rate from Singapore dollars to Japanese yen?

a8f38e3c404ada9c.png

Bạn sẽ thấy rằng trợ lý không thể truy xuất tỷ giá hối đoái theo thời gian thực. Lý do là vì hiện tại, trợ lý không có quyền truy cập vào Internet và không kết nối được với hệ thống bên ngoài. Để giải quyết vấn đề này, chúng ta sẽ triển khai một hàm Python để truy xuất tỷ giá hối đoái thông qua REST API và tích hợp hàm này dưới dạng một Công cụ hàm cho tác nhân.

Trước tiên, hãy kết thúc quy trình tác nhân đang chạy bằng cách sử dụng phím tắt Ctrl + C (đối với Windows/Linux) hoặc Cmd + C (đối với macOS).

Sau đó, hãy tạo một tệp Python có tên là custom_functions.py. Tệp này sẽ chứa hàm Python chịu trách nhiệm truy xuất dữ liệu tỷ giá hối đoái từ một API bên ngoài.

Tạo custom_functions.py:

import requests

# define a function to get exchange rate
def get_fx_rate(base: str, target: str):
        """
        Fetches the current exchange rate between two currencies.

        Args:
                base: The base currency (e.g., "SGD").
                target: The target currency (e.g., "JPY").

        Returns:
                The exchange rate information as a json response,
                or None if the rate could not be fetched.
        """
        base_url = "https://hexarate.paikama.co/api/rates/latest"
        api_url = f"{base_url}/{base}?target={target}"

        response = requests.get(api_url)
        if response.status_code == 200:
                return response.json()

Bây giờ, hãy chỉnh sửa tệp agent.py: nhập hàm get_fx_rate và chỉ định hàm đó làm FunctionTool.

Đang cập nhật agent.py:

from google.adk.agents import Agent
from google.adk.tools import FunctionTool

from .custom_functions import get_fx_rate

root_agent = Agent(
    model='gemini-2.0-flash-001',
    name='root_agent',
    description='A helpful assistant for user questions.',
    instruction='Answer user questions to the best of your knowledge',
    tools=[FunctionTool(get_fx_rate)]
)

Sau khi thay đổi, hãy khởi động lại tác nhân bằng cách nhập:

uv run adk web

Khi tác nhân hoạt động, hãy hỏi lại câu hỏi tương tự:

What is the exchange rate from Singapore dollars to Japanese yen?

Lần này, bạn sẽ thấy tỷ giá hối đoái thực tế do công cụ get_fx_rate cung cấp.

4f671fe04f8421f5.png

Bạn có thể đặt bất kỳ câu hỏi nào liên quan đến việc đổi ngoại tệ.

4. Thêm công cụ tích hợp

Giờ đây, khi có thể cung cấp tỷ giá hối đoái, tác vụ tiếp theo là lấy thông tin dự báo thời tiết của tháng tới. Đặt câu hỏi này cho nhân viên hỗ trợ:

What is the weather forecast in Tokyo, Japan for next month?

96c175077957fdd0.png

Như bạn có thể thấy, thông tin dự báo thời tiết cần có thông tin theo thời gian thực mà nhân viên hỗ trợ của chúng tôi không có. Mặc dù có thể viết mã các hàm Python mới cho từng phần dữ liệu theo thời gian thực cần thiết, nhưng việc thêm ngày càng nhiều công cụ tuỳ chỉnh sẽ nhanh chóng khiến tác nhân trở nên quá phức tạp và khó quản lý.

Rất may là Bộ công cụ phát triển (ADK) của Trợ lý cung cấp một bộ công cụ tích hợp sẵn, bao gồm cả Google Tìm kiếm, sẵn sàng sử dụng, giúp đơn giản hoá cách trợ lý của chúng tôi tương tác với thế giới bên ngoài. Hãy thêm một công cụ Tìm kiếm của Google vào tác nhân của chúng ta. Để làm việc đó, bạn cần chỉnh sửa tệp agent.py như sau:

from google.adk.agents import Agent
from google.adk.tools import FunctionTool
from google.adk.tools import google_search

from .custom_functions import get_fx_rate

root_agent = Agent(
    model='gemini-2.0-flash-001',
    name='root_agent',
    description='A helpful assistant for user questions.',
    instruction='Answer user questions to the best of your knowledge',
    tools=[
        FunctionTool(get_fx_rate), 
        google_search,
    ]
)

Sau khi bạn chỉnh sửa tệp, hãy khởi động lại phiên bản adk web. Trong trường hợp bạn quên,

  1. Nhấp vào cửa sổ dòng lệnh, nhấn tổ hợp phím Ctrl + C hoặc Cmd + C để dừng phiên bản
  2. uv run adk web để khởi động phiên bản

Bạn sẽ gặp phải lỗi!

Lỗi này là có chủ ý và hướng dẫn một nguyên tắc kiến trúc cốt lõi của ADK. Để tránh sự mơ hồ và giữ cho thiết kế của tác nhân gọn gàng, tác nhân được thiết kế để chỉ sử dụng một công cụ chính dựa trên tìm kiếm. Bạn không thể chỉ liệt kê google_search cùng với các công cụ phức tạp khác trong cùng một tác nhân.

Cách tiếp cận phù hợp là áp dụng mô hình nhiều tác nhân: chúng ta tạo một tác nhân mới, chuyên biệt, có nhiệm vụ duy nhất là thực hiện các lượt tìm kiếm trên Google. Sau đó, chúng tôi cung cấp tác nhân tìm kiếm này cho personal_assistant chính của mình dưới dạng một công cụ.

Bây giờ, hãy tạo một tệp Python có tên là custom_agents.py. Tệp này sẽ chứa mã cho google_search_agent chuyên biệt. Sao chép mã nguồn sau đây vào tệp custom_agents.py.

Đang tạo custom_agents.py

from google.adk.agents import Agent
from google.adk.tools import google_search


# Create an agent with google search tool as a search specialist
google_search_agent = Agent(
    model='gemini-2.0-flash-001',
    name='google_search_agent',
    description='A search agent that uses google search to get latest information about current events, weather, or business hours.',
    instruction='Use google search to answer user questions about real-time, logistical information.',
    tools=[google_search],
)

Sau khi tạo tệp, hãy cập nhật tệp agent.py như minh hoạ dưới đây.

Đang cập nhật agent.py

from google.adk.agents import Agent
from google.adk.tools import FunctionTool
from google.adk.tools import agent_tool

from .custom_functions import get_fx_rate
from .custom_agents import google_search_agent


root_agent = Agent(
    model='gemini-2.0-flash-001',
    name='root_agent',
    description='A helpful assistant for user questions.',
    tools=[
        FunctionTool(get_fx_rate), 
        agent_tool.AgentTool(agent=google_search_agent),
    ]
)

Hãy phân tích mẫu mới mạnh mẽ trong mã:

  • Một tác nhân chuyên trách mới: Chúng tôi đã xác định một tác nhân hoàn toàn mới là google_search_agent. Lưu ý nội dung mô tả cụ thể và công cụ duy nhất của thẻ này là google_search. Đây là một chuyên gia về tìm kiếm.
  • agent_tool.AgentTool: Đây là một trình bao bọc đặc biệt từ ADK. Công cụ này lấy toàn bộ một tác nhân (google_search_agent của chúng tôi) và đóng gói tác nhân đó để trông giống như một công cụ tiêu chuẩn.
  • Thông minh hơn **root_agent**: root_agent của chúng tôi hiện có một công cụ mới: agent_tool.AgentTool(agent=google_search_agent). Mô hình này không biết cách tìm kiếm trên web, nhưng biết rằng mình có một công cụ có thể uỷ quyền các tác vụ tìm kiếm.

Lưu ý rằng trường chỉ dẫn đã biến mất khỏi root_agent. Giờ đây, các chỉ dẫn của công cụ này được xác định ngầm bằng những công cụ mà nó có. Đây là một trình điều phối hoặc bộ định tuyến, có nhiệm vụ chính là hiểu yêu cầu của người dùng và chuyển yêu cầu đó đến đúng công cụ, có thể là hàm get_fx_rate hoặc google_search_agent. Thiết kế phi tập trung này là chìa khoá để xây dựng các hệ thống tác nhân phức tạp và dễ bảo trì.

Bây giờ, hãy khởi động lại phiên bản adk web và hỏi lại tác nhân câu hỏi này:

What is the weather forecast in Tokyo, Japan for next month?

9771716f64132c54.png

Giờ đây, trợ lý đang sử dụng google_search_agent để lấy thông tin mới nhất

Bạn cũng có thể thử đặt câu hỏi về tỷ giá hối đoái hiện tại. Giờ đây, trợ lý ảo có thể sử dụng công cụ phù hợp cho từng câu hỏi.

2a8e6525a9f5a4ee.png

Bạn có thể thoải mái đặt cho trợ lý những câu hỏi khác cần thông tin theo thời gian thực và quan sát cách trợ lý xử lý các câu hỏi đó bằng những công cụ mà trợ lý có.

5. Thêm công cụ của bên thứ ba

Trợ lý AI của chúng tôi đang trở thành một trợ lý du lịch tuyệt vời. Công cụ này có thể xử lý việc quy đổi tiền tệ bằng công cụ get_fx_rate và quản lý hoạt động hậu cần bằng công cụ google_search_agent. Tuy nhiên, một chuyến đi tuyệt vời không chỉ là vấn đề về hậu cần mà còn là việc tìm hiểu văn hoá và lịch sử của điểm đến.

Mặc dù công cụ google_search_agent có thể cung cấp thông tin về văn hoá và lịch sử dựa trên kết quả tìm kiếm, nhưng bạn nên lấy thông tin đó từ một nguồn đáng tin cậy hơn như Wikipedia. Tương tự, bạn có thể tạo hàm Python của riêng mình để trích xuất thông tin từ Wikipedia, nhưng chắc chắn phải có cách tốt hơn.

Rất may là ADK được thiết kế để có khả năng mở rộng cao, cho phép bạn tích hợp liền mạch các công cụ từ các khung AI Agent khác như CrewAI và LangChain. Khả năng tương tác này là yếu tố quan trọng vì giúp giảm thời gian phát triển và cho phép bạn sử dụng lại các công cụ hiện có. Đối với trường hợp sử dụng này, chúng ta sẽ tận dụng các công cụ của Wikipedia trong LangChain.

Trước tiên, hãy dừng quy trình tác nhân đang chạy (Ctrl + C hoặc Cmd + C) rồi cài đặt các thư viện bổ sung vào môi trường ảo Python hiện tại.

uv add langchain-community
uv add wikipedia

Sau khi quá trình cài đặt hoàn tất. Tạo một tệp có tên là third_party_tools.py. Tệp này sẽ chứa phương thức triển khai cho công cụ LangChain Wikipedia.

Đang tạo third_party_tools.py

from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper

# Configure the Wikipedia LangChain tool to act as our cultural guide
langchain_wikipedia_tool = WikipediaQueryRun(
    api_wrapper=WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=3000)
)

# Give the tool a more specific description for our agent
langchain_wikipedia_tool.description = (
    "Provides deep historical and cultural information on landmarks, concepts, and places."
    "Use this for 'tell me about' or 'what is the history of' type questions."
)

Bây giờ, hãy cập nhật tệp agent.py.

Đang cập nhật agent.py

from google.adk.agents import Agent
from google.adk.tools import FunctionTool
from google.adk.tools import agent_tool
from google.adk.tools import langchain_tool

from .custom_functions import get_fx_rate
from .custom_agents import google_search_agent
from .third_party_tools import langchain_wikipedia_tool


root_agent = Agent(
    model='gemini-2.0-flash-001',
    name='root_agent',
    description='A helpful assistant for user questions.',
    tools=[
        FunctionTool(get_fx_rate), 
        agent_tool.AgentTool(agent=google_search_agent),
        langchain_tool.LangchainTool(langchain_wikipedia_tool),
    ]
)

Bây giờ, hãy khởi động lại phiên bản adk web và hỏi lại tác nhân câu hỏi này:

Tell me about the history of Kyoto

862ec3546a8fbb5f.png

Trợ lý xác định chính xác đây là một câu hỏi trong quá khứ và sử dụng công cụ Wikipedia mới của mình. Bằng cách tích hợp một công cụ của bên thứ ba và chỉ định cho công cụ đó một vai trò cụ thể, bạn đã giúp tác nhân của mình thông minh và hữu ích hơn đáng kể cho mục đích lập kế hoạch du lịch.

Để biết chính xác cách mà tác nhân đưa ra lựa chọn này, bạn có thể sử dụng trình kiểm tra sự kiện trong giao diện người dùng adk web. Nhấp vào thẻ Sự kiện, rồi nhấp vào sự kiện functionCall gần đây nhất.

e3f388b64d08e666.png

Trình kiểm tra cho thấy danh sách tất cả các công cụ có sẵn và làm nổi bật tool_code cho công cụ mà tác nhân đã thực thi.

135c9a1068d6c58f.png

6. Dọn dẹp

Vì lớp học lập trình này không liên quan đến bất kỳ sản phẩm nào chạy trong thời gian dài, nên bạn chỉ cần dừng các phiên hoạt động của tác nhân (ví dụ: phiên bản adk web trong thiết bị đầu cuối) bằng cách nhấn Ctrl + C trong thiết bị đầu cuối.

Xoá thư mục và tệp dự án của nhân viên hỗ trợ

Nếu bạn chỉ muốn xoá mã khỏi môi trường Cloud Shell, hãy sử dụng các lệnh sau:

cd ~
rm -rf ai-agents-adk

Tắt Vertex AI API

Để tắt Vertex AI API đã được bật trước đó, hãy chạy lệnh sau:

gcloud services disable aiplatform.googleapis.com

Tắt toàn bộ dự án trên Google Cloud

Nếu bạn muốn tắt hoàn toàn dự án Google Cloud, hãy tham khảo hướng dẫn chính thức để biết hướng dẫn chi tiết.

7. Kết luận

Xin chúc mừng! Bạn đã uỷ quyền thành công cho tác nhân trợ lý cá nhân bằng các hàm tuỳ chỉnh và quyền truy cập vào Google Tìm kiếm theo thời gian thực.

Quan trọng hơn, bạn đã học được mẫu kiến trúc cơ bản để xây dựng các tác nhân có khả năng: sử dụng các tác nhân chuyên biệt làm công cụ. Bằng cách tạo một google_search_agent chuyên dụng và cung cấp nó cho root_agent, bạn đã thực hiện bước đầu tiên từ việc xây dựng một tác nhân duy nhất đến việc điều phối một hệ thống đa tác nhân đơn giản nhưng mạnh mẽ.

Giờ đây, bạn đã chuẩn bị sẵn sàng cho lớp học lập trình tiếp theo trong chuỗi lớp học lập trình này. Trong lớp học lập trình đó, chúng ta sẽ tìm hiểu sâu hơn về việc điều phối nhiều tác nhân và quy trình làm việc. Hẹn gặp bạn ở lớp học này nhé!