(Кликнете върху изображението по-горе, за да гледате видеото на този урок)
Инструментите са интересни, защото позволяват на AI агентите да имат по-широк спектър от възможности. Вместо агентът да разполага с ограничен набор от действия, които може да изпълнява, чрез добавяне на инструмент, агентът може вече да извършва широк набор от действия. В тази глава ще разгледаме Дизайнерския модел за използване на инструменти, който описва как AI агентите могат да използват конкретни инструменти, за да постигнат целите си.
В този урок ще се опитаме да отговорим на следните въпроси:
След завършване на този урок ще можете да:
Дизайнерският модел за използване на инструменти се фокусира върху това да даде възможност на големите езикови модели (LLM) да взаимодействат с външни инструменти, за да постигнат конкретни цели. Инструментите са код, който може да бъде изпълнен от агент за извършване на действия. Инструмент може да бъде проста функция, като калкулатор, или API повикване към трета страна, като проверка на цена на акции или прогноза за времето. В контекста на AI агентите, инструментите са проектирани да бъдат изпълнявани от агентите в отговор на функционални повиквания, генерирани от модела.
AI агентите могат да използват инструменти за изпълнение на сложни задачи, извличане на информация или вземане на решения. Дизайнерският модел за използване на инструменти често се използва в сценарии, изискващи динамично взаимодействие с външни системи, като бази данни, уеб услуги или интерпретатори на код. Тази възможност е полезна за редица различни случаи:
Тези строителни блокове позволяват на AI агента да изпълнява широк набор от задачи. Нека разгледаме ключовите елементи, нужни за реализиране на Дизайнерския модел за използване на инструменти:
Схеми на функции/инструменти: Подробни дефиниции на наличните инструменти, включително името на функцията, нейното предназначение, необходими параметри и очаквани резултати. Тези схеми позволяват на LLM да разбере какви инструменти са на разположение и как да конструира валидни заявки.
Логика за изпълнение на функции: Определя кога и как инструментите се извикват в зависимост от намерението на потребителя и контекста на разговора. Това може да включва модули за планиране, маршрутизиране или условни потоци, които определят динамично използването на инструменти.
Система за обработка на съобщения: Компоненти, които управляват комуникацията между входовете на потребителя, отговорите на LLM, повикванията към инструменти и резултатите от тях.
Интеграционна рамка за инструменти: Инфраструктура, която свързва агента с различни инструменти, независимо дали са прости функции или сложни външни услуги.
Обработка на грешки и валидиране: Механизми за управление на неуспехи при изпълнение на инструменти, проверка на параметрите и управление на неочаквани отговори.
Управление на състоянието: Следи контекста на разговора, предишни взаимодействия с инструменти и постоянни данни, за да осигури последователност при многостъпкови взаимодействия.
След това нека разгледаме по-подробно Функционалното извикване.
Функционалното извикване е основният начин, по който даваме възможност на Големите езикови модели (LLM) да взаимодействат с инструменти. Често ще видите думите ‘Функция’ и ‘Инструмент’ да се използват взаимозаменяемо, защото ‘функции’ (блокове от многократно използваем код) са “инструментите”, които агенти използват за изпълнение на задачи. За да се извика кода на функция, LLM трябва да сравни заявката на потребителя с описанието на функциите. За тази цел към LLM се изпраща схема, съдържаща описанията на всички налични функции. След това LLM избира най-подходящата функция за задачата и връща нейното име и аргументи. Избраната функция се извиква, отговорът й се изпраща обратно към LLM, който използва информацията, за да отговори на заявката на потребителя.
За разработчици, които искат да реализират функционалното извикване за агенти, ще са нужни:
Нека илюстрираме с примера за получаване на текущото време в град:
Инициализиране на LLM, който поддържа функционално извикване:
Не всички модели поддържат функционално извикване, затова е важно да се провери дали LLM, който използвате, го поддържа. Azure OpenAI поддържа функционално извикване. Можем да започнем с инициализиране на клиента за Azure OpenAI.
# Инициализирайте Azure OpenAI клиента
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_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, агентските рамки ни предоставят предварително изградени блокове за реализиране на използването на инструменти.
Ето някои примери как можете да реализирате Дизайнерския модел за използване на инструменти с различни агентски рамки:
Microsoft Agent Framework е отворена AI рамка за изграждане на AI агенти. Тя опростява процеса на използване на функционални повиквания, като позволява да дефинирате инструменти като Python функции с декоратора @tool. Рамката управлява комуникацията напред и назад между модела и вашия код. Тя също предоставя достъп до предварително изградени инструменти като Търсене на файлове и Интепретатор на код чрез AzureAIProjectAgentProvider.
Следната диаграма илюстрира процеса на функционално извикване с Microsoft Agent Framework:

В Microsoft Agent Framework инструментите се дефинират като декорирани функции. Можем да превърнем функцията get_current_time, която видяхме по-рано, в инструмент, като използваме декоратора @tool. Рамката автоматично сериализира функцията и нейните параметри, създавайки схемата, която се изпраща на LLM.
from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
@tool
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# Създайте клиента
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Създайте агент и стартирайте с инструмента
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
Услугата Azure AI Agent е по-нова агентска рамка, предназначена да даде възможност на разработчиците да създават, внедряват и мащабират висококачествени и разширяеми AI агенти сигурно, без необходимост от управление на подлежащите изчислителни и съхранителни ресурси. Тя е особено полезна за корпоративни приложения, тъй като е напълно управлявана услуга с корпоративно ниво на сигурност.
В сравнение с разработката с LLM API директно, Azure AI Agent Service предлага някои предимства, включително:
Инструментите, налични в Azure AI Agent Service, могат да се разделят в две категории:
Услугата позволява да използваме тези инструменти заедно като toolset. Тя използва също и нишки (threads), които следят историята на съобщенията в конкретен разговор.
Представете си, че сте търговски агент в компания на име Contoso. Искате да създадете разговорен агент, който може да отговаря на въпроси относно вашите търговски данни.
Следното изображение илюстрира как бихте могли да използвате Azure AI Agent Service за анализ на вашите търговски данни:

За да използваме някой от тези инструменти с услугата, можем да създадем клиент и да дефинираме инструмент или набор от инструменти. За практическия пример можем да използваме следния Python код. LLM ще може да разгледа toolset-а и да реши дали да използва създадената от потребителя функция 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 = 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
)
Често срещан проблем при SQL, динамично генериран от LLM, е сигурността, особено рискът от SQL инжекция или злонамерени действия, като изтриване или манипулация на базата данни. Въпреки че тези опасения са валидни, те могат ефективно да бъдат смекчени чрез правилна конфигурация на правата за достъп до базата данни. За повечето бази данни това включва конфигуриране на базата данни в режим само за четене. За бази данни като PostgreSQL или Azure SQL приложението трябва да бъде с роля само за четене (SELECT).
Изпълнението на приложението в защитена среда допълнително повишава защитата. В корпоративни сценарии данните обикновено се извличат и трансформират от оперативни системи в база данни или хранилище за данни само за четене с потребителско ориентирана схема. Този подход гарантира, че данните са защитени, оптимизирани за производителност и достъпност и че приложението има ограничен, само за четене достъп.
Присъединете се към Microsoft Foundry Discord, за да се срещнете с други обучаващи се, да участвате в часове за въпроси и да получите отговори на въпросите си за AI агенти.
Разбиране на агентските дизайнерски модели
Отказ от отговорност:
Този документ е преведен с помощта на AI преводаческа услуга Co-op Translator. Въпреки че се стремим към точност, имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За важна информация се препоръчва професионален човешки превод. Не носим отговорност за каквито и да било недоразумения или неправилни тълкувания, произтичащи от използването на този превод.