? LLM を活用したアプリケーションの継続的インテグレーション ???
BenchLLMは、大規模言語モデル (LLM) と AI を利用したアプリケーションのテストを合理化する Python ベースのオープンソース ライブラリです。 LLM を介して任意の数のテストで応答を検証することで、モデル、エージェント、またはチェーンの精度を測定します。
BenchLLM は、LLM アプリケーションを改善するために V7 で積極的に使用されており、現在は MIT ライセンスの下でオープンソース化され、より幅広いコミュニティと共有されています。
BenchLLM を使用して次のことを行います。
️ 注: BenchLLM は開発の初期段階にあり、急速に変更される可能性があります。バグ報告、機能リクエスト、または貢献については、GitHub ページで問題を開くか、プル リクエスト (PR) を送信してください。
BenchLLM は、機械学習モデルを検証するための明確な 2 段階の方法論を実装します。
テスト: この段階では、任意の数の予想される応答に対してコードを実行し、即時の判断や比較を行わずにモデルによって生成された予測を取得します。
評価: 記録された予測は、LLM を使用して予想される出力と比較され、事実の類似性が検証されます (またはオプションで手動で)。合否ステータスやその他の指標を含む詳細な比較レポートが生成されます。
この系統的な分離により、モデルのパフォーマンスを包括的に把握できるようになり、各ステップの制御と改善が可能になります。
BenchLLM をインストールするには pip を使用します
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 は、Python コード内のinput
引数の型を抽出し、それに応じて YAML ファイルからinput
フィールドを読み込みます。
デフォルトでは、BenchLLM はsemantic
エバリュエーターに OpenAI の GPT-3 モデルを使用します。これには、 OPENAI_API_KEY
環境変数を設定する必要があります。このデフォルトのエバリュエーターを使用したくない場合は、代替エバリュエーターを指定できます (以下で詳しく説明します)。
export OPENAI_API_KEY= ' your-api-key '
「your-api-key」を実際の OpenAI API キーに置き換えます。
テストを開始するには、 bench run
コマンドを使用します。
$ bench run
デフォルトでは、ベンチ実行コマンドは、現在のディレクトリで @test デコレータを実装する Python ファイルを検索します。特定のファイルまたはフォルダーをターゲットにするには、それを直接指定します。
$ 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
、単純なローカル Web インターフェイスに pywebio を使用します非対話型エバリュエーターは、評価を並行して実行するための--workers N
もサポートしています。
$ bench run --evaluator string-match --workers 5
評価プロセスを高速化するために、BenchLLM はキャッシュを使用します。 (予測、期待) ペアが過去に評価されており、キャッシュが使用されている場合、評価出力は将来の評価のために保存されます。キャッシュにはいくつかの種類があります。
memory
、現在の実行中に出力値のみをキャッシュします。これは、 --retry-count N
指定して実行する場合に特に便利です。file
、実行の最後にキャッシュを JSON ファイルとして Output/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
上の例では、 forecast
モジュールの関数get_n_day_weather_forecast
がモック化されています。つまり、この関数が呼び出されるたびに、モデルは"It's sunny in London"
を受け取ります。 BenchLLM は、関数がget_n_day_weather_forecast(location=London, num_days=1)
とは異なる引数値で呼び出された場合にも警告を出します。これらの引数パラメータの指定はオプションであることに注意してください。
ベンチ実行では各テスト関数を実行してその出力を評価しますが、多くの場合、これらを 2 つのステップに分けることが有益です。たとえば、人に手動で評価を実行してもらいたい場合や、同じ関数に対して複数の評価方法を試したい場合などです。
$ bench run --no-eval
これにより、 output/latest/predictions
に json ファイルが生成されます。その後、それらを次のように評価できます。
$ 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
使用してキャッシュを有効にし、 StringMatchEvaluator
のworkers
パラメーターを2
に設定して並列評価を可能にします。キャッシュ結果はPath("path/to/cache.json")
で指定されたファイルに保存されます。
bench add
: 新しいテストをスイートに追加します。bench tests
: スイート内のすべてのテストをリストします。bench run
: すべてまたはターゲットのテスト スイートを実行します。bench eval
: 既存のテスト実行の評価を実行します。 BenchLLM は Python 3.10 用に開発されていますが、他の Python バージョンでも動作する可能性があります。 Python 3.10 環境および pip >= 23 を使用することをお勧めします。conda またはその他の環境マネージャーを使用して環境をセットアップできます。
$ conda create --name benchllm python=3.10
$ conda activate benchllm
$ pip install -e " .[dev] "
すべてのサンプルを実行するには、まずサンプルの追加の依存関係をインストールします。
$ pip install -e " .[examples] "
貢献の手順:
私たちは PEP8 スタイル ガイドに準拠しています。投稿する際はこのガイドに従ってください。
サポートが必要な場合は、お気軽に GitHub ページで問題を開いてください。