(Klikněte na obrázek výše pro zobrazení videa této lekce)
Nástroje jsou zajímavé, protože umožňují AI agentům mít širší škálu schopností. Místo toho, aby agent měl omezenou sadu akcí, které může provádět, může nyní agent pomocí přidání nástroje vykonávat širokou škálu činností. V této kapitole se podíváme na návrhový vzor použití nástrojů, který popisuje, jak mohou AI agenti využívat konkrétní nástroje k dosažení svých cílů.
V této lekci se zaměříme na zodpovězení následujících otázek:
Po dokončení této lekce budete schopni:
Návrhový vzor použití nástrojů se zaměřuje na poskytnutí schopnosti LLM interagovat s externími nástroji za účelem dosažení konkrétních cílů. Nástroje jsou kód, který může agent spustit k provedení akcí. Nástroj může být jednoduchá funkce, například kalkulačka, nebo volání API ke službě třetí strany, například vyhledávání ceny akcií nebo předpověď počasí. V kontextu AI agentů jsou nástroje navrženy tak, aby byly spouštěny agenty v reakci na funkční volání generovaná modelem.
AI agenti mohou využívat nástroje k dokončení složitých úkolů, získávání informací nebo přijímání rozhodnutí. Návrhový vzor použití nástrojů se často používá v scénářích vyžadujících dynamickou interakci s externími systémy, jako jsou databáze, webové služby nebo interprety kódu. Tato schopnost je užitečná pro řadu různých případů použití, včetně:
Tyto stavební kameny umožňují AI agentovi vykonávat širokou škálu úkolů. Podívejme se na klíčové prvky potřebné k implementaci návrhového vzoru použití nástrojů:
Schémata funkcí/nástrojů: Podrobné definice dostupných nástrojů, zahrnující název funkce, účel, požadované parametry a očekávané výstupy. Tato schémata umožňují LLM porozumět dostupným nástrojům a jak správně sestavit platné požadavky.
Logika spouštění funkcí: Řídí, jak a kdy jsou nástroje volány na základě uživatelova záměru a kontextu konverzace. Může zahrnovat plánovací moduly, směrovací mechanizmy nebo podmíněné toky určující dynamické používání nástrojů.
Systém zpracování zpráv: Komponenty, které spravují tok konverzace mezi vstupy uživatele, odpověďmi LLM, voláními nástrojů a výstupy nástrojů.
Rámec integrace nástrojů: Infrastruktura, která propojuje agenta s různými nástroji, ať už jsou to jednoduché funkce nebo složité externí služby.
Zpracování chyb a validace: Mechanismy pro zvládání selhání při spouštění nástrojů, ověřování parametrů a řízení neočekávaných odpovědí.
Správa stavu: Sleduje kontext konverzace, předchozí interakce s nástroji a perzistentní data, aby zajistila konzistenci v průběhu vícekrokových interakcí.
Dále se podíváme podrobněji na Funkční volání.
Volání funkcí je primární způsob, jak umožňujeme rozsáhlým jazykovým modelům (LLM) interakci s nástroji. Často uvidíte, že ‘Funkce’ a ‘Nástroj’ jsou použity zaměnitelně, protože ‘funkce’ (bloky znovupoužitelného kódu) jsou ‘nástroje’, které agenti používají k vykonávání úkolů. Aby mohl být kód funkce spuštěn, musí LLM porovnat požadavek uživatele s popisem funkcí. Za tímto účelem je do LLM zasláno schéma obsahující popisy všech dostupných funkcí. LLM pak vybere nejvhodnější funkci pro daný úkol a vrátí její název a argumenty. Vybraná funkce je spuštěna, její odpověď je zaslána zpět do LLM, který využije informace k odpovědi na uživatelův požadavek.
Pro vývojáře, kteří chtějí implementovat funkční volání pro agenty, budete potřebovat:
Použijme příklad získání aktuálního času ve městě:
Inicializujte LLM podporující funkční volání:
Ne všechny modely podporují funkční volání, proto je důležité ověřit, že používaný LLM to podporuje. Azure OpenAI funkční volání podporuje. Můžeme začít inicializací klienta Azure OpenAI.
# Inicializovat klienta 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"
)
Vytvořte funkční schéma:
Následně definujeme JSON schéma, které obsahuje název funkce, popis, co funkce dělá, a názvy a popisy parametrů funkce. Toto schéma pak předáme klientovi, vytvořenému výše, spolu s uživatelovým požadavkem na čas v San Franciscu. Důležité je poznamenat, že je vráceno volání nástroje, nikoli konečná odpověď na otázku. Jak bylo zmíněno, LLM vrací název zvolené funkce a argumenty, které jí budou předány.
# Popis funkce pro načtení modelu
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"],
},
}
}
]
# Počáteční uživatelská zpráva
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# První volání API: Požádejte model, aby použil funkci
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Zpracovat odpověď modelu
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')])
Kód funkce potřebný k vykonání úkolu:
Jakmile LLM vybere, která funkce má být spuštěna, musí být kód funkce implementován a vykonán. Kód získání aktuálního času můžeme implementovat v Pythonu. Také musíme napsat kód na extrakci názvu a argumentů z response_message, abychom získali konečný výsledek.
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"})
# Zpracovat volání funkcí
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.")
# Druhý API požadavek: Získat konečnou odpověď od modelu
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.
Volání funkcí je jádrem většiny, ne-li všech návrhových vzorů použití nástrojů agentů, avšak jeho implementace od základů může být někdy náročná. Jak jsme se naučili v Lekci 2, agentní rámce nám poskytují předpřipravené stavební kameny pro implementaci použití nástrojů.
Zde jsou některé příklady, jak můžete implementovat návrhový vzor použití nástrojů pomocí různých agentních rámců:
Microsoft Agent Framework je open-source AI rámec pro vytváření AI agentů. Zjednodušuje proces používání funkčního volání tím, že umožňuje definovat nástroje jako Python funkce s dekorátorem @tool. Rámec zajišťuje zpětnou komunikaci mezi modelem a vaším kódem. Také poskytuje přístup k předpřipraveným nástrojům jako je vyhledávání souborů a interpretr kódu prostřednictvím AzureAIProjectAgentProvider.
Následující diagram znázorňuje proces funkčního volání s Microsoft Agent Framework:

V Microsoft Agent Framework jsou nástroje definovány jako dekorované funkce. Můžeme převést funkci get_current_time, kterou jsme viděli dříve, na nástroj použitím dekorátoru @tool. Rámec automaticky serializuje funkci a její parametry, vytváří schéma k odeslání do 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"""
...
# Vytvořte klienta
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Vytvořte agenta a spusťte nástroj
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 Service je novější agentní rámec navržený tak, aby vývojářům umožnil bezpečně vytvářet, nasazovat a škálovat kvalitní a rozšiřitelné AI agenty bez nutnosti správy základních výpočetních a úložných zdrojů. Je obzvlášť užitečný pro podnikové aplikace, protože je to plně spravovaná služba s podnikové úrovně zabezpečením.
Ve srovnání s přímým vývojem pomocí API LLM poskytuje Azure AI Agent Service několik výhod, včetně:
Nástroje dostupné v Azure AI Agent Service lze rozdělit do dvou kategorií:
Agent Service nám umožňuje používat tyto nástroje společně jako toolset. Také využívá vlákna, která sledují historii zpráv z konkrétní konverzace.
Představte si, že jste obchodním zástupcem ve firmě nazvané Contoso. Chcete vyvinout konverzačního agenta, který dokáže odpovídat na dotazy týkající se vašich prodejních dat.
Následující obrázek znázorňuje, jak byste mohli použít Azure AI Agent Service k analýze vašich prodejních dat:

Chcete-li použít některý z těchto nástrojů se službou, můžeme vytvořit klienta a definovat nástroj nebo sadu nástrojů. Pro praktickou implementaci můžeme použít následující Python kód. LLM bude moci nahlédnout do sady nástrojů a rozhodnout, zda použít uživatelem vytvořenou funkci fetch_sales_data_using_sqlite_query nebo předpřipravený Interpretr kódu podle uživatelského požadavku.
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 # funkce fetch_sales_data_using_sqlite_query, která se nachází v souboru 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"],
)
# Inicializovat sadu nástrojů
toolset = ToolSet()
# Inicializovat agenta volajícího funkce s funkcí fetch_sales_data_using_sqlite_query a přidat ji do sady nástrojů
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Inicializovat nástroj Code Interpreter a přidat jej do sady nástrojů.
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
)
Běžným problémem u SQL dynamicky generovaného LLM je bezpečnost, zejména riziko SQL injekce nebo škodlivých akcí, jako je mazání nebo manipulace s databází. Přestože jsou tyto obavy oprávněné, lze je efektivně zmírnit správnou konfigurací přístupových oprávnění k databázi. U většiny databází to znamená nakonfigurovat databázi jako pouze pro čtení. U databázových služeb jako PostgreSQL nebo Azure SQL by aplikace měla mít přiřazenou roli pouze pro čtení (SELECT).
Provoz aplikace v zabezpečeném prostředí dále zvyšuje ochranu. V podnikovém prostředí jsou data obvykle extrahována a transformována z provozních systémů do databáze s přístupem pouze pro čtení nebo do datového skladu s uživatelsky přívětivým schématem. Tento přístup zajišťuje, že data jsou bezpečná, optimalizovaná pro výkon a přístupnost a že aplikace má omezený přístup pouze pro čtení.
Připojte se k Microsoft Foundry Discord, kde můžete setkat další studenty, zúčastnit se konzultačních hodin a získat odpovědi na otázky týkající se AI agentů.
Porozumění agentním návrhovým vzorům
Prohlášení o omezení odpovědnosti: Tento dokument byl přeložen pomocí AI překladatelské služby Co-op Translator. Přestože usilujeme o co největší přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho mateřském jazyce by měl být považován za autoritativní zdroj. Pro kritické informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vzniklé použitím tohoto překladu.