انتقلت الوصفات في هذا المستودع منذ ذلك الحين إلى Prodigy ويتم الحفاظ عليها هناك. سيحصلون قريبًا على ترقية مع ظهور دعم Spacy-LLM ، والذي يتميز بمطالبات أفضل ومقدمي LLM المتعددين. لهذا السبب اخترنا أرشفة هذا الريبو ، حتى نركز على الحفاظ على هذه الوصفات كجزء من Spacy و Prodigy مباشرة.
يمكنك معرفة المزيد عن طريق التحقق من قسم نماذج اللغة الكبيرة على المستندات.
يحتوي هذا المستودع على رمز مثال حول كيفية الجمع بين التعلم الصفري والضمن مع جهد تعليق صغير للحصول على مجموعة بيانات عالية الجودة مع أقصى قدر من الكفاءة . على وجه التحديد ، نستخدم نماذج لغة كبيرة متوفرة من Openai لتزويدنا بمجموعة أولية من التنبؤات ، ثم قم بتشغيل مثيل معجزة على جهازنا المحلي لتجاوز هذه التنبؤات وتنسيقها. يتيح لنا ذلك الحصول على مجموعة بيانات قياسية ذهبية بسرعة كبيرة ، وتدريب نموذج أصغر وخاضع للإشراف يناسب احتياجاتنا الدقيقة وحالات الاستخدام.
تأكد من تثبيت Prodigy بالإضافة إلى بعض التبعيات الإضافية لـ Python:
python -m pip install prodigy -f https://[email protected]
python -m pip install -r requirements.txt
مع XXXX-XXXX-XXXX-XXXX
يكون مفتاح ترخيص Progerigy الشخصي الخاص بك.
بعد ذلك ، قم بإنشاء مفتاح API جديد من Openai.com أو إحضار مفتاح موجود. سجل المفتاح السري وكذلك مفتاح المؤسسة وتأكد من توفرها كمتغيرات بيئية. على سبيل المثال ، قم بتعيينها في ملف .env
في دليل الجذر:
OPENAI_ORG = "org-..."
OPENAI_KEY = "sk-..."
ner.openai.correct
: التعليق التوضيحي ner مع التعلم صفر أو قليلة تمثل هذه الوصفة تنبؤات الكيان التي تم الحصول عليها من نموذج لغة كبير وتتيح لك الإشارة إليها على أنها صحيحة ، أو لتنسيقها يدويًا. يتيح لك ذلك جمع مجموعة بيانات قياسية ذهبية بسرعة من خلال التعلم الصفر أو التعلم القليلة. إنه يشبه إلى حد كبير استخدام وصفة ner.correct
القياسية في prodi.gy ، لكننا نستخدم GPT-3 كنموذج خلفي لعمل تنبؤات.
python -m prodigy ner.openai.correct dataset filepath labels [--options] -F ./recipes/openai_ner.py
دعوى | يكتب | وصف | تقصير |
---|---|---|---|
dataset | شارع | مجموعة بيانات Prodigy لحفظ التعليقات التوضيحية ل. | |
filepath | طريق | مسار إلى .jsonl بيانات للشروط. يجب أن تحتوي البيانات على الأقل على حقل "text" . | |
labels | شارع | قائمة مفصولة بفاصلة تحدد ملصقات NER التي يجب أن يتنبأ بها النموذج. | |
--lang ، -l | شارع | لغة بيانات الإدخال - سيتم استخدامها للحصول على رمز مميز ذي صلة. | "en" |
--segment ، -S | بول | العلم لضبط عندما يجب تقسيم الأمثلة إلى جمل. بشكل افتراضي ، يتم عرض مقالة الإدخال الكاملة. | False |
--model ، -m | شارع | نموذج GPT-3 لاستخدامه للتنبؤات الأولية. | "text-davinci-003" |
--prompt_path ، -p | طريق | الطريق إلى قالب موجه .jinja2 . | ./templates/ner_prompt.jinja2 |
--examples-path ، -e | طريق | طريق إلى أمثلة للمساعدة في تحديد المهمة. يمكن أن يكون الملف إذا تم ضبطه على None ، يتم تطبيق التعلم الصفري. | None |
--max-examples ، -n | int | كحد أقصى عدد من الأمثلة لتضمينها في مطالبة Openai. إذا تم ضبطه على 0 ، يتم تطبيق التعلم الصفري دائمًا ، حتى عندما تتوفر أمثلة. | 2 |
--batch-size ، -b | int | حجم دفعة من الاستفسارات لإرسالها إلى API Openai. | 10 |
--verbose ، -v | بول | علامة لطباعة معلومات إضافية إلى المحطة. | False |
دعنا نقول أننا نريد التعرف على الأطباق والمكونات ومعدات الطهي من بعض النص الذي حصلنا عليه من طبخ فرعي. سنرسل النص إلى GPT-3 ، الذي تستضيفه Openai ، ونقدم موجه التعليق التوضيحي لشرح نموذج اللغة نوع التنبؤات التي نريدها. شيء مثل:
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.py
بعد تلقي النتائج من Openai API ، تقوم وصفة Prodigy بتحويل التنبؤات إلى مهمة شرحية يمكن تقديمها باستخدام Prodigy. تُظهر المهمة حتى المطالبة الأصلية وكذلك الإجابة الخام التي حصلنا عليها من نموذج اللغة.
هنا ، نرى أن النموذج قادر على التعرف على الأطباق والمكونات ومعدات الطهي بشكل صحيح منذ البداية!
توفر الوصفة أيضًا خيارًا --verbose
أو -v
يتضمن المطالبة الدقيقة والاستجابة على المحطة عند استلام حركة المرور. لاحظ أنه نظرًا لأن طلبات واجهة برمجة التطبيقات مثبتة ، فقد تضطر إلى التمرير مرة أخرى قليلاً للعثور على المطالبة الحالية.
في مرحلة ما ، قد تلاحظ وجود خطأ في تنبؤات نموذج لغة Openai. على سبيل المثال ، لاحظنا وجود خطأ في التعرف على معدات الطهي في هذا المثال:
إذا رأيت هذا النوع من الأخطاء المنهجية ، فيمكنك توجيه التنبؤات في الاتجاه الصحيح عن طريق تصحيح المثال ثم تحديد أيقونة "العلم" الصغيرة في أعلى يمين واجهة المستخدم المعجزة:
بمجرد أن تضغط على قبول على واجهة Prodigy ، سيتم التقاط المثال الذي تم الإبلاغ عنه تلقائيًا وإضافته إلى الأمثلة التي يتم إرسالها إلى API Openai كجزء من المطالبة.
ملحوظة
نظرًا لأن Bordigy تقوم بتوجيه هذه الطلبات ، فسيتم تحديث المطالبة بتأخير طفيف ، بعد إرسال الدفعة التالية من المطالبات إلى 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
سيؤدي ذلك إلى إنشاء ملف predictions.jsonl
ner.manual
لاحظ أن API OpenAI قد تُرجع "429 الكثير من الطلبات" عند طلب الكثير من البيانات في وقت واحد - في هذه الحالة ، من الأفضل التأكد من طلب 100 أمثلة فقط في وقت واحد.
بعد أن قمت برعاية مجموعة من التنبؤات ، يمكنك تصدير النتائج باستخدام db-out
:
python -m prodigy db-out my_ner_data > ner_data.jsonl
يحتوي تنسيق التعليقات التوضيحية المصدرة على جميع البيانات التي تحتاجها لتدريب نموذج أصغر في اتجاه مجرى النهر. يحتوي كل مثال في مجموعة البيانات على النص الأصلي ، والرموز المميزة ، والتعليقات التوضيحية التي تشير إلى الكيانات ، إلخ.
يمكنك أيضًا تصدير البيانات إلى التنسيق الثنائي لـ Spacy ، باستخدام data-to-spacy
. يتيح لك هذا التنسيق التحميل في التعليقات التوضيحية ككائنات Doc
Spacy ، والتي يمكن أن تكون مريحة لمزيد من التحويل. يجعل الأمر data-to-spacy
أيضًا تدريب نموذج NER مع Spacy. تقوم أولاً بتصدير البيانات ، وتحديد بيانات القطار على أنها 20 ٪ من المجموع:
python -m prodigy data-to-spacy ./data/annotations/ --ner my_ner_data -es 0.2
ثم يمكنك تدريب نموذج مع Spacy أو Prodigy:
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/
Directory.
لقد قمنا أيضًا بتضمين برنامج نصي تجريبي للتحميل بتنسيق ثنائي .spacy
وتدريب نموذج مع مكتبة transformers
Huggingface. يمكنك استخدام نفس البيانات التي قمت بتصديرها للتو وتشغيل البرنامج النصي مثل هذا:
# 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 | شارع | مجموعة بيانات Prodigy لحفظ التعليقات التوضيحية ل. | |
filepath | طريق | مسار إلى .jsonl بيانات للشروط. يجب أن تحتوي البيانات على الأقل على حقل "text" . | |
labels | شارع | قائمة مفصولة بفاصلة تحدد ملصقات تصنيف النص الذي يجب أن يتنبأ به النموذج. | |
--lang ، -l | شارع | لغة بيانات الإدخال - سيتم استخدامها للحصول على رمز مميز ذي صلة. | "en" |
--segment ، -S | بول | العلم لضبط عندما يجب تقسيم الأمثلة إلى جمل. بشكل افتراضي ، يتم عرض مقالة الإدخال الكاملة. | False |
--model ، -m | شارع | نموذج GPT-3 لاستخدامه للتنبؤات الأولية. | "text-davinci-003" |
--prompt-path ، -p | طريق | الطريق إلى قالب موجه .jinja2 . | ./templates/textcat_prompt.jinja2 |
--examples-path ، -e | طريق | طريق إلى أمثلة للمساعدة في تحديد المهمة. يمكن أن يكون الملف إذا تم ضبطه على None ، يتم تطبيق التعلم الصفري. | None |
--max-examples ، -n | int | كحد أقصى عدد من الأمثلة لتضمينها في مطالبة Openai. إذا تم ضبطه على 0 ، يتم تطبيق التعلم الصفري دائمًا ، حتى عندما تتوفر أمثلة. | 2 |
--batch-size ، -b | int | حجم دفعة من الاستفسارات لإرسالها إلى API Openai. | 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 بشكل بارز في واجهة المستخدم. يمكننا الضغط على زر قبول (علامة الاختيار) لتضمين النص كمثال إيجابي أو اضغط على زر رفض (علامة التبادل) إذا كان مثالاً سلبياً.
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:
بعد ذلك ، يمكننا استخدام هذه الوصفة للتعامل مع الحالات المتعددة والمتعددة من خلال تمرير الملصقات الثلاثة إلى المعلمة --labels
. يجب علينا أيضًا تعيين علامة --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 ، تقوم هذه الوصفة أيضًا بتحويل التنبؤات إلى مهمة شرحية يمكن تقديمها باستخدام Prodigy. بالنسبة للتصنيف الثنائي ، نستخدم واجهة classification
مع عناصر HTML مخصصة ، بينما بالنسبة للتصنيف النصوص المتعدد أو متعدد الأطوار ، نستخدم واجهة شرح choice
. لاحظ أننا ندرج المطالبة الأصلية والاستجابة Openai في واجهة المستخدم.
أخيرًا ، يمكنك استخدام علامة --verbose
أو -v
لإظهار المطالبة الدقيقة والاستجابة على المحطة. لاحظ أنه نظرًا لأن طلبات واجهة برمجة التطبيقات مثبتة ، فقد تضطر إلى التمرير مرة أخرى قليلاً للعثور على المطالبة الحالية.
على غرار وصفات NER ، يمكنك أيضًا توجيه التنبؤات في الاتجاه الصحيح عن طريق تصحيح المثال ثم تحديد أيقونة "العلم" الصغيرة في أعلى يمين واجهة المستخدم المعجزة:
بمجرد الضغط على زر قبول على واجهة Prodigy ، سيتم التقاط المثال الذي تم الإبلاغ عنه وإضافته إلى الأمثلة القليلة التي يتم إرسالها إلى API Openai كجزء من المطالبة.
ملحوظة
نظرًا لأن Bordigy تقوم بتوجيه هذه الطلبات ، فسيتم تحديث المطالبة بتأخير طفيف ، بعد إرسال الدفعة التالية من المطالبات إلى Openai. يمكنك تجربة جعل حجم الدُفعة (--batch-size
أو-b
) أصغر لإيجاد التغيير في وقت أقرب ، ولكن هذا قد يؤثر سلبًا على سرعة سير عمل التعليقات التوضيحية.
textcat.openai.fetch
: جلب نص تصنيف الأمثلة تتيح لنا وصفة textcat.openai.fetch
جلب مجموعة كبيرة من الأمثلة مقدمًا. هذا مفيد عندما تكون مع بيانات متخصصة للغاية وتهتم فقط بأمثلة نادرة.
python -m prodigy textcat.openai.fetch input_data.jsonl predictions.jsonl --labels Recipe -F ./recipes/openai_textcat.py
سيؤدي ذلك إلى إنشاء ملف predictions.jsonl
textcat.manual
لاحظ أن API OpenAI قد تُرجع أخطاء "429 الكثير من الطلبات" عند طلب الكثير من البيانات في وقت واحد - في هذه الحالة ، من الأفضل التأكد من طلب 100 أمثلة فقط أو نحو ذلك في وقت واحد وإلقاء نظرة على حدود معدل واجهة برمجة التطبيقات.
وصفة textcat.openai.fetch
مناسبة للعمل مع مجموعات البيانات حيث يوجد خلل شديد في الفصل. عادةً ما تريد العثور على أمثلة للصف النادر بدلاً من التعليق على عينة عشوائية. من هناك ، تريد رفع عينة منهم لتدريب نموذج لائق وما إلى ذلك.
هذا هو المكان الذي قد تساعد فيه نماذج اللغة الكبيرة مثل Openai.
باستخدام مجموعة بيانات Reddit R/Cooking ، دفعنا Openai إلى البحث عن تعليقات تشبه وصفة طعام. بدلاً من التعليق على 10000 أمثلة ، قمنا بتشغيل textcat.openai.fetch
وحصلنا على 145 فئة إيجابية. من بين هذه الأمثلة الـ 145 ، تحول 114 إلى إيجابيات حقيقية (79 ٪ الدقة). ثم فحصنا 1000 مثال سلبي ووجدنا 12 حالة سلبية خاطئة (98 ٪ استدعاء).
من الناحية المثالية ، بمجرد شرح مجموعة البيانات بالكامل ، يمكننا تدريب نموذج خاضع للإشراف أفضل من استخدامه على الاعتماد على تنبؤات الصفر للإنتاج. تكلفة التشغيل منخفضة ومن الأسهل إدارتها.
بعد أن قمت برعاية مجموعة من التنبؤات ، يمكنك تصدير النتائج باستخدام db-out
:
python -m prodigy db-out my_textcat_data > textcat_data.jsonl
يحتوي تنسيق التعليقات التوضيحية المصدرة على جميع البيانات التي تحتاجها لتدريب نموذج أصغر في اتجاه مجرى النهر. يحتوي كل مثال في مجموعة البيانات على النص الأصلي ، والرموز المميزة ، والتعليقات التوضيحية التي تشير إلى الكيانات ، إلخ.
يمكنك أيضًا تصدير البيانات إلى التنسيق الثنائي لـ Spacy ، باستخدام data-to-spacy
. يتيح لك هذا التنسيق التحميل في التعليقات التوضيحية ككائنات Doc
Spacy ، والتي يمكن أن تكون مريحة لمزيد من التحويل. يجعل الأمر data-to-spacy
أيضًا تدريب نموذج تصنيف النص مع 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
ثم يمكنك تدريب نموذج مع Spacy أو Prodigy:
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 | شارع | استعلام لإرساله إلى Openai | |
output_path | طريق | مسار لحفظ الإخراج | |
--seeds ، -s | شارع | واحد أو أكثر من عبارات البذور المفصولة بفاصلة. | "" |
--n ، -n | int | الحد الأدنى لعدد العناصر التي يجب توليدها | 100 |
--model ، -m | شارع | نموذج 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 parm | 10 |
--max-tokens ، -mt | int | Max Tokens لتوليد كل مكالمة | 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
سيؤدي ذلك إلى إنشاء مطالبة بـ Openai التي تطلب محاولة إنشاء 100 مثال على الأقل من "حيل لوح التزلج". هناك حد أعلى لمقدار الرموز التي يمكن إنشاؤها بواسطة 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
التي تأتي مع Prodigy لذلك.
# 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 تقييم المطالباتالهدف من هذه الوصفة هو السماح لشخص ما بمقارنة جودة المخرجات من مطالبين بطريقة قابلة للقياس الكمي.
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 | شارع | مجموعة بيانات Prodigy لحفظ الإجابات في | |
inputs_path | طريق | طريق إلى مدخلات JSONL | |
display_template_path | طريق | قالب لتلخيص الحجج | |
prompt1_template_path | طريق | الطريق إلى قالب موجه Jinja2 الأول | |
prompt2_template_path | طريق | الطريق إلى قالب موجه Jinja2 الثاني | |
--model ، -m | شارع | نموذج GPT-3 لاستخدامه في الانتهاء | "text-davinci-003" |
--batch-size ، -b | int | حجم الدُفعة لإرسالها إلى Openai API | 10 |
--verbose ، -v | بول | طباعة معلومات إضافية إلى المحطة | False |
--no-random ، -NR | بول | لا تُظهر عشوائيًا الذي يظهر التعليق التوضيحي على أنه صحيح | False |
--repeat ، -r | int | كم مرة لإرسال نفس المطالبة إلى Openai | 1 |
على سبيل المثال ، دعونا نحاول توليد هايكوس فكاهي. للقيام بذلك ، نحتاج أولاً إلى إنشاء ملفين Jinja يمثلان المطالبة لإرسالها إلى Openai.
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 النهائي. لن يتم استخدام هذا واحد لإنشاء مطالبة ، لكنه سيولد عنوانًا مفيدًا يذكّر بتعليق المهمة الحالية. إليك مثال على مثل هذا القالب.
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
هذا ما تبدو عليه واجهة التعليقات التوضيحية:
عندما تنظر إلى هذه الواجهة ، ستلاحظ أن قالب العنوان يتم تقديمه وأنك قادر على الاختيار من خيارين. كلا الخيارين هما ردود من Openai التي تم إنشاؤها بواسطة قالب اثنين. يمكنك أيضًا رؤية prompt_args
المقدمة في الزاوية اليمنى السفلى من قائمة الاختيار.
من هنا ، يمكنك التعليق على الأمثلة المفضلة لديك وجمع البيانات التي قد تساعدك على تحديد الموجه الأفضل.
بمجرد الانتهاء من التعليق ، سيتم تقديم نظرة عامة على النتائج.
=========================== Evaluation results ===========================
✔ You preferred prompt1.jinja2
prompt1.jinja2 11
prompt2.jinja2 5
ولكن يمكنك أيضًا جلب التعليقات التوضيحية الأولية من قاعدة البيانات لمزيد من التحليل.
python -m prodigy db-out haiku
هناك الكثير من تجارب المتابعة المثيرة للاهتمام لهذا ، والكثير من الطرق لتكييف الفكرة الأساسية مع المهام المختلفة أو مجموعات البيانات. نحن مهتمون أيضًا بتجربة مطالبات مختلفة. من غير الواضح مقدار التنسيق الذي يطلبه التعليقات التوضيحية قد يغير تنبؤات النموذج ، أو ما إذا كانت هناك مطالبة أقصر قد تؤدي أيضًا. نريد أيضًا إجراء بعض التجارب الشاملة.