このリポジトリのレシピはその後、天才に移動し、そこで維持されています。彼らはまもなく、Spacy-LLMサポートの出現によりアップグレードさえできます。これは、より良いプロンプトと複数のLLMプロバイダーを備えています。そのため、このレポをアーカイブすることを選択したのです。そのため、これらのレシピをスペイシーと天才の一部として直接維持することに焦点を当てることができます。
ドキュメントの大規模な言語モデルセクションをチェックすることで、詳細を確認できます。
このリポジトリには、ゼロと少数のショット学習を組み合わせた方法と、最大効率の高い高品質のデータセットを取得するための小さな注釈の取り組みに関する例が含まれています。具体的には、OpenAIから利用可能な大きな言語モデルを使用して、最初の予測セットを提供し、ローカルマシンの天才インスタンスをスピンアップしてこれらの予測を実行してキュレーションします。これにより、金標準のデータセットをかなり迅速に取得し、正確なニーズとユースケースに適合する小さな監視されたモデルをトレーニングできます。

Prodigyといくつかの追加のPython依存関係を必ずインストールしてください。
python -m pip install prodigy -f https://[email protected]
python -m pip install -r requirements.txt XXXX-XXXX-XXXX-XXXXを使用すると、個人の天才ライセンスキーがあります。
次に、openai.comから新しいAPIキーを作成するか、既存のキーを取得します。シークレットキーと組織キーを記録し、これらが環境変数として利用可能であることを確認してください。たとえば、ルートディレクトリの.envファイルに設定します。
OPENAI_ORG = "org-..."
OPENAI_KEY = "sk-..."
ner.openai.correct :ゼロまたは少数のショット学習によるnerアノテーションこのレシピは、大規模な言語モデルから得られたエンティティの予測をマークし、それらを正しいものとしてフラグを立てるか、手動でキュレートすることができます。これにより、ゼロショットまたは少数のショット学習を通じて、金標準のデータセットをすばやく収集できます。 Prodi.gyで標準のner.correctレシピを使用するのと非常によく似ていますが、予測を行うためにGPT-3をバックエンドモデルとして使用しています。
python -m prodigy ner.openai.correct dataset filepath labels [--options] -F ./recipes/openai_ner.py| 口論 | タイプ | 説明 | デフォルト |
|---|---|---|---|
dataset | str | 注釈を保存するためのProdigy Dataset。 | |
filepath | パス | .jsonlデータへのパスアノテート。データには、少なくとも"text"フィールドを含める必要があります。 | |
labels | str | モデルが予測すべきNERラベルを定義するコンマ分離リスト。 | |
--lang 、 -l | str | 入力データの言語は、関連するトークンザーを取得するために使用されます。 | "en" |
--segment 、 -S | ブール | 例を設定するフラグは、例を文に分割する必要がある場合に設定します。デフォルトでは、完全な入力記事が表示されます。 | False |
--model 、 -m | str | 初期予測に使用するGPT-3モデル。 | "text-davinci-003" |
--prompt_path 、 -p | パス | .jinja2プロンプトテンプレートへのパス。 | ./templates/ner_prompt.jinja2 |
--examples-path 、 -e | パス | タスクを定義するのに役立つ例へのパス。ファイルは.yml、.yaml、または.jsonです。 Noneに設定すると、ゼロショット学習が適用されます。 | None |
--max-examples 、 -n | int | Openaiへのプロンプトに含める最大数の例。 0に設定すると、例が利用可能な場合でも、ゼロショット学習が常に適用されます。 | 2 |
--batch-size 、 -b | int | Openai APIに送信するクエリのバッチサイズ。 | 10 |
--verbose 、 -v | ブール | ターミナルに追加情報を印刷するフラグ。 | False |
調理subredditから入手したいくつかのテキストから、料理、材料、調理器具を認識したいとしましょう。 OpenaiがホストするGPT-3にテキストを送信し、アノテーションプロンプトを提供して、言語モデルに必要な予測の種類を説明します。次のようなもの:
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:
...
このプロンプトの定義を.jinja2ファイルで定義します。これは、少数のショット学習のために試験を追加する方法についても説明します。独自のテンプレートを作成し、 --prompt-pathまたは-pオプションでレシピに提供できます。さらに、 --examples-pathまたは-eを使用すると、追加の例を含む.y(a)mlまたは.jsonファイルのファイルパスを設定できます。
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.pyOpenai APIの結果を受け取った後、Prodigy Recipeは予測をProdigyでレンダリングできる注釈タスクに変換します。タスクは、元のプロンプトと、言語モデルから得た生の答えを示しています。

ここでは、モデルが最初から料理、材料、調理器具を正しく認識できることがわかります!
レシピには、トラフィックを受け取るときにターミナルでの正確なプロンプトと応答を含む--verboseまたは-vオプションも提供します。 APIへのリクエストはバッチされているため、現在のプロンプトを見つけるには少し戻って戻る必要がある場合があることに注意してください。
ある時点で、Openai言語モデルの予測に間違いがあることに気付くかもしれません。たとえば、この例では、調理器具の認識に誤りがあることに気付きました。

この種の系統的エラーが表示された場合は、例を修正し、天才UIの右上に小さな「フラグ」アイコンを選択することで、予測を正しい方向に導くことができます。

ProdigyインターフェイスでAcceptを獲得すると、フラグ付きの例が自動的にピックアップされ、プロンプトの一部としてOpenai APIに送信される例に追加されます。
注記
Prodigyはこれらの要求をバッチするため、次のプロンプトがOpenaiに送信された後、プロンプトはわずかな遅延で更新されます。バッチサイズ(--batch-sizeまたは-b)を小さくするために、変更をより早く実施することを実験できますが、これは注釈ワークフローの速度に悪影響を与える可能性があります。
ner.openai.fetch :前すぐに例をフェッチしますner.openai.correctレシピは、注釈中にOpenaiの例を取得しますが、事前に大量の例を取得できるレシピも含まれています。
python -m prodigy ner.openai.fetch input_data.jsonl predictions.jsonl " dish,ingredient,equipment " -F ./recipes/ner.pyこれにより、 ner.manualレシピでロードできるpredictions.jsonlファイルが作成されます。
Openai APIは、一度に多くのデータを要求したときに「429が多すぎる」リクエストのエラーを返す可能性があることに注意してください。この場合、一度に100個ほどの例のみを要求することが最善です。
一連の予測をキュレーションした後、 db-outで結果をエクスポートできます。
python -m prodigy db-out my_ner_data > ner_data.jsonlエクスポートされた注釈の形式には、下流の小さなモデルをトレーニングするために必要なすべてのデータが含まれています。データセットの各例には、元のテキスト、トークン、エンティティを示すスパンアノテーションなどが含まれています。
データを使用して、 data-to-spacyをSpacyのバイナリ形式にエクスポートすることもできます。この形式を使用すると、アノテーションをSpacy Docオブジェクトとして読み込みます。これは、さらに変換するのに便利です。また、 data-to-spacyコマンドにより、SPACYでNERモデルを簡単にトレーニングできます。最初にデータをエクスポートし、列車データを合計の20%として指定します。
python -m prodigy data-to-spacy ./data/annotations/ --ner my_ner_data -es 0.2その後、スペイシーや天才でモデルをトレーニングできます。
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o ner-modelこれにより、モデルがner-model/ディレクトリに保存されます。
また、 .spacyバイナリ形式にロードし、ハギングフェイスtransformersライブラリを使用してモデルをトレーニングする実験スクリプトも含めました。エクスポートしたばかりの同じデータを使用して、次のようにスクリプトを実行できます。
# 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結果のモデルはhf-ner-model/ディレクトリに保存されます。
textcat.openai.correct :ゼロまたは少数の学習を伴うtextcatアノテーションこのレシピにより、大規模な言語モデルの助けを借りてテキストをより速く分類することができます。また、特定のラベルが選択された理由を説明する「理由」も提供します。
python -m prodigy textcat.openai.correct dataset filepath labels [--options] -F ./recipes/openai_textcat.py| 口論 | タイプ | 説明 | デフォルト |
|---|---|---|---|
dataset | str | 注釈を保存するためのProdigy Dataset。 | |
filepath | パス | .jsonlデータへのパスアノテート。データには、少なくとも"text"フィールドを含める必要があります。 | |
labels | str | モデルが予測すべきテキスト分類ラベルを定義するコンマ区切りリスト。 | |
--lang 、 -l | str | 入力データの言語は、関連するトークンザーを取得するために使用されます。 | "en" |
--segment 、 -S | ブール | 例を設定するフラグは、例を文に分割する必要がある場合に設定します。デフォルトでは、完全な入力記事が表示されます。 | False |
--model 、 -m | str | 初期予測に使用するGPT-3モデル。 | "text-davinci-003" |
--prompt-path 、 -p | パス | .jinja2プロンプトテンプレートへのパス。 | ./templates/textcat_prompt.jinja2 |
--examples-path 、 -e | パス | タスクを定義するのに役立つ例へのパス。ファイルは.yml、.yaml、または.jsonです。 Noneに設定すると、ゼロショット学習が適用されます。 | None |
--max-examples 、 -n | int | Openaiへのプロンプトに含める最大数の例。 0に設定すると、例が利用可能な場合でも、ゼロショット学習が常に適用されます。 | 2 |
--batch-size 、 -b | int | Openai APIに送信するクエリのバッチサイズ。 | 10 |
--exclusive-classes 、 -E | ブール | 分類タスクを排他的にするフラグ。 | False |
--verbose 、 -v | ブール | ターミナルに追加情報を印刷するフラグ。 | False |
textcatレシピは、バイナリ、マルチクラス、マルチサーベルテキストの分類に使用できます。適切な数のラベルを--labelsパラメーターに渡すことでこれを設定できます。たとえば、単一のラベルを渡すと、バイナリ分類などに変わります。手続きセクションでそれぞれについて説明します。
特定のRedditコメントが食品レシピについて語っているかどうかを知りたいとします。テキストをGPT-3に送信し、必要な予測を指示するプロンプトを提供します。
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:
バイナリ分類の場合、特定のテキストが食品レシピであり、それ以外の場合は「拒否」されている場合、GPT-3に「受け入れる」ことを望みます。 GPT-3の提案は、UIで顕著に表示されます。 [[マーク]]ボタンを押して、テキストを正の例として含めるか、否定的な例の場合は拒否(クロスマーク)ボタンを押すことができます。
python -m prodigy textcat.openai.correct my_binary_textcat_data data/reddit_r_cooking_sample.jsonl --labels recipe -F recipes/openai_textcat.py
ここで、Redditコメントをレシピ、フィードバック、または質問として分類したいとします。次のプロンプトを書くことができます。
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:
次に、このレシピを使用して、3つのラベルを--labelsパラメーターに渡すことにより、マルチサーベルおよびマルチクラスのケースを処理できます。また、単一選択のUIをレンダリングするために、 --exclusive-classesフラグを設定する必要があります。
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
これらのプロンプトを.jinja2テンプレートとして書き込み、少数のショット学習の例を取り入れることもできます。独自のテンプレートを作成し、 --prompt-pathまたは-pオプションでレシピに提供できます。さらに、 --examples-pathまたは-eを使用すると、追加の例を含む.y(a)mlまたは.jsonファイルのファイルパスを設定できます。また、これらの例にコンテキストを追加することもできます。出力を改善するために観察しました。
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 NERレシピと同様に、このレシピは、予測を天才でレンダリングできる注釈タスクに変換します。バイナリ分類には、カスタムHTML要素を使用したclassificationインターフェイスを使用しますが、マルチラベルまたはマルチクラステキストの分類については、 choice Annotationインターフェイスを使用します。 UIに元のプロンプトとOpenAI応答を含めることに注意してください。
最後に、 --verboseまたは-vフラグを使用して、端末に正確なプロンプトと応答を表示できます。 APIへのリクエストはバッチされているため、現在のプロンプトを見つけるには少し戻って戻る必要がある場合があることに注意してください。
NERレシピと同様に、例を修正し、天才UIの右上に小さな「フラグ」アイコンを選択することにより、予測を正しい方向に導くこともできます。

ProdigyインターフェイスのAcceptボタンを押すと、フラグ付きの例がピックアップされ、プロンプトの一部としてOpenai APIに送信された少数の例に追加されます。
注記
Prodigyはこれらの要求をバッチするため、次のプロンプトがOpenaiに送信された後、プロンプトはわずかな遅延で更新されます。バッチサイズ(--batch-sizeまたは-b)を小さくするために、変更をより早く実施することを実験できますが、これは注釈ワークフローの速度に悪影響を与える可能性があります。
textcat.openai.fetch :テキストの分類の例を前払いしますtextcat.openai.fetch Recipeを使用すると、事前に大量の例を獲得できます。これは、非常に不均衡なデータを使用しており、まれな例にのみ興味を持っている場合に役立ちます。
python -m prodigy textcat.openai.fetch input_data.jsonl predictions.jsonl --labels Recipe -F ./recipes/openai_textcat.pyこれにより、 textcat.manualレシピでロードできるpredictions.jsonlファイルが作成されます。
Openai APIは、一度にデータを要求しすぎると「429が多すぎる」エラーを返す可能性があることに注意してください。この場合、一度に100個ほどの例のみを要求し、APIのレート制限を確認することが最善です。
textcat.openai.fetch Recipeは、深刻なクラスの不均衡があるデータセットの操作に適しています。通常、ランダムサンプルに注釈を付けるのではなく、まれなクラスの例を見つけたいと思うでしょう。そこから、まともなモデルなどをトレーニングするためにアップサンプリングします。
これは、Openaiのような大規模な言語モデルが役立つかもしれない場所です。
Reddit R/Cooking Datasetを使用して、Openaiに食品のレシピに似たコメントを探すよう促しました。 10,000の例に注釈を付ける代わりに、 textcat.openai.fetchを実行し、145の肯定的なクラスを取得しました。これらの145の例のうち、114は真のポジティブ(79%の精度)であることが判明しました。次に、1,000の否定的な例を確認して、12の偽陰性の症例を見つけました(98%のリコール)。
理想的には、データセットに完全に注釈を付けたら、生産のゼロショット予測に依存するよりも使用する方が良い監視されたモデルをトレーニングできます。実行コストは低く、管理が簡単です。
一連の予測をキュレーションした後、 db-outで結果をエクスポートできます。
python -m prodigy db-out my_textcat_data > textcat_data.jsonlエクスポートされた注釈の形式には、下流の小さなモデルをトレーニングするために必要なすべてのデータが含まれています。データセットの各例には、元のテキスト、トークン、エンティティを示すスパンアノテーションなどが含まれています。
データを使用して、 data-to-spacyをSpacyのバイナリ形式にエクスポートすることもできます。この形式を使用すると、アノテーションをSpacy Docオブジェクトとして読み込みます。これは、さらに変換するのに便利です。また、 data-to-spacyコマンドにより、スパシーでテキスト分類モデルを簡単にトレーニングできます。最初にデータをエクスポートし、列車データを合計の20%として指定します。
# 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.2その後、スペイシーや天才でモデルをトレーニングできます。
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o textcat-modelこれにより、モデルがtextcat-model/ディレクトリに保存されます。
terms.openai.fetch :クエリに基づくフレーズと用語をフェッチこのレシピは、大規模な言語モデルから取得した用語とフレーズを生成します。これらの用語は、キュレーションしてパターンファイルに変えることができます。これは、下流の注釈タスクに役立ちます。
python -m prodigy terms.openai.fetch query filepath [--options] -F ./recipes/openai_terms.py| 口論 | タイプ | 説明 | デフォルト |
|---|---|---|---|
query | str | Openaiに送信するクエリ | |
output_path | パス | 出力を保存するパス | |
--seeds 、 -s | str | 1つ以上のコンマ分離された種子フレーズ。 | "" |
--n 、 -n | int | 生成するアイテムの最小数 | 100 |
--model 、 -m | str | 完了に使用するGPT-3モデル | "text-davinci-003" |
--prompt-path 、 -p | パス | Jinja2プロンプトテンプレートへのパス | templates/terms_prompt.jinja2 |
--verbose 、 -v | ブール | 追加情報をターミナルに印刷します | False |
--resume 、 -r | ブール | 出力ファイルからテキスト例にロードして再開します | False |
--progress 、 -pb | ブール | レシピの進捗状況を印刷します。 | False |
--temperature 、 -t | フロート | Openai温度パラメーション | 1.0 |
--top-p 、 --tp | フロート | Openai TOP_P PARAM | 1.0 |
--best-of 、 -bo | int | openai best_of param " | 10 |
--n-batch 、 -nb | int | Openaiバッチサイズパラメーション | 10 |
--max-tokens 、 -mt | int | 通話ごとに生成するマックストークン | 100 |
テキストでスケートボードのトリックを検出することに興味があるとしたら、既知のトリックの用語リストから始めてください。次のクエリから始めてください。
# 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.pyこれにより、「スケートボードのトリック」の少なくとも100の例を生成しようとするように求めるOpenaiへのプロンプトが生成されます。 Openaiが生成できるトークンの量には上限がありますが、このレシピは、指定された量に達するまで条件を収集し続けます。
より正確にしようとする場合は、クエリをより詳細にすることを選択できますが、代わりに--seedsを介していくつかの種子用語を追加することもできます。これらは、Openaiを正しい方向に導くのに役立つスタート例として機能します。
# 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多くの例を収集するには時間がかかる場合があるため、リクエストが送信されたときに、進行--progressを示すことが役立ちます。
# 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.pyいくつかの例を収集した後、もっと生成したいかもしれません。以前の出力ファイルから続行することを選択できます。これにより、これらの例は、Openaiへのプロンプトの種子として効果的に再利用されます。
# 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レシピが完了すると、このように見えるコンテンツを持つtricks.jsonlファイルがあります。
{ "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 " }}
...これで、スケートボードのトリックを含むtricks.jsonlファイルがディスク上にありますが、これらすべてが正確であると仮定することはできません。次のステップは、用語を確認することであり、そのための天才に伴うtextcat.manualレシピを使用できます。
# The tricks.jsonl was fetched from OpenAI beforehand
python -m prodigy textcat.manual skateboard-tricks-list tricks.jsonl --label skateboard-tricksこれにより、次のようになるインターフェイスが生成されます。

各例を手動で受け入れるか拒否することができ、注釈が完了したら、注釈付きテキストをterms.to-patternsレシピを介してパターンファイルにエクスポートできます。
# Generate a `patterns.jsonl` file.
python -m prodigy terms.to-patterns skateboard-tricks-list patterns.jsonl --label skateboard-tricks --spacy-model blank:enレシピが完了すると、 patterns.jsonlがあります。
{ "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は、プロンプトサイズに厳しい制限があります。 4079トークンを超えるプロンプトを持つことはできません。残念ながら、それはあなたが生成できる用語リストのサイズに制限があることを意味します。レシピは、これが発生したときにエラーを報告しますが、この制限に注意するのは良いことです。
ab.openai.prompts :A/Bプロンプトの評価このレシピの目標は、2つのプロンプトからの出力の品質を定量化可能で盲目的な方法で迅速に比較できるようにすることです。
python -m prodigy ab.openai.prompts dataset inputs_path display_template_path prompt1_template_path prompt2_template_path [--options] -F ./recipes/openai_ab.py| 口論 | タイプ | 説明 | デフォルト |
|---|---|---|---|
dataset | str | 答えを保存するためのProdigy Dataset | |
inputs_path | パス | JSONL入力へのパス | |
display_template_path | パス | 引数を要約するためのテンプレート | |
prompt1_template_path | パス | 最初のJinja2プロンプトテンプレートへのパス | |
prompt2_template_path | パス | 2番目のJinja2プロンプトテンプレートへのパス | |
--model 、 -m | str | 完了に使用するGPT-3モデル | "text-davinci-003" |
--batch-size 、 -b | int | Openai APIに送信するバッチサイズ | 10 |
--verbose 、 -v | ブール | 追加情報をターミナルに印刷します | False |
--no-random 、 -NR | ブール | どの注釈が正しいと示されているかをランダム化しないでください | False |
--repeat 、 -r | int | 同じプロンプトをOpenaiに送信する頻度 | 1 |
例として、ユーモラスな俳句を生成してみましょう。そのためには、最初にOpenaiに送信するプロンプトを表す2つのJinjaファイルを構築する必要があります。
templates/ab/prompt1.jinja2 Write a haiku about {{topic}}.
templates/ab/prompt2.jinja2 Write an incredibly hilarious haiku about {{topic}}. So funny!
必要なパラメーターを使用して.JSONLファイルを構築することにより、これらのプロンプトの変数を提供できます。この場合{{topic}}が考慮されることを確認する必要があります。
これが機能する可能性のある.jsonlファイルの例です。
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 " }}注記
prompt_argsの下のすべての引数は、Jinjaテンプレートをレンダリングするために渡されます。idは必須であり、後の分析でグループを識別するために使用できます。
評価する準備がほぼ準備されていますが、このレシピには最後のJinja2テンプレートが1つ必要です。これはプロンプトを生成するために使用されませんが、現在のタスクをアノテーターに思い出させる有用なタイトルを生成します。このようなテンプレートの例は次のとおりです。
templates/ab/input.jinja2 A haiku about {{topic}}.
これらすべてのテンプレートをまとめると、注釈を開始できます。以下のコマンドは、注釈インターフェイスを開始し、 --repeat 4オプションも使用します。これにより、各トピックが少なくとも4回プロンプトを生成するために使用されることが保証されます。
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
これは、注釈インターフェイスが次のように見えるものです。

このインターフェイスを見ると、タイトルテンプレートがレンダリングされ、2つのオプションから選択できることがわかります。どちらのオプションも、2つのプロンプトテンプレートによって生成されたOpenAIからの応答です。また、選択メニューの右下隅にレンダリングされているprompt_argsを確認することもできます。
ここから、お気に入りの例に注釈を付け、どのプロンプトが最適かを決定するのに役立つデータを収集できます。
解決が完了したら、結果の概要が表示されます。
=========================== Evaluation results ===========================
✔ You preferred prompt1.jinja2
prompt1.jinja2 11
prompt2.jinja2 5
ただし、さらに分析するために、データベースから生の注釈を取得することもできます。
python -m prodigy db-out haiku
これには興味深いフォローアップ実験がたくさんあり、基本的なアイデアをさまざまなタスクやデータセットに適応させる方法がたくさんあります。また、さまざまなプロンプトを試してみたいと思います。モデルの予測が変更される可能性がある場合、注釈が要求される形式、または同様に機能する可能性のある短いプロンプトがあるかどうかは不明です。また、いくつかのエンドツーエンドの実験を実行したいと考えています。