ai-agents-for-beginners

Kuidas disainida head AI agente

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

Tööriistade kasutamise disainimuster

Tööriistad on huvitavad, kuna võimaldavad tehisintellekti agentidel omada laiemat võimekuse valikut. Selle asemel, et agendil oleks piiratud tegevuste komplekt, mida ta saab teha, saab tööriista lisamisega agent nüüd teha palju erinevaid tegevusi. Selles peatükis vaatleme tööriistade kasutamise disainimustrit, mis kirjeldab, kuidas tehisintellekti agentid saavad kasutada konkreetseid tööriistu oma eesmärkide saavutamiseks.

Sissejuhatus

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

Õpieesmärgid

Pärast selle õppetüki läbimist suudate:

Mis on tööriistade kasutamise disainimuster?

Tööriistade kasutamise disainimuster keskendub sellele, et anda LLM-idele võime suhelda väliste tööriistadega, et saavutada kindlaid eesmärke. Tööriistad on kood, mida agent saab käivitada tegevuste sooritamiseks. Tööriist võib olla lihtne funktsioon nagu kalkulaator või API kõne kolmanda osapoole teenusele, näiteks aktsiahindade otsing või ilmastikuennustus. AI agentide kontekstis on tööriistad disainitud olema täidetavad agentide poolt vastusena mudeli poolt genereeritud funktsiooni kõnedele.

Millistes kasutusjuhtumites seda saab rakendada?

AI agentidel on võimalik tööriistu kasutada keerukate ülesannete täitmiseks, teabe hankimiseks või otsuste tegemiseks. Tööriistade kasutamise disainimustrit kasutatakse sageli olukordades, kus on vaja dünaamilist suhtlust väliste süsteemidega, nagu andmebaasid, veebiteenused või koodi tõlgendajad. See võimekus on kasulik mitmesugusteks kasutusjuhtumiteks, sealhulgas:

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

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

Järgnevalt vaatleme funktsiooni/tööriista kutsumist lähemalt.

Funktsiooni/tööriista kutsumine

Funktsiooni kutsumine on peamine viis, kuidas võimaldada suurte keelemudelite (LLM) kasutamist tööriistadega suhtlemiseks. Sageli kasutatakse sõnu „funktsioon“ ja „tööriist“ vaheldumisi, sest „funktsioonid“ (taaskasutatav koodiplokk) on tööriistad, mida agendid kasutavad ülesannete täitmiseks. Selleks, et funktsiooni koodi kutsuda, peab LLM võrdlema kasutaja taotlust funktsiooni kirjeldusega. Selleks saadetakse LLM-ile skeem, mis sisaldab kirjeldusi kõigist saadaval olevatest funktsioonidest. LLM valib ülesande jaoks sobivama funktsiooni, tagastab selle nime ja argumendid. Valitud funktsioon kutsutakse välja, selle vastus saadetakse tagasi LLM-ile, kes kasutab seda informatsiooni kasutaja taotlusele vastamiseks.

Arendajatel, kes soovivad agentidele funktsiooni kutsumist rakendada, on vaja:

  1. LLM mudelit, mis toetab funktsiooni kutsumist
  2. Skeemi, mis sisaldab funktsioonide kirjeldusi
  3. Koodi iga kirjeldusega funktsiooni jaoks

Näiteks võtame kohaliku aja saamiseks linnas:

  1. Algata LLM, mis toetab funktsiooni kutsumist:

    Mitte kõik mudelid ei toeta funktsiooni kutsumist, seega on oluline kontrollida, kas kasutatav LLM seda toetab. Azure OpenAI toetab funktsiooni kutsumist. Saame alustada OpenAI kliendi initsialiseerimisest Azure OpenAI Responses API vastu (stabiilse /openai/v1/ lõpp-punkti kasutamine — api_version pole vajalik).

     # Algatage OpenAI klient Azure OpenAI jaoks (Responses API, v1 lõpp-punkt)
     client = OpenAI(
         base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('/')}/openai/v1/",
         api_key=os.environ["AZURE_OPENAI_API_KEY"],
     )
     deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT"]
    
  2. Loo funktsiooni skeem:

    Järgmiseks määratleme JSON-skeemi, mis sisaldab funktsiooni nime, selle tegevuse kirjelduse ning parameetrite nimed ja kirjeldused. Seejärel edastame selle skeemi koos kasutaja taotlusega, kes soovib teada saada aega San Franciscos. Oluline on märkida, et tagastatakse tööriista kõne, mitte lõplik vastus küsimusele. Nagu eelnevalt mainitud, tagastab LLM ülesande jaoks valitud funktsiooni nime ja argumendid.

     # Funktsiooni kirjeldus mudeli lugemiseks (Responses API flat tööriista formaat)
     tools = [
         {
             "type": "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"],
             },
         }
     ]
    
      
     # Esialgne kasutaja sõnum
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
    
     # Esimene API kõne: Palu mudelil kasutada funktsiooni
     response = client.responses.create(
         model=deployment_name,
         input=messages,
         tools=tools,
         tool_choice="auto",
         store=False,
     )
    
     # Vastuste API tagastab tööriista kõned funktsioonikõne üksustena vastuses.output.
     # Lisa need vestlusesse, et mudelil oleks järgmisel sammul täielik kontekst.
     messages += response.output
    
     print("Model's response:")
     print(response.output)
      
    
     Model's response:
     [ResponseFunctionToolCall(arguments='{"location":"San Francisco"}', call_id='call_pOsKdUlqvdyttYB67MOj434b', name='get_current_time', type='function_call')]
    
  3. Funktsiooni kood ülesande täitmiseks:

    Nüüd, kui LLM on valinud, millist funktsiooni tuleb käivitada, tuleb ülesande täitmiseks vajalik kood implementeerida ja käivitada. Saame Pythonis kirjutada koodi, mis tagastab kohaliku aja. Samuti on vaja kirjutada kood, mis ekstraheerib response_message’st funktsiooni nime 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"})
    
     # Töötle funktsioonikõnesid
     tool_calls = [item for item in response.output if item.type == "function_call"]
     if tool_calls:
         for tool_call in tool_calls:
             if tool_call.name == "get_current_time":
    
                 function_args = json.loads(tool_call.arguments)
    
                 time_response = get_current_time(
                     location=function_args.get("location")
                 )
    
                 # Tagasta tööriista tulemus funktsioonikõne väljundi elemendina
                 messages.append({
                     "type": "function_call_output",
                     "call_id": tool_call.call_id,
                     "output": time_response,
                 })
     else:
         print("No tool calls were made by the model.")
    
     # Teine API kõne: saa mudeli lõplik vastus
     final_response = client.responses.create(
         model=deployment_name,
         input=messages,
         tools=tools,
         store=False,
     )
    
     return final_response.output_text
    
       get_current_time called with location: San Francisco
       Timezone found for san francisco
       The current time in San Francisco is 09:24 AM.
    

Funktsiooni kutsumine on enamiku, kui mitte kõigi agentide tööriistade kasutamise disainide süda, kuid selle nullist realiseerimine võib olla mõnikord keeruline. Nagu õppisime Õppetükk 2 raames, pakuvad agenti raamistikes ette ehitatud ehituskive tööriistade kasutamise rakendamiseks.

Tööriistade kasutamise näited agenti raamistikuga

Siin on mõned näited, kuidas saate tööriistade kasutamise disainimustri rakendada erinevate agenti raamistikute abil:

Microsoft Agent Framework

Microsoft Agent Framework on avatud lähtekoodiga tehisintellekti raamistik AI agentide loomiseks. See lihtsustab funktsiooni kutsumise protsessi, võimaldades teil määratleda tööriistad Python funktsioonidena kasutades @tool dekoratiivfunktsiooni. Raamistik haldab mudeli ja teie koodi vahelist suhtlust. Samuti annab see ligipääsu eelnevalt ehitatud tööriistadele nagu Failiotsing ja Koodi Tõlgendaja, millele pääseb ligi FoundryChatClient kaudu.

Järgmine diagramm illustreerib funktsiooni kutsumise protsessi Microsoft Agent Framework’is:

function calling

Microsoft Agent Frameworkis määratakse tööriistad kaunistatud funktsioonidena. Saame eelmainitud get_current_time funktsiooni muuta tööriistaks, kasutades @tool dekoratiivfunktsiooni. Raamistik serialiseerib funktsiooni ja selle parameetrid automaatselt, luues skeemi, mis saadetakse LLM-ile.

import os
from agent_framework import tool
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

@tool(approval_mode="never_require")
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# Loo klient
provider = FoundryChatClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=AzureCliCredential(),
)

# Loo agent ja käivita see tööriistaga
agent = provider.as_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

Microsoft Foundry Agent Service

Microsoft Foundry Agent Service on uuem agenti raamistik, mis on loodud selleks, et võimaldada arendajatel turvaliselt luua, juurutada ja skaleerida kvaliteetseid ning laiendatavaid AI agente ilma vajaduseta hallata aluseks olevaid arvutus- ja salvestusressursse. See sobib eriti hästi ettevõtte rakendustega, kuna on täielikult hallatav teenus ettevõtte taseme turvalisusega.

Võrreldes otse LLM API kasutamisega pakub Microsoft Foundry Agent Service mitmeid eeliseid, sealhulgas:

Microsoft Foundry Agent Service’is olevad tööriistad saab jagada kahte kategooriasse:

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

Agent Service võimaldab meil neid tööriistu kasutada koos kui toolset (tööriistakomplekt). See kasutab ka lõime (threads), mis jälgivad konkreetse vestluse sõnumite ajalugu.

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

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

Agentic Service In Action

Nende tööriistade kasutamiseks teenusega saame luua kliendi ja määratleda tööriista või tööriistade komplekti. Seda praktiliselt rakendades võime kasutada järgmist Python koodi. LLM saab vaadata tööriistade komplekti ja otsustada, kas kasutada kasutaja loodud funktsiooni fetch_sales_data_using_sqlite_query või eelnevalt ehitatud Koodi Tõlgendajat vastavalt kasutaja taotlusele.

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 funktsioon, mida saab leida failist 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"],
)

# Initsialiseeri tööriistakomplekt
toolset = ToolSet()

# Initsialiseeri funktsioonide kutsumise agent koos fetch_sales_data_using_sqlite_query funktsiooniga ja lisa see tööriistakomplekti
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Initsialiseeri Koodi Tõlgendi tööriist ja lisa see tööriistakomplekti.
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-4.1-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

Millised on erilised kaalutlused tööriistade kasutamise disainimustri kasutamisel usaldusväärsete AI agentide loomiseks?

Ühine mure SQL-i dünaamilise genereerimise puhul LLM-ide poolt on turvalisus, eriti SQL süstimise või pahatahtlike tegevuste oht, nagu andmebaasi kustutamine või muutmine. Kuigi need ohud on õigustatud, saab neid efektiivselt leevendada, konfigureerides andmebaasi ligipääsu õigusi nõuetekohaselt. Enamiku andmebaaside puhul tähendab see andmebaasi seadistamist ainult lugemisõiguslikuks. Selliste teenuste nagu PostgreSQL või Azure SQL puhul peaks rakendusele määrama lugemisõigusega (SELECT) rolli.

Rakenduse käitamine turvalises keskkonnas tugevdab veelgi kaitset. Ettevõtte stsenaariumites ekstraheeritakse ja muudetakse andmeid tavaliselt operatsioonisüsteemidest lugemisõigusliku andmebaasi või andmelao jaoks kasutajasõbraliku skeemiga. See lähenemine tagab, et andmed on turvalised, optimeeritud jõudluseks ja ligipääsetavuseks ning rakendusel on piiratud, ainult lugemisõigus.

Näidiskoodid

Kas teil on rohkem küsimusi tööriistade kasutamise disainimustrite kohta?

Liituge Microsoft Foundry Discordi kogukonnaga, et kohtuda teiste õppijatega, osaleda küsimuste-tundides ja saada vastused oma AI agentide küsimustele.

Täiendavad ressursid

Selle Agendi Suitsetestimine (Valikuline)

Pärast seda, kui õpite agente juurutama Õppetükk 16, saate suitsutesti teha selle õppetüki TravelToolAgent-i jaoks (kas see ikka kasutab oma tööriistu ja vastab?) faili tests/lesson-04-smoke-tests.json abil. Vaadake, kuidas seda käivitada, failist tests/README.md.

Eelmine õppetükk

Agentse disainimustrite mõistmine

Järgmine õppetükk

Agentne RAG


Lahtiütlus: See dokument on tõlgitud kasutades AI tõlketeenust Co-op Translator. Kuigi me püüdleme täpsuse poole, palun pange tähele, et automatiseeritud tõlgetes võib esineda vigu või ebatäpsusi. Originaaldokument selle emakeeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlkega seotud eksimustest või valesti mõistmistest.