ai-agents-for-beginners

Kako dizajnirati dobre AI agente

(Kliknite na gornju sliku za pregled videa ove lekcije)

Dizajnerski obrazac upotrebe alata

Alati su zanimljivi jer omogućuju AI agentima da imaju širi raspon sposobnosti. Umjesto da agent ima ograničen skup radnji koje može izvršiti, dodavanjem alata agent sada može obavljati širok spektar radnji. U ovom poglavlju proučit ćemo Dizajnerski obrazac upotrebe alata, koji opisuje kako AI agenti mogu koristiti specifične alate za postizanje svojih ciljeva.

Uvod

U ovoj lekciji nastojimo odgovoriti na sljedeća pitanja:

Ciljevi učenja

Nakon završetka ove lekcije moći ćete:

Što je Dizajnerski obrazac upotrebe alata?

Dizajnerski obrazac upotrebe alata usredotočen je na davanje sposobnosti velikim jezičnim modelima (LLM-ovima) da komuniciraju s vanjskim alatima za postizanje specifičnih ciljeva. Alati su kod koji agent može izvršiti za obavljanje radnji. Alat može biti jednostavna funkcija poput kalkulatora ili API poziv ka usluzi treće strane, kao što je dohvaćanje cijena dionica ili vremenske prognoze. U kontekstu AI agenata, alati su dizajnirani da budu izvršeni od strane agenata kao odgovor na funkcijske pozive generirane modelom.

Za koje slučajeve upotrebe se može primijeniti?

AI agenti mogu koristiti alate za dovršavanje složenih zadataka, dohvaćanje informacija ili donošenje odluka. Dizajnerski obrazac upotrebe alata često se koristi u scenarijima koji zahtijevaju dinamičku interakciju s vanjskim sustavima, poput baza podataka, web servisa ili interpretera koda. Ova sposobnost korisna je za niz različitih slučajeva uporabe, uključujući:

Koji su elementi/gradivni blokovi potrebni za implementaciju dizajnerskog obrasca upotrebe alata?

Ovi gradivni blokovi omogućuju AI agentu obavljanje širokog spektra zadataka. Pogledajmo ključne elemente potrebne za implementaciju Dizajnerskog obrasca upotrebe alata:

Dalje, pogledajmo detaljnije pozivanje funkcija/alata.

Pozivanje funkcija/alata

Pozivanje funkcija je primarni način na koji omogućujemo velikim jezičnim modelima (LLM) interakciju s alatima. Često ćete vidjeti da se ‘Funkcija’ i ‘Alat’ koriste naizmjenično jer su ‘funkcije’ (blokovi ponovno iskoristivog koda) alati koje agenti koriste za izvršavanje zadataka. Kako bi se kod funkcije mogao pozvati, LLM mora usporediti zahtjev korisnika s opisom funkcije. Za to se šalje shema koja sadrži opise svih dostupnih funkcija LLM-u. LLM zatim odabire najprikladniju funkciju za zadatak i vraća njen naziv i argumente. Izabrana funkcija se poziva, njen odgovor se šalje natrag LLM-u, koji koristi informacije za odgovor korisnikovom zahtjevu.

Da bi programeri implementirali pozivanje funkcija za agente, potreban je:

  1. LLM model koji podržava pozivanje funkcija
  2. Shema koja sadrži opise funkcija
  3. Kod za svaku opisana funkciju

Koristimo primjer dobivanja trenutnog vremena u gradu kako bismo ilustrirali:

  1. Inicijalizirajte LLM koji podržava pozivanje funkcija:

    Nisu svi modeli podržani za pozivanje funkcija, stoga je važno provjeriti da vaš LLM to podržava. Azure OpenAI podržava pozivanje funkcija. Možemo započeti iniciranjem Azure OpenAI klijenta.

     # Inicijalizirajte Azure OpenAI klijent
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Izrada sheme funkcije:

    Zatim definiramo JSON shemu koja sadrži naziv funkcije, opis što funkcija radi te nazive i opise parametara funkcije. Ovu shemu zatim prosljeđujemo prethodno kreiranom klijentu zajedno s korisnikovim zahtjevom za pronalazak vremena u San Franciscu. Važno je napomenuti da je vraćen poziv alatu, ne konačan odgovor na pitanje. Kao što je ranije spomenuto, LLM vraća ime funkcije koju je odabrao za zadatak i argumente koji će joj se proslijediti.

     # Opis funkcije za čitanje modela
     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"],
                 },
             }
         }
     ]
    
      
     # Početna korisnička poruka
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # Prvi poziv API-ja: Zatražite od modela da koristi funkciju
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Obrada odgovora modela
       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. Kod funkcije potreban za izvršenje zadatka:

    Sada kada je LLM odabrao funkciju koju treba pokrenuti, potrebno je implementirati i izvršiti kod koji obavlja zadatak. Kod za dohvat trenutnog vremena možemo implementirati u Pythonu. Također ćemo trebati napisati kod za izdvajanje naziva i argumenata iz response_message da bismo dobili konačni rezultat.

       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"})
    
      # Obrada poziva funkcije
       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.")  
      
       # Drugi API poziv: Dohvati konačni odgovor od modela
       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.
    

Pozivanje funkcija je u srcu većine, ako ne i svih, dizajnerskih obrazaca upotrebe alata za agente, no ponekad može biti izazovno implementirati ga od nule. Kao što smo naučili u Lekciji 2, agentic frameworki nam pružaju unaprijed izrađene gradivne blokove za implementaciju upotrebe alata.

Primjeri upotrebe alata s agentic frameworkima

Evo nekoliko primjera kako možete implementirati Dizajnerski obrazac upotrebe alata koristeći različite agentic frameworke:

Semantic Kernel

Semantic Kernel je open-source AI okvir za .NET, Python i Java programere koji rade s velikim jezičnim modelima (LLM). Pojednostavljuje proces korištenja poziva funkcija automatski opisujući vaše funkcije i njihove parametre modelu kroz proces nazvan serijalizacijom. Također upravlja dvosmjernom komunikacijom između modela i vašeg koda. Još jedna prednost korištenja agentic frameworka poput Semantic Kernel jest što vam omogućuje pristup unaprijed izrađenim alatima poput File Search i Code Interpreter.

Sljedeća dijagrama ilustrira proces poziva funkcija s Semantic Kernel:

function calling

U Semantic Kernel funkcije/alati nazivaju se Plugins. Funkciju get_current_time koju smo ranije vidjeli možemo pretvoriti u plugin tako da je stavimo u klasu. Također možemo uvesti dekorator kernel_function koji prima opis funkcije. Kada zatim kreirate kernel s GetCurrentTimePlugin, kernel će automatski serijalizirati funkciju i njene parametre te u tom procesu kreirati shemu za slanje LLM-u.

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

# Kreiraj kernel
kernel = Kernel()

# Kreiraj dodatak
get_current_time_plugin = GetCurrentTimePlugin(location)

# Dodaj dodatak u kernel
kernel.add_plugin(get_current_time_plugin)

Azure AI Agent Service

Azure AI Agent Service je noviji agentic framework dizajniran da omogući programerima sigurno izgradnju, implementaciju i skaliranje visokokvalitetnih i proširivih AI agenata bez potrebe za upravljanjem osnovnim računalnim i spremišnim resursima. Posebno je koristan za poslovne aplikacije jer je potpuno upravljana usluga razine poduzeća s naprednom sigurnošću.

U usporedbi s razvojem direktno putem LLM API-ja, Azure AI Agent Service nudi neke prednosti, uključujući:

Alati dostupni u Azure AI Agent Service mogu se podijeliti u dvije kategorije:

  1. Alati za znanje:
  2. Alati za akcije:

Agent Service omogućuje da ove alate koristimo zajedno kao toolset. Također koristi threadove koji prate povijest poruka iz određene konverzacije.

Zamislite da ste prodajni agent u tvrtki Contoso. Želite razviti konverzacijski agent koji može odgovarati na pitanja o vašim prodajnim podacima.

Slika ispod ilustrira kako možete koristiti Azure AI Agent Service za analizu vaših prodajnih podataka:

Agentic Service In Action

Za korištenje bilo kojeg od ovih alata s uslugom možemo kreirati klijenta i definirati alat ili skup alata. Za praktičnu implementaciju možemo koristiti sljedeći Python kod. LLM će moći pogledati skup alata i odlučiti hoće li koristiti korisnički definiranu funkciju fetch_sales_data_using_sqlite_query ili unaprijed izrađeni Code Interpreter, ovisno o zahtjevu korisnika.

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 # funkcija fetch_sales_data_using_sqlite_query koja se može pronaći u datoteci fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# Inicijaliziraj skup alata
toolset = ToolSet()

# Inicijaliziraj agenta za pozivanje funkcija s funkcijom fetch_sales_data_using_sqlite_query i dodaj je u skup alata
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Inicijaliziraj alat za interpretaciju koda i dodaj ga u skup alata.
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
)

Koje su posebne razmatranja pri korištenju Dizajnerskog obrasca upotrebe alata za izgradnju pouzdanih AI agenata?

Česta zabrinutost vezana za SQL dinamički generirani od strane LLM-ova jest sigurnost, posebno rizik od SQL injekcija ili zlonamjernih radnji poput brisanja ili izmjena baze podataka. Iako su ove zabrinutosti opravdane, mogu se učinkovito ublažiti pravilnom konfiguracijom dozvola pristupa bazi podataka. Za većinu baza podataka to uključuje konfiguraciju baze kao samo za čitanje. Za baze podataka poput PostgreSQL ili Azure SQL aplikaciji treba dodijeliti ulogu samo za čitanje (SELECT). Pokretanje aplikacije u sigurnom okruženju dodatno pojačava zaštitu. U poslovnim scenarijima, podaci se obično ekstrahiraju i transformiraju iz operativnih sustava u bazu podataka ili skladište podataka samo za čitanje s korisnički prilagođenom shemom. Ovaj pristup osigurava da su podaci sigurni, optimizirani za izvedbu i pristupačnost, te da aplikacija ima ograničen pristup samo za čitanje.

Primjeri koda

Imate li više pitanja o alatu Upotreba oblikovnih obrazaca?

Pridružite se Azure AI Foundry Discord kako biste se upoznali s ostalim učenicima, sudjelovali na radnim satima i dobili odgovore na pitanja vezana uz AI agente.

Dodatni resursi

Prethodni lekcija

Understanding Agentic Design Patterns

Sljedeća lekcija

Agentic RAG


Odricanje od odgovornosti: Ovaj je dokument preveden pomoću AI prijevoda usluge Co-op Translator. Iako težimo točnosti, imajte na umu da automatizirani prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba se smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni ljudski prijevod. Nismo odgovorni za bilo kakva nesporazuma ili kriva tumačenja koja proizlaze iz korištenja ovog prijevoda.