ai-agents-for-beginners

Πώς να Σχεδιάσετε Καλούς Πράκτορες Τεχνητής Νοημοσύνης

(Κάντε κλικ στην παραπάνω εικόνα για να δείτε το βίντεο αυτού του μαθήματος)

Σχέδιο Χρήσης Εργαλείων

Τα εργαλεία είναι ενδιαφέροντα επειδή επιτρέπουν στους πράκτορες Τεχνητής Νοημοσύνης να έχουν ευρύτερο φάσμα δυνατοτήτων. Αντί ο πράκτορας να έχει περιορισμένο σύνολο ενεργειών που μπορεί να εκτελέσει, με την προσθήκη ενός εργαλείου, ο πράκτορας μπορεί τώρα να εκτελέσει μια μεγάλη γκάμα ενεργειών. Σε αυτό το κεφάλαιο, θα εξετάσουμε το Σχέδιο Χρήσης Εργαλείων, το οποίο περιγράφει πώς οι πράκτορες ΤΝ μπορούν να χρησιμοποιούν συγκεκριμένα εργαλεία για να πετύχουν τους στόχους τους.

Εισαγωγή

Σε αυτό το μάθημα, προσπαθούμε να απαντήσουμε στις παρακάτω ερωτήσεις:

Στόχοι Μάθησης

Μετά την ολοκλήρωση αυτού του μαθήματος, θα μπορείτε να:

Τι είναι το Σχέδιο Χρήσης Εργαλείων;

Το Σχέδιο Χρήσης Εργαλείων εστιάζει στην παροχή της δυνατότητας στα LLMs να αλληλεπιδρούν με εξωτερικά εργαλεία για να πετύχουν συγκεκριμένους στόχους. Τα εργαλεία είναι κώδικας που μπορεί να εκτελεστεί από έναν πράκτορα για να εκτελέσει ενέργειες. Ένα εργαλείο μπορεί να είναι μια απλή λειτουργία όπως μια αριθμομηχανή ή μια κλήση API σε μια υπηρεσία τρίτου μέρους όπως η αναζήτηση τιμής μετοχής ή η πρόβλεψη καιρού. Στο πλαίσιο των πρακτόρων ΤΝ, τα εργαλεία έχουν σχεδιαστεί ώστε να εκτελούνται από τους πράκτορες ως απόκριση στις συναρτησιακές κλήσεις που παράγονται από το μοντέλο.

Σε ποιες περιπτώσεις χρήσης μπορεί να εφαρμοστεί;

Οι πράκτορες ΤΝ μπορούν να αξιοποιούν εργαλεία για να ολοκληρώσουν σύνθετες εργασίες, να ανακτήσουν πληροφορίες ή να λάβουν αποφάσεις. Το σχέδιο χρήσης εργαλείων χρησιμοποιείται συχνά σε σενάρια που απαιτούν δυναμική αλληλεπίδραση με εξωτερικά συστήματα, όπως βάσεις δεδομένων, διαδικτυακές υπηρεσίες ή διερμηνείς κώδικα. Αυτή η ικανότητα είναι χρήσιμη για διάφορες περιπτώσεις χρήσης όπως:

Ποια είναι τα στοιχεία/δομικά στοιχεία που απαιτούνται για την υλοποίηση του σχεδίου χρήσης εργαλείων;

Αυτά τα δομικά στοιχεία επιτρέπουν στον πράκτορα ΤΝ να εκτελεί ένα ευρύ φάσμα εργασιών. Ας δούμε τα βασικά στοιχεία που απαιτούνται για να υλοποιήσουμε το Σχέδιο Χρήσης Εργαλείων:

Ας δούμε στη συνέχεια πιο αναλυτικά την Κλήση Συνάρτησης/Εργαλείου.

Κλήση Συνάρτησης/Εργαλείου

Η κλήση συνάρτησης είναι ο βασικός τρόπος που επιτρέπουμε στα Μεγάλα Γλωσσικά Μοντέλα (LLMs) να αλληλεπιδρούν με εργαλεία. Θα δείτε συχνά τις λέξεις ‘Συνάρτηση’ και ‘Εργαλείο’ να χρησιμοποιούνται εναλλάξ, επειδή οι ‘συναρτήσεις’ (μπλοκ επαναχρησιμοποιήσιμου κώδικα) είναι τα ‘εργαλεία’ που χρησιμοποιούν οι πράκτορες για να εκτελέσουν εργασίες. Για να κληθεί ο κώδικας μιας συνάρτησης, το LLM πρέπει να συγκρίνει το αίτημα του χρήστη με την περιγραφή της συνάρτησης. Για να γίνει αυτό, αποστέλλεται στο LLM ένα σχήμα που περιέχει τις περιγραφές όλων των διαθέσιμων συναρτήσεων. Στη συνέχεια, το LLM επιλέγει την πιο κατάλληλη συνάρτηση για την εργασία και επιστρέφει το όνομά της και τα επιχειρήματά της. Η επιλεγμένη συνάρτηση καλείται, η απόκρισή της αποστέλλεται πίσω στο LLM, το οποίο χρησιμοποιεί τις πληροφορίες για να απαντήσει στο αίτημα του χρήστη.

Για να υλοποιήσετε κλήση συνάρτησης για πράκτορες, θα χρειαστείτε:

  1. Ένα μοντέλο LLM που υποστηρίζει κλήση συνάρτησης
  2. Ένα σχήμα που περιέχει τις περιγραφές των συναρτήσεων
  3. Τον κώδικα για κάθε περιγραφόμενη συνάρτηση

Ας χρησιμοποιήσουμε το παράδειγμα λήψης της τρέχουσας ώρας σε μια πόλη για να το απεικονίσουμε:

  1. Πρωτοτυποποίηση ενός 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"
     )
    
  2. Δημιουργία Σχήματος Συνάρτησης:

    Στη συνέχεια, θα ορίσουμε ένα 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')])
    
  3. Ο απαραίτητος κώδικας της συνάρτησης για την εκτέλεση της εργασίας:

    Τώρα που το 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

Το Πλαίσιο Πρακτόρων της Microsoft είναι ένα ανοιχτού κώδικα πλαίσιο ΤΝ για την κατασκευή πρακτόρων ΤΝ. Απλοποιεί τη διαδικασία χρήσης της κλήσης συνάρτησης επιτρέποντάς σας να ορίσετε εργαλεία ως συναρτήσεις Python με το διακοσμητή @tool. Το πλαίσιο διαχειρίζεται την αλληλεπίδραση μεταξύ του μοντέλου και του κώδικά σας. Επιπλέον, παρέχει πρόσβαση σε προ-κατασκευασμένα εργαλεία όπως Αναζήτηση Αρχείων και Διερμηνέα Κώδικα μέσω του AzureAIProjectAgentProvider.

Το παρακάτω διάγραμμα απεικονίζει τη διαδικασία κλήσης συνάρτησης με το Microsoft Agent Framework:

function calling

Στο 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

Η Υπηρεσία Πρακτόρων Azure AI είναι ένα νεότερο πλαίσιο πρακτόρων που σχεδιάστηκε για να δίνει τη δυνατότητα στους προγραμματιστές να κατασκευάσουν με ασφάλεια, αναπτύξουν και κλιμακώσουν πρακτόρες ΤΝ υψηλής ποιότητας και επεκτάσιμους, χωρίς την ανάγκη διαχείρισης των υποκείμενων πόρων υπολογισμού και αποθήκευσης. Είναι ιδιαίτερα χρήσιμη για επιχειρησιακές εφαρμογές καθώς αποτελεί μια πλήρως διαχειριζόμενη υπηρεσία με ασφάλεια επιπέδου επιχείρησης.

Σε σύγκριση με την ανάπτυξη απευθείας με το API LLM, η Azure AI Agent Service παρέχει ορισμένα πλεονεκτήματα, όπως:

Τα εργαλεία που είναι διαθέσιμα στην Azure AI Agent Service διαχωρίζονται σε δύο κατηγορίες:

  1. Εργαλεία Γνώσης:
  2. Εργαλεία Δράσης:

Η Υπηρεσία Πρακτόρων μας επιτρέπει να χρησιμοποιούμε αυτά τα εργαλεία μαζί ως toolset. Επίσης, χρησιμοποιεί νήματα που παρακολουθούν το ιστορικό μηνυμάτων από μια συγκεκριμένη συνομιλία.

Φανταστείτε ότι είστε πωλητής σε εταιρεία ονόματι Contoso. Θέλετε να αναπτύξετε έναν συνομιλιακό πράκτορα που να μπορεί να απαντά σε ερωτήσεις σχετικά με τα δεδομένα πωλήσεών σας.

Η παρακάτω εικόνα απεικονίζει πώς μπορείτε να χρησιμοποιήσετε την Azure AI Agent Service για να αναλύσετε τα δεδομένα πωλήσεών σας:

Agentic Service In Action

Για να χρησιμοποιήσουμε οποιοδήποτε από αυτά τα εργαλεία με την υπηρεσία, μπορούμε να δημιουργήσουμε έναν πελάτη και να ορίσουμε ένα εργαλείο ή σύνολο εργαλείων (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 για να συναντήσετε άλλους εκπαιδευόμενους, να παρακολουθήσετε ώρες γραφείου και να απαντηθούν οι ερωτήσεις σας για τους Πράκτορες ΤΝ.

Πρόσθετοι Πόροι

Προηγούμενο Μάθημα

Κατανόηση Σχεδίων Agentic

Επόμενο Μάθημα

Agentic RAG


Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.