(Kattints a fenti képre, hogy megnézd a videót az óráról)
Az eszközök azért érdekesek, mert lehetővé teszik az AI ügynökök számára, hogy szélesebb körű képességekkel rendelkezzenek. Az ügynök korlátozott cselekvési lehetőségei helyett, egy eszköz hozzáadásával az ügynök most már számos különböző műveletet tud végrehajtani. Ebben a fejezetben az Eszközhasználati tervezési mintát vizsgáljuk meg, amely leírja, hogyan használhatnak az AI ügynökök specifikus eszközöket céljaik eléréséhez.
Ebben az órában a következő kérdésekre keressük a választ:
Az óra elvégzése után képes leszel:
Az Eszközhasználati tervezési minta arra összpontosít, hogy a 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 műveletek elvégzésére. Egy eszköz lehet egy egyszerű funkció, például egy számológép, vagy egy API-hívás egy harmadik fél szolgáltatásához, például részvényárfolyamok lekérdezése vagy időjárás-előrejelzés. Az AI ügynökök kontextusában az eszközöket úgy tervezték, hogy az ügynökök végrehajtsák őket modell által generált funkcióhívások alapján.
Az AI ügynökök eszközöket használhatnak összetett feladatok elvégzésére, információk lekérésére vagy döntések meghozatalára. Az eszközhasználati tervezési mintát gyakran alkalmazzák olyan helyzetekben, amelyek dinamikus interakciót igényelnek külső rendszerekkel, például adatbázisokkal, webszolgáltatásokkal vagy kódértelmezőkkel. Ez a képesség számos különböző felhasználási esetben hasznos, például:
Ezek az építőelemek lehetővé teszik az AI ügynök számára, hogy széles körű feladatokat végezzen el. Nézzük meg az Eszközhasználati tervezési minta megvalósításához szükséges kulcselemeket:
Ezután részletesebben megvizsgáljuk a Funkció/Eszköz hívást.
A funkcióhívás az elsődleges módja annak, hogy lehetővé tegyük a Nagy Nyelvi Modellek (LLM-ek) számára az eszközökkel való interakciót. Gyakran látni fogod, hogy a “Funkció” és “Eszköz” kifejezéseket felcserélhetően használják, mert a “funkciók” (újrafelhasználható kódrészletek) azok az “eszközök”, amelyeket az ügynökök a feladatok végrehajtására használnak. Ahhoz, hogy egy funkció kódját végrehajtsák, az LLM-nek össze kell hasonlítania a felhasználói kérést a funkció leírásával. Ehhez egy séma, amely tartalmazza az összes elérhető funkció leírását, elküldésre kerül az LLM-nek. Az LLM kiválasztja a feladathoz legmegfelelőbb funkciót, és visszaküldi annak nevét és argumentumait. A kiválasztott funkciót végrehajtják, válaszát visszaküldik az LLM-nek, amely az információt felhasználja a felhasználói kérés megválaszolására.
A fejlesztőknek a funkcióhívás megvalósításához az ügynökök számára szükségük lesz:
Nézzük meg a példát, hogyan lehet megkapni az aktuális időt egy városban:
Egy funkcióhívást támogató LLM inicializálása:
Nem minden modell támogatja a funkcióhívást, ezért fontos ellenőrizni, hogy az általad használt LLM támogatja-e. Az Azure OpenAI támogatja a funkcióhívást. Kezdhetjük az Azure OpenAI kliens inicializálásával.
# 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"
)
Funkció séma létrehozása:
Ezután definiálunk egy JSON sémát, amely tartalmazza a funkció nevét, a funkció céljának leírását, valamint a funkció paramétereinek neveit és leírásait. Ezt a sémát átadjuk az előzőleg létrehozott kliensnek, valamint a felhasználói kérésnek, hogy megtaláljuk az időt San Franciscóban. Fontos megjegyezni, hogy egy eszközhívás az, ami visszatér, nem a kérdés végső válasza. Ahogy korábban említettük, az LLM visszaküldi a feladathoz kiválasztott funkció nevét és az átadandó argumentumokat.
# 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')])
A feladat végrehajtásához szükséges funkciókód:
Most, hogy az LLM kiválasztotta, melyik funkciót kell futtatni, a feladat végrehajtásához szükséges kódot kell megvalósítani és végrehajtani. Megvalósíthatjuk a kódot az aktuális idő lekérésére Pythonban. Azt is meg kell írnunk a kódot, amely kivonja a nevet és az argumentumokat a response_message-ből, hogy megkapjuk a végső eredményt.
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.
A Funkcióhívás a legtöbb, ha nem az összes ügynök eszközhasználati tervezésének középpontjában áll, azonban a nulláról történő megvalósítása néha kihívást jelenthet. Ahogy a 2. órában tanultuk, az ügynöki keretrendszerek előre elkészített építőelemeket biztosítanak az eszközhasználat megvalósításához.
Íme néhány példa arra, hogyan valósíthatod meg az Eszközhasználati tervezési mintát különböző ügynöki keretrendszerek használatával:
Semantic Kernel egy nyílt forráskódú AI keretrendszer .NET, Python és Java fejlesztők számára, akik Nagy Nyelvi Modellekkel (LLM-ekkel) dolgoznak. Egyszerűsíti a funkcióhívás használatának folyamatát azáltal, hogy automatikusan leírja a funkcióidat és azok paramétereit a modell számára egy szerializálás nevű folyamaton keresztül. Emellett kezeli a modell és a kód közötti oda-vissza kommunikációt. Az ügynöki keretrendszer, mint például a Semantic Kernel használatának másik előnye, hogy hozzáférést biztosít előre elkészített eszközökhöz, mint például File Search és Code Interpreter.
Az alábbi diagram bemutatja a funkcióhívás folyamatát a Semantic Kernel használatával:

A Semantic Kernel-ben a funkciókat/eszközöket Pluginoknak nevezik. Az előzőekben látott get_current_time funkciót átalakíthatjuk egy pluginná úgy, hogy egy osztállyá alakítjuk, amely tartalmazza a funkciót. Importálhatjuk a kernel_function dekorátort is, amely a funkció leírását veszi át. Amikor létrehozol egy kernelt a GetCurrentTimePlugin-nal, a kernel automatikusan szerializálja a funkciót és annak paramétereit, létrehozva a sémát, amelyet elküld az LLM-nek a folyamat során.
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 egy újabb ügynöki keretrendszer, amelyet arra terveztek, hogy lehetővé tegye a fejlesztők számára, hogy biztonságosan építsenek, telepítsenek és skálázzanak magas minőségű és bővíthető AI ügynököket anélkül, hogy az alapvető számítási és tárolási erőforrásokat kellene kezelniük. Különösen hasznos vállalati alkalmazásokhoz, mivel teljesen kezelt szolgáltatás vállalati szintű biztonsággal.
Az LLM API-val való közvetlen fejlesztéshez képest az Azure AI Agent Service néhány előnyt kínál, többek között:
Az Azure AI Agent Service-ben elérhető eszközök két kategóriába sorolhatók:
Csatlakozz az Azure AI Foundry Discord közösséghez, hogy találkozhass más tanulókkal, részt vehess konzultációkon, és választ kapj az AI Agents-szel kapcsolatos kérdéseidre.
Agentic Design Patterns megértése
Felelősség kizárása:
Ezt a dokumentumot az Co-op Translator AI fordítási szolgáltatás segítségével fordították le. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.