ai-agents-for-beginners

Kuinka suunnitella hyviä tekoälyagentteja

(Klikkaa yllä olevaa kuvaa nähdäksesi tämän oppitunnin videon)

Työkalujen käyttö -suunnittelumalli

Työkalut ovat mielenkiintoisia, koska ne mahdollistavat tekoälyagenttien laajemman toimintakyvyn. Sen sijaan, että agentilla olisi vain rajallinen määrä toimintoja, työkalun lisääminen antaa agentille mahdollisuuden suorittaa monenlaisia tehtäviä. Tässä luvussa tarkastelemme Työkalujen käyttö -suunnittelumallia, joka kuvaa, kuinka tekoälyagentit voivat käyttää tiettyjä työkaluja tavoitteidensa saavuttamiseksi.

Johdanto

Tässä oppitunnissa pyrimme vastaamaan seuraaviin kysymyksiin:

Oppimistavoitteet

Oppitunnin jälkeen osaat:

Mikä on Työkalujen käyttö -suunnittelumalli?

Työkalujen käyttö -suunnittelumalli keskittyy antamaan LLM:ille (suuret kielimallit) kyvyn olla vuorovaikutuksessa ulkoisten työkalujen kanssa saavuttaakseen tiettyjä tavoitteita. Työkalut ovat koodia, jonka agentti voi suorittaa toimintojen toteuttamiseksi. Työkalu voi olla yksinkertainen funktio, kuten laskin, tai API-kutsu kolmannen osapuolen palveluun, kuten osakekurssien haku tai säätiedot. Tekoälyagenttien kontekstissa työkalut on suunniteltu suoritettavaksi agenttien toimesta vastauksena mallin tuottamiin funktiokutsuihin.

Mihin käyttötapauksiin sitä voidaan soveltaa?

Tekoälyagentit voivat hyödyntää työkaluja monimutkaisten tehtävien suorittamiseen, tiedon hakemiseen tai päätöksentekoon. Työkalujen käyttö -suunnittelumallia käytetään usein tilanteissa, joissa tarvitaan dynaamista vuorovaikutusta ulkoisten järjestelmien, kuten tietokantojen, verkkopalveluiden tai koodintulkitsijoiden kanssa. Tämä kyky on hyödyllinen monissa eri käyttötapauksissa, kuten:

Mitkä ovat tarvittavat elementit/muodostavat osat työkalujen käyttö -suunnittelumallin toteuttamiseksi?

Nämä elementit mahdollistavat tekoälyagentin suorittaa monenlaisia tehtäviä. Tarkastellaan keskeisiä elementtejä, jotka tarvitaan Työkalujen käyttö -suunnittelumallin toteuttamiseen:

Seuraavaksi tarkastelemme funktio-/työkalukutsuja tarkemmin.

Funktio-/työkalukutsut

Funktiokutsut ovat ensisijainen tapa, jolla suuret kielimallit (LLM:t) voivat olla vuorovaikutuksessa työkalujen kanssa. Usein näet “Funktio” ja “Työkalu” käytettävän keskenään, koska “funktiot” (uudelleenkäytettävän koodin lohkot) ovat “työkaluja”, joita agentit käyttävät tehtävien suorittamiseen. Jotta funktion koodi voidaan kutsua, LLM:n täytyy verrata käyttäjän pyyntöä funktion kuvaukseen. Tätä varten LLM:lle lähetetään skeema, joka sisältää kaikkien käytettävissä olevien funktioiden kuvaukset. LLM valitsee tehtävään sopivimman funktion ja palauttaa sen nimen ja argumentit. Valittu funktio kutsutaan, sen vastaus lähetetään takaisin LLM:lle, joka käyttää tietoa vastatakseen käyttäjän pyyntöön.

Jotta kehittäjät voivat toteuttaa funktiokutsuja agenteille, tarvitset:

  1. LLM-mallin, joka tukee funktiokutsuja
  2. Skeeman, joka sisältää funktioiden kuvaukset
  3. Koodin jokaiselle kuvatulle funktiolle

Käytetään esimerkkinä ajan hakemista kaupungissa:

  1. Alusta LLM, joka tukee funktiokutsuja:

    Kaikki mallit eivät tue funktiokutsuja, joten on tärkeää varmistaa, että käyttämäsi LLM tukee niitä. Azure OpenAI tukee funktiokutsuja. Voimme aloittaa Azure OpenAI -asiakkaan alustamisella.

     # 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. Luo funktioskeema:

    Seuraavaksi määrittelemme JSON-skeeman, joka sisältää funktion nimen, kuvauksen funktion toiminnasta sekä funktion parametrien nimet ja kuvaukset. Tämän skeeman avulla voimme välittää sen aiemmin luodulle asiakkaalle yhdessä käyttäjän pyynnön kanssa löytää aika San Franciscossa. On tärkeää huomata, että palautettu työkalukutsu ei ole lopullinen vastaus kysymykseen. Kuten aiemmin mainittiin, LLM palauttaa funktion nimen, jonka se valitsi tehtävään, ja argumentit, jotka sille välitetään.

     # 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. Tehtävän suorittamiseen tarvittava funktiokoodi:

    Nyt kun LLM on valinnut, mikä funktio täytyy suorittaa, tehtävän suorittamiseen tarvittava koodi täytyy toteuttaa ja suorittaa. Voimme toteuttaa koodin nykyisen ajan hakemiseksi Pythonilla. Meidän täytyy myös kirjoittaa koodi, joka poimii nimen ja argumentit response_message:sta saadaksemme lopullisen tuloksen.

       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.
    

Funktiokutsut ovat keskeinen osa useimpia, ellei kaikkia agenttien työkalujen käyttöön liittyviä suunnittelumalleja, mutta niiden toteuttaminen alusta alkaen voi joskus olla haastavaa. Kuten opimme Oppitunnilla 2, agenttikehykset tarjoavat meille valmiita rakennuspalikoita työkalujen käytön toteuttamiseen.

Työkalujen käyttöesimerkkejä agenttikehysten avulla

Tässä on joitakin esimerkkejä siitä, kuinka voit toteuttaa Työkalujen käyttö -suunnittelumallin eri agenttikehysten avulla:

Semantic Kernel

Semantic Kernel on avoimen lähdekoodin tekoälykehys .NET-, Python- ja Java-kehittäjille, jotka työskentelevät suurten kielimallien (LLM) kanssa. Se yksinkertaistaa funktiokutsujen käyttöä kuvaamalla automaattisesti funktiosi ja niiden parametrit mallille prosessin kautta, jota kutsutaan serialisoinniksi. Se myös hallitsee mallin ja koodisi välistä viestintää. Toinen etu agenttikehyksen, kuten Semantic Kernelin, käytössä on, että se mahdollistaa pääsyn valmiisiin työkaluihin, kuten Tiedostohaku ja Koodintulkitsija.

Seuraava kaavio havainnollistaa funktiokutsujen prosessia Semantic Kernelin avulla:

funktiokutsut

Semantic Kernelissä funktioita/työkaluja kutsutaan Plugineiksi. Voimme muuntaa aiemmin näkemämme get_current_time-funktion pluginiksi muuttamalla sen luokaksi, jossa funktio sijaitsee. Voimme myös tuoda kernel_function-koristelijan, joka ottaa funktion kuvauksen. Kun luot ytimen GetCurrentTimePluginin kanssa, ydin serialisoi automaattisesti funktion ja sen parametrit, luoden skeeman, joka lähetetään LLM:lle prosessin aikana.

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 on uudempi agenttikehys, joka on suunniteltu antamaan kehittäjille mahdollisuus rakentaa, ottaa käyttöön ja laajentaa korkealaatuisia ja laajennettavia tekoälyagentteja turvallisesti ilman, että heidän tarvitsee hallita taustalla olevia laskenta- ja tallennusresursseja. Se on erityisen hyödyllinen yrityssovelluksissa, koska se on täysin hallinnoitu palvelu yritystason turvallisuudella.

Kun verrataan suoraan LLM-API:n käyttöön, Azure AI Agent Service tarjoaa joitakin etuja, kuten:

Azure AI Agent Servicen käytettävissä olevat työkalut voidaan jakaa kahteen kategoriaan:

  1. Tietotyökalut:
  2. Toimintatyökalut:

Agent Service mahdollistaa näiden työkalujen käytön yhdessä toolset-kokonaisuutena. Se hyödyntää myös threads-säikeitä, jotka pitävät kirjaa tietyn keskustelun viestihistoriasta.

Kuvittele, että olet myyntiedustaja yrityksessä nimeltä Contoso. Haluat kehittää keskusteluagentin, joka voi vastata kysymyksiin myyntidatastasi.

Seuraava kuva havainnollistaa, kuinka voisit käyttää Azure AI Agent Serviceä myyntidatan analysointiin:

Agenttikehys toiminnassa

Jotta voisit käyttää mitä tahansa näistä työkaluista palvelun kanssa, voit luoda asiakkaan ja määritellä työkalun tai työkalukokonaisuuden. Käytännön toteutuksessa voimme käyttää seuraavaa Python-koodia. LLM pystyy tarkastelemaan työkalukokonaisuutta ja päättämään, käytetäänkö käyttäjän luomaa funktiota, fetch_sales_data_using_sqlite_query, vai valmiiksi rakennettua Koodintulkitsijaa käyttäjän pyynnön perusteella.

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
)

Mitä erityisiä huomioita liittyy Työkalujen käyttö -suunnittelumallin käyttöön luotettavien tekoälyagenttien rakentamisessa?

LLM:ien dynaamisesti generoituun SQL:ään liittyvä yleinen huolenaihe on turvallisuus, erityisesti SQL-injektion tai haitallisten toimien, kuten tietokannan pudottamisen tai manipuloinnin, riski. Vaikka nämä huolenaiheet ovat perusteltuja, ne voidaan tehokkaasti lieventää määrittämällä tietokannan käyttöoikeudet asianmukaisesti. Useimmille tietokannoille tämä tarkoittaa tietokannan määrittämistä vain lukuoikeudella. Tietokantapalveluissa, kuten PostgreSQL tai Azure SQL, sovellukselle tulisi antaa vain lukuoikeus (SELECT). Sovelluksen suorittaminen turvallisessa ympäristössä parantaa suojausta entisestään. Yrityskäytännöissä data yleensä kerätään ja muokataan operatiivisista järjestelmistä luettavaksi tietokannaksi tai tietovarastoksi, jossa on käyttäjäystävällinen skeema. Tämä lähestymistapa varmistaa, että data on turvallista, optimoitu suorituskyvyn ja saavutettavuuden kannalta, ja että sovelluksella on rajoitettu, vain lukuoikeus.

Onko sinulla lisää kysymyksiä työkalujen käyttöön liittyvistä suunnittelumalleista?

Liity Azure AI Foundry Discordiin keskustellaksesi muiden oppijoiden kanssa, osallistuaksesi toimistotunteihin ja saadaksesi vastauksia AI Agents -kysymyksiisi.

Lisäresurssit

Edellinen oppitunti

Agenttisuunnittelumallien ymmärtäminen

Seuraava oppitunti

Agentic RAG


Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.