(Κάντε κλικ στην παραπάνω εικόνα για να δείτε το βίντεο αυτού του μαθήματος)
Τα εργαλεία είναι ενδιαφέροντα επειδή επιτρέπουν στους πράκτορες Τεχνητής Νοημοσύνης να έχουν ευρύτερο φάσμα δυνατοτήτων. Αντί ο πράκτορας να έχει περιορισμένο σύνολο ενεργειών που μπορεί να εκτελέσει, με την προσθήκη ενός εργαλείου, ο πράκτορας μπορεί τώρα να εκτελέσει μια μεγάλη γκάμα ενεργειών. Σε αυτό το κεφάλαιο, θα εξετάσουμε το Σχέδιο Χρήσης Εργαλείων, το οποίο περιγράφει πώς οι πράκτορες ΤΝ μπορούν να χρησιμοποιούν συγκεκριμένα εργαλεία για να πετύχουν τους στόχους τους.
Σε αυτό το μάθημα, προσπαθούμε να απαντήσουμε στις παρακάτω ερωτήσεις:
Μετά την ολοκλήρωση αυτού του μαθήματος, θα μπορείτε να:
Το Σχέδιο Χρήσης Εργαλείων εστιάζει στην παροχή της δυνατότητας στα LLMs να αλληλεπιδρούν με εξωτερικά εργαλεία για να πετύχουν συγκεκριμένους στόχους. Τα εργαλεία είναι κώδικας που μπορεί να εκτελεστεί από έναν πράκτορα για να εκτελέσει ενέργειες. Ένα εργαλείο μπορεί να είναι μια απλή λειτουργία όπως μια αριθμομηχανή ή μια κλήση API σε μια υπηρεσία τρίτου μέρους όπως η αναζήτηση τιμής μετοχής ή η πρόβλεψη καιρού. Στο πλαίσιο των πρακτόρων ΤΝ, τα εργαλεία έχουν σχεδιαστεί ώστε να εκτελούνται από τους πράκτορες ως απόκριση στις συναρτησιακές κλήσεις που παράγονται από το μοντέλο.
Οι πράκτορες ΤΝ μπορούν να αξιοποιούν εργαλεία για να ολοκληρώσουν σύνθετες εργασίες, να ανακτήσουν πληροφορίες ή να λάβουν αποφάσεις. Το σχέδιο χρήσης εργαλείων χρησιμοποιείται συχνά σε σενάρια που απαιτούν δυναμική αλληλεπίδραση με εξωτερικά συστήματα, όπως βάσεις δεδομένων, διαδικτυακές υπηρεσίες ή διερμηνείς κώδικα. Αυτή η ικανότητα είναι χρήσιμη για διάφορες περιπτώσεις χρήσης όπως:
Αυτά τα δομικά στοιχεία επιτρέπουν στον πράκτορα ΤΝ να εκτελεί ένα ευρύ φάσμα εργασιών. Ας δούμε τα βασικά στοιχεία που απαιτούνται για να υλοποιήσουμε το Σχέδιο Χρήσης Εργαλείων:
Σχήματα Συνάρτησης/Εργαλείου: Αναλυτικοί ορισμοί διαθέσιμων εργαλείων, συμπεριλαμβανομένου του ονόματος συνάρτησης, σκοπού, απαιτούμενων παραμέτρων και αναμενόμενων εξόδων. Αυτά τα σχήματα επιτρέπουν στο LLM να κατανοήσει ποια εργαλεία είναι διαθέσιμα και πώς να κατασκευάσει έγκυρα αιτήματα.
Λογική Εκτέλεσης Συνάρτησης: Καθορίζει πώς και πότε καλούνται τα εργαλεία με βάση την πρόθεση του χρήστη και το πλαίσιο της συνομιλίας. Αυτό μπορεί να περιλαμβάνει μονάδες προγραμματισμού, μηχανισμούς δρομολόγησης ή ροές με συνθήκες που ορίζουν δυναμικά τη χρήση του εργαλείου.
Σύστημα Διαχείρισης Μηνυμάτων: Συνιστώσες που διαχειρίζονται τη ροή της συνομιλίας μεταξύ εισόδων χρήστη, αποκρίσεων LLM, κλήσεων εργαλείων και εξόδων εργαλείων.
Πλαίσιο Ενσωμάτωσης Εργαλείων: Υποδομή που συνδέει τον πράκτορα με διάφορα εργαλεία, είτε πρόκειται για απλές συναρτήσεις είτε για πολύπλοκες εξωτερικές υπηρεσίες.
Διαχείριση Σφαλμάτων & Επικύρωση: Μηχανισμοί για τη διαχείριση αποτυχιών εκτέλεσης εργαλείων, την επικύρωση παραμέτρων και τη διαχείριση απροσδόκητων αποκρίσεων.
Διαχείριση Κατάστασης: Παρακολουθεί το πλαίσιο της συνομιλίας, προηγούμενες αλληλεπιδράσεις με εργαλεία και μόνιμα δεδομένα για να εξασφαλίσει συνοχή σε πολυβηματικές αλληλεπιδράσεις.
Ας δούμε στη συνέχεια πιο αναλυτικά την Κλήση Συνάρτησης/Εργαλείου.
Η κλήση συνάρτησης είναι ο βασικός τρόπος που επιτρέπουμε στα Μεγάλα Γλωσσικά Μοντέλα (LLMs) να αλληλεπιδρούν με εργαλεία. Θα δείτε συχνά τις λέξεις ‘Συνάρτηση’ και ‘Εργαλείο’ να χρησιμοποιούνται εναλλάξ, επειδή οι ‘συναρτήσεις’ (μπλοκ επαναχρησιμοποιήσιμου κώδικα) είναι τα ‘εργαλεία’ που χρησιμοποιούν οι πράκτορες για να εκτελέσουν εργασίες. Για να κληθεί ο κώδικας μιας συνάρτησης, το LLM πρέπει να συγκρίνει το αίτημα του χρήστη με την περιγραφή της συνάρτησης. Για να γίνει αυτό, αποστέλλεται στο LLM ένα σχήμα που περιέχει τις περιγραφές όλων των διαθέσιμων συναρτήσεων. Στη συνέχεια, το LLM επιλέγει την πιο κατάλληλη συνάρτηση για την εργασία και επιστρέφει το όνομά της και τα επιχειρήματά της. Η επιλεγμένη συνάρτηση καλείται, η απόκρισή της αποστέλλεται πίσω στο LLM, το οποίο χρησιμοποιεί τις πληροφορίες για να απαντήσει στο αίτημα του χρήστη.
Για να υλοποιήσετε κλήση συνάρτησης για πράκτορες, θα χρειαστείτε:
Ας χρησιμοποιήσουμε το παράδειγμα λήψης της τρέχουσας ώρας σε μια πόλη για να το απεικονίσουμε:
Πρωτοτυποποίηση ενός LLM που υποστηρίζει κλήση συνάρτησης:
Δεν υποστηρίζουν όλα τα μοντέλα την κλήση συνάρτησης, επομένως είναι σημαντικό να ελέγξετε αν το LLM που χρησιμοποιείτε το υποστηρίζει. Το Azure OpenAI υποστηρίζει κλήση συνάρτησης. Μπορούμε να ξεκινήσουμε ξεκινώντας τον Azure OpenAI πελάτη.
# Αρχικοποιήστε τον πελάτη Azure OpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Δημιουργία Σχήματος Συνάρτησης:
Στη συνέχεια, θα ορίσουμε ένα JSON σχήμα που περιέχει το όνομα της συνάρτησης, περιγραφή του τι κάνει, καθώς και τα ονόματα και τις περιγραφές των παραμέτρων της συνάρτησης. Μετά θα δώσουμε αυτό το σχήμα στον πελάτη που δημιουργήσαμε προηγουμένως, μαζί με το αίτημα χρήστη για να βρούμε την ώρα στο Σαν Φρανσίσκο. Το σημαντικό εδώ είναι ότι επιστρέφεται μια κλήση εργαλείου, όχι η τελική απάντηση στην ερώτηση. Όπως αναφέρθηκε, το LLM επιστρέφει το όνομα της συνάρτησης που επέλεξε για την εργασία και τα επιχειρήματα που θα περαστούν σε αυτήν.
# Περιγραφή λειτουργίας για το μοντέλο να διαβάσει
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"],
},
}
}
]
# Αρχικό μήνυμα χρήστη
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# Πρώτη κλήση API: Ζητήστε από το μοντέλο να χρησιμοποιήσει τη λειτουργία
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Επεξεργαστείτε την απάντηση του μοντέλου
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')])
Ο απαραίτητος κώδικας της συνάρτησης για την εκτέλεση της εργασίας:
Τώρα που το LLM επέλεξε ποια συνάρτηση πρέπει να εκτελεστεί, ο κώδικας για την εκτέλεση της εργασίας πρέπει να υλοποιηθεί και να εκτελεστεί. Μπορούμε να υλοποιήσουμε τον κώδικα για να πάρουμε την τρέχουσα ώρα σε Python. Επίσης θα χρειαστεί να γράψουμε τον κώδικα για να εξάγουμε το όνομα και τα επιχειρήματα από το response_message για να πάρουμε το τελικό αποτέλεσμα.
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"})
# Διαχείριση κλήσεων συναρτήσεων
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.")
# Δεύτερη κλήση API: Λάβετε την τελική απάντηση από το μοντέλο
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.
Η Κλήση Συνάρτησης είναι στον πυρήνα σχεδόν κάθε σχεδίου χρήσης εργαλείου από πράκτορες, όμως η υλοποίησή της από το μηδέν μπορεί μερικές φορές να είναι προκλητική. Όπως μάθαμε στο Μάθημα 2, τα πλαίσια πρακτόρων παρέχουν προ-κατασκευασμένα δομικά στοιχεία για την υλοποίηση της χρήσης εργαλείων.
Εδώ είναι μερικά παραδείγματα για το πώς μπορείτε να υλοποιήσετε το Σχέδιο Χρήσης Εργαλείων χρησιμοποιώντας διάφορα πλαίσια πρακτόρων:
Το Πλαίσιο Πρακτόρων της Microsoft είναι ένα ανοιχτού κώδικα πλαίσιο ΤΝ για την κατασκευή πρακτόρων ΤΝ. Απλοποιεί τη διαδικασία χρήσης της κλήσης συνάρτησης επιτρέποντάς σας να ορίσετε εργαλεία ως συναρτήσεις Python με το διακοσμητή @tool. Το πλαίσιο διαχειρίζεται την αλληλεπίδραση μεταξύ του μοντέλου και του κώδικά σας. Επιπλέον, παρέχει πρόσβαση σε προ-κατασκευασμένα εργαλεία όπως Αναζήτηση Αρχείων και Διερμηνέα Κώδικα μέσω του AzureAIProjectAgentProvider.
Το παρακάτω διάγραμμα απεικονίζει τη διαδικασία κλήσης συνάρτησης με το Microsoft Agent Framework:

Στο Microsoft Agent Framework, τα εργαλεία ορίζονται ως διακοσμημένες συναρτήσεις. Μπορούμε να μετατρέψουμε τη συνάρτηση get_current_time που είδαμε νωρίτερα σε εργαλείο χρησιμοποιώντας το διακοσμητή @tool. Το πλαίσιο θα σειριοποιήσει αυτόματα τη συνάρτηση και τις παραμέτρους της, δημιουργώντας το σχήμα για να σταλεί στο LLM.
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"""
...
# Δημιουργήστε τον πελάτη
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Δημιουργήστε έναν πράκτορα και εκτελέστε με το εργαλείο
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 είναι ένα νεότερο πλαίσιο πρακτόρων που σχεδιάστηκε για να δίνει τη δυνατότητα στους προγραμματιστές να κατασκευάσουν με ασφάλεια, αναπτύξουν και κλιμακώσουν πρακτόρες ΤΝ υψηλής ποιότητας και επεκτάσιμους, χωρίς την ανάγκη διαχείρισης των υποκείμενων πόρων υπολογισμού και αποθήκευσης. Είναι ιδιαίτερα χρήσιμη για επιχειρησιακές εφαρμογές καθώς αποτελεί μια πλήρως διαχειριζόμενη υπηρεσία με ασφάλεια επιπέδου επιχείρησης.
Σε σύγκριση με την ανάπτυξη απευθείας με το API LLM, η Azure AI Agent Service παρέχει ορισμένα πλεονεκτήματα, όπως:
Τα εργαλεία που είναι διαθέσιμα στην Azure AI Agent Service διαχωρίζονται σε δύο κατηγορίες:
Η Υπηρεσία Πρακτόρων μας επιτρέπει να χρησιμοποιούμε αυτά τα εργαλεία μαζί ως toolset. Επίσης, χρησιμοποιεί νήματα που παρακολουθούν το ιστορικό μηνυμάτων από μια συγκεκριμένη συνομιλία.
Φανταστείτε ότι είστε πωλητής σε εταιρεία ονόματι Contoso. Θέλετε να αναπτύξετε έναν συνομιλιακό πράκτορα που να μπορεί να απαντά σε ερωτήσεις σχετικά με τα δεδομένα πωλήσεών σας.
Η παρακάτω εικόνα απεικονίζει πώς μπορείτε να χρησιμοποιήσετε την Azure AI Agent Service για να αναλύσετε τα δεδομένα πωλήσεών σας:

Για να χρησιμοποιήσουμε οποιοδήποτε από αυτά τα εργαλεία με την υπηρεσία, μπορούμε να δημιουργήσουμε έναν πελάτη και να ορίσουμε ένα εργαλείο ή σύνολο εργαλείων (toolset). Για να το υλοποιήσουμε πρακτικά, μπορούμε να χρησιμοποιήσουμε τον παρακάτω κώδικα Python. Το LLM θα μπορεί να κοιτάξει το toolset και να αποφασίσει αν θα χρησιμοποιήσει τη συνάρτηση που δημιούργησε ο χρήστης, fetch_sales_data_using_sqlite_query, ή τον προ-κατασκευασμένο Διερμηνέα Κώδικα, ανάλογα με το αίτημα του χρήστη.
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 που μπορεί να βρεθεί σε ένα αρχείο 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"],
)
# Αρχικοποίηση σετ εργαλείων
toolset = ToolSet()
# Αρχικοποίηση πράκτορα κλήσης συναρτήσεων με τη συνάρτηση fetch_sales_data_using_sqlite_query και προσθήκη της στο σετ εργαλείων
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Αρχικοποίηση εργαλείου 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
)
Ένα κοινό ανησυχητικό θέμα με το δυναμικά παραγόμενο SQL από τα LLMs είναι η ασφάλεια, ιδιαίτερα ο κίνδυνος SQL injection ή κακόβουλων ενεργειών, όπως η διαγραφή ή τροποποίηση της βάσης δεδομένων. Παρότι αυτές οι ανησυχίες είναι βάσιμες, μπορούν να μετριαστούν αποτελεσματικά με τη σωστή διαμόρφωση των δικαιωμάτων πρόσβασης στη βάση δεδομένων. Για τις περισσότερες βάσεις δεδομένων αυτό περιλαμβάνει τη ρύθμιση της βάσης δεδομένων ως μόνο-για-ανάγνωση. Για υπηρεσίες βάσεων δεδομένων όπως το PostgreSQL ή Azure SQL, η εφαρμογή θα πρέπει να έχει ανατεθεί με ρόλο μόνο για ανάγνωση (SELECT).
Η εκτέλεση της εφαρμογής σε ασφαλές περιβάλλον αυξάνει περαιτέρω την προστασία. Σε επιχειρησιακά σενάρια, τα δεδομένα συνήθως εξάγονται και μετασχηματίζονται από λειτουργικά συστήματα σε μια βάση δεδομένων ή αποθήκη δεδομένων μόνο για ανάγνωση με ένα φιλικό προς τον χρήστη σχήμα. Αυτή η προσέγγιση εξασφαλίζει ότι τα δεδομένα είναι ασφαλή, βελτιστοποιημένα για απόδοση και προσβασιμότητα, και ότι η εφαρμογή έχει περιορισμένη, μόνο για ανάγνωση, πρόσβαση.
Γίνετε μέλος του Microsoft Foundry Discord για να συναντήσετε άλλους εκπαιδευόμενους, να παρακολουθήσετε ώρες γραφείου και να απαντηθούν οι ερωτήσεις σας για τους Πράκτορες ΤΝ.
Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.