Skip to main content

Python 断言

python 断言允许你提供一个自定义的 Python 函数来验证 LLM 输出。

一个名为 output 的变量会被注入到上下文中。如果输出通过断言,函数应返回 true,否则返回 false。如果函数返回一个数字,它将被视为分数。

示例:

assert:
- type: python
value: output[5:10] == 'Hello'

你也可以返回一个数字,它将被视为分数:

assert:
- type: python
value: math.log10(len(output)) * 10

多行函数

Python 断言支持多行字符串:

assert:
- type: python
value: |
# 在此插入评分逻辑...
if output == 'Expected output':
return {
'pass': True,
'score': 0.5,
}
return {
'pass': False,
'score': 0,
}

使用测试上下文

在 Python 函数中可以使用一个 context 对象。以下是其类型定义:

from typing import Any, Dict, TypedDict, Union

class AssertContext(TypedDict):
prompt: str
vars: Dict[str, str]
test: Dict[str, Any] # 包含 "vars"、"assert"、"options" 等键

例如,如果测试用例有一个变量 example,可以在 Python 中这样访问它:

tests:
- description: '带上下文的测试'
vars:
example: '示例文本'
assert:
- type: python
value: 'context['vars']['example'] in output'

外部 .py 文件

要引用外部文件,请使用 file:// 前缀:

assert:
- type: python
value: file://relative/path/to/script.py
config:
outputLengthLimit: 10

该文件将被调用,传入一个 output 字符串和一个 AssertContext 对象(见上文)。它期望返回一个 bool(通过/失败)、float(分数)或 GradingResult

以下是一个示例 assert.py

from typing import Dict, TypedDict, Union

def get_assert(output: str, context) -> Union[bool, float, Dict[str, Any]]:
print('Prompt:', context['prompt'])
print('Vars', context['vars']['topic'])

# 这是一个示例 GradingResult 字典
return {
'pass': True,
'score': 0.6,
'reason': '看起来不错',
}

这是一个使用断言的 YML 文件中定义的配置数据的断言示例:

from typing import Dict, Union

def get_assert(output: str, context) -> Union[bool, float, Dict[str, Any]]:
return output.length() <= context.get('config', {}).get('outputLengthLimit', 0)

你还可以通过 GradingResult 对象返回嵌套的指标和断言:

{
'pass': True,
'score': 0.75,
'reason': '看起来不错',
'componentResults': [{
'pass': 'bananas' in output.lower(),
'score': 0.5,
'reason': '包含香蕉',
}, {
'pass': 'yellow' in output.lower(),
'score': 0.5,
'reason': '包含黄色',
}]
}

GradingResult 类型

以下是你可以用于 GradingResult 对象的 Python 类型定义:

@dataclass
class GradingResult:
pass_: bool # 'pass' 是 Python 中的保留关键字
score: float
reason: str
component_results: Optional[List['GradingResult']] = None
named_scores: Optional[Dict[str, float]] = None # 在 UI 中显示为指标

覆盖 Python 二进制文件

默认情况下,promptfoo 会在你的 shell 中运行 python。确保 python 指向适当的可执行文件。

如果没有 python 二进制文件,你会看到一个“python: command not found”错误。

要覆盖 Python 二进制文件,请设置 PROMPTFOO_PYTHON 环境变量。你可以将其设置为路径(如 /path/to/python3.11)或 PATH 中的可执行文件(如 python3.11)。

其他断言类型

有关断言的更多信息,请参阅 测试断言