(Нажмите на изображение выше, чтобы посмотреть видео этого урока)
Инструменты интересны тем, что они расширяют возможности AI-агентов. Вместо того чтобы агент имел ограниченный набор действий, добавление инструмента позволяет ему выполнять широкий спектр задач. В этой главе мы рассмотрим шаблон проектирования использования инструментов, который описывает, как AI-агенты могут использовать конкретные инструменты для достижения своих целей.
В этом уроке мы постараемся ответить на следующие вопросы:
После завершения этого урока вы сможете:
Шаблон проектирования использования инструментов сосредоточен на предоставлении LLMs возможности взаимодействовать с внешними инструментами для достижения конкретных целей. Инструменты — это код, который может быть выполнен агентом для выполнения действий. Инструмент может быть простой функцией, например калькулятором, или API-запросом к стороннему сервису, например, для получения данных о ценах на акции или прогнозе погоды. В контексте AI-агентов инструменты предназначены для выполнения агентами в ответ на вызовы функций, сгенерированные моделью.
AI-агенты могут использовать инструменты для выполнения сложных задач, получения информации или принятия решений. Шаблон проектирования использования инструментов часто применяется в сценариях, требующих динамического взаимодействия с внешними системами, такими как базы данных, веб-сервисы или интерпретаторы кода. Эта возможность полезна для множества различных случаев, включая:
Эти строительные блоки позволяют AI-агенту выполнять широкий спектр задач. Давайте рассмотрим ключевые элементы, необходимые для реализации шаблона проектирования использования инструментов:
Схемы функций/инструментов: Подробные описания доступных инструментов, включая имя функции, назначение, требуемые параметры и ожидаемые результаты. Эти схемы позволяют LLM понять, какие инструменты доступны и как формировать корректные запросы.
Логика выполнения функций: Определяет, как и когда инструменты вызываются на основе намерений пользователя и контекста разговора. Это может включать модули планирования, механизмы маршрутизации или условные потоки, которые динамически определяют использование инструментов.
Система обработки сообщений: Компоненты, которые управляют потоком общения между вводом пользователя, ответами LLM, вызовами инструментов и их результатами.
Фреймворк интеграции инструментов: Инфраструктура, которая соединяет агента с различными инструментами, будь то простые функции или сложные внешние сервисы.
Обработка ошибок и проверка: Механизмы для обработки сбоев выполнения инструментов, проверки параметров и управления неожиданными ответами.
Управление состоянием: Отслеживает контекст разговора, предыдущие взаимодействия с инструментами и постоянные данные для обеспечения согласованности в многоходовых взаимодействиях.
Далее мы подробнее рассмотрим вызов функций/инструментов.
Вызов функций — это основной способ, с помощью которого мы даем возможность большим языковым моделям (LLMs) взаимодействовать с инструментами. Часто термины “функция” и “инструмент” используются взаимозаменяемо, поскольку “функции” (блоки повторно используемого кода) являются “инструментами”, которые агенты используют для выполнения задач. Чтобы код функции был вызван, LLM должен сравнить запрос пользователя с описанием функции. Для этого схема, содержащая описания всех доступных функций, отправляется в LLM. Затем LLM выбирает наиболее подходящую функцию для задачи и возвращает ее имя и аргументы. Выбранная функция вызывается, ее ответ отправляется обратно в LLM, который использует информацию для ответа на запрос пользователя.
Для реализации вызова функций для агентов разработчикам потребуется:
Рассмотрим пример получения текущего времени в городе:
Инициализация LLM, поддерживающего вызов функций:
Не все модели поддерживают вызов функций, поэтому важно убедиться, что используемая вами модель LLM это делает. Azure OpenAI поддерживает вызов функций. Мы можем начать с инициализации клиента Azure OpenAI.
# Initialize the Azure OpenAI client
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 возвращает имя функции, которую он выбрал для задачи, и аргументы, которые будут переданы ей.
# Function description for the model to read
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"],
},
}
}
]
# 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.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Process the model's response
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"})
# Handle function calls
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.")
# Second API call: Get the final response from the model
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, работающих с большими языковыми моделями (LLMs). Он упрощает процесс использования вызова функций, автоматически описывая ваши функции и их параметры модели через процесс, называемый сериализацией. Он также управляет обменом данными между моделью и вашим кодом. Еще одно преимущество использования агентного фреймворка, такого как Semantic Kernel, заключается в доступе к готовым инструментам, таким как File Search и Code Interpreter.
Следующая диаграмма иллюстрирует процесс вызова функций с Semantic Kernel:
В Semantic Kernel функции/инструменты называются плагинами. Мы можем преобразовать функцию get_current_time
, которую видели ранее, в плагин, превратив ее в класс с функцией внутри. Мы также можем импортировать декоратор kernel_function
, который принимает описание функции. Когда вы создаете ядро с GetCurrentTimePlugin, ядро автоматически сериализует функцию и ее параметры, создавая схему для отправки в 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
# Create the kernel
kernel = Kernel()
# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)
# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)
Azure AI Agent Service — это новый агентный фреймворк, предназначенный для того, чтобы разработчики могли безопасно создавать, развертывать и масштабировать высококачественных и расширяемых AI-агентов без необходимости управлять базовыми вычислительными и хранилищными ресурсами. Он особенно полезен для корпоративных приложений, так как является полностью управляемым сервисом с корпоративным уровнем безопасности.
В сравнении с разработкой напрямую с использованием API LLM, Azure AI Agent Service предоставляет некоторые преимущества, включая:
Инструменты, доступные в Azure AI Agent Service, можно разделить на две категории:
Сервис Agent Service позволяет использовать эти инструменты вместе как toolset
. Он также использует threads
, которые отслеживают историю сообщений из конкретного разговора.
Представьте, что вы являетесь агентом по продажам в компании Contoso. Вы хотите разработать разговорного агента, который сможет отвечать на вопросы о ваших данных продаж.
Следующее изображение иллюстрирует, как можно использовать Azure AI Agent Service для анализа данных продаж:
Чтобы использовать любой из этих инструментов с сервисом, мы можем создать клиент и определить инструмент или набор инструментов. Для практической реализации можно использовать следующий код на Python. LLM сможет посмотреть на набор инструментов и решить, использовать ли пользовательскую функцию fetch_sales_data_using_sqlite_query
или готовый Code Interpreter в зависимости от запроса пользователя.
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 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 = ToolSet()
toolset.add(fetch_data_function)
# Initialize Code Interpreter tool and adding it to the toolset.
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
Распространенной проблемой с SQL, динамически генерируемым LLM, является безопасность, особенно риск SQL-инъекций или вредоносных действий, таких как удаление или изменение базы данных. Хотя эти проблемы актуальны, их можно эффективно устранить, правильно настроив разрешения доступа к базе данных. Для большинства баз данных это включает настройку базы данных как только для чтения. Для таких сервисов баз данных, как PostgreSQL или Azure SQL, приложению следует назначить роль только для чтения (SELECT).
Запуск приложения в безопасной среде дополнительно повышает защиту. В корпоративных сценариях данные обычно извлекаются и преобразуются из операционных систем в базу данных только для чтения или хранилище данных с удобной для пользователя схемой. Этот подход гарантирует, что данные защищены, оптимизированы для производительности и доступности, а приложение имеет ограниченный доступ только для чтения.
Присоединяйтесь к Azure AI Foundry Discord, чтобы встретиться с другими учащимися, посетить часы консультаций и получить ответы на ваши вопросы о AI Agents.
Понимание шаблонов агентного дизайна
Отказ от ответственности:
Этот документ был переведен с использованием сервиса автоматического перевода Co-op Translator. Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.