Πώς να Δημιουργήσετε Παράλληλα Εργασιακά Ροήματα με Python | Οδηγός Βήμα-Βήμα


Εισαγωγή

Τα μεγάλα γλωσσικά μοντέλα μπορεί να είναι δύσκολα στη χρήση σε ένα περιβάλλον παραγωγής, επειδή μπορούν να παρουσιάσουν ανακρίβειες, ασυνέπειες και καθυστέρηση. Καθώς τα μοντέλα γίνονται μεγαλύτερα και πιο ικανά, είναι δελεαστικό να περιλαμβάνεται περισσότερα συμφραζόμενα και πιο σύνθετες οδηγίες σε κάθε εντολή, με την ελπίδα ότι το μοντέλο θα μπορέσει να τα διαχειριστεί, αλλά με μία μόνο εντολή συστήματος χρησιμοποιώντας ένα σχετικά μεγάλο μοντέλο, η καθυστέρηση μπορεί να κυμαίνεται από 3 έως 15 δευτερόλεπτα. Εάν δημιουργείτε έναν πράκτορα που απαιτεί άμεση αντίδραση, όπως ένα bot για τηλεφωνική συνομιλία, αυτό είναι πολύ μεγάλο διάστημα για να κάνει παύση ο πράκτορας.

Μια επιλογή με χαμηλότερη καθυστέρηση είναι να χωρίσετε την εργασία σε μικρότερες εργασίες και να αφήσετε τις ροές εργασίας του LLM σας να διαχειρίζονται κάθε κομμάτι ταυτόχρονα, καθιστώντας πιο εύκολη τη σωστή διαχείριση από τα μικρότερα μοντέλα. Αυτό θα σας επιτρέψει να βελτιώσετε δραστικά την καθυστέρηση σας και, σε πολλές περιπτώσεις, το κόστος σας.

Υπάρχουν μερικοί διαφορετικοί τρόποι για να εκτελούνται οι πρακτικές εργασίες παράλληλα, αλλά σε πολλές πρακτικές εργασίες, το κύριο σημείο συμφόρησης είναι η κλήση προς το LLM. Μπορείτε να μειώσετε αυτό το σημείο συμφόρησης κάνοντας πολλαπλές, ταυτόχρονες κλήσεις προς τα LLM API χρησιμοποιώντας τις βιβλιοθήκες asyncio και aiohttp της Python.

Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε την Python για να δημιουργήσετε πρακτικά ροές εργασίας που κάνουν πολλαπλές κλήσεις LLM ασύγχρονα. Αυτό θα σας επιτρέψει να δημιουργήσετε ταχύτερες και πιο ακριβείς εφαρμογές LLM που μπορούν να αναπτυχθούν σε ένα Droplet ή σε μια serverless περίπτωση ως σημείο τερματισμού API.

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

Κύρια Συμπεράσματα

  • Η χρήση ασύγχρονων κλήσεων σε μικρά, γρήγορα μοντέλα μπορεί να σας βοηθήσει να δημιουργήσετε αποτελεσματικές ροές εργασίας με χαμηλή καθυστέρηση για εφαρμογές που απαιτούν άμεση ανταπόκριση.
  • Οι ροές εργασίας με πολλαπλά μοντέλα σας επιτρέπουν να προσαρμόζετε κάθε προτροπή για διαφορετικό μοντέλο, μειώνοντας τις συνολικές ανάγκες σε υπολογιστική ισχύ και μειώνοντας το κόστος για αυτοδιαχείριση μοντέλων LLM και χρήση τρίτων API

Προαπαιτούμενα

Για να ολοκληρώσετε αυτό το σεμινάριο, θα χρειαστείτε:

  • Ένα τοπικό περιβάλλον ανάπτυξης για Python 3.
  • Πρόσβαση σε ένα API LLM. Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το μοντέλο Mistral-Small-3.2-24B που αναπτύχθηκε σε ένα GPU Droplet χρησιμοποιώντας το vLLM. Μπορείτε να ρυθμίσετε ένα GPU Droplet χρησιμοποιώντας το vLLM για να παρέχετε ένα μοντέλο ακολουθώντας τον οδηγό Πώς να Εκτελέσετε GPT-OSS και vLLM σε ένα GPU Droplet με AMD και ROCm.
  • Εξοικείωση με τη σύνταξη async/await της Python (προαιρετικό αλλά χρήσιμο).

Βήμα 1 — Ρύθμιση του Περιβάλλοντός σας

Πρώτα, ρυθμίστε το περιβάλλον σας και εγκαταστήστε τις εξαρτήσεις σας. Σε αυτό το σεμινάριο, θα γίνονται κλήσεις σε ένα μοντέλο Mistral-Small-3.2-24B που έχει αναπτυχθεί σε μια GPU Droplet H200, αλλά θα χρειαστεί είτε να κάνετε κλήσεις στο δικό σας αναπτυγμένο μοντέλο είτε σε ένα API LLM τρίτου μέρους. Αυτό το σεμινάριο κάνει κλήσεις μόνο σε ένα LLM, αλλά θα μπορείτε να χρησιμοποιήσετε διαφορετικό μοντέλο από διαφορετικούς παρόχους για κάθε prompt αν θέλετε.

Δημιουργήστε ένα εικονικό περιβάλλον και εγκαταστήστε τις απαιτούμενες εξαρτήσεις:

python3 -m venv venv
source venv/bin/activate
pip install aiohttp

Θα κάνετε τις κλήσεις του μοντέλου σας ασύγχρονα, οπότε θα χρειαστεί να δημιουργήσετε ορισμένες ασύγχρονες συναρτήσεις που μπορούν να διαχειριστούν αυτές τις κλήσεις. Θα χρησιμοποιήσετε τις βιβλιοθήκες asyncio και aiohttp στην Python. Εάν χρησιμοποιείτε διαφορετικό API LLM, θα χρειαστεί να εγκαταστήσετε τον πελάτη τους για να διαχειριστείτε τις κλήσεις στο endpoint τους.

Δημιουργήστε ένα νέο αρχείο με όνομα agentic_workflows.py και προσθέστε τον ακόλουθο κώδικα για να εισαγάγετε τις απαραίτητες εξαρτήσεις και να ορίσετε το σημείο πρόσβασης της API.

Αντικαταστήστε το your_server_ip με τη διεύθυνση IP του GPU Droplet σας ή ορίστε τον πελάτη για το API του LLM σας:

import asyncio
import aiohttp

# Your droplet's vLLM server URL
VLLM_SERVER_URL = "http://your_server_ip:8000/v1/chat/completions"

Βήμα 2 — Γράφοντας τη Λογική της Ασύγχρονης Κλήσης

Θέλετε οι ασύγχρονες κλήσεις σας να μπορούν να πάρουν μια λίστα από λεξικά που το καθένα να περιέχει το αναγνωριστικό του μοντέλου και την εντολή (prompt) που θέλετε να στείλετε στο LLM, και να τα στείλουν όλα χωρίς να περιμένουν την ατομική απάντηση κάθε κλήσης. Η εντολή θα περιλαμβάνει το ιστορικό συνομιλίας και την εντολή συστήματος για την συγκεκριμένη κλήση. Θα προσθέσετε μια συγχρονική συνάρτηση call_models που μπορεί να εισαχθεί και να κληθεί στο κύριο script σας.

Προσθέστε τις ακόλουθες ασύγχρονες συναρτήσεις στο agentic_workflows.py:

async def _call_single_model(call_spec):
    """Make an async call to the Digital Ocean GPU droplet with a given model and messages"""
    model_id = call_spec["model_id"]
    messages = call_spec["messages"]
    
    payload = {
        "model": model_id,
        "messages": messages,
        "max_tokens": 100, 
        "temperature": 0.1 
    }
    
    async with aiohttp.ClientSession() as session:
        async with session.post(VLLM_SERVER_URL, json=payload) as response:
            result = await response.json()
            
            message = result["choices"][0]["message"]["content"]
            return message

async def _call_models_async(call_list):
    """Call multiple models asynchronously and return responses in the same order"""
    # Create tasks for all model calls
    tasks = [_call_single_model(call_spec) for call_spec in call_list]
    
    # Run all tasks concurrently and return responses in order
    responses = await asyncio.gather(*tasks)
    return responses

def call_models(call_list):
    return asyncio.run(_call_models_async(call_list))

Η μέθοδος aiohttp.ClientSession() δημιουργεί μια ασύγχρονη συνεδρία πελάτη που στέλνει αιτήματα POST στο τελικό σημείο API και χειρίζεται την απάντηση HTTP ασύγχρονα. Αυτό επιτρέπει την εκτέλεση πολλαπλών κλήσεων API LLM ταυτόχρονα αντί διαδοχικά.

Η συνάρτηση _call_models_async() συγκεντρώνει όλες τις λεπτομέρειες πολλαπλών αιτημάτων που παρέχουμε και κάνει όλες τις κλήσεις API χωρίς να περιμένει κάθε απάντηση. Στη συνέχεια, καθώς οι απαντήσεις επιστρέφουν, τις προσθέτει σε μια λίστα με την ίδια σειρά που εστάλησαν. Η συνάρτηση call_models() είναι μια συγχρονισμένη συνάρτηση που κάνει τις ασύγχρονες κλήσεις πιο εύκολες στην εκτέλεση.

Βήμα 3 — Γράφοντας τα Προτροπές σας

Τώρα που έχετε γράψει τη βασική λειτουργικότητα για να κάνετε ασύγχρονες κλήσεις σε ένα API endpoint, πρέπει να γράψετε τα prompts σας. Θα έχετε τρία ξεχωριστά συστήματα prompts. Ένα θα βοηθά σε ερωτήσεις σχετικά με τιμές, ένα άλλο με τον προγραμματισμό, και ένα τρίτο με την αναγνώριση άλλων ερωτήσεων για καταχωρίσεις και την προώθησή τους σε έναν ανθρώπινο εκπρόσωπο. Μπορείτε να προσθέσετε περισσότερα, συμπεριλαμβανομένων κάποιων με μεγαλύτερη αυτονομία στη λήψη αποφάσεων, αλλά αυτά τα τρία θα λειτουργήσουν προς το παρόν.

SYSTEM_PROMPT_CONFIGURATIONS = {
    "pricing_prompt": {
        "model_id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", 
        "prompt": "You are a customer service agent. Determine if the user's most recent request is asking about the price of a listing. If they are asking about the price of a listing AND if they have included the listing_id, return only the listing_id of the item they are asking about in the following format: 'listing_id: XXXXXX'. \nIf they are asking about the pricing of a listing AND did NOT mention the specific listing_id number, ask them for the listing id number. If they are requesting something other than the price of a listing: return only the word 'false'."
    },
    "scheduling_prompt": {
        "model_id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", 
        "prompt": "You are a customer service agent. Determine if the user's most recent request is asking to schedule a call with a real estate agent. If they are trying to schedule a call, return the date and time they would like to schedule the call in the following format: 'date: YYYY-MM-DD, time: HH:MM'. If they are trying to schedule a call but they did not mention the specific date and time they are available, ask them what day and time they are available. Do not provide any additional information, such as the agent's availability. If they are not asking to schedule a call, return only the word 'false'." 
    }, 
    "listing_prompt": {
        "model_id": "mistralai/Mistral-Small-3.2-24B-Instruct-2506", 
        "prompt": "You are a customer service agent. Determine if the user is asking a question about a listing. If they are asking a question about a listing, return only the word 'true'. Otherwise, return only the word 'false'."
    }
}

Σε αυτές τις ρυθμίσεις προτροπής συστήματος, θα συμπεριλάβετε τον τίτλο της προτροπής για μελλοντική αναφορά, το αναγνωριστικό μοντέλου στο οποίο στέλνετε αυτήν την προτροπή και τη διατύπωση της ίδιας της προτροπής συστήματος στην οποία θα επισυνάπτεται το ιστορικό της συνομιλίας.

Βήμα 4 — Επεξεργασία Εισόδου Χρήστη Μέσω των Μοντέλων

Τώρα χρειάζεται να δημιουργήσετε μια συνάρτηση που μπορεί να πάρει τη συνομιλία του χρήστη, να προσθέσει σε αυτή κάθε προτροπή του συστήματος και να κάνει τις ασύγχρονες κλήσεις σας στο σωστό μοντέλο για κάθε προτροπή χρησιμοποιώντας τη συνάρτηση call_models() που γράψατε παραπάνω. Αυτό το παράδειγμα υποθέτει ότι το ιστορικό της συνομιλίας αποθηκεύεται στο front-end με την ίδια μορφή που δέχεται το API μας και αποστέλλεται μαζί με την πιο πρόσφατη είσοδο του χρήστη.

Προσθέστε την ακόλουθη συνάρτηση στο agentic_workflows.py:

def run_agentic_workflow(conversation_history):
    model_calls_list = []
    prompt_names = []  # Keep track of prompt order for response mapping
    
    for prompt_name, config in SYSTEM_PROMPT_CONFIGURATIONS.items():
        model_id = config["model_id"]
        system_prompt = config["prompt"]
        
        # Construct the full message prompt: system prompt + conversation history
        full_messages = [{"role": "system", "content": system_prompt}] + conversation_history
        
        model_calls_list.append({
            "model_id": model_id,
            "messages": full_messages
        })
        prompt_names.append(prompt_name) 
    
    prompt_responses = call_models(model_calls_list)

Αυτή η συνάρτηση δημιουργεί μια λίστα από αντικείμενα λεξικού για κάθε προτροπή συστήματος που περιλαμβάνει το αναγνωριστικό του μοντέλου και την προτροπή συστήματος + το ιστορικό συνομιλίας. Στη συνέχεια, καλεί τις ασύγχρονες συναρτήσεις για να καλέσει κάθε μοντέλο για κάθε προτροπή συστήματος χρησιμοποιώντας τη συνάρτηση call_models().

Αφού καλέσετε τα μοντέλα, οι απαντήσεις λαμβάνονται και αποθηκεύονται στη μεταβλητή prompt_responses με την ίδια σειρά που στάλθηκαν, οπότε χρειάζεται να εκχωρήσετε νέες μεταβλητές με τις πραγματικές απαντήσεις από τα μοντέλα.

Συνεχίστε να προσθέτετε στη λειτουργία run_agentic_workflow:

    # Map responses to their respective prompts
    pricing_response = prompt_responses[prompt_names.index("pricing_prompt")]
    scheduling_response = prompt_responses[prompt_names.index("scheduling_prompt")]
    listing_response = prompt_responses[prompt_names.index("listing_prompt")]

Βήμα 5 — Ορισμός της Λογικής

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

Συνεχίστε να προσθέτετε στη συνάρτηση run_agentic_workflow στο agentic_workflows.py:

    # Route 1: Handle pricing inquiries
    if pricing_response.lower() != "false":
        if pricing_response.startswith("listing_id:"):
            # Extract listing ID from response
            listing_id = pricing_response.split("listing_id: ")[1].strip()
            
            # Simulate database/API lookup
            # You can add database querying logic here to look for a target listing ID. For our example, we will use a simple Python dictionary
            example_price_database = {
                "123456": "$350,000",
                "654321": "$450,000", 
                "112233": "$550,000"
            }
            
            found_price = example_price_database.get(listing_id)
            if found_price:
                final_response = f"The price for listing {listing_id} is {found_price}."
            else:
                final_response = "We are unable to find that listing ID in our records. Are you sure you have the correct listing ID?"
        else:
            final_response = pricing_response  # Response asking for listing ID
    
    # Route 2: Handle scheduling requests
    elif scheduling_response.lower() != "false":
        if scheduling_response.startswith("date:"):
            final_response = f"Perfect! I've scheduled a call for you on that date and time. A sales representative will reach out to you at that time."
            # In production: Add logic to actually book the appointment, and consider customizing the message to confirm the date and time selected.
        else:
            final_response = scheduling_response  # Response asking for specific time
    
    # Route 3: Handle general listing questions  
    elif listing_response.lower() != "false":
        final_response = "Please hold while I transfer you to a specialist for further assistance."
        # In production: Add logic to transfer chat to human representative
        # You could alternatively add logic to access listing details and answer the user's specific question

    else:
        final_response = "I apologize, I'm not sure how I can help with that. Let me transfer you to a human representative who can better assist you."
        # In production: Add logic to transfer chat to human representative
    
    return final_response

Βήμα 6 — Δοκιμή της ροής εργασίας σας

Τώρα που έχετε γράψει τον κώδικα για ένα βασικό πρακτορικό workflow που χειρίζεται τρεις κατηγορίες ερωτήσεων, θα το δοκιμάσετε με μια συνομιλία σχετικά με την τιμή μιας αγγελίας. Σε αυτή τη συνομιλία, ο χρήστης δεν δίνει τον αριθμό ταυτότητας της αγγελίας στην αρχική του ερώτηση, και το μοντέλο απαντά με μια επακόλουθη ερώτηση ζητώντας τον αριθμό αυτό. Ο χρήστης τον παρέχει και το μοντέλο απαντά με τη σωστή τιμή.

Δημιουργήστε ένα νέο αρχείο με όνομα test_workflow.py και προσθέστε τον παρακάτω κώδικα δοκιμής:

from agentic_workflows import run_agentic_workflow

conversation_history = [
    {"role": "user", "content": "Hi, can you tell me the price of one of your listings?"},
]
final_response = run_agentic_workflow(conversation_history)
print(f"Response: {final_response}")

Τρέξτε το σενάριο δοκιμής:

python3 test_workflow.py

Θα δείτε μια έξοδο παρόμοια με αυτή:

Response: Could you please provide the listing_id of the item you're asking about?

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

conversation_history = [
    {"role": "user", "content": "Hi, can you tell me the price of one of your listings?"},
    {"role": "assistant", "content": "Could you please provide the listing_id of the item you're asking about?"},
    {"role": "user", "content": "Yes, the listing ID is 123456"},
]
final_response = run_agentic_workflow(conversation_history)
print(f"Response: {final_response}")

Τρέξε ξανά το σενάριο:

python3 test_workflow.py

Θα δείτε τις πληροφορίες τιμολόγησης:

Response: The price for listing 123456 is $350,000.

Συμπέρασμα

Σε αυτό το σεμινάριο, δημιουργήσατε από το μηδέν μια παράλληλη πρακτική ροή εργασίας σε Python. Δημιουργήσατε ασύγχρονες συναρτήσεις για να κάνετε ταυτόχρονες κλήσεις LLM, ρυθμίσατε πολλαπλές εντολές συστήματος για διαφορετικές εργασίες και υλοποιήσατε ένα επίπεδο λογικής δρομολόγησης για να χειρίζεστε τα αιτήματα των χρηστών.

Για να κάνετε αυτό το πλαίσιο έτοιμο για παραγωγή, θα χρειαστεί να δοκιμάσετε, να ξαναγράψετε τα prompts, να αλλάξετε μοντέλα και να δοκιμάσετε ξανά με διαφορετικές συνομιλίες μέχρι να φτάσετε σε ένα επίπεδο ακρίβειας και ταχύτητας που να πληροί τις απαιτήσεις σας. Με αυτού του είδους τις ροές εργασίας, θα χρειαστεί να δοκιμάζετε κάθε prompt ξεχωριστά και να συνεχίζετε να τα βελτιώνετε με το χρόνο. Στο παράδειγμά μας, επιλέξαμε το μοντέλο Mistral-Small-3.2-24B λόγω της χαμηλής καθυστέρησής του (μέσος χρόνος απόκρισης μικρότερος από 0,5 δευτερόλεπτα), της ικανότητάς του να ακολουθεί αυτές τις συγκεκριμένες οδηγίες και της δυνατότητας να αναπτυχθεί σε μία μόνο GPU. Δοκιμάσαμε επίσης με τα GPT-OSS-120b, GPT-OSS-20b και Llama 3.1 8b, και το μοντέλο Mistral απέδωσε καλύτερα για αυτή τη συγκεκριμένη περίπτωση χρήσης. Η επιλογή του σωστού μοντέλου για κάθε prompt ή εργασία είναι μια επαναληπτική διαδικασία.

Αν ενδιαφέρεστε να χρησιμοποιήσετε πράκτορες με περισσότερη αυτονομία, τα συστήματα προτροπών μπορούν να τους δοθεί περισσότερη ή λιγότερη αυτονομία δίνοντάς τους πρόσβαση σε περισσότερα συμφραζόμενα ή περισσότερα εργαλεία. Μπορείτε ακόμη να έχετε επακόλουθες κλήσεις στο LLM «αλυσσιδωτά» για σκέψη ή άλλους σκοπούς. Ωστόσο, αν μια προτροπή απαιτεί πολλές API κλήσεις σε μια αλυσίδα, αυτό θα αυξήσει την καθυστέρηση της ροής εργασίας, επειδή δεν περιμένετε πλέον μόνο μια ομάδα ασύγχρονων κλήσεων προς τα μοντέλα.

Αναπτύξαμε το μοντέλο Mistral με το vLLM, οπότε δεν χρειάστηκε να αλλάξουμε τη μορφή των παραμετροποιήσεων (prompts) μας για να λειτουργούν με διαφορετικά μοντέλα. Ωστόσο, τα μοντέλα της OpenAI, Claude και τα μοντέλα ανοιχτού κώδικα μπορεί να έχουν διαφορετικές απαιτήσεις για τη μορφοποίηση των prompts που στέλνονται στα APIs τους. Εάν χρησιμοποιείτε διαφορετικούς παρόχους μοντέλων για κάθε κλήση, θα χρειαστεί να γράψετε συναρτήσεις Python που μπορούν να μετατρέψουν τη μορφή των prompts ώστε να ταιριάζει με τις απαιτήσεις του μοντέλου που καλείτε. Για παράδειγμα, ενδέχεται να χρειάζεστε μια συνάρτηση που μπορεί να πάρει ένα prompt μορφοποιημένο για vLLM και να μετατρέψει τη σύνταξη σε ένα prompt μορφοποιημένο για Claude.

Συχνά θα διαπιστώσετε ότι ορισμένα μοντέλα χρειάζονται πολύ περισσότερο χρόνο από άλλα, αναγκάζοντάς σας να περιμένετε την πιο αργή απάντηση για να λάβετε όλες τις απαντήσεις πίσω. Με τη βιβλιοθήκη asyncio της Python, μπορείτε να επεξεργαστείτε τις απαντήσεις των μοντέλων καθώς αυτές έρχονται, χρησιμοποιώντας asyncio.as_completed() αντί για asyncio.gather(). Στη συνέχεια, μπορείτε να ελέγξετε τις πρώτες απαντήσεις για να δείτε αν είναι η διαδρομή που θέλετε να ακολουθήσετε και να προχωρήσετε χωρίς να περιμένετε τις υπόλοιπες απαντήσεις. Αυτό θα απαιτούσε επίσης αλλαγές στο επίπεδο λογικής.

Όταν προσθέτετε περισσότερα προτροπές συστήματος, το κύριο εμπόδιο που θα αντιμετωπίσετε εδώ είναι η περιορισμένη ταχύτητα με το LLM API ή τα όρια επεξεργασίας με την GPU σας. Ο καλύτερος τρόπος για να ξεπεράσετε αυτό είναι να φιλοξενήσετε το δικό σας μοντέλο σε ένα GPU Droplet, αλλά μπορείτε επίσης να αντιμετωπίσετε αυτά τα ζητήματα αυξάνοντας τα όρια ταχύτητας της API σας, κατανέμοντας τα αιτήματά σας σε διάφορα API και εφαρμόζοντας λογική επανεκκίνησης, χειρισμό χρονικού ορίου και χειρισμό σφαλμάτων όταν χτυπηθούν τα όρια ταχύτητας.

Ευχαριστούμε που μάθατε με την Κοινότητα Linux-Console.net.