? Непрерывная интеграция для приложений на базе LLM ???
BenchLLM — это библиотека с открытым исходным кодом на основе Python, которая упрощает тестирование больших языковых моделей (LLM) и приложений на базе искусственного интеллекта. Он измеряет точность вашей модели, агентов или цепочек путем проверки ответов на любое количество тестов через LLM.
BenchLLM активно используется в V7 для улучшения наших приложений LLM и теперь имеет открытый исходный код под лицензией MIT, чтобы поделиться им с более широким сообществом.
Используйте BenchLLM, чтобы:
️ ПРИМЕЧАНИЕ. BenchLLM находится на ранней стадии разработки и в него могут вноситься быстрые изменения.Чтобы сообщить об ошибках, запросить новые функции или внести свой вклад, откройте проблему или отправьте запрос на включение (PR) на нашей странице GitHub.
BenchLLM реализует отдельную двухэтапную методологию проверки ваших моделей машинного обучения:
Тестирование . Этот этап включает в себя запуск вашего кода с любым количеством ожидаемых ответов и сбор прогнозов, полученных с помощью вашей модели, без немедленной оценки или сравнения.
Оценка : записанные прогнозы сравниваются с ожидаемыми результатами с использованием 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 извлечет тип input
аргумента в коде Python и соответствующим образом загрузит поле input
из файла YAML.
По умолчанию BenchLLM использует модель GPT-3 OpenAI для semantic
оценщика. Для этого необходимо установить переменную среды OPENAI_API_KEY
. Если вы не хотите использовать этот оценщик по умолчанию, вы можете указать альтернативный (более подробно обсуждается ниже):
export OPENAI_API_KEY= ' your-api-key '
Замените «ваш-api-ключ» своим фактическим ключом API OpenAI.
Чтобы начать тестирование, используйте команду 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 в файле 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
В приведенном выше примере высмеивается функция 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 и pip >= 23. Вы можете использовать conda или любой другой менеджер среды для настройки среды:
$ conda create --name benchllm python=3.10
$ conda activate benchllm
$ pip install -e " .[dev] "
Чтобы запустить все примеры, сначала установите дополнительные зависимости примеров.
$ pip install -e " .[examples] "
Шаги по вкладу:
Мы придерживаемся руководства по стилю PEP8. Пожалуйста, следуйте этому руководству при внесении вклада.
Если вам нужна поддержка, смело открывайте вопрос на нашей странице GitHub.