? Kontinuierliche Integration für LLM-basierte Anwendungen ???
BenchLLM ist eine Python-basierte Open-Source-Bibliothek, die das Testen von Large Language Models (LLMs) und KI-gestützten Anwendungen optimiert. Es misst die Genauigkeit Ihres Modells, Ihrer Agenten oder Ketten, indem es die Antworten auf eine beliebige Anzahl von Tests über LLMs validiert.
BenchLLM wird bei V7 aktiv zur Verbesserung unserer LLM-Anwendungen eingesetzt und ist jetzt Open Source unter MIT-Lizenz, um es mit der breiteren Community zu teilen
Verwenden Sie BenchLLM, um:
️ HINWEIS: BenchLLM befindet sich in einem frühen Entwicklungsstadium und unterliegt schnellen Änderungen.Für Fehlerberichte, Funktionsanfragen oder Beiträge öffnen Sie bitte ein Problem oder senden Sie eine Pull-Anfrage (PR) auf unserer GitHub-Seite.
BenchLLM implementiert eine eindeutige zweistufige Methodik zur Validierung Ihrer maschinellen Lernmodelle:
Testen : In dieser Phase wird Ihr Code mit einer beliebigen Anzahl erwarteter Antworten verglichen und die von Ihrem Modell erzeugten Vorhersagen ohne sofortige Beurteilung oder Vergleich erfasst.
Auswertung : Die aufgezeichneten Vorhersagen werden mithilfe von LLMs mit der erwarteten Ausgabe verglichen, um die sachliche Ähnlichkeit zu überprüfen (oder optional manuell). Es werden detaillierte Vergleichsberichte erstellt, einschließlich des Pass/Fail-Status und anderer Kennzahlen.
Diese methodische Trennung bietet einen umfassenden Überblick über die Leistung Ihres Modells und ermöglicht eine bessere Kontrolle und Verfeinerung jedes Schritts.
Zur Installation von BenchLLM verwenden wir pip
pip install benchllm
Beginnen Sie mit dem Importieren der Bibliothek und markieren Sie mit dem @benchllm.test-Dekorator die Funktion, die Sie testen möchten:
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 )
Bereiten Sie als Nächstes Ihre Tests vor. Dabei handelt es sich um YAML/JSON-Dateien, die wie folgt aufgebaut sind:
input : What's 1+1? Be very terse, only numeric output
expected :
- 2
- 2.0
Im obigen Beispiel handelt es sich bei der input
um die Abfrage oder Anweisung, die Ihr Modell verarbeiten wird, und expected
Eingabe enthält die potenziellen Antworten, die Ihr Modell zurückgeben sollte. Es ist wichtig zu beachten, dass input
eine einfache str
oder ein komplexeres verschachteltes Wörterbuch sein kann. BenchLLM extrahiert den Typ des input
im Python-Code und lädt das input
entsprechend aus der YAML-Datei.
Standardmäßig verwendet BenchLLM das GPT-3-Modell von OpenAI für den semantic
Evaluator. Dies erfordert das Setzen der Umgebungsvariablen OPENAI_API_KEY
. Wenn Sie diesen Standardauswerter nicht verwenden möchten, können Sie einen alternativen Auswerter angeben (weiter unten ausführlicher erläutert):
export OPENAI_API_KEY= ' your-api-key '
Ersetzen Sie „Ihr-API-Schlüssel“ durch Ihren tatsächlichen OpenAI-API-Schlüssel.
Um den Test zu starten, verwenden Sie den bench run
-Befehl:
$ bench run
Standardmäßig sucht der Bench-Run-Befehl im aktuellen Verzeichnis nach Python-Dateien, die den @test-Decorator implementieren. Um eine bestimmte Datei oder einen bestimmten Ordner als Ziel festzulegen, geben Sie ihn/sie direkt an:
$ bench run path/to/my/file.py or/path/to/folder/with/files
Der Parameter --retry-count
ermöglicht BenchLLM, einen Test mehrmals auszuführen, was für Modelle nützlich ist, deren Ausgaben möglicherweise variieren:
$ bench run --retry-count 5
BenchLLM bietet mehrere Bewertungsmethoden, um festzustellen, ob die Vorhersage mit den erwarteten Werten des Testfalls übereinstimmt. Mit dem Parameter --evaluator
können Sie die Auswertungsmethode angeben:
Es gibt mehrere Möglichkeiten, um zu bewerten, ob die Vorhersage der Testfunktionen mit den erwarteten Werten der Testfälle übereinstimmt. Standardmäßig wird GPT-3 zum Vergleichen der Ausgabe verwendet. Sie können --evaluator
verwenden, um eine andere Methode zu verwenden
semantic
prüft die semantische Ähnlichkeit mithilfe von Sprachmodellen wie GPT-3, GPT-3.5 oder GPT-4 (Parameter --model
). Bitte beachten Sie, dass Sie für diesen Evaluator die Umgebungsvariable OPENAI_API_KEY
festlegen müssen.embedding
verwendet den Kosinusabstand zwischen eingebetteten Vektoren. Bitte beachten Sie, dass Sie für diesen Evaluator die Umgebungsvariable OPENAI_API_KEY
festlegen müssen.string-match
, prüft, ob die Zeichenfolgen übereinstimmen (ohne Berücksichtigung der Groß- und Kleinschreibung)interactive
: Der Benutzer akzeptiert manuell Tests im Terminal oder besteht sie nichtweb
, verwendet Pywebio für eine einfache lokale Weboberfläche Die nicht interaktiven Evaluatoren unterstützen auch die parallele Ausführung der Evaluierungen durch --workers N
$ bench run --evaluator string-match --workers 5
Um den Auswertungsprozess zu beschleunigen, verwendet BenchLLM einen Cache. Wenn ein (Vorhersage, erwartetes) Paar in der Vergangenheit ausgewertet wurde und ein Cache verwendet wurde, wird die Auswertungsausgabe für zukünftige Auswertungen gespeichert. Es gibt verschiedene Arten von Caches:
memory
speichert Ausgabewerte nur während der aktuellen Ausführung zwischen. Dies ist besonders nützlich, wenn mit --retry-count N
ausgeführt wirdfile
speichert den Cache am Ende des Laufs als JSON-Datei in „output/cache.json“. Dies ist das Standardverhalten.none
, verwendet keinen Cache. $ bench run examples --cache memory
Wenn Sie an der Entwicklung von Ketten oder dem Training von Agentenmodellen arbeiten, kann es Fälle geben, in denen diese Modelle mit externen Funktionen interagieren müssen – beispielsweise das Abfragen einer Wettervorhersage oder das Ausführen einer SQL-Abfrage. In solchen Szenarien erleichtert BenchLLM die Möglichkeit, diese Funktionen zu verspotten. Dadurch können Sie Ihre Tests vorhersehbarer machen und unerwartete Funktionsaufrufe erkennen.
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
Im obigen Beispiel wird die Funktion get_n_day_weather_forecast
im forecast
simuliert. Mit anderen Worten: Jedes Mal, wenn diese Funktion aufgerufen wird, erhält das Modell "It's sunny in London"
. BenchLLM stellt außerdem Warnungen bereit, wenn die Funktion mit anderen Argumentwerten als get_n_day_weather_forecast(location=London, num_days=1)
aufgerufen wird. Bitte beachten Sie, dass die Bereitstellung dieser Argumentparameter optional ist.
Während im Bench-Run jede Testfunktion ausgeführt und dann deren Ausgabe ausgewertet wird, kann es oft von Vorteil sein, diese in zwei Schritte zu unterteilen. Wenn Sie beispielsweise möchten, dass eine Person die Bewertung manuell durchführt, oder wenn Sie mehrere Bewertungsmethoden für dieselbe Funktion ausprobieren möchten.
$ bench run --no-eval
Dadurch werden JSON-Dateien in output/latest/predictions
generiert. Später können Sie sie mit auswerten
$ bench eval output/latest/predictions
Für eine detailliertere Steuerung bietet BenchLLM eine API. Sie müssen keine YML/JSON-Tests hinzufügen, um Ihr Modell bewerten zu können. Sie können stattdessen:
Test
instanziierenTester
-Objekt, um Vorhersagen zu generierenEvaluator
-Objekt, um Ihr Modell auszuwerten 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 )
Wenn Sie Caching integrieren und mehrere parallele Evaluierungsjobs ausführen möchten, können Sie Ihren Evaluator wie folgt ändern:
from benchllm . cache import FileCache
...
evaluator = FileCache ( StringMatchEvaluator ( workers = 2 ), Path ( "path/to/cache.json" ))
evaluator . load ( predictions )
results = evaluator . run ()
In diesem Beispiel wird FileCache
verwendet, um das Caching zu aktivieren, und der workers
-Parameter von StringMatchEvaluator
wird auf 2
gesetzt, um parallele Auswertungen zu ermöglichen. Die Cache-Ergebnisse werden in einer durch Path("path/to/cache.json")
angegebenen Datei gespeichert.
bench add
: Einen neuen Test zu einer Suite hinzufügen.bench tests
: Listen Sie alle Tests in einer Suite auf.bench run
: Führen Sie alle Testsuiten oder Zieltests aus.bench eval
: Führt die Bewertung eines vorhandenen Testlaufs durch. BenchLLM wurde für Python 3.10 entwickelt, funktioniert jedoch möglicherweise auch mit anderen Python-Versionen. Wir empfehlen die Verwendung einer Python 3.10-Umgebung und pip >= 23. Sie können Conda oder einen anderen Umgebungsmanager verwenden, um die Umgebung einzurichten:
$ conda create --name benchllm python=3.10
$ conda activate benchllm
$ pip install -e " .[dev] "
Um alle Beispiele auszuführen, installieren Sie zunächst die zusätzlichen Abhängigkeiten der Beispiele
$ pip install -e " .[examples] "
Beitragsschritte:
Wir halten uns an den PEP8-Styleguide. Bitte befolgen Sie diese Anleitung, wenn Sie Beiträge leisten.
Wenn Sie Unterstützung benötigen, können Sie gerne ein Problem auf unserer GitHub-Seite eröffnen.