(Kattints a fenti képre, hogy megnézd a videót a lecké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 képes 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 a leckében a következő kérdésekre keressük a választ:
A lecke 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, hogy specifikus célokat érjenek el. 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, mivel a “funkciók” (újrafelhasználható kódblokkok) azok az “eszközök”, amelyeket az ügynökök feladatok végrehajtására használnak. Ahhoz, hogy egy funkció kódja meghívható legyen, 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ó meghívásra kerül, válasza visszaküldésre kerül az LLM-nek, amely az információt felhasználja a felhasználói kérés megválaszolására.
Az ügynökök funkcióhívásának megvalósításához a fejlesztőknek 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. 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 nevét és leírását. 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égleges 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, hogy Pythonban megkapjuk az aktuális időt. Azt is meg kell írnunk a kódot, amely kivonja a nevet és az argumentumokat a response_message-ből, hogy megkapjuk a végleges 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öki eszközhasználati tervezés 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. leckében 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 keretrendszerekkel:
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át azáltal, hogy automatikusan leírja a funkcióidat és azok paramétereit a modell számára egy folyamaton keresztül, amelyet szerializálásnak neveznek. Emellett kezeli a modell és a kód közötti kommunikációt. Az ügynöki keretrendszer, mint a Semantic Kernel, további 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.
A következő diagram bemutatja a funkcióhívás folyamatát a Semantic Kernel segítségével:
A Semantic Kernelben a funkciókat/eszközöket Pluginoknak nevezik. Az előzőekben látott get_current_time
funkciót pluginé alakíthatjuk úgy, hogy 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-nel, a kernel automatikusan szerializálja a funkciót és annak paramétereit, létrehozva a sémát, amelyet elküld az LLM-nek.
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 a fejlesztők biztonságosan építhessenek, telepíthessenek és skálázhassanak magas minőségű és bővíthető AI ügynököket anélkül, hogy az alapul szolgáló számítási és tárolási erőforrásokat kellene kezelniük. Különösen hasznos vállalati alkalmazások esetében, 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, például:
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 témájú kérdéseidre.
Agentikus tervezési minták megértése
Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás, a Co-op Translator segítségével lett lefordítva. 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 semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.