(A fenti képre kattintva megtekintheti a lecke videóját)
Az eszközök érdekesek, mert lehetővé teszik az AI ügynökök számára, hogy szélesebb spektrumú képességekkel rendelkezzenek. Az ügynök ahelyett, hogy egy korlátozott cselekvéssorozatot hajtana végre, egy eszköz hozzáadásával különféle műveleteket tud végezni. Ebben a fejezetben megvizsgáljuk az Eszközhasználati tervezési mintát, amely leírja, hogyan használhatják az AI ügynökök a konkrét eszközöket céljaik elérésére.
Ebben a leckében a következő kérdésekre keressük a választ:
A lecke elvégzése után képes lesz:
A Tool Use Design Pattern (eszközhasználati tervezési minta) arra fókuszál, hogy az LLM-ek képesek legyenek külső eszközökkel interakcióba lépni konkrét célok elérése érdekében. Az eszközök olyan kódok, amelyeket egy ügynök végrehajthat, hogy műveleteket hajtson végre. Egy eszköz lehet egyszerű függvény, például egy kalkulátor, vagy egy harmadik fél szolgáltatásának API hívása, például részvényárfolyam lekérdezése vagy időjárás-előrejelzés. Az AI ügynökök esetében az eszközöket úgy alakítják ki, hogy azokat az ügynökök modell által generált függvényhívások válaszaként tudják végrehajtani.
Az AI ügynökök eszközök segítségével képesek bonyolult feladatokat megoldani, információt lekérni vagy döntéseket hozni. Az eszközhasználati tervezési mintát jellemzően olyan helyzetekben alkalmazzák, ahol dinamikus interakció szükséges külső rendszerekkel, például adatbázisokkal, webszolgáltatásokkal vagy kódfordítókkal. Ez a képesség többféle esetben hasznos, például:
Ezek az építőelemek teszik lehetővé, hogy az AI ügynök széles feladatskálát végezzen el. Nézzük meg a Tool Use Design Pattern megvalósításához szükséges kulcselemeket:
Függvény/eszköz sémák: A rendelkezésre álló eszközök részletes definíciói, beleértve a függvény nevét, célját, szükséges paramétereit és várható kimeneteit. Ezek a sémák segítik az LLM-et abban, hogy megértse, milyen eszközök elérhetők és hogyan kell érvényes kéréseket összeállítani.
Függvény végrehajtási logika: Szabályozza, mikor és hogyan hívják meg az eszközöket a felhasználói szándék és a beszélgetési kontextus alapján. Ez tartalmazhat tervező modulokat, útválasztó mechanizmusokat vagy feltételes folyamatokat, amelyek dinamikusan döntenek az eszközhasználatról.
Üzenetkezelő rendszer: Az alkotóelemek, amelyek felügyelik a beszélgetés menetét a felhasználói bemenetek, LLM válaszok, eszközhívások és azok kimenetei között.
Eszköz integrációs keretrendszer: Infrastruktúra, amely összekapcsolja az ügynököt különféle eszközökkel, akár egyszerű függvényekről, akár összetett külső szolgáltatásokról legyen szó.
Hibakezelés és validáció: Mechanizmusok az eszközvégrehajtás hibáinak kezelésére, a paraméterek érvényesítésére és váratlan válaszok kezelésére.
Állapotkezelés: Követi a beszélgetési kontextust, korábbi eszközhasználatokat és tartós adatokat a konzisztencia érdekében többfordulós interakciók során.
Ezután nézzük meg részletesebben a függvény/eszköz hívást.
A függvényhívás az elsődleges módja annak, hogy LLM-eket eszközökkel kapcsoljunk össze. Gyakran használjuk felváltva a „Function” és az „Tool” szavakat, mert a „függvények” (újrafelhasználható kódrészek) azok az eszközök, amelyeket az ügynökök feladatok elvégzéséhez használnak. Annak érdekében, hogy egy függvény kódját meghívhassuk, az LLM-nek össze kell vetnie a felhasználói kérést a függvény leírásával. Ehhez egy olyan sémát kell az LLM-nek elküldeni, amely tartalmazza az elérhető függvények leírásait. Az LLM kiválasztja a feladathoz legmegfelelőbb függvényt, majd visszaadja annak nevét és argumentumait. A kiválasztott függvényt meghívjuk, a válaszát visszaküldjük az LLM-nek, amely ezt felhasználva válaszol a felhasználó kérésére.
A fejlesztőknek, akik függvényhívást kívánnak megvalósítani ügynököknek, szükségük lesz:
Vegyük például az aktuális idő lekérését egy városban a következőképpen:
Indítsunk el egy, a függvényhívást támogató LLM-et:
Nem minden modell támogatja a függvényhívást, így fontos ellenőrizni, hogy az Ön által használt LLM ezt tudja-e. Az Azure OpenAI támogatja a függvényhívást. Kezdhetjük az OpenAI kliens inicializálásával az Azure OpenAI Responses API-jához (a stabil /openai/v1/ végpont — nincs szükség api_version-re).
# Inicializálja az OpenAI klienst az Azure OpenAI (Responses API, v1 végpont) számára
client = OpenAI(
base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('/')}/openai/v1/",
api_key=os.environ["AZURE_OPENAI_API_KEY"],
)
deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT"]
Függvény séma létrehozása:
Ezután definiálunk egy JSON sémát, amely tartalmazza a függvény nevét, leírását, és a paraméterek nevét valamint azok leírását. Ezt a sémát átadjuk a korábban létrehozott kliensnek, amelyhez hozzáadjuk a felhasználói kérés, például a san franciscói idő lekérdezését. Fontos megjegyezni, hogy egy eszközhívás az, ami visszatér, nem a kérdés végleges válasza. Ahogyan korábban említettük, az LLM visszaadja a kiválasztott függvény nevét és a hozzá tartozó argumentumokat.
# A modell által olvasható függvényleírás (Responses API lapos eszközformátum)
tools = [
{
"type": "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"],
},
}
]
# Kezdeti felhasználói üzenet
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# Első API hívás: Kérd meg a modellt, hogy használja a függvényt
response = client.responses.create(
model=deployment_name,
input=messages,
tools=tools,
tool_choice="auto",
store=False,
)
# A Responses API a tool call-okat function_call elemekként adja vissza a response.output-ban.
# Fűzd hozzá őket a beszélgetéshez, hogy a modell teljes kontextussal rendelkezzen a következő körben.
messages += response.output
print("Model's response:")
print(response.output)
Model's response:
[ResponseFunctionToolCall(arguments='{"location":"San Francisco"}', call_id='call_pOsKdUlqvdyttYB67MOj434b', name='get_current_time', type='function_call')]
A függvény kódja a feladat végrehajtásához:
Miután az LLM kiválasztotta, hogy melyik függvényt kell futtatni, a végrehajtó kódot meg kell írni és futtatni kell. Pythonban megvalósíthatjuk az aktuális idő lekérését. Szükséges lesz az is, hogy kódot írjunk az válaszüzenetből a név és argumentumok kinyeréséhez a végső eredményhez.
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"})
# Függvényhívások kezelése
tool_calls = [item for item in response.output if item.type == "function_call"]
if tool_calls:
for tool_call in tool_calls:
if tool_call.name == "get_current_time":
function_args = json.loads(tool_call.arguments)
time_response = get_current_time(
location=function_args.get("location")
)
# A művelet eredményét function_call_output elemként visszaadni
messages.append({
"type": "function_call_output",
"call_id": tool_call.call_id,
"output": time_response,
})
else:
print("No tool calls were made by the model.")
# Második API hívás: A modell végső válaszának lekérése
final_response = client.responses.create(
model=deployment_name,
input=messages,
tools=tools,
store=False,
)
return final_response.output_text
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
A függvényhívás áll a legtöbb, ha nem az összes ügynök eszközhasználati tervezési minta központjában, azonban a megvalósítása teljesen saját kezűleg néha kihívást jelenthet. Ahogyan a 2. leckéből megtanultuk, az ügynök keretrendszerek előre elkészített építőelemekkel segítik az eszközhasználat megvalósítását.
Íme néhány példa arra, hogyan valósítható meg az eszközhasználati tervezési minta különféle ügynök keretrendszerek segítségével:
A Microsoft Agent Framework egy nyílt forráskódú AI keretrendszer AI ügynökök építéséhez. Egyszerűsíti a függvényhívás használatát, lehetővé téve, hogy eszközöket Python függvényként definiáljunk a @tool dekorátorral. A keretrendszer kezeli a modell és a kód közötti kommunikáció oda-vissza folyamatát. Emellett előre elkészített eszközökhöz biztosít hozzáférést, mint például a Fájlkutató és Kód-interpreter a FoundryChatClient segítségével.
A következő ábra szemlélteti a függvényhívás folyamatát a Microsoft Agent Framework használatával:

A Microsoft Agent Frameworkben az eszközök dekorált függvényekként vannak definiálva. Az előzőleg látott get_current_time függvényt eszközzé alakíthatjuk a @tool dekorátor segítségével. A keretrendszer automatikusan szériázza a függvényt és paramétereit, így elkészíti a sémát, amit az LLM-nek küld.
import os
from agent_framework import tool
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
@tool(approval_mode="never_require")
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# Kliens létrehozása
provider = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
# Agent létrehozása és futtatása az eszközzel
agent = provider.as_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
A Microsoft Foundry Agent Service egy újabb ügynök keretrendszer, amelyet úgy terveztek, hogy a fejlesztők biztonságosan építhessenek, telepíthessenek és méretezzenek nagy teljesítményű, bővíthető AI ügynököket anélkül, hogy az alapvető számítási és tárhelyi erőforrásokat kezelniük kellene. Különösen hasznos vállalati alkalmazásokhoz, mivel teljesen felügyelt szolgáltatás vállalati szintű biztonsággal.
Ha összehasonlítjuk a közvetlen LLM API fejlesztéssel, a Microsoft Foundry Agent Service néhány előnyt kínál, többek között:
A Microsoft Foundry Agent Service-ben elérhető eszközök két kategóriába sorolhatók:
Az Agent Service lehetővé teszi ezek az eszközök együttes, toolset-ként való használatát. Emellett használja a szálakat, amelyek nyomon követik egy adott beszélgetés üzenettörténetét.
Képzeljük el, hogy egy Contoso nevű cégnél értékesítési ügynök vagy. Olyan beszélgető ügynököt szeretnél fejleszteni, amely válaszolni tud értékesítési adatokról szóló kérdésekre.
A következő kép azt szemlélteti, hogyan használhatod a Microsoft Foundry Agent Service-t értékesítési adatok elemzésére:

Ezek bármelyikének használatához az Agent Service-szel létrehozhatunk egy klienst, és definiálhatunk egy eszközt vagy eszközkészletet. Gyakorlati megvalósításhoz a következő Python kódot használhatjuk. Az LLM meg tudja nézni az eszközkészletet, és eldöntheti, hogy a felhasználó által létrehozott fetch_sales_data_using_sqlite_query függvényt vagy az előre elkészített Code Interpreter-t használja a felhasználói kérés alapján.
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 függvény, amely megtalálható a fetch_sales_data_functions.py fájlban.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# Eszközkészlet inicializálása
toolset = ToolSet()
# Függvényhívó ügynök inicializálása a fetch_sales_data_using_sqlite_query függvénnyel és hozzáadása az eszközkészlethez
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Kódértelmező eszköz inicializálása és hozzáadása az eszközkészlethez.
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-5-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
Az LLM-ek által dinamikusan generált SQL esetében gyakori aggály a biztonság, különösen az SQL injekció vagy rosszindulatú műveletek kockázata, például az adatbázis törlése vagy manipulálása. Bár ezek az aggodalmak jogosak, hatékonyan mérsékelhetőek az adatbázis-hozzáférési jogosultságok megfelelő beállításával. A legtöbb adatbázis esetén ez azt jelenti, hogy az adatbázist csak olvasható módban konfiguráljuk. Olyan adatbázis szolgáltatásoknál, mint a PostgreSQL vagy Azure SQL, az alkalmazásnak olvasható (SELECT) jogosultságot kell kapnia.
Az alkalmazás biztonságos környezetben futtatása tovább növeli a védelmet. Vállalati helyzetekben az adatok rendszerint kivonásra és átalakításra kerülnek az operációs rendszerekből, egy olvasható adatbázisba vagy adattárházba egy felhasználóbarát sémával. Ez a megközelítés biztosítja az adatok biztonságát, a teljesítmény és hozzáférhetőség optimalizáltságát, valamint korlátozott, csak olvasható hozzáférést az alkalmazás számára.
Csatlakozzon a Microsoft Foundry Discord szerverhez, hogy találkozzon más tanulókkal, vegyen részt nyílt órákon, és kérdéseit feltegye AI ügynökökkel kapcsolatban.
Miután megtanultad, hogyan telepíts ügynököket a 16. leckében, gyorsan tesztelheted ennek a leckének a TravelToolAgent ügynökét (még mindig hívja az eszközeit és válaszol?) a tests/lesson-04-smoke-tests.json használatával. Lásd a tests/README.md fájlt a futtatás módjáról.
Az Ügynöki Tervezési Minták Megértése
Jogi nyilatkozat: Ez a dokumentum az AI fordítási szolgáltatás, a Co-op Translator segítségével készült. Bár az pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az anyanyelvén tekintendő hiteles forrásnak. Fontos információk esetén professzionális emberi fordítást javasolunk. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely ebből a fordításból ered.