ai-agents-for-beginners

Kako dizajnirati dobre AI agente

(Kliknite na sliku iznad za pregled videa ove lekcije)

Dizajnerski obrazac za korištenje alata

Alati su zanimljivi jer omogućuju AI agentima širi raspon sposobnosti. Umjesto da agent ima ograničen skup radnji koje može izvršiti, dodavanjem alata agent sada može izvoditi širok raspon radnji. U ovom poglavlju proučit ćemo dizajnerski obrazac za korištenje 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 za korištenje alata?

Dizajnerski obrazac za korištenje alata fokusira se na omogućavanje LLM-ovima (Large Language Models) interakciju s vanjskim alatima kako bi postigli specifične ciljeve. Alati su kod koji agent može izvršiti za obavljanje radnji. Alat može biti jednostavna funkcija poput kalkulatora ili API poziv prema usluzi treće strane, poput pretraživanja cijena dionica ili vremenske prognoze. U kontekstu AI agenata, alati su dizajnirani da ih agenti izvršavaju kao odgovor na funkcijske pozive generirane modelom.

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

AI agenti mogu koristiti alate za obavljanje složenih zadataka, dohvaćanje informacija ili donošenje odluka. Dizajnerski obrazac za korištenje alata često se koristi u scenarijima koji zahtijevaju dinamičku interakciju s vanjskim sustavima, poput baza podataka, web usluga ili interpretera koda. Ova sposobnost korisna je za razne slučajeve upotrebe, uključujući:

Koji su elementi/građevni blokovi potrebni za implementaciju dizajnerskog obrasca za korištenje alata?

Ovi građevni blokovi omogućuju AI agentu obavljanje širokog raspona zadataka. Pogledajmo ključne elemente potrebne za implementaciju dizajnerskog obrasca za korištenje alata:

Sljedeće ćemo detaljnije pogledati pozivanje funkcija/alata.

Pozivanje funkcija/alata

Pozivanje funkcija primarni je način na koji omogućujemo LLM-ovima interakciju s alatima. Često ćete vidjeti da se “funkcije” i “alati” koriste naizmjenično jer su “funkcije” (blokovi ponovljivog koda) “alati” koje agenti koriste za obavljanje zadataka. Kako bi se kod funkcije pozvao, LLM mora usporediti korisnički zahtjev s opisom funkcije. Za to se LLM-u šalje shema koja sadrži opise svih dostupnih funkcija. LLM zatim odabire najprikladniju funkciju za zadatak i vraća njezino ime i argumente. Odabrana funkcija se poziva, njezin odgovor šalje natrag LLM-u, koji koristi informacije za odgovor na korisnički zahtjev.

Za implementaciju pozivanja funkcija za agente, programeri trebaju:

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

Pogledajmo primjer dobivanja trenutnog vremena u određenom gradu kako bismo ilustrirali:

  1. Inicijalizacija LLM-a koji podržava pozivanje funkcija:

    Nisu svi modeli podržavaju pozivanje funkcija, stoga je važno provjeriti podržava li LLM koji koristite. Azure OpenAI podržava pozivanje funkcija. Možemo započeti inicijalizacijom Azure OpenAI klijenta.

     # 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"
     )
    
  2. Kreiranje sheme funkcije:

    Zatim ćemo definirati JSON shemu koja sadrži naziv funkcije, opis onoga što funkcija radi te nazive i opise parametara funkcije. Ovu shemu ćemo zatim proslijediti prethodno kreiranom klijentu, zajedno s korisničkim zahtjevom za pronalaženje vremena u San Franciscu. Važno je napomenuti da se vraća poziv alata, a ne konačan odgovor na pitanje. Kao što je ranije spomenuto, LLM vraća naziv funkcije koju je odabrao za zadatak i argumente koji će joj biti proslijeđeni.

     # 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')])
    
  3. Kod funkcije potrebne za izvršenje zadatka:

    Sada kada je LLM odabrao koju funkciju treba pokrenuti, potrebno je implementirati i izvršiti kod koji obavlja zadatak. Kod za dobivanje trenutnog vremena možemo implementirati u Pythonu. Također ćemo trebati napisati kod za izdvajanje imena i argumenata iz response_message kako bismo dobili konačan 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"})
    
      # 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.
    

Pozivanje funkcija srž je većine, ako ne i svih dizajna za korištenje alata od strane agenata, no implementacija od nule ponekad može biti izazovna. Kao što smo naučili u Lekciji 2, agentički okviri pružaju nam unaprijed izgrađene građevne blokove za implementaciju korištenja alata.

Primjeri korištenja alata s agentičkim okvirima

Evo nekoliko primjera kako možete implementirati dizajnerski obrazac za korištenje alata koristeći različite agentičke okvire:

Semantic Kernel

Semantic Kernel je open-source AI okvir za .NET, Python i Java programere koji rade s velikim jezičnim modelima (LLM-ovima). Pojednostavljuje proces korištenja pozivanja funkcija automatskim opisivanjem vaših funkcija i njihovih parametara modelu kroz proces nazvan serializacija. Također upravlja dvosmjernom komunikacijom između modela i vašeg koda. Još jedna prednost korištenja agentičkog okvira poput Semantic Kernel-a je ta što omogućuje pristup unaprijed izgrađenim alatima poput pretraživanja datoteka i interpretera koda.

Sljedeći dijagram ilustrira proces pozivanja funkcija sa Semantic Kernel-om:

pozivanje funkcija

U Semantic Kernel-u funkcije/alati nazivaju se dodacima (Plugins). Funkciju get_current_time koju smo ranije vidjeli možemo pretvoriti u dodatak tako da je pretvorimo u klasu s funkcijom unutar nje. Također možemo uvesti dekorator kernel_function, koji prima opis funkcije. Kada zatim kreirate kernel s dodatkom GetCurrentTimePlugin, kernel će automatski serializirati funkciju i njezine parametre, stvarajući shemu za slanje LLM-u u tom procesu.

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

Azure AI Agent Service je noviji agentički okvir dizajniran za omogućavanje programerima da sigurno izgrade, implementiraju i skaliraju visokokvalitetne i proširive AI agente bez potrebe za upravljanjem osnovnim računalnim i skladišnim resursima. Posebno je koristan za poslovne aplikacije jer je potpuno upravljana usluga s sigurnošću na razini poduzeća.

U usporedbi s razvojem izravno putem LLM API-ja, Azure AI Agent Service pruža neke prednosti, uključujući:

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

  1. Alati za znanje:
  2. Alati za radnje:

Agent Service omogućuje korištenje ovih alata zajedno kao toolset. Također koristi threads koje prate povijest poruka iz određenog razgovora.

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

Sljedeća slika ilustrira kako biste mogli koristiti Azure AI Agent Service za analizu svojih prodajnih podataka:

Agentic Service u akciji

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 izgrađeni Code Interpreter, ovisno o korisničkom zahtjevu.

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 function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

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

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
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 napomene za korištenje dizajnerskog obrasca za korištenje alata u izgradnji pouzdanih AI agenata?

Česta zabrinutost kod SQL-a koji dinamički generiraju LLM-ovi je sigurnost, posebno rizik od SQL injekcija ili zlonamjernih radnji, poput brisanja ili manipulacije bazom podataka. Iako su ove zabrinutosti valjane, mogu se učinkovito ublažiti pravilnom konfiguracijom dozvola za pristup bazi podataka. Za većinu baza podataka to uključuje konfiguriranje baze kao samo za čitanje. Za usluge baza podataka poput PostgreSQL-a ili Azure SQL-a, aplikaciji treba dodijeliti ulogu samo za čitanje (SELECT).

Pokretanje aplikacije u sigurnom okruženju dodatno povećava zaštitu. U poslovnim scenarijima podaci se obično izvlače i transformiraju iz operativnih sustava u bazu podataka samo za čitanje ili skladište podataka s korisnički prilagođenom shemom. Ovaj pristup osigurava da su podaci sigurni, optimizirani za performanse i pristupačnost te da aplikacija ima ograničen, samo za čitanje pristup.

Imate li dodatnih pitanja o dizajnerskom obrascu za korištenje alata?

Pridružite se Azure AI Foundry Discordu kako biste upoznali druge polaznike, sudjelovali u uredskim satima i dobili odgovore na svoja pitanja o AI agentima.

Dodatni resursi

Prethodna lekcija

Razumijevanje obrazaca agentičkog dizajna

Sljedeća lekcija

Agentički RAG


Odricanje od odgovornosti:
Ovaj dokument je preveden pomoću AI usluge za prevođenje Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije koje proizlaze iz korištenja ovog prijevoda.