؟ التكامل المستمر للتطبيقات التي تدعم LLM ؟؟؟
BenchLLM هي مكتبة مفتوحة المصدر تعتمد على لغة Python وتعمل على تبسيط اختبار نماذج اللغات الكبيرة (LLMs) والتطبيقات التي تدعم الذكاء الاصطناعي. إنه يقيس دقة النموذج أو الوكلاء أو السلاسل الخاصة بك عن طريق التحقق من صحة الإجابات على أي عدد من الاختبارات عبر LLMs.
يتم استخدام BenchLLM بشكل نشط في V7 لتحسين تطبيقات LLM لدينا وهو الآن مفتوح المصدر بموجب ترخيص MIT لمشاركته مع المجتمع الأوسع
استخدم BenchLLM من أجل:
️ ملاحظة: BenchLLM في مرحلة مبكرة من التطوير وسيخضع لتغييرات سريعة.للإبلاغ عن الأخطاء أو طلبات الميزات أو المساهمات، يرجى فتح مشكلة أو إرسال طلب سحب (PR) على صفحة GitHub الخاصة بنا.
تطبق BenchLLM منهجية متميزة من خطوتين للتحقق من صحة نماذج التعلم الآلي الخاصة بك:
الاختبار : تتضمن هذه المرحلة تشغيل التعليمات البرمجية الخاصة بك مقابل أي عدد من الاستجابات المتوقعة والتقاط التنبؤات التي ينتجها النموذج الخاص بك دون إصدار أحكام أو مقارنة فورية.
التقييم : تتم مقارنة التنبؤات المسجلة بالمخرجات المتوقعة باستخدام LLMs للتحقق من التشابه الواقعي (أو يدويًا بشكل اختياري). يتم إنشاء تقارير مقارنة مفصلة، بما في ذلك حالة النجاح/الفشل والمقاييس الأخرى.
يوفر هذا الفصل المنهجي رؤية شاملة لأداء النموذج الخاص بك ويسمح بتحكم أفضل وتحسين كل خطوة.
لتثبيت BenchLLM نستخدم النقطة
pip install benchllm
ابدأ باستيراد المكتبة واستخدم مصمم الديكور @benchllm.test لتحديد الوظيفة التي ترغب في اختبارها:
import benchllm
# Your custom model implementation
def run_my_model ( input ):
# Your model's logic goes here.
return some_result
@ benchllm . test ( suite = "/path/to/test/suite" ) # If the tests are in the same directory, just use @benchllm.test.
def invoke_model ( input : str ):
return run_my_model ( input )
بعد ذلك، قم بإعداد اختباراتك. هذه هي ملفات YAML/JSON منظمة على النحو التالي:
input : What's 1+1? Be very terse, only numeric output
expected :
- 2
- 2.0
في المثال أعلاه، input
هو الاستعلام أو التعليمات التي سيعالجها نموذجك، expected
يحتوي على الاستجابات المحتملة التي يجب أن يعرضها نموذجك. من المهم ملاحظة أن input
يمكن أن يكون عبارة عن str
بسيطة أو قاموس متداخل أكثر تعقيدًا؛ سيقوم BenchLLM باستخراج نوع وسيطة input
في كود Python وتحميل حقل input
من ملف YAML وفقًا لذلك.
افتراضيًا، يستخدم BenchLLM نموذج GPT-3 الخاص بـ OpenAI للمقيم semantic
. يتطلب هذا تعيين متغير البيئة OPENAI_API_KEY
. إذا كنت لا تريد استخدام هذا المقيم الافتراضي، فيمكنك تحديد بديل (تتم مناقشته بمزيد من التفاصيل أدناه):
export OPENAI_API_KEY= ' your-api-key '
استبدل "your-api-key" بمفتاح OpenAI API الفعلي الخاص بك.
لبدء الاختبار، استخدم الأمر bench run
:
$ bench run
افتراضيًا، يبحث أمر bench run عن ملفات Python التي تنفذ الديكور @test في الدليل الحالي. لاستهداف ملف أو مجلد محدد، قم بتحديده مباشرةً:
$ bench run path/to/my/file.py or/path/to/folder/with/files
تسمح المعلمة --retry-count
لـ BenchLLM بإجراء اختبار عدة مرات، وهو مفيد للنماذج التي قد يكون لها تباين في مخرجاتها:
$ bench run --retry-count 5
يقدم BenchLLM طرق تقييم متعددة لتحديد ما إذا كان التنبؤ يطابق القيم المتوقعة لحالة الاختبار. يمكنك استخدام المعلمة --evaluator
لتحديد طريقة التقييم:
هناك طرق متعددة لتقييم ما إذا كان التنبؤ بوظائف الاختبار يتطابق مع القيم المتوقعة لحالات الاختبار. بشكل افتراضي، يتم استخدام GPT-3 لمقارنة المخرجات. يمكنك استخدام --evaluator
لاستخدام طريقة مختلفة
semantic
، يتحقق من التشابه الدلالي باستخدام نماذج اللغة مثل GPT-3 أو GPT-3.5 أو GPT-4 ( --model
المعلمة). يرجى ملاحظة أنه بالنسبة لهذا المُقيم، تحتاج إلى تعيين متغير البيئة OPENAI_API_KEY
.embedding
مسافة جيب التمام بين المتجهات المضمنة. يرجى ملاحظة أنه بالنسبة لهذا المُقيم، تحتاج إلى تعيين متغير البيئة OPENAI_API_KEY
.string-match
، للتحقق مما إذا كانت السلاسل متطابقة (غير حساسة لحالة الأحرف)interactive
، يقبل المستخدم يدويًا الاختبارات في الجهاز أو يفشل فيهاweb
، يستخدم pywebio لواجهة ويب محلية بسيطة يدعم المقيمون غير التفاعليين أيضًا --workers N
لتشغيل التقييمات بالتوازي
$ bench run --evaluator string-match --workers 5
لتسريع عملية التقييم، يستخدم BenchLLM ذاكرة تخزين مؤقت. إذا تم تقييم زوج (التنبؤ، المتوقع) في الماضي وتم استخدام ذاكرة التخزين المؤقت، فسيتم حفظ مخرجات التقييم للتقييمات المستقبلية. هناك عدة أنواع من ذاكرات التخزين المؤقت:
memory
، تقوم فقط بتخزين قيم الإخراج مؤقتًا أثناء التشغيل الحالي. يعد هذا مفيدًا بشكل خاص عند التشغيل باستخدام --retry-count N
file
، يخزن ذاكرة التخزين المؤقت في نهاية التشغيل كملف JSON في الإخراج/cache.json. هذا هو السلوك الافتراضي.none
، لا يستخدم أي ذاكرة التخزين المؤقت. $ bench run examples --cache memory
عند العمل على تطوير السلاسل أو نماذج وكيل التدريب، قد تكون هناك حالات تحتاج فيها هذه النماذج إلى التفاعل مع وظائف خارجية - على سبيل المثال، الاستعلام عن توقعات الطقس أو تنفيذ استعلام SQL. في مثل هذه السيناريوهات، يسهل BenchLLM القدرة على الاستهزاء بهذه الوظائف. يساعدك هذا على جعل اختباراتك أكثر قابلية للتنبؤ بها ويتيح اكتشاف استدعاءات الوظائف غير المتوقعة.
input : I live in London, can I expect rain today?
expected : ["no"]
calls :
- name : forecast.get_n_day_weather_forecast
returns : It's sunny in London.
arguments :
location : London
num_days : 1
في المثال أعلاه، تم الاستهزاء بالوظيفة get_n_day_weather_forecast
في وحدة forecast
. بمعنى آخر، في كل مرة يتم فيها استدعاء هذه الوظيفة، سيتلقى النموذج "It's sunny in London"
. يوفر BenchLLM أيضًا تحذيرات إذا تم استدعاء الوظيفة بقيم وسيطة مختلفة عن get_n_day_weather_forecast(location=London, num_days=1)
. يرجى ملاحظة أن توفير معلمات الوسيطة هذه أمر اختياري.
في حين أن تشغيل المقعد يقوم بتشغيل كل وظيفة اختبار ثم يقوم بتقييم مخرجاتها، فقد يكون من المفيد في كثير من الأحيان فصلها إلى خطوتين. على سبيل المثال، إذا كنت تريد أن يقوم شخص ما بإجراء التقييم يدويًا أو إذا كنت تريد تجربة طرق تقييم متعددة على نفس الوظيفة.
$ bench run --no-eval
سيؤدي هذا إلى إنشاء ملفات json في output/latest/predictions
ثم يمكنك تقييمها لاحقًا
$ bench eval output/latest/predictions
لمزيد من التحكم التفصيلي، يوفر BenchLLM واجهة برمجة التطبيقات (API). ليس مطلوبًا منك إضافة اختبارات YML/JSON لتتمكن من تقييم النموذج الخاص بك. يمكنك بدلاً من ذلك:
Test
Tester
لإنشاء التنبؤاتEvaluator
لتقييم النموذج الخاص بك from benchllm import StringMatchEvaluator , Test , Tester
# Instantiate your Test objects
tests = [
Test ( input = "What's 1+1?" , expected = [ "2" , "It's 2" ]),
Test ( input = "First rule of fight club?" , expected = [ "Do not talk about fight club" ]),
]
# Use a Tester object to generate predictions using any test functions
tester = Tester ( my_test_function )
tester . add_tests ( tests )
predictions = tester . run ()
# Use an Evaluator object to evaluate your model
evaluator = StringMatchEvaluator ()
evaluator . load ( predictions )
results = evaluator . run ()
print ( results )
إذا كنت تريد دمج التخزين المؤقت وتشغيل وظائف تقييم متوازية متعددة، فيمكنك تعديل المُقيم الخاص بك كما يلي:
from benchllm . cache import FileCache
...
evaluator = FileCache ( StringMatchEvaluator ( workers = 2 ), Path ( "path/to/cache.json" ))
evaluator . load ( predictions )
results = evaluator . run ()
في هذا المثال، يتم استخدام FileCache
لتمكين التخزين المؤقت، ويتم تعيين المعلمة workers
الخاصة بـ StringMatchEvaluator
على 2
للسماح بالتقييمات المتوازية. يتم حفظ نتائج ذاكرة التخزين المؤقت في ملف محدد بواسطة Path("path/to/cache.json")
.
bench add
: إضافة اختبار جديد إلى المجموعة.bench tests
: قم بإدراج جميع الاختبارات في المجموعة.bench run
: قم بتشغيل جميع مجموعات الاختبار أو استهدافها.bench eval
: يقوم بتشغيل تقييم تشغيل اختباري موجود. تم تطوير BenchLLM لـ Python 3.10، على الرغم من أنه قد يعمل مع إصدارات Python الأخرى أيضًا. نوصي باستخدام بيئة Python 3.10 والنقطة >= 23. يمكنك استخدام conda أو أي مدير بيئة آخر لإعداد البيئة:
$ conda create --name benchllm python=3.10
$ conda activate benchllm
$ pip install -e " .[dev] "
لتشغيل كافة الأمثلة أولاً، قم بتثبيت الأمثلة على التبعيات الإضافية
$ pip install -e " .[examples] "
خطوات المساهمة:
نحن نلتزم بدليل أسلوب PEP8. يرجى اتباع هذا الدليل عند المساهمة.
إذا كنت بحاجة إلى أي دعم، فلا تتردد في فتح مشكلة على صفحة GitHub الخاصة بنا.