ai-agents-for-beginners

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

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

Eszközhasználati tervezési minta

Az eszközök azért érdekesek, mert lehetővé teszik, hogy az AI-ügynökök szélesebb körű képességekkel rendelkezzenek. Ahelyett, hogy az ügynöknek korlátozott készletű műveletei lennének, egy eszköz hozzáadásával az ügynök most már sokféle műveletet képes végrehajtani. Ebben a fejezetben az Eszközhasználati tervezési mintát vizsgáljuk, amely leírja, hogyan használhatnak az AI-ügynökök konkrét 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 lesz:

Mi az eszközhasználati tervezési minta?

A Eszközhasználati tervezési minta az LLM-eknek az a képessége, hogy külső eszközökkel lépjenek interakcióba 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ű függvény, például egy számológép, vagy egy harmadik féltől származó szolgáltatás API-hívása, például részvényár-keresés vagy időjárás-előrejelzés. Az AI-ügynökök kontextusában az eszközöket úgy tervezték, hogy ügynökök hajtsák végre őket válaszként a model által generált függvényhívásokra.

Milyen használati esetekre alkalmazható?

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éshozatalra. Az eszközhasználati tervezési mintát gyakran olyan forgatókönyvekben alkalmazzák, amelyek dinamikus interakciót igényelnek külső rendszerekkel, például adatbázisokkal, webszolgáltatásokkal vagy kódfuttatókkal. Ez a képesség számos különböző használati esetben hasznos, többek között:

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

Ezek az építőkockák lehetővé teszik az AI-ügynök számára, hogy széles körű feladatokat végezzen el. Nézzük meg a kulcselemeket, amelyek szükségesek az Eszközhasználati tervezési minta megvalósításához:

Ezután nézzük meg részletesebben a Funkció/Eszköz hívást.

Funkció/Eszköz hívás

A funkcióhívás az elsődleges módja annak, hogy az LLM-eket eszközökkel történő interakcióra képessé tegyük. Gyakran látni fogja, hogy a ‘Funkció’ és az ‘Eszköz’ kifejezést felcserélhetően használják, mert a ‘funkciók’ (újrahasznosítható kódbetétek) azok az ‘eszközök’, amelyeket az ügynökök a feladatok végrehajtására használnak. 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. Ennek érdekében egy sémát, amely tartalmazza az összes elérhető függvény leírását, elküldünk az LLM-nek. Az LLM ezután kiválasztja a feladathoz legmegfelelőbb függvényt és visszaadja annak nevét és argumentumait. A kiválasztott függvényt meghívják, a válasza visszakerül az LLM-hez, amely ezt az információt felhasználva adja meg a felhasználó számára a választ.

Ahhoz, hogy a fejlesztők megvalósítsák a funkcióhívást az ügynökök számára, szükség lesz:

  1. Egy LLM modellre, amely támogatja a funkcióhívást
  2. Egy sémára, amely tartalmazza a függvényleírásokat
  3. Az egyes leírt függvények kódjára

Vegyük a példát, amikor egy város aktuális idejét szeretnénk lekérdezni:

  1. Inicializáljunk egy funkcióhívást támogató LLM-et:

    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. Elkezdhetjük az Azure OpenAI kliens inicializálásával.

     # Inicializálja az Azure OpenAI klienst
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Hozzuk létre a funkció sémát:

    Ezután definiálunk egy JSON sémát, amely tartalmazza a függvény nevét, a függvény által végzett művelet leírását, valamint a függvény paramétereinek nevét és leírását. Ezt a sémát elküldjük az előzőleg létrehozott kliensnek, együtt a felhasználó San Francisco-i időpont lekérésére irányuló kérésével. Fontos megjegyezni, hogy egy eszközhívás az, ami visszatér, nem a végső válasz a kérdésre. Amint korábban említettük, az LLM visszaadja a feladathoz kiválasztott függvény nevét és az átadandó argumentumokat.

     # A modell számára olvasandó függvény leírása
     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érd 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",
       )
      
       # Feldolgozd 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:

    Most, hogy az LLM kiválasztotta, melyik függvényt kell futtatni, a feladatot végrehajtó kódot meg kell valósítani és futtatni kell. Pythonban megvalósíthatjuk az aktuális idő lekérését. Emellett szükség lesz kódra is annak kinyerésére, hogy a response_message-ből hogyan szedjük ki a nevet és az argumentumokat a végső eredmény megszerzéséhez.

       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 Funkcióhívás a legtöbb, ha nem az összes ügynök eszközhasználati tervezésének központi eleme, azonban a nulla alapú megvalósítás néha kihívást jelenthet. Ahogy a Lesson 2 leckében megtanultuk, az agentikus keretrendszerek előre elkészített építőkockákat biztosítanak az eszközhasználat megvalósításához.

Eszközhasználati példák agentikus keretrendszerekkel

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

Microsoft Agent Framework

Microsoft Agent Framework egy nyílt forráskódú AI keretrendszer AI-ügynökök építéséhez. Egyszerűsíti a funkcióhívás folyamatát azzal, hogy lehetővé teszi az eszközök Python függvényekként való definiálását a @tool dekorátorral. A keretrendszer kezeli a modell és a kód közötti oda-vissza kommunikációt. Emellett hozzáférést biztosít előre elkészített eszközökhöz, például File Search és Code Interpreter a AzureAIProjectAgentProvider segítségével.

A következő ábra szemlélteti a funkcióhívás folyamatát a Microsoft Agent Framework használatával:

Funkcióhívás

A Microsoft Agent Frameworkben az eszközök dekorált függvényekként vannak definiálva. A korábban látott get_current_time függvényt eszközzé alakíthatjuk a @tool dekorátor használatával. A keretrendszer automatikusan szerializálja a függvényt és annak paramétereit, létrehozva a sémát, amelyet az LLM-nek küldünk.

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"""
    ...

# Hozd létre a klienst
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Hozz létre egy ügynököt és futtasd az eszközzel
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

Azure AI Agent Service egy újabb agentikus keretrendszer, amelyet arra terveztek, hogy lehetővé tegye a fejlesztők számára biztonságosan magas színvonalú, kiterjeszthető AI-ügynökök építését, telepítését és skálázását anélkül, hogy a mögöttes 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 felügyelt szolgáltatás vállalati szintű biztonsággal.

Az LLM API közvetlen használatához 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:

  1. Tudáseszközök:
  2. Műveleti eszközök:

Az Agent Service lehetővé teszi, hogy ezeket az eszközöket egy toolset-ként használjuk együtt. Emellett threads-eket használ, amelyek nyomon követik egy adott beszélgetés üzenettörténetét.

Képzelje el, hogy egy Contoso nevű vállalat értékesítési ügynöke. Egy olyan beszélgető ügynököt szeretne fejleszteni, amely képes válaszolni az értékesítési adataira vonatkozó kérdésekre.

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

Agent Service működés közben

Bármelyik eszköz használatához a szolgáltatással létrehozhatunk egy klienset é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 képes lesz megnézni az eszközkészletet és eldönteni, hogy a felhasználó által létrehozott függvényt, a fetch_sales_data_using_sqlite_query-t használja-e, vagy a beépített Code Interpreter-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 # A 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)

# A Code Interpreter 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 megfontolások szükségesek az Eszközhasználati tervezési minta alkalmazásához megbízható AI-ügynökök építésekor?

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 kockázata, például adatbázis törlése vagy manipulálása. Bár ezek az aggodalmak jogosak, hatékonyan mérsékelhetők az adatbázis-hozzáférési jogosultságok megfelelő konfigurálásával. A legtöbb adatbázis esetében ez azt jelenti, hogy az adatbázist csak olvashatóként kell konfigurálni. Olyan adatbázis-szolgáltatásoknál, mint a PostgreSQL vagy az Azure SQL, az alkalmazásnak olvasható (SELECT) szerepkört kell kapnia.

Az alkalmazás biztonságos környezetben való futtatása tovább növeli a védelmet. Vállalati forgatókönyvekben az adatok általában kinyerésre és átalakításra kerülnek az operációs rendszerekből egy 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, és hogy az alkalmazás korlátozott, csak olvasható hozzáféréssel rendelkezik.

Mintakódok

Van még kérdése az Eszközhasználati tervezési mintákkal kapcsolatban?

Csatlakozzon a Microsoft Foundry Discord szerverhez, hogy találkozzon más tanulókkal, részt vegyen konzultációkon és választ kapjon AI-ügynökökkel kapcsolatos kérdéseire.

További források

Előző lecke

Az agentikus tervezési minták megértése

Következő lecke

Ügynöki RAG


Felelősségkizárás: Ezt a dokumentumot a mesterséges intelligencián alapuló fordítószolgáltatás, a Co-op Translator (https://github.com/Azure/co-op-translator) segítségével fordították. Bár igyekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti, anyanyelvi változat tekintendő hiteles forrásnak. Fontos információk esetén professzionális, emberi fordítást javasolunk. Nem vállalunk felelősséget az e fordítás használatából eredő bármilyen félreértésért vagy téves értelmezésért.