(Klõpsake ülaloleval pildil, et vaadata selle õppetunni videot)
Tööriistad on huvitavad, sest need võimaldavad AI-agentidel omada laiemat võimekust. Selle asemel, et agentil oleks piiratud hulk toiminguid, mida ta saab teha, võimaldab tööriista lisamine agendil nüüd sooritada palju erinevaid toiminguid. Selles peatükis vaatleme Tool Use Design Patterni ehk tööriistade kasutamise disainimustrit, mis kirjeldab, kuidas AI-agentid 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:
The Tool Use Design Pattern keskendub LLM-idele võime andmisele suhelda väliste tööriistadega konkreetsete eesmärkide saavutamiseks. Tööriistad on kood, mida agent saab täitmiseks kasutada toimingute sooritamiseks. Tööriist võib olla lihtne funktsioon nagu kalkulaator või kolmanda osapoole teenuse API-kõne, näiteks aktsiahindade päring või ilmaprognoos. AI-agentite kontekstis on tööriistad loodud olema täidetavad agentide poolt vastuseks model-generated function calls.
AI-agentid saavad 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 kooditõlgid. See võime on kasulik mitmesuguste kasutusjuhtude jaoks, sealhulgas:
Need ehitusplokid võimaldavad AI-agendil sooritada laia valikut ülesandeid. Vaatame peamisi elemente, mis on vajalikud Tool Use Design Patterni rakendamiseks:
Funktsioonide/tööriistade skeemid: Üksikasjalikud definitsioonid saadaolevatest tööriistadest, sealhulgas funktsiooni nimi, eesmärk, vajalikud parameetrid ja eeldatavad 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: Reguleerib, kuidas ja millal tööriistu kutsutakse vastavalt kasutaja kavatsusele ja vestluse kontekstile. See võib hõlmata planeerija mooduleid, marsruutimismehhanisme või tingimuslikke vooge, mis määravad tööriistade kasutuse dünaamiliselt.
Sõnumite käsitlemise süsteem: Komponendid, mis haldavad konversatsiooni voogu kasutaja sisendite, LLM-vastuste, tööriistakõnede ja tööriistade väljundite vahel.
Tööriistade integreerimise raamistik: Taristu, mis ühendab agendi erinevate tööriistadega, olgu need siis lihtsad funktsioonid või keerukad välisteenused.
Veahaldus ja valideerimine: Mehhanismid tööriista täitmise ebaõnnestumiste käsitlemiseks, parameetrite valideerimiseks ja ootamatute vastuste haldamiseks.
Oleku haldus: Jälgib vestluse konteksti, varasemaid tööriistainteresse ja püsivaid andmeid, et tagada järjepidevus mitmevoorulistes interaktsioonides.
Järgmisena vaatame funktsiooni/tööriista kutsumist üksikasjalikumalt.
Funktsioonide kutsumine on peamine viis, kuidas võimaldame Large Language Modelitel (LLM-idel) suhelda tööriistadega. Tihti kasutatakse sõnu ‘Function’ ja ‘Tool’ vaheldumisi, sest ‘funktsioonid’ (taaskasutatava koodi plokid) on ‘tööriistad’, mida agendid kasutavad ülesannete täitmiseks. Selleks, et funktsiooni kood saaks kutsutud, peab LLM võrdlema kasutaja päringut funktsioonide kirjeldusega. Selleks saadetakse LLM-ile skeem, mis sisaldab kõigi saadaolevate funktsioonide kirjeldusi. LLM valib seejärel ülesande jaoks kõige sobivama funktsiooni ja tagastab selle nime ning argumendid. Valitud funktsioon kutsutakse ära, selle vastus saadetakse tagasi LLM-ile, kes kasutab seda teavet kasutaja päringule vastamiseks.
Arendajatel, kes soovivad agentidele funktsioonikõnede rakendamist, on vaja:
Vaatame näidet, kuidas saada praegust aega linnas, et illustreerida:
Algata LLM, mis toetab funktsioonikõnesid:
Mitte kõik mudelid ei toeta funktsioonikõnesid, seega on oluline kontrollida, kas kasutatav LLM seda teeb. Azure OpenAI toetab funktsioonikõnesid. Saame alustada, initsieerides Azure OpenAI kliendi.
# Initsialiseeri Azure OpenAI klient
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Loo funktsiooni skeem:
Järgmisena määratleme JSON-skeemi, mis sisaldab funktsiooni nime, kirjeldust, mida funktsioon teeb, ning funktsiooni parameetrite nimesid ja kirjeldusi. Seejärel edastame selle skeemi varem loodud kliendile koos kasutaja päringuga, kus ta tahab teada kellaaja San Franciscos. Oluline on märkida, et tagastatakse tööriistakutse, mitte lõplik vastus küsimusele. Nagu eelpool mainitud, tagastab LLM valitud funktsiooni nime ja argumendid, mis talle edastatakse.
# Funktsiooni kirjeldus mudeli lugemiseks
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"],
},
}
}
]
# Algne 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.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Töötle mudeli vastust
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 on vaja käivitada, tuleb realiseerida ja käivitada kood, mis ülesande täidab. Saame Pythonis rakendada koodi, mis hangib praeguse kellaaja. Samuti peame kirjutama koodi, mis ekstraheerib response_message’st 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"})
# Käsitle funktsioonikõnesid
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.")
# Teine API-kõne: Hangi mudelilt lõplik vastus
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õne on enamikus, kui mitte kõikides agentide tööriistakasutuse disainides keskmes, kuid selle nullist rakendamine võib mõnikord olla keeruline. Nagu õppisime Lesson 2 osas, pakuvad agentse raamistikud meile eelnevalt ehitatud ehitusplokke tööriistakasutuse rakendamiseks.
Siin on mõned näited sellest, kuidas saate tööriistade kasutamise disainimustrit rakendada erinevate agentsete raamistikuga:
Microsoft Agent Framework on avatud lähtekoodiga AI-raamistik AI-agentide ehitamiseks. See lihtsustab funktsioonikõnede kasutamist, võimaldades teil määratleda tööriistad Python-funktsioonidena, kasutades dekoratsiooni @tool. Raamistik haldab mudeli ja teie koodi vahelist kahepoolset suhtlust. Samuti annab see juurdepääsu eelnevalt ehitatud tööriistadele nagu File Search ja Code Interpreter kaudu AzureAIProjectAgentProvider.
Järgmine diagramm illustreerib funktsioonikõnede protsessi Microsoft Agent Frameworkiga:

Microsoft Agent Frameworkis määratletakse tööriistad dekoreeritud funktsioonidena. Saame teisendada varem näidatud get_current_time funktsiooni tööriistaks, kasutades dekoratsiooni @tool. Raamistik serialiseerib automaatselt funktsiooni ja selle parameetrid, luues skeemi, mida saata LLM-ile.
from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
@tool
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# Loo klient
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Loo agent ja käivita see tööriistaga
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
Azure AI Agent Service on uuem agentse raamistik, mis on loodud arendajate võimestamiseks turvaliselt ehitada, juurutada ja skaleerida kvaliteetseid ning laiendatavaid AI-agente, ilma et peaks hallama aluseks olevaid arvutus- ja salvestusressursse. See on eriti kasulik ettevõtete rakendustes, kuna tegemist on täielikult hallatud teenusega ettevõttekvaliteediga turvalisusega.
Võrreldes arendamisega otse LLM API-ga annab Azure AI Agent Service mõningaid eeliseid, sealhulgas:
Azure AI Agent Service’is saadaval olevad tööriistad jagunevad kaheks kategooriaks:
Agent Service võimaldab meil kasutada neid tööriistu koos kui toolseti. Lisaks kasutab see threadsi, mis jälgivad konkreetse vestluse sõnumite ajalugu.
Kujutage ette, et olete müügiesindaja ettevõttes nimega Contoso. Soovite arendada vestlusagenti, mis suudab vastata teie müügiandmete kohta esitatud küsimustele.
Järgmine pilt illustreerib, kuidas võiksite 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 toolseti. Praktiliseks rakendamiseks võime kasutada järgmist Python-koodi. LLM suudab vaadata toolset’i ja otsustada, kas kasutada kasutaja loodud funktsiooni fetch_sales_data_using_sqlite_query või eelnevalt ehitatud Code Interpreterit, 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 funktsioon, mida leidub failis 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 funktsiooni kutsuv agent 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 Code Interpreter tööriist ja lisa see tööriistakomplekti
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
Üks levinud mure dünaamiliselt LLM-ide genereeritud SQL-i puhul on turvalisus, eriti SQL-süstimise või pahatahtlike tegevuste risk, nagu andmebaasi kustutamine või manipuleerimine. Kuigi need mured on õigustatud, saab neid tõhusalt leevendada andmebaasi juurdepääsulubade nõuetekohase seadistamisega. Enamikus andmebaasides tähendab see andmebaasi seadistamist ainult lugemisõigusega. Selliste andmebaasiteenuste nagu PostgreSQL või Azure SQL puhul tuleks rakendusele määrata ainult lugemisõigus (SELECT).
Rakenduse käitamine turvalises keskkonnas suurendab kaitset veelgi. Ettevõtte stsenaariumites ekstraheeritakse ja muudetakse andmed tavaliselt operatsioonisüsteemidest eraldatud ainult-lugemis andmebaasi või andmehoidlasse kasutajasõbraliku skeemiga. See lähenemine tagab, et andmed on turvalised, optimeeritud jõudluse ja ligipääsetavuse jaoks ning et rakendusel on piiratud, ainult-lugemise juurdepääs.
Liituge Microsoft Foundry Discord kanaliga, et kohtuda teiste õppuritega, osaleda tundi aegadel (office hours) ja saada vastuseid oma AI Agents küsimustele.
Agentse disaini mustrite mõistmine
Vastutusest loobumine: See dokument on tõlgitud tehisintellekti tõlketeenuse Co-op Translator (https://github.com/Azure/co-op-translator) abil. Kuigi me püüame olla täpsed, pidage meeles, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Originaaldokumenti selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitatakse kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste ega valesti tõlgendamise eest.