promptfoo:打造可靠安全的LLM应用
在人工智能和大语言模型(LLM)快速发展的今天,如何确保基于LLM的应用程序的质量、安全性和可靠性成为了开发者面临的一大挑战。promptfoo应运而生,它是一款功能强大的开源工具,专门用于测试、评估和红队测试LLM应用,帮助开发者构建更加可靠、安全的AI系统。
promptfoo的核心功能
promptfoo提供了一系列强大的功能,使LLM应用的测试和评估变得简单高效:
-
多模型支持:支持OpenAI、Anthropic、Azure、Google等主流LLM提供商,以及Llama等开源模型。
-
自动化评分:通过定义各种断言类型,实现对LLM输出的自动化评分。
-
红队测试:内置红队测试功能,帮助发现潜在的安全漏洞。
-
详细报告:生成矩阵视图和风险报告,直观展示评估结果。
-
CI/CD集成:支持命令行和CI/CD集成,实现持续测试。
-
高度可定制:提供灵活的配置选项,满足不同场景的需求。
工作流程
promptfoo的典型工作流程如下:
- 建立测试用例:确定核心用例和可能的失败情况。
- 探索提示词修改:使用
promptfoo eval
评估所有输出。 - 持续完善:随着用户反馈的收集,不断扩充测试用例池。
为什么选择promptfoo?
promptfoo相比其他评估工具有以下优势:
- 开发者友好:快速、高效,支持实时重载和缓存等功能。
- 经过实战检验:最初为服务超过1000万用户的LLM应用而开发。
- 简单声明式测试用例:无需编写代码或使用复杂的笔记本。
- 语言无关:支持Python、JavaScript等多种编程语言。
- 协作功能:内置分享功能和Web查看器,方便团队协作。
- 完全开源:100%开源项目,无任何附加条件。
- 注重隐私:软件完全在本地运行,直接与LLM通信。
使用方法
评估功能
要开始使用promptfoo,只需运行以下命令:
npx promptfoo@latest init
这将在当前目录创建一个promptfooconfig.yaml
占位文件。编辑提示词和变量后,运行以下命令启动评估:
npx promptfoo@latest eval
红队测试/渗透测试
运行以下命令开始红队测试:
npx promptfoo@latest redteam init
这将引导您完成设置过程,包括选择要查找的漏洞类型等。
配置
promptfoo使用YAML配置格式,将每个提示词应用于一系列示例输入(即"测试用例"),并检查它们是否满足要求(即"断言")。
以下是一个简单的配置示例:
prompts: [prompt1.txt, prompt2.txt]
providers: [openai:gpt-4o-mini, ollama:llama2:70b]
tests:
- description: '测试翻译为法语'
vars:
language: French
input: Hello world
assert:
- type: contains-json
- type: javascript
value: output.length < 100
- description: '测试翻译为德语'
vars:
language: German
input: How's it going?
assert:
- type: llm-rubric
value: does not describe self as an AI, model, or chatbot
- type: similar
value: was geht
threshold: 0.6 # 余弦相似度
支持的断言类型
promptfoo支持多种断言类型,包括确定性评估指标和模型辅助评估指标。以下是部分支持的断言类型:
确定性评估指标:
equals
:输出完全匹配contains
:输出包含子字符串regex
:输出匹配正则表达式is-json
:输出是有效的JSONjavascript
:提供的JavaScript函数验证输出python
:提供的Python函数验证输出
模型辅助评估指标:
similar
:使用嵌入和余弦相似度进行评估classifier
:通过分类器运行LLM输出llm-rubric
:使用语言模型根据给定标准评分LLM输出factuality
:确保LLM输出符合给定事实moderation
:确保输出安全
每种断言类型都可以通过添加not-
前缀来取反,例如not-equals
或not-regex
。
从电子表格导入测试
对于喜欢在CSV中配置LLM测试的用户,可以使用以下简单配置:
prompts: [prompts.txt]
providers: [openai:gpt-4o-mini]
tests: tests.csv
命令行使用
promptfoo提供了丰富的命令行选项,以下是一些常用选项:
-p, --prompts <paths...>
:提示词文件路径-r, --providers <name or path...>
:API提供商-o, --output <path>
:输出文件路径--tests <path>
:外部测试文件路径-c, --config <paths>
:配置文件路径-j, --max-concurrency <number>
:最大并发API调用数
示例
提示词质量评估
以下示例评估在助手机器人的个性中添加形容词是否影响响应:
npx promptfoo eval -p prompts.txt -r openai:gpt-4o-mini -t tests.csv
模型质量评估
以下示例评估GPT-3和GPT-4对给定提示词的输出差异:
npx promptfoo eval -p prompts.txt -r openai:gpt-3.5-turbo openai:gpt-4 -o output.html
作为Node包使用
promptfoo也可以作为库在项目中使用。以下是一个简单的示例:
import promptfoo from 'promptfoo';
const results = await promptfoo.evaluate({
prompts: ['Rephrase this in French: {{body}}', 'Rephrase this like a pirate: {{body}}'],
providers: ['openai:gpt-4o-mini'],
tests: [
{
vars: {
body: 'Hello world',
},
},
{
vars: {
body: "I'm hungry",
},
},
],
});
安装
promptfoo支持多种安装方式,包括npm、npx、Homebrew和从源代码安装。以下是使用npm全局安装的方法:
npm install -g promptfoo
安装完成后,可以通过运行以下命令验证安装:
promptfoo --version
开发
对于想要参与promptfoo开发的开发者,可以按照以下步骤在本地构建和运行:
-
克隆仓库:
git clone https://github.com/promptfoo/promptfoo.git cd promptfoo
-
安装依赖:
npm i
-
运行评估:
npx path/to/promptfoo-source eval
promptfoo欢迎社区贡献,无论是提交pull request还是开启issue都是受欢迎的。
结语
promptfoo为LLM应用开发者提供了一个强大而灵活的工具,帮助他们构建更加可靠、安全的AI系统。通过自动化测试、评估和红队测试,开发者可以更好地了解他们的LLM应用的性能和潜在风险,从而不断改进和优化。
随着AI技术的不断发展,像promptfoo这样的工具将在确保AI应用的质量和安全性方面发挥越来越重要的作用。无论您是正在开发新的LLM应用,还是想要评估和改进现有的AI系统,promptfoo都是一个值得尝试的强大工具。
🔗 查看完整文档
通过使用promptfoo,开发者可以更加自信地构建和部署LLM应用,为用户提供更好的AI体验。让我们一起努力,推动AI技术的健康发展,创造更加智能、安全的未来!