ai-agents-for-beginners

Hogyan tervezzünk jó AI ügynököket

(Kattints a fenti képre a lecke videójának megtekintéséhez)

Eszközhasználat tervezési minta

Az eszközök érdekessége, hogy lehetővé teszik az AI ügynökök számára a képességek szélesebb skáláját. Ahelyett, hogy az ügynöknek egy korlátozott műveletkészlete lenne, egy eszköz hozzáadásával az ügynök már szélesebb körű műveleteket képes végrehajtani. Ebben a fejezetben megvizsgáljuk az Eszközhasználat tervezési mintát, amely leírja, hogyan használhatják az AI ügynökök a specifikus eszközöket céljaik eléréséhez.

Bevezetés

Ebben a leckében a következő kérdésekre keressük a választ:

Tanulási célok

A lecke elvégzése után képes leszel:

Mi az Eszközhasználat tervezési minta?

Az Eszközhasználat tervezési minta arra összpontosít, hogy a nagy nyelvi modellek (LLM-ek) képesek legyenek külső eszközökkel együttműködni meghatározott célok elérése érdekében. Az eszközök olyan kódok, amelyeket az ügynök végrehajthat bizonyos műveletek elvégzésére. Egy eszköz lehet egyszerű függvény, például egy számológép, vagy egy harmadik fél szolgáltatásának API hívása, például árfolyam vagy időjárás lekérdezése. AI ügynökök kontextusában az eszközöket úgy tervezik, hogy az ügynökök modell által generált függvényhívások válaszaként hajtsák végre.

Milyen felhasználási esetekre alkalmazható?

Az AI ügynökök eszközöket használhatnak bonyolult feladatok elvégzésére, információk lekérésére, vagy döntéshozatalra. Az eszközhasználati tervezési mintát gyakran alkalmazzák olyan forgatókönyvekben, ahol dinamikus interakció szükséges külső rendszerekkel, mint adatbázisok, webszolgáltatások vagy kódértelmezők. Ez a képesség számos különböző felhasználási esetben hasznos, például:

Mely elemek/építőelemek szükségesek az eszközhasználat tervezési minta megvalósításához?

Ezek az építőelemek teszik lehetővé az AI ügynök számára, hogy széles körű feladatokat hajtson végre. Nézzük meg a kulcsfontosságú elemeket az Eszközhasználat tervezési minta megvalósításához:

Most nézzük meg részletesebben a Függvény/Eszköz hívást.

Függvény/Eszköz hívás

A függvényhívás az elsődleges módja annak, hogy a Nagy Nyelvi Modelleket (LLM-eket) eszközökkel együttműködve használjuk. Gyakran látjuk a „Függvény” és „Eszköz” kifejezéseket felcserélhetően, mert a „függvények” (újrahasználható kódrészek) az „eszközök”, amelyeket az ügynökök használnak a feladatok végrehajtására. Ahhoz, hogy egy függvény kódját meghívják, az LLM-nek össze kell hasonlítania a felhasználó kérését a függvény leírásával. Ehhez egy olyan séma kerül elküldésre az LLM-nek, amely tartalmazza az összes elérhető függvény leírását. Az LLM kiválasztja a legmegfelelőbb függvényt a feladathoz, és visszaküldi a nevét és az argumentumait. A kiválasztott függvényt meghívják, a válasza visszakerül az LLM-hez, amely az információk alapján válaszol a felhasználó kérésére.

A fejlesztőknek, akik függvényhívást akarnak megvalósítani ügynökök számára, szükségük lesz:

  1. Egy olyan LLM modellre, amely támogatja a függvényhívást
  2. Egy sémára, amely tartalmazza a függvények leírásait
  3. A leírt függvények kódjára

Vegyük az aktuális idő lekérésének példáját egy városban a szemléltetéshez:

  1. Indítsunk el egy LLM-et, amely támogatja a függvényhívást:

    Nem minden modell támogatja a függvényhívást, ezért fontos ellenőrizni, hogy a használt LLM igen. Az Azure OpenAI támogatja a függvényhívást. Kezdhetünk az Azure OpenAI kliens inicializálásával.

     # Inicializálja az Azure OpenAI klienset
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Hozzunk létre egy függvénysémát:

    Ezután definiálunk egy JSON sémát, amely tartalmazza a függvény nevét, a függvény leírását és a paraméterek nevét, leírását. Ezt a sémát aztán átadjuk a korábban létrehozott kliensnek, együtt a felhasználói kéréssel, miszerint San Francisco aktuális idejére kíváncsiak vagyunk. Fontos megjegyezni, hogy ez egy eszköz hívás eredménye, nem a végső válasz a kérdésre. Amint korábban említettük, az LLM visszaküldi a feladathoz kiválasztott függvény nevét és az argumentumokat.

     # Függvényleírás a modell számára olvasásra
     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"],
                 },
             }
         }
     ]
    
      
     # Kezdeti felhasználói üzenet
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # Első API hívás: Kérje meg a modellt, hogy használja a függvényt
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Feldolgozza a modell válaszát
       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')])
    
  3. A feladat végrehajtásához szükséges függvénykód:

    Miután az LLM kiválasztotta, hogy melyik függvényt kell futtatni, a végrehajtó kódot meg kell valósítani és futtatni kell. Pythonban megvalósíthatjuk az aktuális idő lekéréséhez szükséges kódot. Emellett szükséges lesz a válaszüzenetből kinyerni a függvény nevét és argumentumait 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
       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.")  
      
       # Második API hívás: A modell végső válaszának lekérése
       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 függvényhívás a legtöbb, ha nem az összes ügynökös eszközhasználati minta központi eleme, azonban a kézi megvalósítása néha kihívást jelenthet. Ahogy a 2. leckében tanultuk, az ügynökös keretrendszerek előre elkészített építőelemeket kínálnak az eszközhasználat megvalósításához.

Példák eszközhasználatra ügynökös keretrendszerekkel

Íme néhány példa arra, hogyan valósítható meg az Eszközhasználat tervezési minta különféle ügynökös keretrendszerek használatával:

Semantic Kernel

A Semantic Kernel egy nyílt forráskódú AI keretrendszer .NET, Python és Java fejlesztők számára, akik nagy nyelvi modellekkel dolgoznak. Egyszerűsíti a függvényhívás folyamatát azáltal, hogy automatikusan leírja a függvényeidet és azok paramétereit a modellnek egy szerializálás nevű folyamaton keresztül. Kezeli továbbá a kommunikáció oda-vissza menetét a modell és a kód között. Egy további előnye annak, hogy Semantic Kernel ügynökös keretrendszert használunk, hogy előre elkészített eszközökhöz férhetünk hozzá, mint például a Fájlkereső és Kódértelmező.

A következő ábra szemlélteti a függvényhívás folyamatát a Semantic Kernel használatával:

function calling

A Semantic Kernelben a függvényeket/eszközöket bővítményeknek hívják. Az előbb látott get_current_time függvényt egy osztállyá alakíthatjuk, amely tartalmazza a függvényt, és ebből bővítményt készítünk. Importálhatjuk a kernel_function dekorátort is, amely a függvény leírását fogadja be. Amikor létrehozunk egy kernelet a GetCurrentTimePlugin-nel, az automatikusan szerializálja a függvényt és paramétereit, így létrehozva a sémát, amelyet a modellnek továbbítunk.

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

# Hozd létre a magot
kernel = Kernel()

# Hozd létre a bővítményt
get_current_time_plugin = GetCurrentTimePlugin(location)

# Add hozzá a bővítményt a maghoz
kernel.add_plugin(get_current_time_plugin)

Azure AI Agent Service

Az Azure AI Agent Service egy újabb ügynökös keretrendszer, amely arra szolgál, hogy a fejlesztők biztonságosan, könnyen fejleszthessenek, telepíthessenek és méretezzenek magas színvonalú, bővíthető AI ügynököket anélkül, hogy az alapvető számítási és tárhely erőforrásokat kezelniük kellene. Különösen hasznos vállalati alkalmazások esetén, mivel egy teljesen menedzselt szolgáltatás és vállalati szintű biztonságot nyújt.

Az LLM API közvetlen használatához képest az Azure AI Agent Service a következő előnyöket kínálja:

Az Azure AI Agent Service-ben elérhető eszközök két kategóriába sorolhatók:

  1. Tudás Eszközök:
  2. Műveleti Eszközök:

Az Agent Service lehetővé teszi ezek együttes használatát, mint eszközkészlet (toolset). Emellett szálakat is használ, amelyek nyomon követik az adott beszélgetés üzenet előzményeit.

Képzeld el, hogy egy Contoso nevű cég értékesítési ügynöke vagy. Beszélgető ügynököt szeretnél fejleszteni, amely képes válaszolni az értékesítési adataiddal kapcsolatos kérdésekre.

A következő kép szemlélteti, hogyan lehet az Azure AI Agent Service-t használni az értékesítési adatok elemzésére:

Agentic Service In Action

Az eszközök használatához a szolgáltatással létrehozhatunk egy klienst és definiálhatunk egy eszközt vagy eszközkészletet. Ennek gyakorlati megvalósítására az alábbi Python kód használható. Az LLM megvizsgálja az eszközkészletet, és eldönti, hogy használja-e a felhasználó által létrehozott fetch_sales_data_using_sqlite_query függvényt vagy az előre elkészített Kódértelmezőt 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 = 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
)

Milyen különleges szempontokat kell figyelembe venni az Eszközhasználat tervezési minta alkalmazásánál megbízható AI ügynökök építéséhez?

Az LLM-ek által dinamikusan generált SQL-lel kapcsolatban gyakori aggodalom a biztonság, különösen az SQL injekció vagy rosszindulatú műveletek, mint az adatbázis törlése vagy manipulálása. Bár ezek az aggodalmak jogosak, hatékonyan mérsékelhetők az adatbázishoz való hozzáférési engedélyek megfelelő konfigurálásával. A legtöbb adatbázis esetén ez az adatbázis csak olvasható (read-only) beállítását jelenti. Olyan adatbázis szolgáltatásoknál mint a PostgreSQL vagy az Azure SQL, az alkalmazásnak olvasási (SELECT) szerepkört kell kapnia. Az alkalmazás futtatása biztonságos környezetben további védelmet nyújt. Vállalati környezetekben az adatok jellemzően az operatív rendszerekből vannak kinyerve és átalakítva egy csak olvasható adatbázisba vagy adattárházba, amely felhasználóbarát sémával rendelkezik. Ez a megközelítés biztosítja, hogy az adatok biztonságosak, teljesítmény és hozzáférhetőség szempontjából optimalizáltak, valamint az alkalmazás korlátozott, csak olvasható hozzáféréssel rendelkezik.

Mintakódok

További kérdése van az eszközhasználati tervezési mintákkal kapcsolatban?

Csatlakozzon az Azure AI Foundry Discord szerveréhez, hogy találkozhasson más tanulókkal, részt vegyen ügyfélszolgálati órákon és megválaszoltassa AI Agentekkel kapcsolatos kérdéseit.

További források

Előző lecke

Agentikus tervezési minták megértése

Következő lecke

Agentikus RAG


Nyilatkozat: Ez a dokumentum az AI fordító szolgáltatás, a Co-op Translator segítségével készült. Bár a pontosságra törekszünk, kérjük, vegye figyelembe, hogy az automatikus fordítás hibákat vagy pontatlanságokat tartalmazhat. Az eredeti dokumentum az adott nyelven tekintendő hiteles forrásnak. Kritikus információk esetén szakmai emberi fordítást javaslunk. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy helytelen értelmezésekért.