Αυτή η ανάρτηση είναι το δεύτερο μέρος ενός σεμιναρίου για την ανάπτυξη ενός 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

Η έξοδος της κονσόλας θα σας ενημερώσει „πού“ είναι διαθέσιμη η εφαρμογή – θα „εκτελείται“ στο παράθυρο του τερματικού σας, αλλά θα „εξυπηρετεί αιτήματα“ στη διεύθυνση που εμφανίζεται (συνήθως 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, ανανεώνοντας το παράθυρο του προγράμματος περιήγησης και ακόμη και αλλάζοντας τη «διαδρομή» στην οποία εμφανίζεται η απάντηση με επεξεργασία της γραμμής @app.get("/")
π.χ @app.get("/anything-you-like")
.

Προσθήκη διαδρομής 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}

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

Φέρτε το μαζί – το 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, }
Αυτή η εφαρμογή θα πρέπει να ανταποκρίνεται με σχετικά ακριβείς βαθμολογίες οντοτήτων και συναισθημάτων για οποιοδήποτε κείμενο της στέλνετε. Συγκεκριμένα, θα λειτουργήσει καλά για κείμενα «τύπου κριτικής», στα οποία πιθανότατα εκπαιδεύτηκαν αρχικά τα γλωσσικά μοντέλα που χρησιμοποιούνται.


συμπέρασμα
Μπράβο – δημιουργήσατε ένα end-to-end API που μπορεί να εκτελέσει ορισμένες βασικές εργασίες NLP σε κείμενο που το στέλνετε. Σε μια συνέχεια της ανάρτησης, μπορεί να δούμε πώς τοποθετείτε αυτό το API στο Διαδίκτυο για να το κάνετε προσβάσιμο σε έναν ιστότοπο, σε σενάριο python ή σε άλλο χρήστη.
Οι εργασίες επεξεργασίας γλώσσας που ολοκληρώνει αυτό το API δεν ήταν ασήμαντες μόλις πριν από λίγα χρόνια και αυτό το API το διαχειρίζεται με λιγότερες από 60 γραμμές κώδικα – δείχνοντας πόσο γρήγορα προχωρά ο κόσμος του NLP.
Φυσικά, είναι δυνατές βελτιώσεις, εάν επιθυμείτε:
- Το σύστημα θα επεξεργάζεται μόνο ένα αίτημα κάθε φορά, επομένως ο ρυθμός επεξεργασίας είναι πολύ περιορισμένος. Μια επέκταση. προς την ασύγχρονες λειτουργίες θα ήταν το επόμενο βήμα (σημειώστε ότι αυτό είναι πιο εύκολο να ειπωθεί παρά να γίνει, δεδομένου ότι η λειτουργία NLP είναι δεσμευμένη στη CPU, και ως εκ τούτου μια ουρά και πολλές διεργασίες μπορεί να είναι ο δρόμος προς τα κάτω).
- Όπως αναφέρθηκε, το API θα έχει μεγάλη ένταση μνήμης, καθώς χρησιμοποιούμε δύο διαφορετικές βιβλιοθήκες επεξεργασίας γλωσσών με πλήρως φορτωμένα μοντέλα για καθεμία.
- Δεν υπαρχει έλεγχο ταυτότητας χρήστη ή οποιαδήποτε ασφάλεια; Εάν αυτή η εφαρμογή ήταν προσβάσιμη από το Διαδίκτυο, ο καθένας θα μπορούσε να στείλει δεδομένα σε αυτήν.
- Αν περιμένατε πολλά επαναλαμβανόμενα κείμενα ή προτάσεις, α στρώμα προσωρινής αποθήκευσης στα αιτήματα θα ήταν καλή πρακτική για τη βελτίωση της απόδοσης.
Έχω τυλίξει όλο τον κώδικα και τα παραδείγματα για αυτήν την ανάρτηση αυτό το αποθετήριο Github – Ελπίζω να είναι χρήσιμο σε ορισμένους αναγνώστες. Καλή τύχη με τις περιπέτειες AI και NLP API!