ai-agents-for-beginners

Як проектувати хороших AI агентів

(Натисніть на зображення вище, щоб переглянути відео цього уроку)

Шаблон проектування використання інструментів

Інструменти цікаві тим, що вони дозволяють AI агентам мати ширший спектр можливостей. Замість того, щоб агент мав обмежений набір дій, які він може виконувати, додаючи інструмент, тепер агент може виконувати широкий спектр дій. У цій главі ми розглянемо Шаблон проектування використання інструментів, який описує, як AI агенти можуть використовувати певні інструменти для досягнення своїх цілей.

Вступ

У цьому уроці ми прагнемо відповісти на такі питання:

Цілі навчання

Після завершення цього уроку ви зможете:

Що таке Шаблон проектування використання інструментів?

Шаблон проектування використання інструментів зосереджений на наданні LLM можливості взаємодіяти із зовнішніми інструментами для досягнення конкретних цілей. Інструменти — це код, який може бути виконаний агентом для виконання дій. Інструмент може бути простою функцією, наприклад калькулятором, або викликом API до стороннього сервісу, такого як пошук цін на акції або прогноз погоди. У контексті AI агентів інструменти розроблені для виконання агентами у відповідь на генеровані моделлю виклики функцій.

Для яких випадків він може бути застосований?

AI агенти можуть використовувати інструменти для виконання складних завдань, отримання інформації чи прийняття рішень. Шаблон проектування використання інструментів часто застосовується в сценаріях, які вимагають динамічної взаємодії з зовнішніми системами, такими як бази даних, веб-сервіси або інтерпретатори коду. Ця здатність корисна для низки різних випадків використання, включаючи:

Які елементи/будівельні блоки потрібні для реалізації шаблону використання інструментів?

Ці будівельні блоки дозволяють AI агенту виконувати широкий спектр завдань. Розглянемо ключові елементи, потрібні для реалізації Шаблону проектування використання інструментів:

Далі розглянемо докладніше Виклик функції/інструменту.

Виклик функції/інструмента

Виклик функції — це основний спосіб, яким ми надаємо великим мовним моделям (LLM) змогу взаємодіяти з інструментами. Часто терміни «Функція» і «Інструмент» використовують як синоніми, бо «функції» (блоки багаторазового використання коду) є «інструментами», які агенти застосовують для виконання завдань. Щоб код функції був викликаний, LLM має порівняти запит користувача з описом функції. Для цього до LLM надсилається схема, що містить описи всіх доступних функцій. LLM тоді обирає найбільш підходящу для завдання функцію та повертає її ім’я і аргументи. Обрана функція виконується, її відповідь повертається LLM, який використовує цю інформацію для формування відповіді на запит користувача.

Щоб реалізувати виклик функції для агентів, вам знадобиться:

  1. Модель LLM, що підтримує виклики функцій
  2. Схема функцій із їх описами
  3. Код для кожної описаної функції

Візьмемо приклад отримання поточного часу в місті:

  1. Ініціалізуємо 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"
     )
    
  2. Створення схеми функції:

    Далі ми визначимо 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')])
    
  3. Код функції, необхідний для виконання завдання:

    Тепер, коли 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

Semantic Kernel — це відкрите фреймворк для AI розробників на .NET, Python та Java, що працюють з великими мовними моделями (LLM). Він спрощує процес використання викликів функцій, автоматично описуючи ваші функції та їх параметри для моделі за допомогою процесу, який називається серіалізацією. Також він обробляє двосторонню комунікацію між моделлю та вашим кодом. Ще одна перевага використання агентного фреймворка, як Semantic Kernel, — це доступ до готових інструментів, таких як Пошук файлів та Інтерпретатор коду.

Наступна діаграма ілюструє процес виклику функції з Semantic Kernel:

function calling

У 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

Azure AI Agent Service — це новіший агентний фреймворк, призначений для того, щоб надати розробникам можливість безпечно створювати, розгортати та масштабувати високоякісних і розширюваних AI агентів без необхідності керувати базовими обчислювальними та сховищними ресурсами. Він особливо корисний для корпоративних застосунків, оскільки є повністю керованим сервісом із корпоративним рівнем безпеки.

У порівнянні з розробкою безпосередньо через LLM API, Azure AI Agent Service має кілька переваг, зокрема:

Інструменти, доступні в Azure AI Agent Service, поділяються на дві категорії:

  1. Інструменти знань:
  2. Інструменти дій:

Сервіс Agent дозволяє використовувати ці інструменти разом як toolset. Він також використовує threads, які відстежують історію повідомлень конкретної розмови.

Уявіть, що ви торговий агент у компанії під назвою Contoso. Ви хочете створити діалогового агента, який зможе відповідати на питання про ваші продажі.

Наступне зображення ілюструє, як можна використовувати Azure AI Agent Service для аналізу продажів:

Agentic Service In Action

Щоб використати будь-який із цих інструментів із сервісом, ми можемо створити клієнта й визначити інструмент або набір інструментів. Для практичної реалізації ми можемо використати наступний код на 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
)

Які особливі зауваження при використанні Шаблону проектування використання інструментів для створення надійних AI агентів?

Поширене занепокоєння щодо динамічно згенерованого LLM SQL пов’язане з безпекою, зокрема ризиком SQL ін’єкцій або шкідливої діяльності, такої як видалення чи модифікація бази даних. Хоча ці занепокоєння є обґрунтованими, їх можна ефективно пом’якшити правильним налаштуванням прав доступу до бази даних. Для більшості баз потрібно налаштувати базу у режимі лише для читання. Для сервісів баз даних, таких як PostgreSQL або Azure SQL, додаток має отримати роль лише для читання (SELECT). Запуск додатка в захищеному середовищі додатково посилює захист. У корпоративних сценаріях дані зазвичай витягуються та трансформуються з операційних систем у базу даних або сховище даних лише для читання з дружньою до користувача схемою. Такий підхід забезпечує безпеку даних, оптимізацію продуктивності та доступності, а також обмежений, лише для читання, доступ додатка.

Зразки коду

Є ще питання про шаблони дизайну інструментів?

Приєднуйтесь до Azure AI Foundry Discord, щоб зустрітися з іншими учнями, відвідати години консультацій і отримати відповіді на питання щодо AI-агентів.

Додаткові ресурси

Попередній урок

Розуміння агентних шаблонів дизайну

Наступний урок

Agentic RAG


Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу штучного інтелекту Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ його рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатися до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння чи неправильне тлумачення, що виникли внаслідок використання цього перекладу.