(Klõpsake ülaloleval pildil, et vaadata selle õppetunni videot)
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.
Selles õppetunnis püüame vastata järgmistele küsimustele:
Pärast selle õppetunni läbimist suudate:
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.
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:
Need ehitusplokid võimaldavad AI agendil täita mitmesuguseid ülesandeid. Vaatame peamisi elemente, mis on vajalikud tööriistade kasutamise disainimustri rakendamiseks:
Funktsiooni/tööriista skeemid: Saadaval olevate tööriistade üksikasjalikud kirjeldused, sealhulgas funktsiooni nimi, eesmärk, vajalikud parameetrid ja oodatavad väljundid. Need skeemid võimaldavad LLM-il mõista, millised tööriistad on saadaval ja kuidas koostada kehtivaid päringuid.
Funktsiooni täitmise loogika: Määrab, kuidas ja millal tööriistu kasutatakse vastavalt kasutaja kavatsusele ja vestluse kontekstile. See võib hõlmata planeerimismooduleid, suunamismehhanisme või tingimuslikke vooge, mis määravad tööriistade kasutamise dünaamiliselt.
Sõnumite haldamise süsteem: Komponendid, mis haldavad vestluse voogu kasutaja sisendite, LLM-i vastuste, tööriistakõnede ja tööriistade väljundite vahel.
Tööriistade integreerimise raamistik: Infrastruktuur, mis ühendab agendi erinevate tööriistadega, olgu need lihtsad funktsioonid või keerulised välised teenused.
Vigade käsitlemine ja valideerimine: Mehhanismid tööriistade täitmise ebaõnnestumiste käsitlemiseks, parameetrite valideerimiseks ja ootamatute vastuste haldamiseks.
Oleku haldamine: Jälgib vestluse konteksti, varasemaid tööriistade interaktsioone ja püsivaid andmeid, et tagada järjepidevus mitme pöördega interaktsioonides.
Järgmisena vaatame funktsiooni/tööriista kõnesid lähemalt.
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:
Vaatame näidet, kuidas saada praegust aega linnas:
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"
)
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')])
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.
Siin on mõned näited, kuidas saate rakendada tööriistade kasutamise disainimustrit, kasutades erinevaid agentide raamistikke:
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:
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 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:
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:
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
)
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.
Liitu Azure AI Foundry Discordiga, et kohtuda teiste õppijatega, osaleda vastuvõtutundides ja saada vastuseid oma AI Agentide küsimustele.
Agentlike disainimustrite mõistmine
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.