ai-agents-for-beginners

Kuidas kujundada häid AI agente

(Klõpsake ülaloleval pildil, et vaadata selle õppetunni videot)

Tööriistade kasutamise disainimuster

Tööriistad on huvitavad, kuna need võimaldavad AI agentidel omada laiemat võimekuste valikut. Kui agent saab kasutada tööriista, ei ole tema tegevused enam piiratud, vaid ta suudab täita mitmesuguseid ülesandeid. Selles peatükis vaatleme tööriistade kasutamise disainimustrit, mis kirjeldab, kuidas AI agendid saavad kasutada konkreetseid tööriistu oma eesmärkide saavutamiseks.

Sissejuhatus

Selles õppetunnis püüame vastata järgmistele küsimustele:

Õppeesmärgid

Pärast selle õppetunni läbimist suudate:

Mis on tööriistade kasutamise disainimuster?

Tööriistade kasutamise disainimuster keskendub sellele, et LLM-id (suured keelemudelid) saaksid suhelda väliste tööriistadega, et saavutada konkreetseid eesmärke. Tööriistad on kood, mida agent saab täita, et sooritada tegevusi. Tööriist võib olla lihtne funktsioon, näiteks kalkulaator, või API-kõne kolmanda osapoole teenusele, nagu aktsiahindade otsing või ilmaprognoos. AI agentide kontekstis on tööriistad loodud selleks, et agendid saaksid neid täita vastuseks mudeli genereeritud funktsioonikõnedele.

Millistes kasutusjuhtudes seda saab rakendada?

AI agendid saavad kasutada tööriistu keerukate ülesannete täitmiseks, teabe hankimiseks või otsuste tegemiseks. Tööriistade kasutamise disainimustrit kasutatakse sageli olukordades, mis nõuavad dünaamilist suhtlust väliste süsteemidega, nagu andmebaasid, veebiteenused või kooditõlgid. See võimekus on kasulik mitmesugustes kasutusjuhtudes, sealhulgas:

Millised elemendid/ehitusplokid on vajalikud tööriistade kasutamise disainimustri rakendamiseks?

Need ehitusplokid võimaldavad AI agendil täita mitmesuguseid ülesandeid. Vaatame peamisi elemente, mis on vajalikud tööriistade kasutamise disainimustri rakendamiseks:

Järgmisena vaatame funktsiooni/tööriista kõnesid lähemalt.

Funktsiooni/tööriista kõned

Funktsioonikõned on peamine viis, kuidas võimaldame suurte keelemudelite (LLM) suhtlemist tööriistadega. Sageli kasutatakse “funktsiooni” ja “tööriista” vaheldumisi, kuna “funktsioonid” (taaskasutatava koodi plokid) on “tööriistad”, mida agendid kasutavad ülesannete täitmiseks. Selleks, et funktsiooni kood täidetaks, peab LLM võrdlema kasutaja päringut funktsiooni kirjeldusega. Selleks saadetakse LLM-ile skeem, mis sisaldab kõigi saadaolevate funktsioonide kirjeldusi. LLM valib ülesande jaoks kõige sobivama funktsiooni ja tagastab selle nime ja argumendid. Valitud funktsioon täidetakse, selle vastus saadetakse tagasi LLM-ile, mis kasutab teavet kasutaja päringule vastamiseks.

Funktsioonikõnede rakendamiseks agentidele vajavad arendajad:

  1. LLM-i mudelit, mis toetab funktsioonikõnesid
  2. Skeemi, mis sisaldab funktsioonide kirjeldusi
  3. Koodi iga kirjeldatud funktsiooni jaoks

Vaatame näidet, kuidas saada praegust aega linnas:

  1. LLM-i, mis toetab funktsioonikõnesid, initsialiseerimine:

    Kõik mudelid ei toeta funktsioonikõnesid, seega on oluline kontrollida, kas kasutatav LLM seda teeb. Azure OpenAI toetab funktsioonikõnesid. Alustame Azure OpenAI kliendi initsialiseerimisest.

     # 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. Funktsiooni skeemi loomine:

    Järgmisena määratleme JSON-skeemi, mis sisaldab funktsiooni nime, funktsiooni eesmärgi kirjeldust ning funktsiooni parameetrite nimesid ja kirjeldusi. Seejärel edastame selle skeemi varem loodud kliendile koos kasutaja päringuga, et leida San Francisco aeg. Oluline on märkida, et tagastatakse tööriistakõne, mitte lõplik vastus küsimusele. Nagu varem mainitud, tagastab LLM ülesande jaoks valitud funktsiooni nime ja argumendid, mis sellele edastatakse.

     # 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. Funktsiooni kood, mis on vajalik ülesande täitmiseks:

    Nüüd, kui LLM on valinud, millist funktsiooni tuleb käivitada, tuleb rakendada ja täita kood, mis ülesande täidab. Saame rakendada koodi praeguse aja saamiseks Pythonis. Samuti peame kirjutama koodi, et ekstraheerida vastuse sõnumist funktsiooni nimi ja argumendid, et saada lõplik tulemus.

       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.
    

Funktsioonikõned on enamiku, kui mitte kõigi agentide tööriistade kasutamise disainide keskmes, kuid nende nullist rakendamine võib olla keeruline. Nagu õppisime õppetunnis 2, pakuvad agentide raamistikud meile eelnevalt ehitatud ehitusplokke tööriistade kasutamise rakendamiseks.

Tööriistade kasutamise näited agentide raamistikuga

Siin on mõned näited, kuidas saate rakendada tööriistade kasutamise disainimustrit, kasutades erinevaid agentide raamistikke:

Semantic Kernel

Semantic Kernel on avatud lähtekoodiga AI raamistik .NET-i, Pythoni ja Java arendajatele, kes töötavad suurte keelemudelitega (LLM). See lihtsustab funktsioonikõnede kasutamist, kirjeldades automaatselt teie funktsioone ja nende parameetreid mudelile protsessi kaudu, mida nimetatakse serialiseerimiseks. Samuti haldab see mudeli ja teie koodi vahelist suhtlust. Teine eelis agentide raamistikuna nagu Semantic Kernel on see, et see võimaldab teil kasutada eelnevalt ehitatud tööriistu, nagu Failiotsing ja Kooditõlgendaja.

Järgmine diagramm illustreerib funktsioonikõnede protsessi Semantic Kerneliga:

funktsioonikõned

Semantic Kernelis nimetatakse funktsioone/tööriistu Pluginiteks. Saame muuta varem nähtud get_current_time funktsiooni pluginaks, muutes selle klassiks, mille sees on funktsioon. Samuti saame importida kernel_function dekoratori, mis võtab funktsiooni kirjelduse. Kui loote kerneli GetCurrentTimePluginiga, serialiseerib kernel automaatselt funktsiooni ja selle parameetrid, luues skeemi, mida LLM-ile saata.

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 uuem agentide raamistik, mis on loodud selleks, et võimaldada arendajatel turvaliselt luua, juurutada ja skaleerida kvaliteetseid ning laiendatavaid AI agente, ilma et oleks vaja hallata aluseks olevaid arvutus- ja salvestusressursse. See on eriti kasulik ettevõtte rakendustes, kuna tegemist on täielikult hallatud teenusega, millel on ettevõtte tasemel turvalisus.

Võrreldes arendamisega otse LLM API-ga pakub Azure AI Agent Service mõningaid eeliseid, sealhulgas:

Azure AI Agent Service’is saadaval olevad tööriistad jagunevad kahte kategooriasse:

  1. Teadmiste tööriistad:
  2. Tegevustööriistad:

Agent Service võimaldab meil kasutada neid tööriistu koos tööriistakomplektina. Samuti kasutab see lõime, mis jälgib konkreetse vestluse sõnumite ajalugu.

Kujutage ette, et olete müügiesindaja ettevõttes nimega Contoso. Soovite arendada vestlusagenti, mis suudab vastata küsimustele teie müügiandmete kohta.

Järgmine pilt illustreerib, kuidas saaksite kasutada Azure AI Agent Service’i oma müügiandmete analüüsimiseks:

Agentiteenuse kasutamine

Nende tööriistade kasutamiseks teenusega saame luua kliendi ja määratleda tööriista või tööriistakomplekti. Selle praktiliseks rakendamiseks saame kasutada järgmist Pythoni koodi. LLM suudab vaadata tööriistakomplekti ja otsustada, kas kasutada kasutaja loodud funktsiooni fetch_sales_data_using_sqlite_query või eelnevalt ehitatud kooditõlgendajat, sõltuvalt kasutaja päringust.

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
)

Millised on erikaalutlused tööriistade kasutamise disainimustri rakendamisel usaldusväärsete AI agentide loomiseks?

LLM-ide poolt dünaamiliselt genereeritud SQL-i puhul on tavaliseks mureks turvalisus, eriti SQL-i süstimise või pahatahtlike toimingute, nagu andmebaasi kustutamine või rikkumine, risk. Kuigi need mured on õigustatud, saab neid tõhusalt leevendada, konfigureerides andmebaasi juurdepääsuõigused õigesti. Enamiku andmebaaside puhul hõlmab see andmebaasi seadistamist ainult lugemiseks. PostgreSQL-i või Azure SQL-i sarnaste andmebaasiteenuste puhul tuleks rakendusele määrata ainult lugemisõigusega (SELECT) roll. Rakenduse käitamine turvalises keskkonnas suurendab veelgi kaitset. Ettevõtete stsenaariumides ekstraheeritakse ja töödeldakse andmeid tavaliselt operatsioonisüsteemidest kirjutuskaitstud andmebaasi või andmelaosse, millel on kasutajasõbralik skeem. See lähenemine tagab, et andmed on turvalised, optimeeritud jõudluse ja juurdepääsetavuse jaoks ning et rakendusel on piiratud, ainult lugemisõigusega juurdepääs.

Kas sul on tööriista kasutamise disainimustrite kohta rohkem küsimusi?

Liitu Azure AI Foundry Discordiga, et kohtuda teiste õppijatega, osaleda vastuvõtutundides ja saada vastuseid oma AI Agentide küsimustele.

Täiendavad ressursid

Eelmine õppetund

Agentlike disainimustrite mõistmine

Järgmine õppetund

Agentlik RAG


Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.