ai-agents-for-beginners

Kako dizajnirati dobre AI agente

(Kliknite sliku iznad da pogledate video ove lekcije)

Uzorak dizajna upotrebe alata

Alati su zanimljivi jer omogućuju AI agentima širi spektar mogućnosti. 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 pogledat ćemo Uzorak dizajna upotrebe alata, koji opisuje kako AI agenti mogu koristiti specifične alate za postizanje svojih ciljeva.

Uvod

U ovoj lekciji želimo odgovoriti na sljedeća pitanja:

Ciljevi učenja

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

Što je Uzorak dizajna upotrebe alata?

The Tool Use Design Pattern fokusira se na davanje LLM-ovima sposobnosti interakcije s vanjskim alatima kako bi postigli određene ciljeve. Alati su kod koji agent može izvršiti da bi obavio radnje. Alat može biti jednostavna funkcija poput kalkulatora ili poziv API-ja treće strane poput dohvaćanja cijena dionica ili vremenske prognoze. U kontekstu AI agenata, alati su dizajnirani da budu izvršeni od strane agenata kao odgovor na model-generated function calls.

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

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

Koji su elementi/gradivni blokovi potrebni za implementaciju uzorka dizajna upotrebe alata?

Ovi gradivni blokovi omogućuju AI agentu izvođenje širokog raspona zadataka. Pogledajmo ključne elemente potrebne za implementaciju Uzorka dizajna upotrebe alata:

Sljedeće, pogledajmo pozivanje funkcija/alata (Function/Tool Calling) detaljnije.

Function/Tool Calling

Pozivanje funkcija je primarni način na koji omogućujemo Large Language Modelima (LLM-ovima) interakciju s alatima. Često ćete vidjeti da se ‘Function’ i ‘Tool’ koriste naizmjenično jer su ‘functions’ (blokovi višekratno upotrebljivog koda) isti kao ‘tools’ koje agenti koriste za izvršavanje zadataka. Da bi se kod funkcije mogao pozvati, LLM mora usporediti korisničev zahtjev s opisom funkcija. Za to se šalje shema koja sadrži opise svih dostupnih funkcija LLM-u. LLM zatim odabire najprikladniju funkciju za zadatak i vraća njezin naziv i argumente. Odabrana funkcija se poziva, njezin odgovor se vraća natrag LLM-u, koji koristi informacije za odgovor na korisnikov zahtjev.

Za developere koji žele implementirati pozivanje funkcija za agente, bit će vam potrebno:

  1. An LLM model that supports function calling
  2. A schema containing function descriptions
  3. The code for each function described

Kao primjer upotrijebimo dohvaćanje trenutnog vremena u nekom gradu:

  1. Inicijalizirajte LLM koji podržava pozivanje funkcija:

    Not all models support function calling, so it’s important to check that the LLM you are using does. Azure OpenAI supports function calling. We can start by initiating the Azure OpenAI client.

     # Inicijalizirajte Azure OpenAI klijent
     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. Kreirajte shemu funkcije:

    Sljedeće ćemo definirati JSON shemu koja sadrži naziv funkcije, opis onoga što funkcija radi te nazive i opise parametara funkcije. Zatim ćemo ovu shemu proslijediti klijentu kreiranom prethodno, zajedno s korisnikovim zahtjevom za pronalaženje vremena u San Franciscu. Važno je napomenuti da je poziv alata ono što se vraća, 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 se proslijediti.

     # Opis funkcije koju model treba pročitati
     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: Zamolite model da upotrijebi funkciju
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Obradite odgovor 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 koju funkciju treba pokrenuti, potrebno je implementirati i izvršiti kod koji obavlja zadatak. Možemo implementirati kod za dohvaćanje trenutnog vremena u Pythonu. Također ćemo morati napisati kod za izdvajanje naziva 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"})
    
      # Rukuj pozivima funkcija
       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 poziv API-ja: 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 središtu većine, ako ne i svih agentnih uzoraka upotrebe alata, no implementacija od nule ponekad može biti izazovna. Kao što smo naučili u Lesson 2 agentski okviri pružaju nam unaprijed izgrađene gradivne blokove za implementaciju upotrebe alata.

Primjeri upotrebe alata s agentskim okvirima

Evo nekoliko primjera kako možete implementirati Uzorak dizajna upotrebe alata koristeći različite agentske okvire:

Microsoft Agent Framework

Microsoft Agent Framework je open-source AI okvir za izgradnju AI agenata. Pojednostavljuje proces korištenja pozivanja funkcija omogućujući vam definiranje alata kao Python funkcija s dekoratorom @tool. Okvir rukuje dvosmjernom komunikacijom između modela i vašeg koda. Također omogućuje pristup unaprijed izrađenim alatima poput File Search i Code Interpreter putem AzureAIProjectAgentProvider.

Sljedeći dijagram ilustrira proces pozivanja funkcija s Microsoft Agent Frameworkom:

pozivanje funkcija

U Microsoft Agent Frameworku alati su definirani kao dekorirane funkcije. Funkciju get_current_time koju smo ranije vidjeli možemo pretvoriti u alat koristeći dekorator @tool. Okvir će automatski serijalizirati funkciju i njezine parametre, stvarajući shemu za slanje LLM-u.

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

# Kreiraj klijenta
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Kreiraj agenta i pokreni pomoću alata
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 je noviji agentski okvir dizajniran da omogući developerima sigurno izgraditi, implementirati i skalirati visokokvalitetne i proširive AI agente bez potrebe za upravljanjem osnovnim računskim i spremišnim resursima. Posebno je koristan za enterprise primjene jer je potpuno upravljana usluga s enterprise razinom sigurnosti.

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

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

  1. Knowledge Tools:
  2. Action Tools:

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

Zamislite da ste prodajni agent u tvrtki zvanoj 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 vaših prodajnih podataka:

Agentska usluga u akciji

Da biste koristili bilo koji od ovih alata s uslugom, možemo stvoriti klijenta i definirati alat ili skup alata. Za praktičnu implementaciju možemo koristiti sljedeći Python kod. LLM će moći pogledati toolset 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 korisnikovom 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 # 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 ga u skup alata
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Inicijaliziraj alat Code Interpreter 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
)

Koja su posebna razmatranja pri korištenju Uzorka dizajna upotrebe alata za izgradnju 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 opravdane, mogu se učinkovito ublažiti pravilnim konfiguriranjem dopuštenja pristupa bazi podataka. Za većinu baza to uključuje konfiguriranje baze kao samo-za-čitanje. Za usluge baza podataka poput PostgreSQL-a ili Azure SQL-a, aplikaciji bi trebala biti dodijeljena uloga samo za čitanje (SELECT).

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

Primjerni kodovi

Imate li dodatnih pitanja o Uzorcima dizajna upotrebe alata?

Pridružite se Microsoft Foundry Discord da se povežete s drugim učenicima, sudjelujete na office hours i dobijete odgovore na svoja pitanja o AI agentima.

Dodatni resursi

Prethodna lekcija

Understanding Agentic Design Patterns

Sljedeća lekcija

Agentski RAG


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