بايثونيس: كاهنة أوراكل أبولو في دلفي.
Pythoness بقلم إيمري بيرجر، وتأليف كايل جويلت وستيفن فرويند
تقوم Pythoness تلقائيًا بإنشاء كود Python من أوصاف واختبارات اللغة الطبيعية.
ملاحظة: يجب أن تكون Pythoness متصلة بـ LLM حتى تعمل. فيما يلي مثال لكيفية ربط Pythoness بحساب OpenAI. بالنسبة لبرامج LLM أخرى، راجع وثائقهم.
حساب OpenAI. سيحتاج حسابك إلى رصيد إيجابي حتى يعمل هذا (تحقق من رصيدك). إذا لم تقم بشراء أرصدة من قبل، فستحتاج إلى شراء أرصدة بقيمة دولار واحد على الأقل (إذا تم إنشاء حساب واجهة برمجة التطبيقات الخاص بك قبل 13 أغسطس 2023) أو 0.50 دولار (إذا كان لديك حساب واجهة برمجة تطبيقات أحدث). احصل على المفتاح هنا.
بمجرد حصولك على مفتاح API، قم بتعيينه كمتغير بيئة يسمى
OPENAI_API_KEY
.export OPENAI_API_KEY= < your-api-key >
أسهل طريقة لتثبيت Pythoness هي من خلال النقطة:
python3 -m pip install pythoness
لاستخدام Pythoness، ما عليك سوى استيراد وحدة pythoness
ثم استخدام الديكور @pythoness.spec
لتحديد الوظيفة المطلوبة:
import pythoness
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." )
def myfib ( n : int ) -> int :
""
سيقوم هذا الكود داخليًا بإنشاء دالة بايثون تسمى myfib
والتي تحسب الرقم n في سلسلة فيبوناتشي. لتنفيذ الدالة فعليًا، يمكنك استدعاؤها كما تفعل مع أي دالة بايثون أخرى:
for i in range ( 20 ):
print ( myfib ( i ))
تقوم Pythoness بتخزين نتائج ترجمة اللغة الطبيعية إلى Python مؤقتًا، وبالتالي فإن عمليات التنفيذ اللاحقة في نفس الدليل ستعمل بشكل أسرع بكثير (تنشئ Pythones قاعدة بيانات تسمى pythoness-cache.db
التي تحفظ هذه الترجمات).
لإيقاف تشغيل جميع رسائل التسجيل، استخدم متغير البيئة PYNS_QUIET
:
env PYNS_QUIET=1 python3 myfib.py
يمكنك توجيه Pythoness من خلال توفير بعض الاختبارات. ستستخدم Pythoness الاختبارات لإنشاء كود Python والتحقق من صحته. الاختبارات هي مجرد قائمة من السلاسل التي تحتوي على تعليمات برمجية أو وظائف Python والتي يجب تقييمها جميعًا على أنها True
.
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ])
def myfib ( n : int ) -> int :
""
يمكنك أيضًا توجيه Pythoness من خلال الاختبارات القائمة على الخاصية . للقيام بذلك، قم بوصف الخصائص التي تريد أن يعرضها برنامجك. ستجري Pythoness اختبارًا قائمًا على الخاصية (Hypothesis)، والذي سيجري اختبارات عدة مرات للتأكد من أن الوظيفة التي تم إنشاؤها تلبي الخصائص المحددة. يعتبر هذا الأسلوب أقوى بكثير من اختبارات الوحدة الموضحة أعلاه.
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [({ 'n' : 'integers(1,20)' }, "myfib(n+2) == myfib(n+1)+myfib(n)" )])
def myfib ( n : int ) -> int :
""
تعتبر TestCases من إطار عمل Unittest المدمج هي الخيار الأخير للاختبار، ويمكن استخدامها عن طريق إعطاء Pythoness TestCases أو وحدة من TestCases:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
يمكنك أيضًا توجيه Pythoness من خلال إعطائها الوظائف والفئات المرتبطة بالكود الذي ستنشئه. ويستخدم مستندات الوظائف والفئات المقدمة لفهم الغرض منها. يمكن لـ Pythoness الاستفادة من الوظائف التي سيتم إنشاؤها بنفسها بهذه الطريقة، حيث يتم تحديد سلسلة المستندات في spec
.
related_objs
عبارة عن قائمة يمكن أن تتضمن وظائف أو فئات أو سلاسل خاصة:
'cls'
الذي يمثل كل شيء في الفصل الذي تحتوي عليه الوظيفة التي تم إنشاؤها، إلى جانب نفسها'*'
الذي يمثل كل شيء في الملف الذي تحتوي عليه الوظيفة التي تم إنشاؤها، بالإضافة إلى نفسها @ pythoness . spec ( "Encodes a string using a single-shift Caesar cipher" )
def encode ( s : str ) -> str :
""
@ pythoness . spec ( "Decodes a string given to encode()" , related_objs = [ encode ])
def decode ( s : str ) -> str :
""
عند العمل مع الفئات، من الأفضل استخدام ميزة __slots__
الخاصة ببايثون. في حين أن Pythoness يمكن أن تعمل بدونها، فإن هذا يزيد من اتساق Pythoness.
يمكنك جعل Pythoness تستبدل المواصفات مباشرة في ملفك بالوظيفة التي تم إنشاؤها: فقط أضف `replace=True':
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ],
replace = True )
def myfib ( n : int ) -> int :
""
على سبيل المثال، أنتجت Pythoness هذا الكود:
def myfib(n: int) -> int:
"""
Compute the nth number in the Fibonacci series.
:param n: The position of the desired number in the Fibonacci series
:type n: int
:return: The nth number in the Fibonacci series
:rtype: int
"""
if n <= 0:
raise ValueError("n must be a positive integer")
elif n == 1 or n == 2:
return 1
else:
fib1, fib2 = 1, 1
for _ in range(3, n + 1):
fib1, fib2 = fib2, fib1 + fib2
return fib2
يمكنك أيضًا استبدال كل دالة تم إنشاؤها باستخدام متغير البيئة "PYNS_REPLACE":
env ' PYNS_REPLACE ' =1
تقدم Pythoness عدة طرق أخرى للتحكم في سلوكها. هذه كلها حجج spec
. تشير القيم المقدمة إلى القيمة الافتراضية.
max_retries=3
: يتحكم في الحد الأقصى لعدد مرات إعادة المحاولة بسبب حالات الفشل (على سبيل المثال، دالة تفشل في أحد الاختبارات المتوفرة).
model='gpt-4o'
: يتحكم في نموذج LLM المطلوب الاستعلام عنه
timeout_seconds=0
: يحدد مقدار الوقت لمحاولة Pythoness واحدة لانتهاء المهلة. بشكل افتراضي، لا توجد مهلة.
verbose=False
: اضبط هذا على True
حتى تتمكن Pythoness من إخراج التفاصيل أثناء إنشاء التعليمات البرمجية والتحقق من صحتها. مفيد في الغالب للمطورين ولمراقبة التقدم. يمكن ضبطها لكل وظيفة مرة واحدة باستخدام متغير البيئة "PYNS_VERBOSE".
regenerate=False
: اضبط هذا على True
لإنشاء تعليمات برمجية جديدة في كل مرة يتم فيها استدعاء دالة، بدلاً من تخزينها وإعادة استخدامها.
output=False
: اضبط هذا على True
لكي تقوم Pythoness بإخراج الكود الذي تم إنشاؤه في المرة الأولى التي يتم فيها استدعاء الوظيفة.