(Kliknite sliku iznad da pogledate video ove lekcije)
Alati su zanimljivi jer omogućuju AI agentima širi spektar mogućnosti. Umjesto da agent ima ograničen skup radnji koje može izvršiti, dodavanjem alata agent sada može izvoditi širok raspon radnji. U ovom poglavlju pogledat ćemo Uzorak dizajna upotrebe alata, koji opisuje kako AI agenti mogu koristiti specifične alate za postizanje svojih ciljeva.
U ovoj lekciji želimo odgovoriti na sljedeća pitanja:
Nakon završetka ove lekcije moći ćete:
The Tool Use Design Pattern fokusira se na davanje LLM-ovima sposobnosti interakcije s vanjskim alatima kako bi postigli određene ciljeve. Alati su kod koji agent može izvršiti da bi obavio radnje. Alat može biti jednostavna funkcija poput kalkulatora ili poziv API-ja treće strane poput dohvaćanja cijena dionica ili vremenske prognoze. U kontekstu AI agenata, alati su dizajnirani da budu izvršeni od strane agenata kao odgovor na model-generated function calls.
AI agenti mogu koristiti alate za dovršavanje složenih zadataka, dohvaćanje informacija ili donošenje odluka. Uzorak dizajna upotrebe alata često se koristi u scenarijima koji zahtijevaju dinamičku interakciju s vanjskim sustavima, poput baza podataka, web servisa ili interpretatora koda. Ova sposobnost korisna je za nekoliko različitih slučajeva upotrebe, uključujući:
Ovi gradivni blokovi omogućuju AI agentu izvođenje širokog raspona zadataka. Pogledajmo ključne elemente potrebne za implementaciju Uzorka dizajna upotrebe alata:
Sheme funkcija/alatâ: Detaljne definicije dostupnih alata, uključujući naziv funkcije, svrhu, obavezne parametre i očekivane izlaze. Ove sheme omogućuju LLM-u da razumije koje su alatke dostupne i kako sastaviti valjane zahtjeve.
Logika izvršavanja funkcija: Uređuje kako i kada se alati pozivaju na temelju korisnikove namjere i konteksta razgovora. To može uključivati module planiranja, mehanizme usmjeravanja ili uvjetne tokove koji dinamički odlučuju o upotrebi alata.
Sustav rukovanja porukama: Komponente koje upravljaju razgovornim tijekom između korisničkih unosa, LLM odgovora, poziva alata i izlaza alata.
Okvir za integraciju alata: Infrastruktura koja povezuje agenta s raznim alatima, bilo da su jednostavne funkcije ili složeni vanjski servisi.
Rukovanje pogreškama i validacija: Mehanizmi za rukovanje neuspjesima u izvršavanju alata, validaciju parametara i upravljanje neočekivanim odgovorima.
Upravljanje stanjem: Prati kontekst razgovora, prethodne interakcije s alatima i trajne podatke kako bi se osigurala konzistentnost tijekom višekratnih interakcija.
Sljedeće, pogledajmo pozivanje funkcija/alata (Function/Tool Calling) detaljnije.
Pozivanje funkcija je primarni način na koji omogućujemo Large Language Modelima (LLM-ovima) interakciju s alatima. Često ćete vidjeti da se ‘Function’ i ‘Tool’ koriste naizmjenično jer su ‘functions’ (blokovi višekratno upotrebljivog koda) isti kao ‘tools’ koje agenti koriste za izvršavanje zadataka. Da bi se kod funkcije mogao pozvati, LLM mora usporediti korisničev zahtjev s opisom funkcija. Za to se šalje shema koja sadrži opise svih dostupnih funkcija LLM-u. LLM zatim odabire najprikladniju funkciju za zadatak i vraća njezin naziv i argumente. Odabrana funkcija se poziva, njezin odgovor se vraća natrag LLM-u, koji koristi informacije za odgovor na korisnikov zahtjev.
Za developere koji žele implementirati pozivanje funkcija za agente, bit će vam potrebno:
Kao primjer upotrijebimo dohvaćanje trenutnog vremena u nekom gradu:
Inicijalizirajte LLM koji podržava pozivanje funkcija:
Not all models support function calling, so it’s important to check that the LLM you are using does. Azure OpenAI supports function calling. We can start by initiating the Azure OpenAI client.
# Inicijalizirajte Azure OpenAI klijent
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Kreirajte shemu funkcije:
Sljedeće ćemo definirati JSON shemu koja sadrži naziv funkcije, opis onoga što funkcija radi te nazive i opise parametara funkcije. Zatim ćemo ovu shemu proslijediti klijentu kreiranom prethodno, zajedno s korisnikovim zahtjevom za pronalaženje vremena u San Franciscu. Važno je napomenuti da je poziv alata ono što se vraća, a ne konačan odgovor na pitanje. Kao što je ranije spomenuto, LLM vraća naziv funkcije koju je odabrao za zadatak i argumente koji će joj se proslijediti.
# Opis funkcije koju model treba pročitati
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četna korisnička poruka
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# Prvi poziv API-ja: Zamolite model da upotrijebi funkciju
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Obradite odgovor modela
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')])
Kod funkcije potreban za izvršenje zadatka:
Sada kada je LLM odabrao koju funkciju treba pokrenuti, potrebno je implementirati i izvršiti kod koji obavlja zadatak. Možemo implementirati kod za dohvaćanje trenutnog vremena u Pythonu. Također ćemo morati napisati kod za izdvajanje naziva i argumenata iz response_message kako bismo dobili konačan rezultat.
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"})
# Rukuj pozivima funkcija
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.")
# Drugi poziv API-ja: Dohvati konačni odgovor od modela
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.
Pozivanje funkcija je u središtu većine, ako ne i svih agentnih uzoraka upotrebe alata, no implementacija od nule ponekad može biti izazovna. Kao što smo naučili u Lesson 2 agentski okviri pružaju nam unaprijed izgrađene gradivne blokove za implementaciju upotrebe alata.
Evo nekoliko primjera kako možete implementirati Uzorak dizajna upotrebe alata koristeći različite agentske okvire:
Microsoft Agent Framework je open-source AI okvir za izgradnju AI agenata. Pojednostavljuje proces korištenja pozivanja funkcija omogućujući vam definiranje alata kao Python funkcija s dekoratorom @tool. Okvir rukuje dvosmjernom komunikacijom između modela i vašeg koda. Također omogućuje pristup unaprijed izrađenim alatima poput File Search i Code Interpreter putem AzureAIProjectAgentProvider.
Sljedeći dijagram ilustrira proces pozivanja funkcija s Microsoft Agent Frameworkom:

U Microsoft Agent Frameworku alati su definirani kao dekorirane funkcije. Funkciju get_current_time koju smo ranije vidjeli možemo pretvoriti u alat koristeći dekorator @tool. Okvir će automatski serijalizirati funkciju i njezine parametre, stvarajući shemu za slanje LLM-u.
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"""
...
# Kreiraj klijenta
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Kreiraj agenta i pokreni pomoću alata
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 noviji agentski okvir dizajniran da omogući developerima sigurno izgraditi, implementirati i skalirati visokokvalitetne i proširive AI agente bez potrebe za upravljanjem osnovnim računskim i spremišnim resursima. Posebno je koristan za enterprise primjene jer je potpuno upravljana usluga s enterprise razinom sigurnosti.
U usporedbi s razvojem koristeći izravno LLM API, Azure AI Agent Service pruža neke prednosti, uključujući:
threads za pohranu svih potrebnih informacijaAlati dostupni u Azure AI Agent Service mogu se podijeliti u dvije kategorije:
Agent Service nam omogućuje korištenje ovih alata zajedno kao toolset. Također koristi threads koji prate povijest poruka iz određenog razgovora.
Zamislite da ste prodajni agent u tvrtki zvanoj Contoso. Želite razviti konverzacijski agent koji može odgovarati na pitanja o vašim prodajnim podacima.
Sljedeća slika ilustrira kako biste mogli koristiti Azure AI Agent Service za analizu vaših prodajnih podataka:

Da biste koristili bilo koji od ovih alata s uslugom, možemo stvoriti klijenta i definirati alat ili skup alata. Za praktičnu implementaciju možemo koristiti sljedeći Python kod. LLM će moći pogledati toolset i odlučiti hoće li koristiti korisnički definiranu funkciju fetch_sales_data_using_sqlite_query ili unaprijed izrađeni Code Interpreter, ovisno o korisnikovom zahtjevu.
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 # funkcija fetch_sales_data_using_sqlite_query koja se može pronaći u datoteci 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"],
)
# Inicijaliziraj skup alata
toolset = ToolSet()
# Inicijaliziraj agenta za pozivanje funkcija s funkcijom fetch_sales_data_using_sqlite_query i dodaj ga u skup alata
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Inicijaliziraj alat Code Interpreter i dodaj ga u skup alata
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
)
Česta zabrinutost kod SQL-a koji dinamički generiraju LLM-ovi je sigurnost, posebno rizik od SQL injekcija ili zlonamjernih radnji, poput brisanja ili manipulacije bazom podataka. Iako su ove zabrinutosti opravdane, mogu se učinkovito ublažiti pravilnim konfiguriranjem dopuštenja pristupa bazi podataka. Za većinu baza to uključuje konfiguriranje baze kao samo-za-čitanje. Za usluge baza podataka poput PostgreSQL-a ili Azure SQL-a, aplikaciji bi trebala biti dodijeljena uloga samo za čitanje (SELECT).
Pokretanje aplikacije u sigurnom okruženju dodatno poboljšava zaštitu. U enterprise scenarijima, podaci se obično izvlače i transformiraju iz operativnih sustava u bazu podataka samo za čitanje ili skladište podataka s pristupačnom shemom. Ovaj pristup osigurava da su podaci sigurni, optimizirani za performanse i pristupačnost te da aplikacija ima ograničen, samo-za-čitanje pristup.
Pridružite se Microsoft Foundry Discord da se povežete s drugim učenicima, sudjelujete na office hours i dobijete odgovore na svoja pitanja o AI agentima.
Understanding Agentic Design Patterns
Odricanje odgovornosti: Ovaj je dokument preveden pomoću AI usluge prevođenja Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Originalni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za kritične informacije preporučuje se profesionalni ljudski prijevod. Ne snosimo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.