Die Rezepte in diesem Repository sind seitdem zu Wunderkind umgezogen und werden dort aufrechterhalten. Sie werden bald sogar ein Upgrade mit dem Aufkommen der Support von Spacy-Llm erhalten, die bessere Eingabeaufforderungen und mehrere LLM-Anbieter bietet. Aus diesem Grund haben wir uns für das Archivieren dieses Repo entschieden, damit wir uns auf die Aufrechterhaltung dieser Rezepte als Teil von Spacy und Wunderkind konzentrieren können.
Sie können mehr erfahren, indem Sie den Abschnitt "Großsprachenmodelle" auf den Dokumenten überprüfen.
This repository contains example code on how to combine zero- and few-shot learning with a small annotation effort to obtain a high-quality dataset with maximum efficiency . Insbesondere verwenden wir große Sprachmodelle, die von OpenAI verfügbar sind, um uns einen anfänglichen Satz von Vorhersagen zu liefern, und dann eine Wunderkindinstanz auf unserer lokalen Maschine aufzusetzen, um diese Vorhersagen zu durchlaufen und zu kuratieren. Dies ermöglicht es uns, ziemlich schnell einen Goldstandard-Datensatz zu erhalten und ein kleineres, überwachtes Modell zu schulen, das zu unseren genauen Anforderungen und unseren Anwendungsfallpassungen entspricht.

Stellen Sie sicher, dass Sie Prodigy sowie einige zusätzliche Python -Abhängigkeiten installieren:
python -m pip install prodigy -f https://[email protected]
python -m pip install -r requirements.txt With XXXX-XXXX-XXXX-XXXX being your personal Prodigy license key.
Erstellen Sie dann einen neuen API -Schlüssel von openai.com oder holen Sie eine vorhandene. Notieren Sie den geheimen Schlüssel sowie den Organisationsschlüssel und stellen Sie sicher, dass diese als Umgebungsvariablen verfügbar sind. For instance, set them in a .env file in the root directory:
OPENAI_ORG = "org-..."
OPENAI_KEY = "sk-..."
ner.openai.correct : NER annotation with zero- or few-shot learning Dieses Rezept markiert Vorhersagen von Entität, die von einem großen Sprachmodell erhalten wurden, und ermöglicht es Ihnen, sie als korrekt zu kennzeichnen oder manuell zu kuratieren. Auf diese Weise können Sie schnell einen Goldstandard-Datensatz über Null-Shot- oder Wenig-Shot-Lernen sammeln. It's very much like using the standard ner.correct recipe in Prodi.gy, but we're using GPT-3 as a backend model to make predictions.
python -m prodigy ner.openai.correct dataset filepath labels [--options] -F ./recipes/openai_ner.py| Argument | Typ | Beschreibung | Standard |
|---|---|---|---|
dataset | str | Prodigy -Datensatz, um Anmerkungen zu speichern. | |
filepath | Weg | Path to .jsonl data to annotate. The data should at least contain a "text" field. | |
labels | str | Komma getrennte Liste, die die NER-Bezeichnungen definiert, die das Modell vorhersagen sollte. | |
--lang , -l | str | Die Sprache der Eingabedaten - wird verwendet, um einen relevanten Tokenizer zu erhalten. | "en" |
--segment , -S | bool | FLAG, um festgelegt zu werden, wenn Beispiele in Sätze aufgeteilt werden sollten. Standardmäßig wird der vollständige Eingangsartikel angezeigt. | False |
--model , -m | str | GPT-3-Modell, das für anfängliche Vorhersagen verwendet werden soll. | "text-davinci-003" |
--prompt_path , -p | Weg | Path to the .jinja2 prompt template. | ./templates/ner_prompt.jinja2 |
--examples-path , -e | Weg | Weg zu Beispielen, um die Aufgabe zu definieren. Die Datei kann ein .yml, .yaml oder .json sein. If set to None , zero-shot learning is applied. | None |
--max-examples , -n | int | Maximale Anzahl von Beispielen, die in die Eingabeaufforderung zum Öffnen aufgenommen werden sollen. Wenn es auf 0 gesetzt ist, wird immer Null-Shot-Lernen angewendet, auch wenn Beispiele verfügbar sind. | 2 |
--batch-size , -b | int | Stapelgröße der Abfragen an die OpenAI -API. | 10 |
--verbose , -v | bool | Fahnen Sie, um zusätzliche Informationen an das Terminal zu drucken. | False |
Nehmen wir an, wir möchten Gerichte, Zutaten und Kochausrüstung aus einem Text erkennen, den wir von einem Koch -Subreddit erhalten haben. Wir senden den Text an GPT-3, das von OpenAI gehostet wird, und geben eine Annotationsaufforderung zur Verfügung, um dem Sprachmodell die gewünschte Art der Vorhersagen zu erklären. So etwas wie:
From the text below, extract the following entities in the following format:
dish: <comma delimited list of strings>
ingredient: <comma delimited list of strings>
equipment: <comma delimited list of strings>
Text:
...
Wir definieren die Definition dieser Eingabeaufforderung in einer .jinja2-Datei, in der auch beschrieben wird, wie Beispiele für wenige Shot-Lernen angehängt werden. You can create your own template and provide it to the recipe with the --prompt-path or -p option. Additionally, with --examples-path or -e you can set the file path of a .y(a)ml or .json file that contains additional examples:
python -m prodigy ner.openai.correct my_ner_data ./data/reddit_r_cooking_sample.jsonl " dish,ingredient,equipment " -p ./templates/ner_prompt.jinja2 -e ./examples/ner.yaml -n 2 -F ./recipes/openai_ner.pyNach Erhalt der Ergebnisse der OpenAI -API wandelt das Wunderkind -Rezept die Vorhersagen in eine Annotationsaufgabe um, die mit Wunderkind verwaltet werden kann. Die Aufgabe zeigt sogar die ursprüngliche Eingabeaufforderung sowie die rohe Antwort, die wir vom Sprachmodell erhalten haben.

Hier sehen wir, dass das Modell von Anfang an Gerichte, Zutaten und Kochgeräte korrekt erkennen kann!
The recipe also offers a --verbose or -v option that includes the exact prompt and response on the terminal as traffic is received. Beachten Sie, dass Sie möglicherweise ein wenig zurückblättern müssen, um die aktuelle Eingabeaufforderung zu finden, da die Anfragen an die API angegeben sind.
Irgendwann können Sie einen Fehler in den Vorhersagen des OpenAI -Sprachmodells bemerken. Zum Beispiel haben wir in diesem Beispiel einen Fehler bei der Erkennung von Kochgeräten festgestellt:

Wenn Sie diese Art von systematischen Fehlern sehen, können Sie die Vorhersagen in die richtige Richtung steuern, indem Sie das Beispiel korrigieren und dann das kleine "Flag" -Symbol oben rechts in der Prodigy -Benutzeroberfläche auswählen:

Once you hit accept on the Prodigy interface, the flagged example will be automatically picked up and added to the examples that are sent to the OpenAI API as part of the prompt.
Notiz
Da Prodigy diese Anfragen stapelt, wird die Eingabeaufforderung mit einer leichten Verzögerung aktualisiert, nachdem die nächste Stapelstapel an OpenAI gesendet wurde. You can experiment with making the batch size (--batch-sizeor-b) smaller to have the change come into effect sooner, but this might negatively impact the speed of the annotation workflow.
ner.openai.fetch : Fetch examples up-front The ner.openai.correct recipe fetches examples from OpenAI while annotating, but we've also included a recipe that can fetch a large batch of examples upfront.
python -m prodigy ner.openai.fetch input_data.jsonl predictions.jsonl " dish,ingredient,equipment " -F ./recipes/ner.py This will create a predictions.jsonl file that can be loaded with the ner.manual recipe.
Beachten Sie, dass die OpenAI -API möglicherweise Fehler "429 zu viele Anforderungen" zurückgibt, wenn Sie zu viele Daten gleichzeitig anfordern - in diesem Fall ist es am besten, sicherzustellen, dass Sie nur etwa 100 Beispiele gleichzeitig anfordern.
After you've curated a set of predictions, you can export the results with db-out :
python -m prodigy db-out my_ner_data > ner_data.jsonlDas Format der exportierten Anmerkungen enthält alle Daten, die Sie für die Ausbildung eines kleineren Modells stromabwärts benötigen. Jedes Beispiel im Datensatz enthält den Originaltext, die Tokens, Span -Annotationen, die die Entitäten usw. bezeichnen, usw.
You can also export the data to spaCy's binary format, using data-to-spacy . This format lets you load in the annotations as spaCy Doc objects, which can be convenient for further conversion. The data-to-spacy command also makes it easy to train an NER model with spaCy. Zuerst exportieren Sie die Daten und geben die Zugdaten als 20% der Gesamtsumme an:
python -m prodigy data-to-spacy ./data/annotations/ --ner my_ner_data -es 0.2Dann können Sie ein Modell mit Spacy oder Wunderkind trainieren:
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o ner-model This will save a model to the ner-model/ directory.
We've also included an experimental script to load in the .spacy binary format and train a model with the HuggingFace transformers library. Sie können dieselben Daten verwenden, die Sie gerade exportiert haben, und das Skript wie folgt ausführen:
# First you need to install the HuggingFace library and requirements
pip install -r requirements_train.txt
python ./scripts/train_hf_ner.py ./data/annotations/train.spacy ./data/annotations/dev.spacy -o hf-ner-model The resulting model will be saved to the hf-ner-model/ directory.
textcat.openai.correct : Textcat annotation with zero- or few-shot learningDieses Rezept ermöglicht es uns, Texte mit Hilfe eines großen Sprachmodells schneller zu klassifizieren. Es bietet auch einen "Grund" zu erklären, warum ein bestimmtes Etikett ausgewählt wurde.
python -m prodigy textcat.openai.correct dataset filepath labels [--options] -F ./recipes/openai_textcat.py| Argument | Typ | Beschreibung | Standard |
|---|---|---|---|
dataset | str | Prodigy -Datensatz, um Anmerkungen zu speichern. | |
filepath | Weg | Path to .jsonl data to annotate. The data should at least contain a "text" field. | |
labels | str | Komma getrennte Liste, die die Textkategorisierungsbezeichnungen definiert, die das Modell vorhersagen sollte. | |
--lang , -l | str | Die Sprache der Eingabedaten - wird verwendet, um einen relevanten Tokenizer zu erhalten. | "en" |
--segment , -S | bool | FLAG, um festgelegt zu werden, wenn Beispiele in Sätze aufgeteilt werden sollten. Standardmäßig wird der vollständige Eingangsartikel angezeigt. | False |
--model , -m | str | GPT-3-Modell, das für anfängliche Vorhersagen verwendet werden soll. | "text-davinci-003" |
--prompt-path , -p | Weg | Path to the .jinja2 prompt template. | ./templates/textcat_prompt.jinja2 |
--examples-path , -e | Weg | Weg zu Beispielen, um die Aufgabe zu definieren. Die Datei kann ein .yml, .yaml oder .json sein. If set to None , zero-shot learning is applied. | None |
--max-examples , -n | int | Maximale Anzahl von Beispielen, die in die Eingabeaufforderung zum Öffnen aufgenommen werden sollen. Wenn es auf 0 gesetzt ist, wird immer Null-Shot-Lernen angewendet, auch wenn Beispiele verfügbar sind. | 2 |
--batch-size , -b | int | Stapelgröße der Abfragen an die OpenAI -API. | 10 |
--exclusive-classes , -E | bool | Flag, um die Klassifizierungsaufgabe exklusiv zu machen. | False |
--verbose , -v | bool | Fahnen Sie, um zusätzliche Informationen an das Terminal zu drucken. | False |
The textcat recipes can be used for binary, multiclass, and multilabel text categorization. You can set this by passing the appropriate number of labels in the --labels parameter; Wenn Sie beispielsweise ein einzelnes Etikett übergeben, wird es in eine binäre Klassifizierung und so weiter. Wir werden in den Abschnitten über jeden über jeden sprechen.
Angenommen, wir möchten wissen, ob ein bestimmter Reddit -Kommentar über ein Lebensmittelrezept spricht. Wir werden den Text an GPT-3 senden und eine Aufforderung zur Verfügung stellen, die die gewünschten Vorhersagen anweist.
From the text below, determine wheter or not it contains a recipe. If it is a
recipe, answer "accept." If it is not a recipe, answer "reject."
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
Für die binäre Klassifizierung möchten wir, dass GPT-3 "Akzeptieren" zurückgibt, wenn ein bestimmter Text ein Lebensmittelrezept ist und ansonsten "ablehnen". Der Vorschlag von GPT-3 wird dann prominent in der Benutzeroberfläche angezeigt. We can press the ACCEPT (check mark) button to include the text as a positive example or press the REJECT (cross mark) button if it is a negative example.
python -m prodigy textcat.openai.correct my_binary_textcat_data data/reddit_r_cooking_sample.jsonl --labels recipe -F recipes/openai_textcat.py
Nehmen wir nun an, wir möchten Reddit -Kommentare als Rezept, Feedback oder eine Frage klassifizieren. Wir können die folgende Eingabeaufforderung schreiben:
Classify the text below to any of the following labels: recipe, feedback, question.
The task is exclusive, so only choose one label from what I provided.
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
Then, we can use this recipe to handle multilabel and multiclass cases by passing the three labels to the --labels parameter. We should also set the --exclusive-classes flag to render a single-choice UI:
python -m prodigy textcat.openai.correct my_multi_textcat_data data/reddit_r_cooking_sample.jsonl
--labels recipe,feedback,question
--exclusive-classes
-F recipes/openai_textcat.py
Wir schreiben diese Eingabeaufforderungen als .Jinja2-Vorlage, die auch Beispiele für wenige Schüsse-Lernen aufnehmen kann. You can create your own template and provide it to the recipe with the --prompt-path or -p option. Additionally, with --examples-path or -e you can set the file path of a .y(a)ml or .json file that contains additional examples. Sie können in diesen Beispielen auch einen Kontext hinzufügen, während wir beobachtet haben, dass die Ausgabe verbessert wird:
python -m prodigy textcat.openai.correct my_binary_textcat_data
./data/reddit_r_cooking_sample.jsonl
--labels recipe
--prompt-path ./templates/textcat_prompt.jinja2
--examples-path ./examples/textcat_binary.yaml -n 2
-F ./recipes/openai_textcat.py Ähnlich wie beim NER -Rezept wandelt dieses Rezept auch die Vorhersagen in eine Annotationsaufgabe um, die mit Wunderkind verwaltet werden kann. For binary classification, we use the classification interface with custom HTML elements, while for multilabel or multiclass text categorization, we use the choice annotation interface. Beachten Sie, dass wir die ursprüngliche Eingabeaufforderung und die OpenAI -Antwort in die Benutzeroberfläche aufnehmen.
Lastly, you can use the --verbose or -v flag to show the exact prompt and response on the terminal. Beachten Sie, dass Sie möglicherweise ein wenig zurückblättern müssen, um die aktuelle Eingabeaufforderung zu finden, da die Anfragen an die API angegeben sind.
Ähnlich wie bei den NER -Rezepten können Sie die Vorhersagen auch in die richtige Richtung lenken, indem Sie das Beispiel korrigieren und dann das kleine "Flag" -Symbol oben rechts neben der Prodigy -Benutzeroberfläche auswählen:

Once you hit the accept button on the Prodigy interface, the flagged example will be picked up and added to the few-shot examples sent to the OpenAI API as part of the prompt.
Notiz
Da Prodigy diese Anfragen stapelt, wird die Eingabeaufforderung mit einer leichten Verzögerung aktualisiert, nachdem die nächste Stapelstapel an OpenAI gesendet wurde. You can experiment with making the batch size (--batch-sizeor-b) smaller to have the change come into effect sooner, but this might negatively impact the speed of the annotation workflow.
textcat.openai.fetch : Fetch text categorization examples up-front The textcat.openai.fetch recipe allows us to fetch a large batch of examples upfront. Dies ist hilfreich, wenn Sie mit stark erbalten Daten zusammenarbeiten und nur an seltenen Beispielen interessiert sind.
python -m prodigy textcat.openai.fetch input_data.jsonl predictions.jsonl --labels Recipe -F ./recipes/openai_textcat.py This will create a predictions.jsonl file that can be loaded with the textcat.manual recipe.
Beachten Sie, dass die OpenAI -API möglicherweise Fehler "429 zu viele Anforderungen" zurücksetzt, wenn Sie zu viele Daten gleichzeitig anfordern. In diesem Fall ist es am besten, sicherzustellen, dass Sie nur etwa 100 Beispiele gleichzeitig anfordern und sich die Tarifbegrenzungen der API ansehen.
The textcat.openai.fetch recipe is suitable for working with datasets where there is severe class imbalance. Normalerweise möchten Sie Beispiele für die seltene Klasse finden, anstatt eine Zufallsstichprobe zu kommentieren. Von dort aus möchten Sie sie einteilen, um ein anständiges Modell zu trainieren und so weiter.
Hier können große Sprachmodelle wie OpenAI helfen.
Mit dem Reddit R/Koch -Datensatz veranlassten wir OpenAI, nach Kommentaren zu suchen, die einem Lebensmittelrezept ähneln. Instead of annotating 10,000 examples, we ran textcat.openai.fetch and obtained 145 positive classes. Von diesen 145 Beispielen stellten sich heraus, dass 114 echte positive (79% Präzision) waren. Anschließend haben wir 1.000 negative Beispiele überprüft und 12 falsch negative Fälle gefunden (98% Rückruf).
Im Idealfall können wir, sobald wir den Datensatz vollständig kommentiert haben, ein beaufsichtigtes Modell trainieren, das besser zu verwenden ist als auf Null-Shot-Vorhersagen für die Produktion. Die laufenden Kosten sind gering und es ist einfacher zu verwalten.
After you've curated a set of predictions, you can export the results with db-out :
python -m prodigy db-out my_textcat_data > textcat_data.jsonlDas Format der exportierten Anmerkungen enthält alle Daten, die Sie für die Ausbildung eines kleineren Modells stromabwärts benötigen. Jedes Beispiel im Datensatz enthält den Originaltext, die Tokens, Span -Annotationen, die die Entitäten usw. bezeichnen, usw.
You can also export the data to spaCy's binary format, using data-to-spacy . This format lets you load in the annotations as spaCy Doc objects, which can be convenient for further conversion. The data-to-spacy command also makes it easy to train a text categorization model with spaCy. Zuerst exportieren Sie die Daten und geben die Zugdaten als 20% der Gesamtsumme an:
# For binary textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat my_textcat_data -es 0.2
# For multilabel textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat-multilabel my_textcat_data -es 0.2Dann können Sie ein Modell mit Spacy oder Wunderkind trainieren:
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o textcat-model This will save a model to the textcat-model/ directory.
terms.openai.fetch : Fetch phrases and terms based on a queryDieses Rezept erzeugt Begriffe und Phrasen, die aus einem großen Sprachmodell erhalten wurden. Diese Begriffe können kuratiert und in Musterdateien umgewandelt werden, was bei nachgeschalteten Annotationsaufgaben helfen kann.
python -m prodigy terms.openai.fetch query filepath [--options] -F ./recipes/openai_terms.py| Argument | Typ | Beschreibung | Standard |
|---|---|---|---|
query | str | Fragen zum Senden an OpenAI | |
output_path | Weg | Pfad zum Speichern der Ausgabe | |
--seeds , -s | str | Ein oder mehrere von Kommas getrennte Samenphrasen. | "" |
--n , -n | int | Mindestanzahl von Elementen zum Generieren | 100 |
--model , -m | str | GPT-3-Modell, das zur Fertigstellung verwendet werden soll | "text-davinci-003" |
--prompt-path , -p | Weg | Pfad zur Jinja2 -Eingabeaufforderung Vorlage | templates/terms_prompt.jinja2 |
--verbose , -v | bool | Drucken Sie zusätzliche Informationen zum Terminal aus | False |
--resume , -r | bool | Lebenslauf durch Laden in Textbeispielen aus der Ausgabedatei | False |
--progress , -pb | bool | Drucken Sie den Fortschritt des Rezepts aus. | False |
--temperature , -t | schweben | OpenAI -Temperaturparam | 1.0 |
--top-p , --tp | schweben | OpenAI TOP_P Param | 1.0 |
--best-of , -bo | int | OpenAI Best_of Param " | 10 |
--n-batch , -nb | int | OpenAI -Batch -Größe Param | 10 |
--max-tokens , -mt | int | Max -Token, die pro Anruf generieren können | 100 |
Nehmen wir an, Sie möchten Skateboard -Tricks im Text erkennen, dann möchten Sie möglicherweise mit einer Begriffsliste bekannter Tricks beginnen. Vielleicht möchten Sie mit der folgenden Abfrage beginnen:
# Base behavior, fetch at least 100 terms/phrases
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.pyDies erzeugt eine Aufforderung zum Öffnen, bei der es darum geht, mindestens 100 Beispiele für "Skateboard -Tricks" zu generieren. Die Anzahl der Token, die von OpenAI erzeugt werden können, ist jedoch eine Obergrenze, aber dieses Rezept wird versuchen, weiterhin Bedingungen zu sammeln, bis es den angegebenen Betrag erreicht hat.
You can choose to make the query more elaborate if you want to try to be more precise, but you can alternatively also choose to add some seed terms via --seeds . Diese werden als Beispiele dienen, um Openai in die richtige Richtung zu steuern.
# Base behavior but with seeds
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py Collecting many examples can take a while, so it can be helpful to show the progress, via --progress as requests are sent.
# Adding progress output as we wait for 500 examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 500 --progress --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.pyNachdem Sie einige Beispiele gesammelt haben, möchten Sie möglicherweise mehr generieren. Sie können wählen, ob Sie eine frühere Ausgabedatei fortsetzen können. Dies wird diese Beispiele effektiv als Samen für die Aufforderung zum Öffnen wiederverwenden.
# Use the `--resume` flag to re-use previous examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 50 --resume --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py When the recipe is done, you'll have a tricks.jsonl file that has contents that look like this:
{ "text" : " pop shove it " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " switch flip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " nose slides " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lazerflip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lipslide " , "meta" :{ "openai_query" : " skateboard tricks " }}
... You now have a tricks.jsonl file on disk that contains skateboard tricks, but you cannot assume that all of these will be accurate. The next step would be to review the terms and you can use the textcat.manual recipe that comes with Prodigy for that.
# The tricks.jsonl was fetched from OpenAI beforehand
python -m prodigy textcat.manual skateboard-tricks-list tricks.jsonl --label skateboard-tricksDies erzeugt eine Schnittstelle, die so aussieht:

You can manually accept or reject each example and when you're done annotating you can export the annotated text into a patterns file via the terms.to-patterns recipe.
# Generate a `patterns.jsonl` file.
python -m prodigy terms.to-patterns skateboard-tricks-list patterns.jsonl --label skateboard-tricks --spacy-model blank:en When the recipe is done, you'll have a patterns.jsonl file that has contents that look like this:
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " pop " },{ "lower" : " shove " },{ "lower" : " it " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " switch " },{ "lower" : " flip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " nose " },{ "lower" : " slides " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lazerflip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lipslide " }]}
...OpenAI hat eine harte Begrenzung für die sofortige Größe. Sie können keine Eingabeaufforderung über 4079 Token haben. Leider bedeutet dies, dass die Größe der Begriffslisten eine Grenze gibt, die Sie generieren können. Das Rezept meldet einen Fehler, wenn dies geschieht, aber es ist gut, sich dieser Einschränkung bewusst zu sein.
ab.openai.prompts : A/B evaluation of promptsDas Ziel dieses Rezepts ist es, jemandem schnell die Qualität der Ausgaben von zwei Eingabeaufforderungen zu vergleichen.
python -m prodigy ab.openai.prompts dataset inputs_path display_template_path prompt1_template_path prompt2_template_path [--options] -F ./recipes/openai_ab.py| Argument | Typ | Beschreibung | Standard |
|---|---|---|---|
dataset | str | Prodigy -Datensatz zum Speichern von Antworten in | |
inputs_path | Weg | Pfad zu JSONL -Eingaben | |
display_template_path | Weg | Vorlage zum Zusammenfassen der Argumente | |
prompt1_template_path | Weg | Pfad zur ersten Jinja2 -Eingabeaufforderung Vorlage | |
prompt2_template_path | Weg | Pfad zur zweiten Jinja2 -Eingabeaufforderung Vorlage | |
--model , -m | str | GPT-3-Modell, das zur Fertigstellung verwendet werden soll | "text-davinci-003" |
--batch-size , -b | int | Stapelgröße an die OpenAI -API zu senden | 10 |
--verbose , -v | bool | Drucken Sie zusätzliche Informationen zum Terminal aus | False |
--no-random , -NR | bool | Randomize nicht, welche Annotation als korrekt angezeigt wird | False |
--repeat , -r | int | Wie oft senden Sie dieselbe Aufforderung zum Öffnen von Openai | 1 |
Lassen Sie uns als Beispiel versuchen, humorvolle Haikus zu erzeugen. Dazu müssen wir zunächst zwei Jinja -Dateien erstellen, die die Eingabeaufforderung an OpenAI darstellen.
templates/ab/prompt1.jinja2 Write a haiku about {{topic}}.
templates/ab/prompt2.jinja2 Write an incredibly hilarious haiku about {{topic}}. So funny!
Sie können Variablen für diese Eingabeaufforderungen bereitstellen, indem Sie eine .jsonl -Datei mit den erforderlichen Parametern erstellen. In this case we need to make sure that {{topic}} is accounted for.
Here's an example .jsonl file that could work.
data/ab_example.jsonl{ "id" : 0 , "prompt_args" : { "topic" : " star wars " }}
{ "id" : 0 , "prompt_args" : { "topic" : " kittens " }}
{ "id" : 0 , "prompt_args" : { "topic" : " the python programming language " }}
{ "id" : 0 , "prompt_args" : { "topic" : " maths " }}Notiz
All the arguments under
prompt_argswill be passed to render the jinja templates. Theidis mandatory and can be used to identify groups in later analysis.
Wir sind fast bereit zu bewerten, aber dieses Rezept erfordert eine letzte Jinja2 -Vorlage. Dieser wird nicht verwendet, um eine Eingabeaufforderung zu generieren, erzeugt jedoch einen nützlichen Titel, der den Annotator an die aktuelle Aufgabe erinnert. Hier ist ein Beispiel für eine solche Vorlage.
templates/ab/input.jinja2 A haiku about {{topic}}.
Wenn Sie all diese Vorlagen zusammenstellen, können Sie mit dem Annotieren beginnen. The command below starts the annotation interface and also uses the --repeat 4 option. Dadurch wird sichergestellt, dass jedes Thema mindestens viermal eine Eingabeaufforderung erstellt.
python -m prodigy ab.openai.prompts haiku data/ab_example.jsonl templates/ab/input.jinja2 templates/ab/prompt1.jinja2 templates/ab/prompt2.jinja2 --repeat 5 -F recipes/openai_ab.py
So sieht die Annotationsschnittstelle aus:

Wenn Sie sich diese Schnittstelle ansehen, werden Sie feststellen, dass die Titelvorlage wiedergegeben wird und dass Sie aus zwei Optionen auswählen können. Beide Optionen sind Antworten von OpenAI, die von den beiden Eingabeaufentwicklungsvorlagen erzeugt wurden. You can also see the prompt_args rendered in the lower right corner of the choice menu.
Von hier aus können Sie Ihre Lieblingsbeispiele kommentieren und Daten sammeln, die Ihnen helfen, zu entscheiden, welche Eingabeaufforderung am besten sind.
Sobald Sie mit Annotieren fertig sind, erhalten Sie einen Überblick über die Ergebnisse.
=========================== Evaluation results ===========================
✔ You preferred prompt1.jinja2
prompt1.jinja2 11
prompt2.jinja2 5
Sie können aber auch die Rohanmerkungen aus der Datenbank für weitere Analysen abrufen.
python -m prodigy db-out haiku
Es gibt viele interessante Follow-up-Experimente und viele Möglichkeiten, die Grundidee an verschiedene Aufgaben oder Datensätze anzupassen. Wir sind auch daran interessiert, verschiedene Eingabeaufforderungen auszuprobieren. Es ist unklar, wie sehr das Format, in dem die Anmerkungen angefordert werden, die Vorhersagen des Modells ändern oder ob es eine kürzere Eingabeaufforderung gibt, die ebenso gut funktioniert. Wir möchten auch einige End-to-End-Experimente durchführen.