ai-agents-for-beginners

Kako oblikovati dobre AI agente

(Kliknite na zgornjo sliko za ogled videa te lekcije)

Vzorec oblikovanja uporabe orodij

Orodja so zanimiva, ker omogočajo AI agentom širši nabor zmožnosti. Namesto da bi agent imel omejen nabor dejanj, ki jih lahko izvede, mu dodajanje orodja omogoči izvajanje širokega spektra dejanj. V tem poglavju bomo raziskali vzorec oblikovanja uporabe orodij, ki opisuje, kako lahko AI agenti uporabljajo specifična orodja za dosego svojih ciljev.

Uvod

V tej lekciji bomo odgovorili na naslednja vprašanja:

Cilji učenja

Po zaključku te lekcije boste lahko:

Kaj je vzorec oblikovanja uporabe orodij?

Vzorec oblikovanja uporabe orodij se osredotoča na omogočanje LLM-jem (velikim jezikovnim modelom), da komunicirajo z zunanjimi orodji za dosego specifičnih ciljev. Orodja so koda, ki jo lahko agent izvede za izvedbo dejanj. Orodje je lahko preprosta funkcija, kot je kalkulator, ali API klic do storitve tretje osebe, kot je iskanje cen delnic ali vremenska napoved. V kontekstu AI agentov so orodja zasnovana tako, da jih agenti izvedejo kot odgovor na funkcijske klice, ki jih generira model.

Za katere primere uporabe je primeren?

AI agenti lahko uporabljajo orodja za dokončanje kompleksnih nalog, pridobivanje informacij ali sprejemanje odločitev. Vzorec oblikovanja uporabe orodij se pogosto uporablja v scenarijih, ki zahtevajo dinamično interakcijo z zunanjimi sistemi, kot so baze podatkov, spletne storitve ali interpreterji kode. Ta zmožnost je uporabna za številne primere uporabe, vključno z:

Kateri so elementi/gradniki, potrebni za implementacijo vzorca oblikovanja uporabe orodij?

Ti gradniki omogočajo AI agentu izvajanje širokega spektra nalog. Poglejmo ključne elemente, potrebne za implementacijo vzorca oblikovanja uporabe orodij:

Nato si podrobneje oglejmo klicanje funkcij/orodij.

Klicanje funkcij/orodij

Klicanje funkcij je primarni način, kako omogočimo velikim jezikovnim modelom (LLM) interakcijo z orodji. Pogosto boste videli, da se izraza ‘funkcija’ in ‘orodje’ uporabljata izmenično, saj so ‘funkcije’ (bloki ponovno uporabne kode) ‘orodja’, ki jih agenti uporabljajo za izvajanje nalog. Da bi bila koda funkcije izvedena, mora LLM primerjati uporabnikovo zahtevo z opisom funkcije. Za to se LLM-ju pošlje shema, ki vsebuje opise vseh razpoložljivih funkcij. LLM nato izbere najprimernejšo funkcijo za nalogo in vrne njeno ime ter argumente. Izbrana funkcija se izvede, njen odziv pa se pošlje nazaj LLM-ju, ki uporabi informacije za odgovor na uporabnikovo zahtevo.

Za implementacijo klicanja funkcij za agente razvijalci potrebujejo:

  1. LLM model, ki podpira klicanje funkcij
  2. Shemo, ki vsebuje opise funkcij
  3. Kodo za vsako opisano funkcijo

Poglejmo primer pridobivanja trenutnega časa v določenem mestu:

  1. Inicializacija LLM, ki podpira klicanje funkcij:

    Vsi modeli ne podpirajo klicanja funkcij, zato je pomembno preveriti, ali LLM, ki ga uporabljate, to omogoča. Azure OpenAI podpira klicanje funkcij. Začnemo lahko z inicializacijo odjemalca Azure OpenAI.

     # 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. Ustvarjanje sheme funkcij:

    Nato definiramo JSON shemo, ki vsebuje ime funkcije, opis, kaj funkcija počne, ter imena in opise parametrov funkcije. To shemo nato posredujemo prej ustvarjenemu odjemalcu skupaj z uporabnikovo zahtevo za iskanje časa v San Franciscu. Pomembno je poudariti, da je rezultat klic orodja, ne končni odgovor na vprašanje. Kot smo že omenili, LLM vrne ime funkcije, ki jo je izbral za nalogo, in argumente, ki bodo posredovani funkciji.

     # 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. Koda funkcije, potrebna za izvedbo naloge:

    Ko LLM izbere, katero funkcijo je treba izvesti, je treba implementirati in izvesti kodo, ki opravi nalogo. Kodo za pridobivanje trenutnega časa lahko implementiramo v Pythonu. Prav tako moramo napisati kodo za pridobivanje imena in argumentov iz response_message, da dobimo konč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"})
    
      # 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.
    

Klicanje funkcij je osrednji del večine, če ne vseh, zasnov uporabe orodij agentov, vendar je lahko implementacija iz nič včasih zahtevna. Kot smo se naučili v Lekciji 2, nam agentni okviri zagotavljajo vnaprej pripravljene gradnike za implementacijo uporabe orodij.

Primeri uporabe orodij z agentnimi okviri

Tukaj je nekaj primerov, kako lahko implementirate vzorec oblikovanja uporabe orodij z različnimi agentnimi okviri:

Semantic Kernel

Semantic Kernel je odprtokvirni AI okvir za razvijalce .NET, Python in Java, ki delajo z velikimi jezikovnimi modeli (LLM). Poenostavi proces uporabe klicanja funkcij z avtomatskim opisovanjem vaših funkcij in njihovih parametrov modelu skozi proces, imenovan serializacija. Prav tako upravlja komunikacijo med modelom in vašo kodo. Druga prednost uporabe agentnega okvira, kot je Semantic Kernel, je, da omogoča dostop do vnaprej pripravljenih orodij, kot sta Iskanje datotek in Interpreter kode.

Naslednji diagram ponazarja proces klicanja funkcij s Semantic Kernel:

klicanje funkcij

V Semantic Kernel se funkcije/orodja imenujejo Vtičniki. Funkcijo get_current_time, ki smo jo videli prej, lahko pretvorimo v vtičnik tako, da jo spremenimo v razred, ki vsebuje funkcijo. Prav tako lahko uvozimo dekorator kernel_function, ki sprejme opis funkcije. Ko nato ustvarite jedro (kernel) z vtičnikom GetCurrentTimePlugin, bo jedro samodejno serializiralo funkcijo in njene parametre ter ustvarilo shemo za pošiljanje LLM-ju.

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 novejši agentni okvir, zasnovan za omogočanje razvijalcem, da varno gradijo, uvajajo in skalirajo visokokakovostne in razširljive AI agente brez potrebe po upravljanju osnovnih računalniških in shranjevalnih virov. Posebej je uporaben za podjetniške aplikacije, saj je popolnoma upravljana storitev z varnostjo na ravni podjetja.

V primerjavi z razvojem neposredno z LLM API-jem Azure AI Agent Service ponuja nekaj prednosti, vključno z:

Orodja, ki so na voljo v Azure AI Agent Service, lahko razdelimo v dve kategoriji:

  1. Orodja za znanje:
  2. Orodja za dejanja:

Agent Service omogoča uporabo teh orodij skupaj kot toolset. Prav tako uporablja threads, ki sledijo zgodovini sporočil iz določenega pogovora.

Predstavljajte si, da ste prodajni agent v podjetju Contoso. Želite razviti pogovornega agenta, ki lahko odgovarja na vprašanja o vaših prodajnih podatkih.

Naslednja slika ponazarja, kako bi lahko uporabili Azure AI Agent Service za analizo vaših prodajnih podatkov:

Agentna storitev v akciji

Za uporabo katerega koli od teh orodij s storitvijo lahko ustvarimo odjemalca in definiramo orodje ali nabor orodij. Za praktično implementacijo lahko uporabimo naslednjo Python kodo. LLM bo lahko pogledal nabor orodij in se odločil, ali bo uporabil uporabniško ustvarjeno funkcijo fetch_sales_data_using_sqlite_query ali vnaprej pripravljeni interpreter kode, odvisno od uporabnikove zahteve.

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
)

Katere posebne vidike je treba upoštevati pri uporabi vzorca oblikovanja uporabe orodij za gradnjo zaupanja vrednih AI agentov?

Pogosta skrb pri SQL, ki ga dinamično generirajo LLM-ji, je varnost, zlasti tveganje SQL vbrizgavanja ali zlonamernih dejanj, kot je brisanje ali spreminjanje baze podatkov. Čeprav so te skrbi upravičene, jih je mogoče učinkovito omiliti z ustrezno konfiguracijo dovoljenj za dostop do baze podatkov. Za večino baz podatkov to vključuje konfiguracijo baze kot samo za branje. Za storitve baz podatkov, kot sta PostgreSQL ali Azure SQL, je treba aplikaciji dodeliti vlogo samo za branje (SELECT).

Zagon aplikacije v varnem okolju dodatno izboljša zaščito. V podjetniških scenarijih se podatki običajno izvlečejo in transformirajo iz operativnih sistemov v bazo podatkov samo za branje ali podatkovno skladišče s shemo, prijazno uporabniku. Ta pristop zagotavlja, da so podatki varni, optimizirani za zmogljivost in dostopnost, ter da ima aplikacija omejen, samo za branje dostop.

Imate še kakšna vprašanja o vzorcu oblikovanja uporabe orodij?

Pridružite se Azure AI Foundry Discord, kjer lahko spoznate druge učence, se udeležite uradnih ur in dobite odgovore na vprašanja o AI agentih.

Dodatni viri

Prejšnja lekcija

Razumevanje vzorcev agentnega oblikovanja

Naslednja lekcija

Agentni RAG


Omejitev odgovornosti:
Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco Co-op Translator. Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.