配置
YAML 配置格式通过一系列示例输入(即“测试用例”)运行每个提示,并检查它们是否满足要求(即“断言”)。
断言是_可选的_。许多人通过手动审查输出获得价值,而 Web UI 有助于促进这一点。
示例
假设我们正在构建一个进行语言翻译的应用。此配置通过 GPT-3.5 和 Gemini 运行每个提示,替换 language 和 input 变量:
prompts:
- file://prompt1.txt
- file://prompt2.txt
providers:
- openai:gpt-4o-mini
- vertex:gemini-pro
tests:
- vars:
language: French
input: Hello world
- vars:
language: German
input: How's it going?
有关设置提示文件的更多信息,请参阅 输入和输出文件。
运行 promptfoo eval 通过此配置将生成一个_矩阵视图_,您可以使用它来评估 GPT 与 Gemini。
使用断言验证输出
接下来,让我们添加一个断言。这将自动拒绝任何不包含 JSON 的输出:
prompts:
- file://prompt1.txt
- file://prompt2.txt
providers:
- openai:gpt-4o-mini
- vertex:gemini-pro
tests:
- vars:
language: French
input: Hello world
assert:
- type: contains-json
- vars:
language: German
input: How's it going?
我们可以创建额外的测试。让我们添加一些其他 类型的断言。对于单个测试用例,使用断言数组以确保满足所有条件。
在此示例中,javascript 断言针对 LLM 输出运行 Javascript。similar 断言使用嵌入检查语义相似性:
prompts:
- file://prompt1.txt
- file://prompt2.txt
providers:
- openai:gpt-4o-mini
- vertex:gemini-pro
tests:
- vars:
language: French
input: Hello world
assert:
- type: contains-json
- type: javascript
value: output.toLowerCase().includes('bonjour')
- vars:
language: German
input: How's it going?
assert:
- type: similar
value: was geht
threshold: 0.6 # 余弦相似度
要了解更多关于断言的信息,请参阅配置 预期输出 的文档。
从单独的文件导入提供者
providers 配置属性可以指向文件列表。例如:
providers:
- file://path/to/provider1.yaml
- file://path/to/provider2.json
提供者文件如下所示:
id: openai:gpt-4o-mini
label: Foo bar
config:
temperature: 0.9
从单独的文件导入测试
tests 配置属性接受文件或目录路径列表。例如:
prompts: file://prompts.txt
providers: openai:gpt-4o-mini
# 加载并运行匹配这些文件路径的所有测试用例
tests:
# 您可以提供一个确切的文件路径
- file://tests/tests2.yaml
# 或通配符(通配符)
- file://tests/*
# 混合匹配实际测试用例
- vars:
var1: foo
var2: bar
单个字符串也是有效的:
tests: tests/*
或路径列表:
tests:
- 'tests/accuracy'
- 'tests/creativity'
- 'tests/hallucination'
我们还支持从 本地文件 和 Google Sheets 导入 CSV 数据集。
从单独的文件导入变量
vars 属性可以指向文件或目录。例如:
tests:
- vars: file://path/to/vars*.yaml
您还可以通过使用 file:// 前缀从文件加载单个变量。例如:
tests:
- vars:
var1: some value...
var2: another value...
var3: file://path/to/var3.txt
支持 Javascript 和 Python 变量文件。例如:
tests:
- vars:
context: file://fetch_from_vector_database.py
这在测试 Pinecone、Chroma、Milvus 等向量数据库时很有用。
Javascript 变量
要动态加载来自 JavaScript 文件的变量,请在 YAML 配置中使用 file:// 前缀,指向导出函数的 JavaScript 文件。
tests:
- vars:
context: file://path/to/dynamicVarGenerator.js
dynamicVarGenerator.js 接收 varName、prompt 和 otherVars 作为参数,您可以使用这些参数根据测试上下文查询数据库或任何其他内容:
module.exports = function (varName, prompt, otherVars) {
// 根据 varName 返回值的示例逻辑
if (varName === 'context') {
return {
output: `已处理 ${otherVars.input} 用于提示: ${prompt}`,
};
}
return {
output: '默认值',
};
// 处理潜在错误
// return { error: '错误信息' }
};
这个 JavaScript 文件根据提供的上下文处理输入变量并返回一个动态值。
Python 变量
对于 Python,方法类似。定义一个包含 get_var 函数的 Python 脚本来生成变量的值。该函数应接受 var_name、prompt 和 other_vars。
tests:
- vars:
context: file://fetch_dynamic_context.py
fetch_dynamic_context.py:
def get_var(var_name: str, prompt: str, other_vars: Dict[str, str]) -> Dict[str, str]:
# 注意:必须返回一个包含 'output' 键或 'error' 键的字典。
# 示例逻辑以动态生 成变量内容
if var_name == 'context':
return {
'output': f"Context for {other_vars['input']} in prompt: {prompt}"
}
return {'output': 'default context'}
# 处理潜在错误
# return { 'error': '错误信息' }
避免重复
默认测试用例
使用 defaultTest 为所有测试设置属性。
在此示例中,我们使用 llm-rubric 断言来确保 LLM 不将自己描述为 AI。此检查适用于所有测试用例:
prompts:
- file://prompt1.txt
- file://prompt2.txt
providers:
- openai:gpt-4o-mini
- vertex:gemini-pro
defaultTest:
assert:
- type: llm-rubric
value: does not describe self as an AI, model, or chatbot
tests:
- vars:
language: French
input: Hello world
assert:
- type: contains-json
- type: javascript
value: output.toLowerCase().includes('bonjour')
- vars:
language: German
input: How's it going?
assert:
- type: similar
value: was geht
threshold: 0.6
你也可以使用 defaultTest 来覆盖每个测试使用的模型。这对于 模型评级的评估 非常有用:
defaultTest:
options:
provider: openai:gpt-4o-mini-0613
YAML 引用
promptfoo 配置支持 JSON 模式 引用,这些引用定义了可重用的块。
使用 $ref 键来重用断言,而不必多次完全定义它们。以下是一个示例:
prompts:
- file://prompt1.txt
- file://prompt2.txt
providers:
- openai:gpt-4o-mini
- vertex:gemini-pro
tests:
- vars:
language: French
input: Hello world
assert:
- $ref: '#/assertionTemplates/startsUpperCase'
- vars:
language: German
input: How's it going?
assert:
- $ref: '#/assertionTemplates/noAIreference'
- $ref: '#/assertionTemplates/startsUpperCase'
assertionTemplates:
noAIreference:
type: llm-rubric
value: does not describe self as an AI, model, or chatbot
startsUpperCase:
type: javascript
value: output[0] === output[0].toUpperCase()
提供者配置中的 tools 和 functions 值不会被解引用。这是因为它们是独立的 JSON 模式,可能包含自己的内部引用。
单个测试用例中的多个变量
测试中的 vars 映射也支持数组值。如果值是数组,测试用例将运行每个值的组合。
例如:
prompts: file://prompts.txt
providers:
- openai:gpt-4o-mini
- openai:gpt-4
tests:
- vars:
language:
- French
- German
- Spanish
input:
- 'Hello world'
- 'Good morning'
- 'How are you?'
assert:
- type: similar
value: 'Hello world'
threshold: 0.8
评估每个 language x input 组合: