Pythoness: デルフィのアポロンの神託の巫女。
Emery Berger による Pythoness、Kyle Gwilt と Stephen Freund による拡張
Pythoness は、自然言語の記述とテストから Python コードを自動的に生成します。
注Pythoness が機能するには、LLM に接続する必要があります。以下は、Pythoness を OpenAI アカウントに接続する方法の例です。他の LLM については、そのドキュメントを参照してください。
OpenAIアカウント。これを機能させるには、アカウントにプラスの残高が必要です(残高を確認してください)。クレジットを購入したことがない場合は、少なくとも 1 ドル (API アカウントが 2023 年 8 月 13 日より前に作成された場合) または 0.50 ドル (新しい API アカウントをお持ちの場合) のクレジットを購入する必要があります。ここで鍵を入手します。
API キーを取得したら、それを
OPENAI_API_KEY
という環境変数として設定します。export OPENAI_API_KEY= < your-api-key >
Pythoness をインストールする最も簡単な方法は、pip を使用することです。
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 :
""
このコードは、フィボナッチ数列の n 番目の数値を計算するmyfib
という名前の Python 関数を内部的に生成します。実際に関数を実行するには、他の Python 関数と同じように呼び出すことができます。
for i in range ( 20 ):
print ( myfib ( i ))
Pythoness は自然言語を Python に翻訳した結果をキャッシュするため、同じディレクトリ内での後続の実行ははるかに高速になります (Pythoness は、これらの翻訳を保存するpythoness-cache.db
というデータベースを作成します)。
すべてのログ メッセージをオフにするには、 PYNS_QUIET
環境変数を使用します。
env PYNS_QUIET=1 python3 myfib.py
いくつかのテストを提供することで、Pythoness をガイドできます。 Pythoness は、Python コードの生成と検証の両方にテストを使用します。テストは、すべてTrue
と評価される Python コードまたは関数を含む単なる文字列のリストです。
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ])
def myfib ( n : int ) -> int :
""
プロパティベースのテストを使用して Pythoness をガイドすることもできます。これを行うには、プログラムに表示させたいプロパティを記述します。 Pythoness はプロパティベースのテスター (仮説) を実行し、生成された関数が指定されたプロパティを満たしていることを確認するためにテストを何度も実行します。このアプローチは、上で説明した単体テストよりもはるかに強力です。
@ 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 はテストの最終オプションであり、Pythoness TestCases または TestCases のモジュールを提供することで使用できます。
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
生成するコードに関連する関数やクラスを Pythoness に与えることで、Pythoness をさらにガイドすることができます。提供された関数とクラスの docstring を使用して、その目的を理解します。 Pythoness は、この方法で自身で生成される関数を利用できます。この場合、 docstring は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 :
""
クラスを操作するときは、Python の__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
: 失敗 (提供されたテストの 1 つに失敗した関数など) による再試行の最大数を制御します。
model='gpt-4o'
: どの LLM モデルをクエリするかを制御します
timeout_seconds=0
: Pythoness の 1 回の試行がタイムアウトするまでの時間を設定します。デフォルトでは、タイムアウトはありません。
verbose=False
: これをTrue
に設定すると、Pythoness はコードの生成と検証時に詳細を出力します。主に開発者にとって、また進行状況を監視するために役立ちます。 「PYNS_VERBOSE」環境変数を使用して、すべての関数を一度に設定できます。
regenerate=False
: これをTrue
に設定すると、関数が呼び出されるたびに、コードを保存して再利用するのではなく、新しいコードが生成されます。
output=False
: これをTrue
に設定すると、関数が初めて呼び出されたときに Pythoness が生成されたコードを出力します。