Prompt engineering

Από το Μηδέν στην Προηγμένη Μηχανική Προτροπών με LangChain σε Python

mm
Προσθέστε το Unite.AI στις προτιμώμενες πηγές σας στο Google

Μια σημαντική πτυχή των Μεγάλων Μοντέλων Γλώσσας (LLMs) είναι ο αριθμός των παραμέτρων που αυτά τα μοντέλα χρησιμοποιούν για την εκμάθηση. Όσο περισσότερες παραμέτρους έχει ένα μοντέλο, τόσο καλύτερα μπορεί να κατανοήσει τη σχέση μεταξύ λέξεων και φράσεων. Αυτό σημαίνει ότι τα μοντέλα με δισεκατομμύρια παραμέτρους έχουν την ικανότητα να παράγουν διάφορες δημιουργικές μορφές κειμένου και να απαντήσουν σε ανοιχτές και απαιτητικές ερωτήσεις με ενημερωτικό τρόπο.

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

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

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

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

Langchain, μια βιβλιοθήκη αιχμής, φέρνει ευκολία και ευελιξία στο σχεδιασμό, την υλοποίηση και την ρύθμιση των προτροπών. Όσο ξεδιπλώνουμε τις αρχές και τις πρακτικές της μηχανικής προτροπών, θα μάθετε πώς να χρησιμοποιήσετε τις ισχυρές λειτουργίες του Langchain για να εκμεταλλευτείτε τις δυνατότητες των μοντέλων Generative AI όπως το GPT-4.

Κατανόηση των Prompts

Πριν βουτήξουμε στις τεχνικές λεπτομέρειες της μηχανικής προτροπών, είναι απαραίτητο να κατανοήσουμε την έννοια των prompts και τη σημασία τους.

Ένα ‘prompt‘ είναι μια σειρά από tokens που χρησιμοποιούνται ως είσοδος σε ένα μοντέλο γλώσσας, οδηγώντας το να παράγει ένα συγκεκριμένο είδος απάντησης. Τα prompts παίζουν έναν κρίσιμο ρόλο στη διεύθυνση της συμπεριφοράς του μοντέλου. Μπορούν να επηρεάσουν την ποιότητα του παραγμένου κειμένου και, όταν σχεδιαστούν σωστά, μπορούν να βοηθήσουν το μοντέλο να παράγει ενημερωτικές, ακριβείς και προσαρμοσμένες στο πλαίσιο απαντήσεις. Η μηχανική προτροπών είναι η τέχνη και η επιστήμη σχεδιασμού αποτελεσματικών προτροπών. Στόχος είναι να αποσπάσει την επιθυμητή έξοδο από ένα γλωσσικό μοντέλο. Με προσεκτική επιλογή και δόμηση των προτροπών, μπορούμε να καθοδηγήσουμε το μοντέλο σε ακριβέστερες και πιο σχετικές απαντήσεις. Στην πράξη, αυτό περιλαμβάνει τη ρύθμιση των φράσεων εισόδου ώστε να ανταποκρίνονται στις μεροληψίες εκπαίδευσης και δομής του μοντέλου.

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

Langchain: Το Γρηγορότερα Εξελισσόμενο Εργαλείο Prompt

LangChain, που εκκινήθηκε τον Οκτώβριο του 2022 από τον Harrison Chase, έχει γίνει ένα από τα πιο υψηλά βαθμολογημένα ανοιχτά framework στο GitHub το 2023. Προσφέρει μια απλοποιημένη και τυποποιημένη διεπαφή για την ενσωμάτωση των Μεγάλων Μοντέλων Γλώσσας (LLMs) σε εφαρμογές. Επίσης, παρέχει μια διεπαφή με πλούσιες λειτουργίες για τη μηχανική προτροπών, επιτρέποντας στους προγραμματιστές να πειραματίζονται με διαφορετικές στρατηγικές και να αξιολογούν τα αποτελέσματά τους. Χρησιμοποιώντας το Langchain, μπορείτε να εκτελέσετε εργασίες μηχανικής προτροπών πιο αποτελεσματικά και με πιο άμεσο τρόπο.

LangFlow χρησιμεύει ως διεπαφή χρήστη για την ορχήστρωση των συνιστωσών του LangChain σε ένα εκτελέσιμο διάγραμμα ροής, επιτρέποντας γρήγορη προτυποποίηση και πειραματισμό.

Το LangChain γεμίζει ένα κρίσιμο κενό στην ανάπτυξη του AI για τις μάζες. Επιτρέπει μια σειρά από εφαρμογές NLP, όπως εικονικοί βοηθοί, γεννήτορες περιεχομένου, συστήματα ερωτήσεων και απαντήσεων, και πολλές άλλες, για την επίλυση μια σειρά από πραγματικά προβλήματα.

Παρά το ότι δεν είναι ένα αυτόνομο μοντέλο ή πάροχος, το LangChain απλοποιεί την αλληλεπίδραση με διάφορα μοντέλα, επεκτείνοντας τις ικανότητες των εφαρμογών LLMs πέρα από τους περιορισμούς μιας απλής κλήσης API.

Η Αρχιτεκτονική του LangChain

 

Τα κύρια συστατικά του LangChain περιλαμβάνουν Model I/O, Prompt Templates, Memory, Agents, και Chains.

Model I/O

Το LangChain διευκολύνει μια απρόσκοπτη σύνδεση με διάφορα μοντέλα γλώσσας, περιβάλλοντάς τα με μια τυποποιημένη διεπαφή γνωστή ως Model I/O. Αυτό διευκολύνει μια άνετη αλλαγή μοντέλου για βελτίωση ή καλύτερη απόδοση. Το LangChain υποστηρίζει διάφορους παρόχους μοντέλων γλώσσας, συμπεριλαμβανομένων OpenAI, HuggingFace, Azure, Fireworks, και πολλά άλλα.

Prompt Templates

Αυτά χρησιμοποιούνται για τη διαχείριση και τη βελτίωση των αλληλεπιδράσεων με τα LLMs, παρέχοντας σύντομες οδηγίες ή παραδείγματα. Η βελτίωση των prompts βελτιώνει την απόδοση του μοντέλου, και η ευελιξία τους συμβάλλει σημαντικά στη διαδικασία εισαγωγής.

Ένα απλό παράδειγμα ενός prompt template:


from langchain.prompts import PromptTemplate
prompt = PromptTemplate(input_variables=["subject"],
template="What are the recent advancements in the field of {subject}?")
print(prompt.format(subject="Natural Language Processing"))

Όσο προχωράμε σε πολυπλοκότητα, συναντάμε πιο σύνθετα μοτίβα στο LangChain, όπως το μοτίβο Reason and Act (ReAct). Το ReAct είναι ένα κρίσιμο μοτίβο για την εκτέλεση ενεργειών, όπου ο πράκτορας αναθέτει μια εργασία σε ένα κατάλληλο εργαλείο, προσαρμόζει την είσοδο για αυτό και αναλύει την έξοδο για να ολοκληρώσει την εργασία. Το παρακάτω παράδειγμα Python δείχνει ένα ReAct μοτίβο. Δείχνει πώς ένα prompt είναι δομημένο στο LangChain, χρησιμοποιώντας μια σειρά από σκέψεις και ενέργειες για να συλλογιστεί ένα πρόβλημα και να παράγει μια τελική απάντηση:

PREFIX = """Answer the following question using the given tools:"""
FORMAT_INSTRUCTIONS = """Follow this format:
Question: {input_question}
Thought: your initial thought on the question
Action: your chosen action from [{tool_names}]
Action Input: your input for the action
Observation: the action's outcome"""
SUFFIX = """Start!
Question: {input}
Thought:{agent_scratchpad}"""

Memory

Η μνήμη είναι μια κρίσιμη έννοια στο LangChain, επιτρέποντας στα LLMs και στα εργαλεία να διατηρούν πληροφορίες με τον καιρό. Αυτή η συμπεριφορά με διατήρηση κατάστασης βελτιώνει την απόδοση των εφαρμογών του LangChain, αποθηκεύοντας προηγούμενες απαντήσεις, αλληλεπιδράσεις χρήστη, την κατάσταση του περιβάλλοντος και τους στόχους του πράκτορα. Οι στρατηγικές ConversationBufferMemory και ConversationBufferWindowMemory βοηθούν στη διατήρηση του πλήρους ή των πρόσφατων μερών μιας συνομιλίας, αντίστοιχα. Για μια πιο σύνθετη προσέγγιση, η στρατηγική ConversationKGMemory επιτρέπει την κωδικοποίηση της συνομιλίας ως γράφο γνώσεων, ο οποίος μπορεί να τροφοδοτηθεί πίσω στα prompts ή να χρησιμοποιηθεί για την πρόβλεψη απαντήσεων χωρίς να καλείται το LLM.

Agents

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

Οι πράκτορες είναι εξοπλισμένοι με υπο-συστατικά:

  • Εργαλεία: Αυτά είναι λειτουργικά συστατικά.
  • Εργαλειοθήκες: Συλλογές εργαλείων.
  • Εκτελεστές Πράκτορα: Αυτός είναι ο μηχανισμός εκτέλεσης που επιτρέπει την επιλογή μεταξύ εργαλείων.

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

Chains

Οι αλυσίδες (chains), όπως υποδηλώνει ο όρος, είναι σειρές από εργασίες που επιτρέπουν στη βιβλιοθήκη του LangChain να επεξεργαστεί τις εισόδους και τις εξόδους των μοντέλων γλώσσας χωρίς προβλήματα. Αυτά τα βασικά συστατικά του LangChain αποτελούνται ουσιαστικά από links, τα οποία μπορούν να είναι άλλες chains ή primitives όπως prompts, μοντέλα γλώσσας ή utilities.

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

Το LangChain κατηγοριοποιεί τις chains του σε τρεις τύπους: Utility chains, Generic chains και Combine Documents chains. Θα εμβαθύνουμε στις Utility και Generic chains για τη συζήτησή μας.

  • Utility Chains είναι ειδικά σχεδιασμένες για να εξαγάγουν ακριβείς απαντήσεις από μοντέλα γλώσσας για στενά ορισμένες εργασίες. Για παράδειγμα, ας δούμε το LLMMathChain. Αυτή η βοηθητική αλυσίδα επιτρέπει στα μοντέλα γλώσσας να εκτελούν μαθηματικούς υπολογισμούς. Αποδέχεται μια ερώτηση σε φυσική γλώσσα και το μοντέλο γλώσσας παράγει ένα τμήμα κώδικα Python, το οποίο στη συνέχεια εκτελείται για να παράγει την απάντηση.
  • Generic Chains, από την άλλη πλευρά, χρησιμεύουν ως δομικά στοιχεία για άλλες chains αλλά δεν μπορούν να χρησιμοποιηθούν αυτόνομα. Αυτές οι chains, όπως η LLMChain, είναι θεμελιώδεις και συχνά συνδυάζονται με άλλες chains για να επιτύχουν σύνθετες εργασίες. Για παράδειγμα, η LLMChain χρησιμοποιείται συχνά για να ζητήσει από ένα μοντέλο γλώσσας να διαμορφώσει την είσοδο με βάση ένα παρεχόμενο prompt template και στη συνέχεια να το περάσει στο μοντέλο γλώσσας.

Βήμα-Βήμα Υλοποίηση του Μηχανικής Προτροπών με Langchain

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

Μπορείτε να επωφεληθείτε από δημοφιλή εργαλεία όπως Docker, Conda, Pip και Poetry για τη ρύθμιση του LangChain. Τα σχετικά αρχεία εγκατάστασης για κάθε μια από αυτές τις μεθόδους μπορούν να βρεθούν στο αποθετήριο του LangChain στο https://github.com/benman1/generative_ai_with_langchain. Αυτό περιλαμβάνει ένα Dockerfile για Docker, ένα requirements.txt για Pip, ένα pyproject.toml για Poetry και ένα langchain_ai.yml αρχείο για Conda.

Σε αυτό το άρθρο, θα χρησιμοποιήσουμε το Pip, τον τυπικό διαχειριστή πακέτων Python, για τη διευκόλυνση της εγκατάστασης και της διαχείρισης των τρίτων βιβλιοθηκών. Αν δεν περιλαμβάνεται στην κατανομή Python σας, μπορείτε να εγκαταστήσετε το Pip ακολουθώντας τις οδηγίες στο https://pip.pypa.io/.

Για να εγκαταστήσετε μια βιβλιοθήκη με Pip, χρησιμοποιήστε την εντολή pip install library_name.

Ωστόσο, το Pip δεν διαχειρίζεται περιβάλλοντα από μόνο του. Για να χειριστείτε διαφορετικά περιβάλλοντα, χρησιμοποιούμε το εργαλείο virtualenv.

Στην επόμενη ενότητα, θα συζητήσουμε τις ενσωματώσεις μοντέλων.

Βήμα 1: Ρύθμιση του Langchain

Πρώτα, πρέπει να εγκαταστήσετε το πακέτο Langchain. Χρησιμοποιούμε το λειτουργικό σύστημα Windows. Εκτελέστε την ακόλουθη εντολή στο τερματικό σας για να το εγκαταστήσετε:


pip install langchain

Βήμα 2: Εισαγωγή του Langchain και άλλων απαραίτητων ενοτήτων

Επόμενο, εισαγάγετε το Langchain μαζί με άλλες απαραίτητες ενότητες. Εδώ, εισαγάγετε επίσης τη βιβλιοθήκη transformers, η οποία χρησιμοποιείται εκτενώς σε εργασίες NLP.


import langchain
from transformers import AutoModelWithLMHead, AutoTokenizer

Βήμα 3: Φόρτωση Προ-Εκπαιδευμένου Μοντέλου

Open AI

OpenAI μοντέλα μπορούν να διασυνδεθούν με τη βιβλιοθήκη LangChain ή τη βιβλιοθήκη πελάτη OpenAI Python. Ιδιαίτερα, το OpenAI παρέχει μια κλάση Embedding για μοντέλα διανυσματικής ενσωμάτωσης κειμένου. Δύο κρίσιμα μοντέλα LLM είναι το GPT-3.5 και το GPT-4, που διαφέρουν κυρίως στο όριο πλήθους token. Η τιμολόγηση για κάθε μοντέλο μπορεί να βρεθεί στην ιστοσελίδα του OpenAI. Ενώ υπάρχουν πιο σύνθετα μοντέλα όπως το GPT-4-32K που έχουν μεγαλύτερο όριο token εισόδου, η διαθεσιμότητά τους μέσω API δεν είναι πάντα εγγυημένη.

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


import os
os.environ["OPENAI_API_KEY"] = 'your-openai-token'

Μετά την επιτυχή δημιουργία του κλειδιού, μπορείτε να το ορίσετε ως μια μεταβλητή περιβάλλοντος (OPENAI_API_KEY) ή να το περάσετε ως παράμετρο κατά τη διάρκεια της δημιουργίας στιγμιοτύπου της κλάσης για κλήσεις OpenAI.

Σκεφτείτε ένα σενάριο LangChain για να δείξουμε την αλληλεπίδραση με τα μοντέλα OpenAI:

from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# The LLM takes a prompt as an input and outputs a completion
prompt = "who is the president of the United States of America?"
completion = llm(prompt)
Ο τρέχων πρόεδρος των Ηνωμένων Πολιτειών της Αμερικής είναι ο Joe Biden.

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

Hugging

Hugging Face είναι μια ΔΩΡΕΑΝ βιβλιοθήκη Transformers Python, συμβατή με PyTorch, TensorFlow και JAX, και περιλαμβάνει υλοποιήσεις μοντέλων όπως BERT, T5, κ.λπ.

Το Hugging Face προσφέρει επίσης το Hugging Face Hub, μια πλατφόρμα για τη φιλοξενία αποθετηρίων κώδικα, μοντέλων μηχανικής μάθησης, συνόλων δεδομένων και web εφαρμογών.

Για να χρησιμοποιήσετε το Hugging Face ως παρόχο για τα μοντέλα σας, θα χρειαστείτε έναν λογαριασμό και κλειδιά API, τα οποία μπορούν να ληφθούν από την ιστοσελίδα τους. Το κλειδί μπορεί να είναι διαθέσιμο στο περιβάλλον σας ως HUGGINGFACEHUB_API_TOKEN.

Σκεφτείτε το ακόλουθο τμήμα Python που χρησιμοποιεί ένα μοντέλο ανοικτού κώδικα που αναπτύχθηκε από την Google (GOOGL ), το Flan-T5-XXL:

from langchain.llms import HuggingFaceHub

llm = HuggingFaceHub(model_kwargs={"temperature": 0.5, "max_length": 64},repo_id="google/flan-t5-xxl")
prompt = "In which country is Tokyo?"
completion = llm(prompt)
print(completion)

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

Βήμα 4: Βασική Μηχανική Προτροπών

Για να αρχίσουμε, θα δημιουργήσουμε ένα απλό prompt και θα δούμε πώς το μοντέλο απαντά.

prompt = 'Translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')

generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

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

Βήμα 5: Προηγμένη Μηχανική Προτροπών

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

prompt = 'As a highly proficient French translator, translate the following English text to French: "{0}"'
input_text = 'Hello, how are you?'
input_ids = tokenizer.encode(prompt.format(input_text), return_tensors='pt')

generated_ids = model.generate(input_ids, max_length=100, temperature=0.9)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))

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

Δημιουργία ενός Συστήματος Ερωτήσεων και Απαντήσεων Ακαδημαϊκής Βιβλιογραφίας με Langchain

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

Πρώτα, για να ρυθμίσουμε το περιβάλλον μας, εγκαταστήστε τις απαραίτητες εξαρτήσεις.

pip install langchain arxiv openai transformers faiss-cpu

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

from langchain.llms import OpenAI
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.docstore.document import Document
import arxiv

Το κεντρικό σημείο του συστήματος ερωτήσεων και απαντήσεων μας είναι η ικανότητα να ανακτήσουμε σχετικές ακαδημαϊκές εργασίες που σχετίζονται με ένα συγκεκριμένο πεδίο, εδώ θεωρούμε την επεξεργασία φυσικής γλώσσας (NLP), χρησιμοποιώντας την ακαδημαϊκή βάση δεδομένων arXiv. Για να το πραγματοποιήσετε, ορίστε μια συνάρτηση get_arxiv_data(max_results=10). Αυτή η συνάρτηση συλλέγει τις πιο πρόσφατες περιλήψεις εργασιών NLP από το arXiv και τις ενσωματώνει σε αντικείμενα εγγράφων LangChain, χρησιμοποιώντας την περίληψη ως περιεχόμενο και το μοναδικό αναγνωριστικό εισόδου ως πηγή.

Θα χρησιμοποιήσουμε το API του arXiv για να ανακτήσουμε πρόσφατες εργασίες που σχετίζονται με την NLP:


def get_arxiv_data(max_results=10):
    search = arxiv.Search(
        query="NLP",
        max_results=max_results,
        sort_by=arxiv.SortCriterion.SubmittedDate,
    )
   
    documents = []
   
    for result in search.results():
        documents.append(Document(
            page_content=result.summary,
            metadata={"source": result.entry_id},
        ))

    return documents

Αυτή η συνάρτηση ανακτά τις περιλήψεις των πιο πρόσφατων εργασιών NLP από το arXiv και τις μετατρέπει σε αντικείμενα εγγράφων LangChain. Χρησιμοποιούμε την περίληψη και το μοναδικό αναγνωριστικό εισόδου (URL προς την εργασία) ως περιεχόμενο και πηγή, αντίστοιχα.

def print_answer(question):
    print(
        chain(
            {
                "input_documents": sources,
                "question": question,
            },
            return_only_outputs=True,
        )["output_text"]
    )                 

Ας ορίσουμε το σώμα κειμένων μας και να ρυθμίσουμε το LangChain:

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(temperature=0))

Με το σύστημά μας ερωτήσεων και απαντήσεων τώρα έτοιμο, μπορούμε να το δοκιμάσουμε θέτοντας μια ερώτηση:

print_answer("What are the recent advancements in NLP?")

Η έξοδος θα είναι η απάντηση στην ερώτησή σας, αναφέροντας τις πηγές από τις οποίες η πληροφορία εξήχθη. Για παράδειγμα:

Οι πρόσφατες εξελίξεις στην NLP περιλαμβάνουν μοντέλα εκτέλεσης οδηγιών ενισχυμένα με ανάκτηση και ένα νέο υπολογιστικό πλαίσιο για την επίλυση προβλημάτων βέλτιστης ροής ισχύος εναλλασσόμενου ρεύματος (ACOPF) με χρήση μονάδων επεξεργασίας γραφικών (GPU).
ΠΗΓΕΣ: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

Μπορείτε εύκολα να αλλάξετε μοντέλα ή να τροποποιήσετε το σύστημα σύμφωνα με τις ανάγκες σας. Για παράδειγμα, εδώ αλλάζουμε στο GPT-4, το οποίο μας δίνει μια πολύ καλύτερη και πιο λεπτομερή απάντηση.

sources = get_arxiv_data(2)
chain = load_qa_with_sources_chain(OpenAI(model_name="gpt-4",temperature=0))
Οι πρόσφατες εξελίξεις στην Επεξεργασία Φυσικής Γλώσσας (NLP) περιλαμβάνουν την ανάπτυξη μοντέλων εκτέλεσης οδηγιών ενισχυμένων με ανάκτηση για εργασίες αναζήτησης πληροφοριών, όπως η απάντηση ερωτήσεων (QA). Αυτά τα μοντέλα μπορούν να προσαρμοστούν σε διάφορους τομείς πληροφοριών και εργασίες χωρίς πρόσθετη περαιτέρω εκπαίδευση. Ωστόσο, συχνά δυσκολεύονται να παραμείνουν πιστά στην παρεχόμενη γνώση και μπορεί να παράγουν επινοημένες πληροφορίες στις απαντήσεις τους. Μια άλλη εξέλιξη είναι η εισαγωγή ενός υπολογιστικού πλαισίου για την επίλυση προβλημάτων βέλτιστης ροής ισχύος εναλλασσόμενου ρεύματος (ACOPF) με χρήση μονάδων επεξεργασίας γραφικών (GPU). Η προσέγγιση χρησιμοποιεί μια αφαίρεση μονής εντολής, πολλαπλών δεδομένων (SIMD) για μη γραμμικά προγράμματα (NLP) και εφαρμόζει μέθοδο εσωτερικού σημείου (IPM) σε συμπυκνωμένο χώρο με στρατηγική χαλάρωσης ανισοτήτων. Η στρατηγική επιτρέπει την παραγοντοποίηση του πίνακα KKT χωρίς αριθμητική επιλογή οδηγού στοιχείου, η οποία προηγουμένως εμπόδιζε την παραλληλοποίηση του αλγορίθμου IPM.
ΠΗΓΕΣ: http://arxiv.org/abs/2307.16877v1, http://arxiv.org/abs/2307.16830v1

Ένα token στο GPT-4 μπορεί να είναι τόσο σύντομο όσο ένας χαρακτήρας ή τόσο μακρύ όσο μια λέξη. Για παράδειγμα, το GPT-4-32K μπορεί να επεξεργαστεί μέχρι 32.000 tokens σε μια μόνο εκτέλεση, ενώ το GPT-4-8K και το GPT-3.5-turbo υποστηρίζουν 8.000 και 4.000 tokens, αντίστοιχα. Ωστόσο, είναι σημαντικό να σημειωθεί ότι κάθε αλληλεπίδραση με αυτά τα μοντέλα συνοδεύεται από ένα κόστος που είναι άμεσα ανάλογο του αριθμού των tokens που επεξεργάζονται, είτε εισόδου είτε εξόδου.

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

Το FAISS (Facebook AI Similarity Search) (META ) βοηθά στην ταχεία εύρεση των πιο σχετικών τμημάτων κειμένου που σχετίζονται με την ερώτησή σας. Δημιουργεί μια διανυσματική αναπαράσταση κάθε τμήματος κειμένου και χρησιμοποιεί αυτά τα διανύσματα για να ανακαλύψει και να ανακτήσει τα τμήματα που είναι πιο παρόμοια με τη διανυσματική αναπαράσταση της ερώτησής σας.

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

 
pip install faiss-cpu langchain CharacterTextSplitter

Μετά την εγκατάσταση των παραπάνω βιβλιοθηκών, εκτελέστε

 
from langchain.embeddings.openai import OpenAIEmbeddings 
from langchain.vectorstores.faiss import FAISS 
from langchain.text_splitter import CharacterTextSplitter 
documents = get_arxiv_data(max_results=10) # We can now use feed more data
document_chunks = []
splitter = CharacterTextSplitter(separator=" ", chunk_size=1024, chunk_overlap=0)
for document in documents:
    for chunk in splitter.split_text(document.page_content):
        document_chunks.append(Document(page_content=chunk, metadata=document.metadata))

search_index = FAISS.from_documents(document_chunks, OpenAIEmbeddings())

chain = load_qa_with_sources_chain(OpenAI(temperature=0))

def print_answer(question):
    print(
        chain(
            {
                "input_documents": search_index.similarity_search(question, k=4),
                "question": question,
            },
            return_only_outputs=True,
        )["output_text"]
    )

Με τον κώδικα ολοκληρωμένο, τώρα έχουμε ένα ισχυρό εργαλείο για την αναζήτηση των τελευταίων ακαδημαϊκών ερευνών στο πεδίο της NLP.

Οι πρόσφατες εξελίξεις στην NLP περιλαμβάνουν τη χρήση βαθιών νευρωνικών δικτύων (DNN) για αυτόματη ανάλυση κειμένου και εργασίες επεξεργασίας φυσικής γλώσσας, όπως ο ορθογραφικός έλεγχος, η ανίχνευση γλώσσας, η εξαγωγή οντοτήτων, η ανίχνευση συγγραφέα, η απάντηση ερωτήσεων και άλλες εργασίες.
ΠΗΓΕΣ: http://arxiv.org/abs/2307.10652v1, http://arxiv.org/abs/2307.07002v1, http://arxiv.org/abs/2307.12114v1, http://arxiv.org/abs/2307.16217v1

Συμπέρασμα

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

Ωστόσο, παρά αυτές τις προόδους, υπάρχουν μερικές συμβουλές να θυμάστε. Όσο χρησιμοποιείτε το Langchain, είναι απαραίτητο να κατανοήσετε ότι η ποιότητα της εξόδου εξαρτάται σε μεγάλο βαθμό από τη διατύπωση της προτροπής. Ο πειραματισμός με διαφορετικά ύφη και δομές προτροπών μπορεί να οδηγήσει σε βελτιωμένα αποτελέσματα. Επίσης, θυμάστε ότι το Langchain υποστηρίζει μια ποικιλία μοντέλων γλώσσας, και το καθένα έχει τα δικά του δυνατά και αδύνατα σημεία. Η επιλογή του σωστού μοντέλου για τη συγκεκριμένη εργασία σας είναι κρίσιμη. Τέλος, είναι σημαντικό να θυμάστε ότι η χρήση αυτών των μοντέλων συνοδεύεται από κόστη, καθώς η επεξεργασία tokens επηρεάζει άμεσα το κόστος των αλληλεπιδράσεων.

Όπως έχει αποδειχθεί στον οδηγό βήμα προς βήμα, το Langchain μπορεί να υποστηρίξει αξιόπιστες εφαρμογές, όπως το σύστημα ερωτήσεων και απαντήσεων ακαδημαϊκής βιβλιογραφίας. Με μια αυξανόμενη κοινότητα χρηστών και αυξανόμενη προβολή στο τοπίο του ανοιχτού κώδικα, το Langchain υπόσχεται να είναι ένα κρίσιμο εργαλείο για την αξιοποίηση του πλήρους δυναμικού των LLMs όπως το GPT-4.

Έχω περάσει τα τελευταία πέντε χρόνια βυθισμένος στον συναρπαστικό κόσμο της Μηχανικής Μάθησης και της Βαθιάς Μάθησης. Το πάθος μου και η εξειδίκευσή μου με οδήγησαν να συμβάλλω σε πάνω από 50 διαφορετικά έργα μηχανικής λογισμικού, με ιδιαίτερη έμφαση στο AI/ML. Η συνεχής περιέργειά μου με έχει οδηγήσει επίσης προς την Επεξεργασία Φυσικής Γλώσσας, ένα πεδίο που είμαι πρόθυμος να εξερευνήσω περαιτέρω.