(Klikkaa yllä olevaa kuvaa nähdäksesi tämän oppitunnin videon)
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.
Tässä oppitunnissa pyrimme vastaamaan seuraaviin kysymyksiin:
Oppitunnin jälkeen osaat:
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.
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:
Nämä elementit mahdollistavat tekoälyagentin suorittaa monenlaisia tehtäviä. Tarkastellaan keskeisiä elementtejä, jotka tarvitaan Työkalujen käyttö -suunnittelumallin toteuttamiseen:
Funktio-/työkaluskeemat: Yksityiskohtaiset määritelmät käytettävissä olevista työkaluista, mukaan lukien funktion nimi, tarkoitus, vaaditut parametrit ja odotetut tulokset. Nämä skeemat mahdollistavat LLM:n ymmärtää, mitkä työkalut ovat käytettävissä ja kuinka rakentaa kelvollisia pyyntöjä.
Funktion suorituslogiikka: Määrittää, miten ja milloin työkaluja kutsutaan käyttäjän tarkoituksen ja keskustelukontekstin perusteella. Tämä voi sisältää suunnittelumoduuleja, reititysmekanismeja tai ehdollisia virtauksia, jotka määrittävät työkalujen käytön dynaamisesti.
Viestien käsittelyjärjestelmä: Komponentit, jotka hallitsevat keskustelun kulkua käyttäjän syötteiden, LLM:n vastausten, työkalukutsujen ja työkalutulosten välillä.
Työkalujen integrointikehys: Infrastruktuuri, joka yhdistää agentin erilaisiin työkaluihin, olivatpa ne yksinkertaisia funktioita tai monimutkaisia ulkoisia palveluita.
Virheenkäsittely ja validointi: Mekanismit työkalujen suoritusvirheiden käsittelyyn, parametrien validointiin ja odottamattomien vastausten hallintaan.
Tilanhallinta: Seuraa keskustelukontekstia, aiempia työkaluvuorovaikutuksia ja pysyvää dataa varmistaakseen johdonmukaisuuden monivaiheisissa vuorovaikutuksissa.
Seuraavaksi tarkastelemme funktio-/työkalukutsuja tarkemmin.
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:
Käytetään esimerkkinä ajan hakemista kaupungissa:
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"
)
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')])
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.
Tässä on joitakin esimerkkejä siitä, kuinka voit toteuttaa Työkalujen käyttö -suunnittelumallin eri agenttikehysten avulla:
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:
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 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:
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:
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
)
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.
Liity Azure AI Foundry Discordiin keskustellaksesi muiden oppijoiden kanssa, osallistuaksesi toimistotunteihin ja saadaksesi vastauksia AI Agents -kysymyksiisi.
Agenttisuunnittelumallien ymmärtäminen
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ä.