Δημιουργήστε ένα API ανίχνευσης συναισθήματος και οντοτήτων με το FastAPI (2/2)

1
Δημιουργήστε ένα API ανίχνευσης συναισθήματος και οντοτήτων με το FastAPI (2/2)

Αυτή η ανάρτηση είναι το δεύτερο μέρος ενός σεμιναρίου για την ανάπτυξη ενός API Επεξεργασίας Φυσικής Γλώσσας (NLP) που βασίζεται σε Python. Μπορείτε να διαβάσετε το Μέρος 1 εδώ, όπου αναπτύξαμε μια ενιαία λειτουργία που χρησιμοποιεί το Spacy και το Flair για εκτέλεση ανάλυση συναισθήματος και ανίχνευση οντοτήτων στο παρεχόμενο κείμενο.

Στο Μέρος 2 του σεμιναρίου, θα δημιουργήσουμε το API με το FastAPI και θα ενσωματώσουμε τη συνάρτηση NLP που έχουμε αναπτύξει. Όλος ο κώδικας για αυτό το σεμινάριο και όλα τα παραδείγματα που βλέπετε παρακάτω είναι διαθέσιμο στο Github.

Η πρώτη σας εφαρμογή Ιστού FastAPI

Το FastAPI έχει σχεδιαστεί για να είναι γρήγορο. τόσο από άποψη απόδοσης, όσο και από άποψη ανάπτυξης! Υπάρχει μια σειρά από λειτουργίες που σας βοηθούν να γράψετε επεκτάσιμες, χωρίς σφάλματα, αυτοτεκμηριωμένες διαδρομές API όσο το δυνατόν γρηγορότερα.

Δημιουργία του αρχείου της αίτησης

Δημιουργήστε το πρώτο σας, απλούστερο API με μια απλή διαδρομή GET που μπορείτε να δοκιμάσετε από το πρόγραμμα περιήγησής σας δημιουργώντας ένα νέο αρχείο, simple_api.py με τις ακόλουθες γραμμές:

from fastapi import FastAPI

# This command creates the web-"app"
app = FastAPI()


# Add a simple GET response at the base url "/"
@app.get("/")
def read_root():
    return {"test_response": "Hello World!"}

Αυτός ο κώδικας δημιουργεί μια εφαρμογή Ιστού που έχει πρόσβαση σε μία λειτουργία σε μία μόνο «διαδρομή», «/». Αποθηκεύστε το αρχείο ως simple_api.py. Για να ξεκινήσετε την εφαρμογή ώστε να μπορείτε να τη δοκιμάσετε, θα χρειαστεί να εκτελέσετε το αρχείο Python από μια κονσόλα ή από Pycharm ή VSCode και τα λοιπά.

Εγκατάσταση βιβλιοθηκών

Για να τρέξετε σε μια κονσόλα, ανοίξτε μια κονσόλα ή ένα τερματικό (έχω χρησιμοποιήσει και μου άρεσε Cmder στα Windowsκαι iTerm σε Mac ως αντικατάσταση των προεπιλογών) και ενεργοποιήστε ένα εικονικό περιβάλλον για αυτό το έργο. Αρχικά, για αυτό το απλό παράδειγμα, θα χρειαστεί μόνο εγκατάσταση fastapi (η βιβλιοθήκη διαδικτυακών εφαρμογών μας) και ουβίκερος (λογισμικό διακομιστή για φιλοξενία της διαδικτυακής μας εφαρμογής). Σε αυτά τα παραδείγματα, έχω εκτελέσει τον κώδικα με Python 3.9.

# if you don't have a Python virtual environment set up - create one with:
python3 -m venv venv

# Activate your environment:
source venv/bin/activate

# Install fastapi and uvicorn
pip install fastapi
pip install uvicorn[standard]

Εκκίνηση του API

Τώρα μπορείτε να ξεκινήσετε το νέο σας api με δυναμική επαναφόρτωση (ο διακομιστής φορτώνει ξανά τα αρχεία σας εάν κάνετε μια αλλαγή) χρησιμοποιώντας:

# Start uvicorn with your app using format filename:app_name
uvicorn simple_api:app --reload
Το Uvicorn εξυπηρετεί την εφαρμογή FastAPI με δυναμική επαναφόρτωση. Η εφαρμογή είναι διαθέσιμη στον τοπικό σας υπολογιστή στη θύρα 8000 σε αυτό το παράδειγμα.

Η έξοδος της κονσόλας θα σας ενημερώσει „πού“ είναι διαθέσιμη η εφαρμογή – θα „εκτελείται“ στο παράθυρο του τερματικού σας, αλλά θα „εξυπηρετεί αιτήματα“ στη διεύθυνση που εμφανίζεται (συνήθως http://127.0.0.1:8000). Σε αυτήν την περίπτωση, το „127.0.0.1“ είναι η προεπιλεγμένη διεύθυνση IP του δικού σας υπολογιστή (ονομάζεται επίσης „localhost“) και το 8000 είναι η „θύρα“. Μπορείτε να επισκεφτείτε τη νέα σας εφαρμογή ανοίγοντας μια καρτέλα προγράμματος περιήγησης και πληκτρολογώντας αυτήν τη διεύθυνση (ή „localhost:8000“) στη γραμμή διευθύνσεων.

Δοκιμή του API στο πρόγραμμα περιήγησής σας

Επισκεπτόμενοι την εφαρμογή σας με το πρόγραμμα περιήγησής σας, το πρόγραμμα περιήγησής σας στέλνει ένα αίτημα „GET“ στο API, στη διαδρομή „/“ και αυτό το αίτημα ενεργοποιεί τη λειτουργία „read_root“ στο σενάριο API (λόγω του @app.get("/") διακοσμητής). Μπορείτε να δείτε ότι η απόκριση API είναι το ίδιο λεξικό που ορίσαμε στο δικό μας simple_api.py αρχείο, μετατράπηκε σε JSON και εκτυπώθηκε στο πρόγραμμα περιήγησής μας (το δικό μου φαίνεται διαφορετικό αφού χρησιμοποιώ „JSONVue„στο Chrome).

Απόκριση από το απλό API, που εκτελείται τοπικά στη θύρα 8000. Εάν σταματήσετε τον διακομιστή σας στο παράθυρο του τερματικού σας χρησιμοποιώντας CTRL-C ή CMD-C, θα παρατηρήσετε ότι η απόκριση δεν θα βρίσκεται πλέον.

Εξοικειωθείτε με τα πράγματα αλλάζοντας την απόκριση API, ανανεώνοντας το παράθυρο του προγράμματος περιήγησης και ακόμη και αλλάζοντας τη «διαδρομή» στην οποία εμφανίζεται η απάντηση με επεξεργασία της γραμμής @app.get("/")π.χ @app.get("/anything-you-like").

Προειδοποίηση: Ο προγραμματισμός και η εργασία σε μια κονσόλα θα σας κάνουν να νιώσετε περισσότερο σαν χάκερ. 🙂 Στη φωτογραφία: τον εξομοιωτή κονσόλας Cmder για όσους βρίσκονται σε περιβάλλον Windows.

Προσθήκη διαδρομής POST στο FastAPI

REST HTTP Verbs

Τα αιτήματα HTTP χρησιμοποιούν διαφορετικά «ρήματα» για την επικοινωνία. Μακράν το πιο συνηθισμένο, και αυτό που χρησιμοποιείται για την προβολή ιστοσελίδων, είναι το αίτημα GET. Τα αιτήματα GET χρησιμοποιούνται συνεχώς από προγράμματα περιήγησης στο Διαδίκτυο (όπως ό,τι κι αν κοιτάτε), για να ζητήσουν ιστοσελίδες και δεδομένα για εμφάνιση στην οθόνη σας.

Ωστόσο, υπάρχει στην πραγματικότητα επτά διαφορετικά ρήματα HTML που μπορείτε να χρησιμοποιήσετε σε οποιαδήποτε διεύθυνση. Όταν χρησιμοποιείται με σχεδιασμό API, είναι σύνηθες να χρησιμοποιούνται τα ρήματα για προλεγόμενες/γνωστές πράξεις. Ακολουθούν πολλά API που ασχολούνται με εγγραφές δεδομένων «REST» γεμάτες αρχές σχεδιασμού. Τα ρήματα και οι συνήθεις χρήσεις τους είναι:

  • ΠΑΙΡΝΩ – ανακτήστε μια καταχώρηση ή ένα σύνολο δεδομένων από το API
  • ΘΕΣΗ – Δημιουργήστε μια νέα καταχώρηση στο API
  • ΒΑΖΩ – Ενημερώστε ή αντικαταστήστε μια καταχώριση
  • ΔΙΑΓΡΑΦΩ – Διαγραφή εγγραφής από το API
  • ΚΗΛΙΔΑ – Τροποποίηση μιας δεδομένης καταχώρισης
  • ΕΠΙΛΟΓΕΣ – Μάθετε τις διαθέσιμες λειτουργίες REST
  • ΚΕΦΑΛΙ – Παρέχετε πληροφορίες σχετικά με μια καταχώριση. Αυτή η λειτουργία δίνει τις ίδιες κεφαλίδες με το GET, αλλά όχι τα ίδια τα δεδομένα.

Από αυτά τα ρήματα, GET και POST είναι τα πιο συχνά χρησιμοποιούμενα.

POST Requests και JSON

Τα αιτήματα POST χρησιμοποιούνται συνήθως για τη δημιουργία μιας καταχώρησης σε μια εφαρμογή ή για την αποστολή δεδομένων στο API για επεξεργασία. Τα δεδομένα περιλαμβάνονται στο σώμα του αιτήματος, χρησιμοποιώντας συχνά δεδομένα μορφοποιημένα JSON (Javascript Object Notation). Το JSON μοιάζει αρκετά με τα λεξικά που ορίζονται από την Python. Για παράδειγμα, ένα έγκυρο αντικείμενο JSON θα μπορούσε να μοιάζει με αυτό:

{
    "firstName": "Shane",
    "lastName": "Lynn",
    "addressLines": ["Dublin", "Ireland"],
    "favouriteBlogs": [
        {
            "name": "Shane's Blog",
            "url": "https://www.shanelynn.ie",
        }
    ]
}

Προσθέστε μια επιλογή POST στο API σας

Στο FastAPI, μπορείτε να ορίσετε μια διαδρομή για την αποδοχή αιτημάτων POST χρησιμοποιώντας το @app.post("/route-name/") διακοσμητής. Είναι ενδιαφέρον ότι ορίζετε τη μορφή των δεδομένων JSON που περιμένετε να λάβετε ως αντικείμενο χρησιμοποιώντας pydantic ένα βιβλιοθήκη για τη διαχείριση της επικύρωσης δεδομένων και της πληκτρολόγησης Python.

Το σενάριο API μπορεί να ενημερωθεί για να προσθέσει μια διαδρομή POST που λαμβάνει ένα λεξικό σε JSON με ένα μόνο κλειδί „ερώτημα“ που περιέχει μια συμβολοσειρά. Η μορφή θα είναι: {"query": "This is the text to analyse"}. Ορίζουμε αυτή τη μορφή στον κώδικα API χρησιμοποιώντας a Κλάση «BaseModel» από την Pydantic με μία μόνο καταχώρηση «ερώτημα» τύπου «στρ».

Τρέξιμο pip install pydantic πριν εκτελέσετε αυτήν την έκδοση:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# Define the expected JSON format as a class from Pydantic:
class QueryString(BaseModel):
    """
    This class only contains one element, a string called "query". 
    This setup will set Pydantic to expect a dictionary of format:
    {"query": "Some sort of string"}
    """
    query: str


# Add a simple GET response at the base url "/"
@app.get("/")
def read_root():
    return {"test_response": "Hello World!"}


# Set up a route that is accessed with POST and 
# receives the dictionary format defined by "QueryString"
@app.post("/analysis/")
def analyse_text(query_string: QueryString):
    return {
        "dataReceived": query_string,
        "success": true,
        }

Δοκιμή αιτημάτων POST χρησιμοποιώντας cURL ή Postman

Δεν μπορείτε εύκολα να δοκιμάσετε τη νέα σας διαδρομή με δεδομένα POST από το παράθυρο του προγράμματος περιήγησής σας, καθώς πρέπει να στείλετε ένα αίτημα POST και τα προγράμματα περιήγησης στέλνουν αιτήματα GET όταν επισκέπτονται ιστότοπους. Συνιστώ την εγκατάσταση Ταχυδρόμος, ένας χρήσιμος πελάτης με διεπαφή χρήστη για δοκιμή και δημιουργία αιτημάτων POST (και άλλων). Μπορείτε επίσης να χρησιμοποιήστε το cURL απευθείας από το τερματικό.

Ξεκινήστε ξανά το API ή αφήστε το να φορτώσει ξανά τον νέο κώδικα με uvicorn simple_post_route:app --reload (χρησιμοποιήστε το δικό σας όνομα αρχείου ανάλογα με την περίπτωση).

Τώρα, μπορείτε να ανοίξετε ένα δεύτερο παράθυρο τερματικού και να στείλετε δεδομένα στο API σας χρησιμοποιώντας το cURL. Σημείωση, όταν χρησιμοποιείτε το cURL (και όλα τα αιτήματα HTTP POST), πρέπει να καθορίσετε τον «τύπο περιεχομένου» των δεδομένων αιτήματος και σε αυτήν την περίπτωση, να καθορίσετε ότι στέλνετε δεδομένα JSON:

curl -X POST -H "Content-Type: application/json" -d '{"query": "This is a test"}' http://localhost:8000/analysis/

Θα πρέπει να δείτε την απάντηση να επαναλαμβάνεται απευθείας στο παράθυρο της κονσόλας σας, όπως αναμένεται:

{"dataReceived":{"query":"This is a test"},"success":true}
Χρησιμοποιώντας το cURL για απευθείας ΑΝΑΡΤΗΣΗ στην εφαρμογή FastAPI από. το παράθυρο του τερματικού. Το cURL θα είναι διαθέσιμο σε μηχανές Linux και Mac και σε εκδόσεις Windows 10+. Διαφορετικά, έχω χρησιμοποιήσει τον εξομοιωτή τερματικού cmder στα Windows στο παρελθόν.

Εάν χρησιμοποιείτε το Postman, το GUI θα σας βοηθήσει να στείλετε το αίτημα. Βεβαιωθείτε ότι έχετε ρυθμίσει το σώμα ώστε να περιέχει το JSON σας, σε μορφή „Raw“ και τύπου περιεχομένου, JSON.

Χρήση του Postman για αποστολή αιτημάτων POST στον τοπικό διακομιστή FastAPI. Ο Ταχυδρόμος είναι ένα πραγματικά χρήσιμο εργαλείο για τον έλεγχο και τον εντοπισμό σφαλμάτων API με ένα ωραίο περιβάλλον χρήστη.

Φέρτε το μαζί – το NLP API σας

Τώρα μπορείτε να συνδυάσετε τις γνώσεις σας σχετικά με το χειρισμό αιτημάτων POST στο FastAPI με τη συνάρτηση ανίχνευσης συναισθήματος και οντοτήτων. αναπτύξαμε στο Μέρος 1 αυτού του σεμιναρίου. Η τελική πλήρης αίτηση (με την προϋπόθεση get_entitites_and_sentiment ορίζεται σε ένα αρχείο get_entities_and_sentiment.py στο ίδιο απευθείας με το αρχείο FastAPI όπως στο το φροντιστήριο Github repo) είναι:

from pydantic import BaseModel
from fastapi import FastAPI
from get_entities_and_sentment import get_entities_and_sentiment

app = FastAPI()


class QueryString(BaseModel):
    query: str


@app.get("/")
def read_root():
    return {"test_response": "The API is working!"}


@app.post("/analysis/")
def analyse_text(query_string: QueryString):

    sentiment, entities = get_entities_and_sentiment(query_string.query)
    return {
        "query": query_string.query,
        "entites": entities,
        "sentiment": sentiment,
        }

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

Χρησιμοποιώντας το cURL για να δοκιμάσετε το NLP API με διάφορες προτάσεις με διαφορετική πολικότητα και τύπους οντοτήτων.
Πλήρης απάντηση NLP API από τον Postman. Οι οντότητες και το συναίσθημα εξάγονται με επιτυχία από το κείμενο του ερωτήματος και η ταχύτητα επεξεργασίας αιτημάτων είναι περίπου 100ms στο Macbook Pro μου.

συμπέρασμα

Μπράβο – δημιουργήσατε ένα end-to-end API που μπορεί να εκτελέσει ορισμένες βασικές εργασίες NLP σε κείμενο που το στέλνετε. Σε μια συνέχεια της ανάρτησης, μπορεί να δούμε πώς τοποθετείτε αυτό το API στο Διαδίκτυο για να το κάνετε προσβάσιμο σε έναν ιστότοπο, σε σενάριο python ή σε άλλο χρήστη.

Οι εργασίες επεξεργασίας γλώσσας που ολοκληρώνει αυτό το API δεν ήταν ασήμαντες μόλις πριν από λίγα χρόνια και αυτό το API το διαχειρίζεται με λιγότερες από 60 γραμμές κώδικα – δείχνοντας πόσο γρήγορα προχωρά ο κόσμος του NLP.

Φυσικά, είναι δυνατές βελτιώσεις, εάν επιθυμείτε:

  • Το σύστημα θα επεξεργάζεται μόνο ένα αίτημα κάθε φορά, επομένως ο ρυθμός επεξεργασίας είναι πολύ περιορισμένος. Μια επέκταση. προς την ασύγχρονες λειτουργίες θα ήταν το επόμενο βήμα (σημειώστε ότι αυτό είναι πιο εύκολο να ειπωθεί παρά να γίνει, δεδομένου ότι η λειτουργία NLP είναι δεσμευμένη στη CPU, και ως εκ τούτου μια ουρά και πολλές διεργασίες μπορεί να είναι ο δρόμος προς τα κάτω).
  • Όπως αναφέρθηκε, το API θα έχει μεγάλη ένταση μνήμης, καθώς χρησιμοποιούμε δύο διαφορετικές βιβλιοθήκες επεξεργασίας γλωσσών με πλήρως φορτωμένα μοντέλα για καθεμία.
  • Δεν υπαρχει έλεγχο ταυτότητας χρήστη ή οποιαδήποτε ασφάλεια; Εάν αυτή η εφαρμογή ήταν προσβάσιμη από το Διαδίκτυο, ο καθένας θα μπορούσε να στείλει δεδομένα σε αυτήν.
  • Αν περιμένατε πολλά επαναλαμβανόμενα κείμενα ή προτάσεις, α στρώμα προσωρινής αποθήκευσης στα αιτήματα θα ήταν καλή πρακτική για τη βελτίωση της απόδοσης.

Έχω τυλίξει όλο τον κώδικα και τα παραδείγματα για αυτήν την ανάρτηση αυτό το αποθετήριο Github – Ελπίζω να είναι χρήσιμο σε ορισμένους αναγνώστες. Καλή τύχη με τις περιπέτειες AI και NLP API!

Schreibe einen Kommentar