? LLM 支持的应用程序的持续集成???
BenchLLM是一个基于 Python 的开源库,可简化大型语言模型 (LLM) 和人工智能驱动的应用程序的测试。它通过法学硕士验证任意数量的测试的响应来衡量模型、代理或链的准确性。
BenchLLM 在 V7 中被积极使用,以改进我们的 LLM 应用程序,现在根据 MIT 许可证开源,以便与更广泛的社区共享
使用 BenchLLM 可以:
️ 注意: BenchLLM 处于开发的早期阶段,将会发生快速变化。对于错误报告、功能请求或贡献,请在我们的 GitHub 页面上提出问题或提交拉取请求 (PR)。
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 将提取 Python 代码中input
参数的类型,并相应地从 YAML 文件中加载input
字段。
默认情况下,BenchLLM 使用 OpenAI 的 GPT-3 模型作为semantic
评估器。这需要设置OPENAI_API_KEY
环境变量。如果您不想使用此默认评估器,则可以指定替代评估器(下面将进一步详细讨论):
export OPENAI_API_KEY= ' your-api-key '
将“your-api-key”替换为您的实际 OpenAI API 密钥。
要启动测试,请使用bench run
命令:
$ 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
,使用 pywebio 作为简单的本地 Web 界面非交互式评估器还支持--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"
。如果使用与get_n_day_weather_forecast(location=London, num_days=1)
不同的参数值调用函数,BenchLLM 还会发出警告。请注意,这些实参参数的提供是可选的。
虽然基准运行运行每个测试函数,然后评估其输出,但将它们分为两个步骤通常是有益的。例如,如果您希望有人手动进行评估,或者您想对同一功能尝试多种评估方法。
$ 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 页面上提出问题。