Bỏ qua tới nội dung
Bài 4/11 · AI Agent cho người mới bắt đầu (Microsoft)

Mẫu thiết kế Tool Use

Mẫu thiết kế Tool Use là gì, các trường hợp áp dụng, các khối xây dựng, function calling từng bước và cách dùng tool an toàn với Microsoft Agent Framework, Foundry Agent Service.

Cơ bản@shine190414 phút đọc

Tool thú vị ở chỗ chúng cho phép AI agent có phạm vi khả năng rộng hơn. Thay vì agent chỉ có một tập hành động giới hạn, khi thêm tool, agent có thể thực hiện rất nhiều hành động khác nhau. Trong bài này, chúng ta sẽ xem mẫu thiết kế (design pattern) Tool Use, mô tả cách AI agent dùng các tool cụ thể để đạt mục tiêu.

Video của bài: Tool Use Design Pattern.

Giới thiệu

Trong bài này, chúng ta muốn trả lời các câu hỏi sau:

  • Mẫu thiết kế Tool Use là gì?
  • Có thể áp dụng nó cho những trường hợp nào?
  • Cần những thành phần/khối xây dựng nào để cài đặt mẫu thiết kế này?
  • Cần lưu ý đặc biệt gì khi dùng mẫu Tool Use để xây AI agent đáng tin cậy?

Mục tiêu học tập

Sau bài này, bạn sẽ có thể:

  • Định nghĩa mẫu thiết kế Tool Use và mục đích của nó.
  • Nhận ra các trường hợp áp dụng được mẫu Tool Use.
  • Hiểu các thành phần chính cần có để cài đặt mẫu thiết kế này.
  • Nhận biết các lưu ý để đảm bảo tính đáng tin cậy của AI agent khi dùng mẫu này.

Mẫu thiết kế Tool Use là gì?

Mẫu thiết kế Tool Use tập trung vào việc trao cho LLM khả năng tương tác với tool bên ngoài để đạt mục tiêu cụ thể. Tool là code mà agent có thể thực thi để thực hiện hành động. Một tool có thể là một hàm đơn giản như máy tính, hoặc một lời gọi API tới dịch vụ bên thứ ba như tra giá cổ phiếu hay dự báo thời tiết. Trong ngữ cảnh AI agent, tool được thiết kế để agent thực thi khi đáp lại các lời gọi hàm do model sinh ra.

Có thể áp dụng cho những trường hợp nào?

AI agent có thể tận dụng tool để hoàn thành tác vụ phức tạp, truy xuất thông tin hoặc ra quyết định. Mẫu Tool Use thường được dùng trong các kịch bản cần tương tác linh hoạt với hệ thống bên ngoài như cơ sở dữ liệu, dịch vụ web hay trình thông dịch code. Khả năng này hữu ích cho nhiều trường hợp sử dụng, bao gồm:

  • Truy xuất thông tin linh hoạt: agent có thể truy vấn API hoặc cơ sở dữ liệu bên ngoài để lấy dữ liệu mới nhất (ví dụ truy vấn cơ sở dữ liệu SQLite để phân tích dữ liệu, lấy giá cổ phiếu hoặc thông tin thời tiết).
  • Thực thi và thông dịch code: agent có thể chạy code hoặc script để giải bài toán, tạo báo cáo hoặc chạy mô phỏng.
  • Tự động hoá quy trình: tự động hoá các quy trình (workflow) lặp lại hoặc nhiều bước bằng cách tích hợp tool như bộ lập lịch tác vụ, dịch vụ email hay pipeline dữ liệu.
  • Hỗ trợ khách hàng: agent có thể tương tác với hệ thống CRM, nền tảng ticket hoặc cơ sở tri thức để giải quyết yêu cầu của người dùng.
  • Tạo và biên tập nội dung: agent có thể tận dụng tool như trình kiểm tra ngữ pháp, bộ tóm tắt văn bản hoặc bộ đánh giá an toàn nội dung để hỗ trợ tác vụ sáng tạo nội dung.

Cần những thành phần nào để cài đặt mẫu Tool Use?

Các khối xây dựng này cho phép AI agent thực hiện nhiều loại tác vụ. Chúng ta hãy xem các thành phần chính cần có:

  • Schema của hàm/tool: định nghĩa chi tiết các tool có sẵn, gồm tên hàm, mục đích, tham số bắt buộc và đầu ra mong đợi. Các schema này giúp LLM hiểu có những tool nào và cách tạo yêu cầu hợp lệ.
  • Logic thực thi hàm: quy định cách và thời điểm gọi tool dựa trên ý định của người dùng và ngữ cảnh hội thoại. Có thể gồm module lập kế hoạch, cơ chế định tuyến hoặc các luồng điều kiện quyết định việc dùng tool một cách linh hoạt.
  • Hệ thống xử lý tin nhắn: các thành phần quản lý luồng hội thoại giữa đầu vào của người dùng, phản hồi của LLM, lời gọi tool và đầu ra của tool.
  • Framework tích hợp tool: hạ tầng kết nối agent với các tool, dù là hàm đơn giản hay dịch vụ bên ngoài phức tạp.
  • Xử lý lỗi và kiểm tra hợp lệ: cơ chế xử lý khi tool thực thi thất bại, kiểm tra tham số và xử lý phản hồi bất ngờ.
  • Quản lý trạng thái: theo dõi ngữ cảnh hội thoại, các tương tác tool trước đó và dữ liệu lâu dài để đảm bảo tính nhất quán qua nhiều lượt tương tác.

Tiếp theo, chúng ta hãy xem chi tiết hơn về function/tool calling.

Function/Tool calling

Function calling là cách chính để chúng ta cho phép Large Language Model (LLM) tương tác với tool. Bạn sẽ thường thấy "function" và "tool" được dùng thay thế cho nhau, vì "function" (các khối code tái sử dụng được) chính là "tool" mà agent dùng để thực hiện tác vụ. Để code của một hàm được gọi, LLM phải so sánh yêu cầu của người dùng với mô tả của các hàm. Để làm vậy, một schema chứa mô tả của mọi hàm có sẵn được gửi cho LLM. Sau đó LLM chọn hàm phù hợp nhất cho tác vụ và trả về tên cùng đối số của hàm. Hàm được chọn sẽ được gọi, phản hồi của nó được gửi lại cho LLM, và LLM dùng thông tin đó để trả lời yêu cầu của người dùng.

Để nhà phát triển cài đặt function calling cho agent, bạn cần:

  1. Một LLM hỗ trợ function calling
  2. Một schema chứa mô tả các hàm
  3. Code cho từng hàm được mô tả

Chúng ta hãy dùng ví dụ lấy giờ hiện tại ở một thành phố để minh hoạ.

Bước 1: khởi tạo một LLM hỗ trợ function calling

Không phải model nào cũng hỗ trợ function calling, nên cần kiểm tra LLM bạn dùng có hỗ trợ không. Azure OpenAI hỗ trợ function calling. Chúng ta có thể bắt đầu bằng cách khởi tạo OpenAI client trỏ tới Responses API của Azure OpenAI (endpoint ổn định /openai/v1/, không cần api_version).

python
# Initialize the OpenAI client for Azure OpenAI (Responses API, v1 endpoint)
client = OpenAI(
    base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('/')}/openai/v1/",
    api_key=os.environ["AZURE_OPENAI_API_KEY"],
)
deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT"]

Bước 2: tạo schema cho hàm

Tiếp theo, chúng ta định nghĩa một JSON schema chứa tên hàm, mô tả việc hàm làm, cùng tên và mô tả các tham số của hàm. Sau đó chúng ta đưa schema này vào client đã tạo ở trên, kèm yêu cầu của người dùng muốn biết giờ ở San Francisco. Điều quan trọng cần lưu ý là thứ được trả về là một lời gọi tool, không phải câu trả lời cuối cùng cho câu hỏi. Như đã nói, LLM trả về tên hàm nó chọn cho tác vụ và các đối số sẽ truyền cho hàm.

python
# Function description for the model to read (Responses API flat tool format)
tools = [
    {
        "type": "function",
        "name": "get_current_time",
        "description": "Get the current time in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city name, e.g. San Francisco",
                },
            },
            "required": ["location"],
        },
    }
]
python

# Initial user message
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]

# First API call: Ask the model to use the function
response = client.responses.create(
    model=deployment_name,
    input=messages,
    tools=tools,
    tool_choice="auto",
    store=False,
)

# The Responses API returns tool calls as function_call items in response.output.
# Append them to the conversation so the model has full context on the next turn.
messages += response.output

print("Model's response:")
print(response.output)

bash
Model's response:
[ResponseFunctionToolCall(arguments='{"location":"San Francisco"}', call_id='call_pOsKdUlqvdyttYB67MOj434b', name='get_current_time', type='function_call')]

Bước 3: code của hàm để thực hiện tác vụ

Khi LLM đã chọn hàm cần chạy, code thực hiện tác vụ cần được cài đặt và thực thi. Chúng ta có thể cài đặt code lấy giờ hiện tại bằng Python. Chúng ta cũng cần viết code trích tên và đối số từ response_message để có kết quả cuối cùng.

python
  def get_current_time(location):
    """Get the current time for a given location"""
    print(f"get_current_time called with location: {location}")  
    location_lower = location.lower()
    
    for key, timezone in TIMEZONE_DATA.items():
        if key in location_lower:
            print(f"Timezone found for {key}")  
            current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
            return json.dumps({
                "location": location,
                "current_time": current_time
            })
  
    print(f"No timezone data found for {location_lower}")  
    return json.dumps({"location": location, "current_time": "unknown"})
python
# Handle function calls
tool_calls = [item for item in response.output if item.type == "function_call"]
if tool_calls:
    for tool_call in tool_calls:
        if tool_call.name == "get_current_time":

            function_args = json.loads(tool_call.arguments)

            time_response = get_current_time(
                location=function_args.get("location")
            )

            # Return the tool result as a function_call_output item
            messages.append({
                "type": "function_call_output",
                "call_id": tool_call.call_id,
                "output": time_response,
            })
else:
    print("No tool calls were made by the model.")

# Second API call: Get the final response from the model
final_response = client.responses.create(
    model=deployment_name,
    input=messages,
    tools=tools,
    store=False,
)

return final_response.output_text
bash
 get_current_time called with location: San Francisco
 Timezone found for san francisco
 The current time in San Francisco is 09:24 AM.

Function calling là trái tim của hầu hết, nếu không phải tất cả, thiết kế dùng tool của agent, nhưng tự cài đặt nó từ đầu đôi khi khá khó. Như đã học ở bài 2, các agentic framework cung cấp cho chúng ta những khối xây dựng dựng sẵn để cài đặt việc dùng tool.

Ví dụ dùng tool với agentic framework

Dưới đây là ví dụ cài đặt mẫu Tool Use bằng các agentic framework khác nhau.

Microsoft Agent Framework

Microsoft Agent Framework là một framework AI mã nguồn mở để xây AI agent. Nó đơn giản hoá việc dùng function calling bằng cách cho phép bạn định nghĩa tool là các hàm Python với decorator @tool. Framework lo phần giao tiếp qua lại giữa model và code của bạn. Nó cũng cho phép truy cập các tool dựng sẵn như File Search và Code Interpreter qua FoundryChatClient.

Sơ đồ sau minh hoạ quá trình function calling với Microsoft Agent Framework:

Function calling

Trong Microsoft Agent Framework, tool được định nghĩa là các hàm có decorator. Chúng ta có thể biến hàm get_current_time đã thấy ở trên thành một tool bằng decorator @tool. Framework sẽ tự động tuần tự hoá hàm và các tham số của nó, tạo schema để gửi cho LLM.

python
import os
from agent_framework import tool
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

@tool(approval_mode="never_require")
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# Create the client
provider = FoundryChatClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=AzureCliCredential(),
)

# Create an agent and run with the tool
agent = provider.as_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

Microsoft Foundry Agent Service

Microsoft Foundry Agent Service là một agentic framework mới hơn, được thiết kế để giúp nhà phát triển xây, triển khai và mở rộng các AI agent chất lượng cao, dễ mở rộng một cách an toàn mà không phải quản lý tài nguyên tính toán và lưu trữ bên dưới. Nó đặc biệt hữu ích cho ứng dụng doanh nghiệp vì là dịch vụ được quản lý hoàn toàn với bảo mật cấp doanh nghiệp.

So với việc phát triển trực tiếp với API của LLM, Microsoft Foundry Agent Service có một số lợi thế:

  • Tự động gọi tool: không cần tự phân tích lời gọi tool, gọi tool và xử lý phản hồi; tất cả giờ được làm ở phía server
  • Dữ liệu được quản lý an toàn: thay vì tự quản lý trạng thái hội thoại, bạn có thể dựa vào thread để lưu mọi thông tin cần thiết
  • Tool có sẵn: các tool bạn dùng để tương tác với nguồn dữ liệu, như Bing, Azure AI Search và Azure Functions.

Các tool trong Microsoft Foundry Agent Service chia thành hai nhóm:

  1. Knowledge Tools (tool tri thức):

  2. Action Tools (tool hành động):

Agent Service cho phép dùng các tool này cùng nhau dưới dạng một toolset. Nó cũng dùng threads để theo dõi lịch sử tin nhắn của từng cuộc hội thoại.

Hãy tưởng tượng bạn là nhân viên bán hàng ở công ty Contoso. Bạn muốn phát triển một agent hội thoại có thể trả lời câu hỏi về dữ liệu bán hàng.

Ảnh sau minh hoạ cách bạn có thể dùng Microsoft Foundry Agent Service để phân tích dữ liệu bán hàng:

Agent Service khi hoạt động

Để dùng bất kỳ tool nào trong số này với dịch vụ, chúng ta có thể tạo một client và định nghĩa một tool hoặc toolset. Để cài đặt thực tế, chúng ta có thể dùng code Python sau. LLM sẽ xem toolset và quyết định dùng hàm do người dùng tạo, fetch_sales_data_using_sqlite_query, hay Code Interpreter dựng sẵn, tuỳ theo yêu cầu của người dùng.

python
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # fetch_sales_data_using_sqlite_query function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# Initialize toolset
toolset = ToolSet()

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-5-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

Lưu ý đặc biệt khi dùng mẫu Tool Use để xây AI agent đáng tin cậy

Một mối lo phổ biến với SQL do LLM sinh động là bảo mật, đặc biệt là rủi ro SQL injection hoặc hành động độc hại như xoá hay can thiệp vào cơ sở dữ liệu. Dù những lo ngại này có cơ sở, chúng có thể được giảm thiểu hiệu quả bằng cách cấu hình đúng quyền truy cập cơ sở dữ liệu. Với hầu hết cơ sở dữ liệu, việc này nghĩa là cấu hình cơ sở dữ liệu ở chế độ chỉ đọc. Với các dịch vụ cơ sở dữ liệu như PostgreSQL hay Azure SQL, ứng dụng nên được gán vai trò chỉ đọc (SELECT).

Chạy ứng dụng trong môi trường an toàn càng tăng cường bảo vệ. Trong các kịch bản doanh nghiệp, dữ liệu thường được trích xuất và biến đổi từ hệ thống vận hành sang một cơ sở dữ liệu chỉ đọc hoặc kho dữ liệu với schema thân thiện với người dùng. Cách làm này đảm bảo dữ liệu an toàn, được tối ưu cho hiệu năng và khả năng truy cập, và ứng dụng chỉ có quyền truy cập hạn chế, chỉ đọc.

Code mẫu

Còn câu hỏi về mẫu thiết kế Tool Use?

Tham gia Microsoft Foundry Discord để gặp gỡ những người cùng học, dự các buổi office hours và được giải đáp thắc mắc về AI agent.

Tài liệu bổ sung

Kiểm thử nhanh agent này (tuỳ chọn)

Sau khi học cách triển khai agent ở bài 16 của khoá gốc, bạn có thể kiểm thử nhanh TravelToolAgent của bài này (nó có còn gọi tool và trả lời không?) bằng tests/lesson-04-smoke-tests.json. Xem tests/README.md để biết cách chạy.

Nguồn