(Натисніть на зображення вище, щоб переглянути відео цього уроку)
Інструменти цікаві тим, що вони дозволяють AI агентам мати ширший спектр можливостей. Замість того, щоб агент мав обмежений набір дій, які він може виконувати, додаючи інструмент, тепер агент може виконувати широкий спектр дій. У цій главі ми розглянемо Шаблон проектування використання інструментів, який описує, як AI агенти можуть використовувати певні інструменти для досягнення своїх цілей.
У цьому уроці ми прагнемо відповісти на такі питання:
Після завершення цього уроку ви зможете:
Шаблон проектування використання інструментів зосереджений на наданні LLM можливості взаємодіяти із зовнішніми інструментами для досягнення конкретних цілей. Інструменти — це код, який може бути виконаний агентом для виконання дій. Інструмент може бути простою функцією, наприклад калькулятором, або викликом API до стороннього сервісу, такого як пошук цін на акції або прогноз погоди. У контексті AI агентів інструменти розроблені для виконання агентами у відповідь на генеровані моделлю виклики функцій.
AI агенти можуть використовувати інструменти для виконання складних завдань, отримання інформації чи прийняття рішень. Шаблон проектування використання інструментів часто застосовується в сценаріях, які вимагають динамічної взаємодії з зовнішніми системами, такими як бази даних, веб-сервіси або інтерпретатори коду. Ця здатність корисна для низки різних випадків використання, включаючи:
Ці будівельні блоки дозволяють AI агенту виконувати широкий спектр завдань. Розглянемо ключові елементи, потрібні для реалізації Шаблону проектування використання інструментів:
Схеми функцій/інструментів: Детальні визначення доступних інструментів, включно з ім’ям функції, призначенням, необхідними параметрами та очікуваними результатами. Ці схеми дозволяють LLM розуміти, які інструменти доступні і як формувати дійсні запити.
Логіка виконання функцій: Визначає, як і коли інструменти викликаються на основі наміру користувача та контексту розмови. Може включати модулі планування, механізми маршрутизації або умовні потоки, які динамічно визначають використання інструментів.
Система обробки повідомлень: Компоненти, що керують діалогом між введеннями користувача, відповідями LLM, викликами інструментів та їх відповідями.
Фреймворк інтеграції інструментів: Інфраструктура, яка під’єднує агента до різних інструментів, будь то прості функції або складні зовнішні сервіси.
Обробка помилок та валідація: Механізми для обробки помилок виконання інструментів, перевірки параметрів та керування непередбачуваними відповідями.
Управління станом: Відстеження контексту розмови, попередніх взаємодій з інструментами та збережених даних для забезпечення узгодженості у багатокрокових діалогах.
Далі розглянемо докладніше Виклик функції/інструменту.
Виклик функції — це основний спосіб, яким ми надаємо великим мовним моделям (LLM) змогу взаємодіяти з інструментами. Часто терміни «Функція» і «Інструмент» використовують як синоніми, бо «функції» (блоки багаторазового використання коду) є «інструментами», які агенти застосовують для виконання завдань. Щоб код функції був викликаний, LLM має порівняти запит користувача з описом функції. Для цього до LLM надсилається схема, що містить описи всіх доступних функцій. LLM тоді обирає найбільш підходящу для завдання функцію та повертає її ім’я і аргументи. Обрана функція виконується, її відповідь повертається LLM, який використовує цю інформацію для формування відповіді на запит користувача.
Щоб реалізувати виклик функції для агентів, вам знадобиться:
Візьмемо приклад отримання поточного часу в місті:
Ініціалізуємо LLM, що підтримує виклики функцій:
Не всі моделі підтримують виклики функцій, тому важливо переконатись, що обрана модель це робить. Azure OpenAI підтримує виклики функцій. Почнемо з ініціалізації клієнта Azure OpenAI.
# Ініціалізуйте клієнт Azure OpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Створення схеми функції:
Далі ми визначимо JSON-схему, що містить ім’я функції, опис її призначення, а також імена і описи параметрів функції. Потім передамо цю схему клієнту, створеному раніше, разом із запитом користувача, який хоче дізнатись час у Сан-Франциско. Важливо відзначити, що результатом є виклик інструменту, а не остаточна відповідь на запитання. Як зазначалося раніше, LLM повертає ім’я обраної функції та аргументи, які будуть передані.
# Опис функції для читання моделлю
tools = [
{
"type": "function",
"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"],
},
}
}
]
# Початкове повідомлення користувача
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# Перший виклик API: Запитайте модель використовувати функцію
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Обробити відповідь моделі
response_message = response.choices[0].message
messages.append(response_message)
print("Model's response:")
print(response_message)
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
Код функції, необхідний для виконання завдання:
Тепер, коли LLM вибрав функцію для запуску, потрібно реалізувати і виконати код, який виконує завдання. Ми реалізуємо код отримання поточного часу на Python. Також необхідно написати код, який витягає ім’я та аргументи з response_message, щоб отримати кінцевий результат.
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"})
# Обробка викликів функцій
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
if tool_call.function.name == "get_current_time":
function_args = json.loads(tool_call.function.arguments)
time_response = get_current_time(
location=function_args.get("location")
)
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": "get_current_time",
"content": time_response,
})
else:
print("No tool calls were made by the model.")
# Другий виклик API: Отримати остаточну відповідь від моделі
final_response = client.chat.completions.create(
model=deployment_name,
messages=messages,
)
return final_response.choices[0].message.content
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
Виклик функції є основою більшості, якщо не всіх, реалізацій шаблону використання інструментів, проте його імплементація з нуля може іноді бути складною. Як ми дізналися в Уроці 2, агентні фреймворки надають нам готові будівельні блоки для реалізації використання інструментів.
Ось кілька прикладів, як можна реалізувати Шаблон проектування використання інструментів, використовуючи різні агентні фреймворки:
Semantic Kernel — це відкрите фреймворк для AI розробників на .NET, Python та Java, що працюють з великими мовними моделями (LLM). Він спрощує процес використання викликів функцій, автоматично описуючи ваші функції та їх параметри для моделі за допомогою процесу, який називається серіалізацією. Також він обробляє двосторонню комунікацію між моделлю та вашим кодом. Ще одна перевага використання агентного фреймворка, як Semantic Kernel, — це доступ до готових інструментів, таких як Пошук файлів та Інтерпретатор коду.
Наступна діаграма ілюструє процес виклику функції з Semantic Kernel:

У Semantic Kernel функції/інструменти називаються Плагінами. Ми можемо перетворити функцію get_current_time, яку бачили раніше, у плагін, створивши з неї клас із функцією всередині. Ми також можемо імпортувати декоратор kernel_function, який приймає опис функції. При створенні kernel з GetCurrentTimePlugin, kernel автоматично серіалізує функцію та її параметри, створюючи схему для відправлення LLM.
from semantic_kernel.functions import kernel_function
class GetCurrentTimePlugin:
async def __init__(self, location):
self.location = location
@kernel_function(
description="Get the current time for a given location"
)
def get_current_time(location: str = ""):
...
from semantic_kernel import Kernel
# Створити ядро
kernel = Kernel()
# Створити плагін
get_current_time_plugin = GetCurrentTimePlugin(location)
# Додати плагін до ядра
kernel.add_plugin(get_current_time_plugin)
Azure AI Agent Service — це новіший агентний фреймворк, призначений для того, щоб надати розробникам можливість безпечно створювати, розгортати та масштабувати високоякісних і розширюваних AI агентів без необхідності керувати базовими обчислювальними та сховищними ресурсами. Він особливо корисний для корпоративних застосунків, оскільки є повністю керованим сервісом із корпоративним рівнем безпеки.
У порівнянні з розробкою безпосередньо через LLM API, Azure AI Agent Service має кілька переваг, зокрема:
Інструменти, доступні в Azure AI Agent Service, поділяються на дві категорії:
Сервіс Agent дозволяє використовувати ці інструменти разом як toolset. Він також використовує threads, які відстежують історію повідомлень конкретної розмови.
Уявіть, що ви торговий агент у компанії під назвою Contoso. Ви хочете створити діалогового агента, який зможе відповідати на питання про ваші продажі.
Наступне зображення ілюструє, як можна використовувати Azure AI Agent Service для аналізу продажів:

Щоб використати будь-який із цих інструментів із сервісом, ми можемо створити клієнта й визначити інструмент або набір інструментів. Для практичної реалізації ми можемо використати наступний код на Python. LLM зможе переглянути набір інструментів і вирішити, чи використовувати створену користувачем функцію fetch_sales_data_using_sqlite_query, чи вбудований Інтерпретатор коду залежно від запиту користувача.
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, яка знаходиться у файлі fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# Ініціалізація набору інструментів
toolset = ToolSet()
# Ініціалізація агента виклику функції з функцією fetch_sales_data_using_sqlite_query та додавання її до набору інструментів
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Ініціалізація інструменту Інтерпретатор коду та додавання його до набору інструментів.
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
Поширене занепокоєння щодо динамічно згенерованого LLM SQL пов’язане з безпекою, зокрема ризиком SQL ін’єкцій або шкідливої діяльності, такої як видалення чи модифікація бази даних. Хоча ці занепокоєння є обґрунтованими, їх можна ефективно пом’якшити правильним налаштуванням прав доступу до бази даних. Для більшості баз потрібно налаштувати базу у режимі лише для читання. Для сервісів баз даних, таких як PostgreSQL або Azure SQL, додаток має отримати роль лише для читання (SELECT). Запуск додатка в захищеному середовищі додатково посилює захист. У корпоративних сценаріях дані зазвичай витягуються та трансформуються з операційних систем у базу даних або сховище даних лише для читання з дружньою до користувача схемою. Такий підхід забезпечує безпеку даних, оптимізацію продуктивності та доступності, а також обмежений, лише для читання, доступ додатка.
Приєднуйтесь до Azure AI Foundry Discord, щоб зустрітися з іншими учнями, відвідати години консультацій і отримати відповіді на питання щодо AI-агентів.
Розуміння агентних шаблонів дизайну
Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу штучного інтелекту Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ його рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатися до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння чи неправильне тлумачення, що виникли внаслідок використання цього перекладу.