确定性指标
这些指标是通过对LLM输出运行的逻辑测试创建的。
| 断言类型 | 返回true如果... |
|---|---|
| 包含 | 输出包含子字符串 |
| 包含所有 | 输出包含所有列表中的子字符串 |
| 包含任意 | 输出包含列表中的任意子字符串 |
| 包含JSON | 输出包含有效JSON(可选的JSON模式验证) |
| 包含SQL | 输出包含有效SQL |
| 包含XML | 输出包含有效XML |
| 成本 | 推理成本低于阈值 |
| 等于 | 输出完全匹配 |
| 不区分大小写包含 | 输出包含子字符串,不区分大小写 |
| 不区分大小写包含所有 | 输出包含所有列表中的子字符串,不区分大小写 |
| 不区分大小写包含任意 | 输出包含列表中的任意子字符串,不区分大小写 |
| 是JSON | 输出是有效JSON(可选的JSON模式验证) |
| 是SQL | 输出是有效SQL语句(可选的权限列表验证) |
| 是有效的OpenAI函数调用 | 确保函数调用匹配函数的JSON模式 |
| 是有效的OpenAI工具调用 | 确保所有工具调用匹配工具的JSON模式 |
| 是XML | 输出是有效XML |
| JavaScript | 提供的JavaScript函数验证输出 |
| 延迟 | 延迟低于阈值(毫秒) |
| Levenshtein | Levenshtein距离低于阈值 |
| 困惑度得分 | 归一化困惑度 |
| 困惑度 | 困惑度低于阈值 |
| Python | 提供的Python函数验证输出 |
| 正则表达式 | 输出匹配正则表达式 |
| rouge-n | Rouge-N得分高于给定阈值 |
| 以...开头 | 输出以字符串开头 |
| Webhook | 提供的Webhook返回{pass: true} |
每种测试类型都可以通过在前面加上not-来取反。例如,not-equals或not-regex。
断言类型
包含
contains断言检查LLM输出是否包含预期值。
示例:
assert:
- type: contains
value: '预期的子字符串'
icontains与之相同,只是它忽略大小写:
assert:
- type: icontains
value: '预期的子字符串'
包含所有
contains-all断言检查LLM输出是否包含所有指定值。
示例:
assert:
- type: contains-all
value:
- '值1'
- '值2'
- '值3'
包含任意
contains-any断言检查LLM输出是否包含至少一个指定值。
示例:
assert:
- type: contains-any
value:
- '值1'
- '值2'
- '值3'
对于不区分大小写的匹配,使用icontains-any。
对于不区分大小写的匹配,使用icontains-all。
正则表达式
regex 断言检查 LLM 输出是否与提供的正则表达式匹配。
示例:
assert:
- type: regex
value: "\\d{4}" # 匹配一个四位数字
Contains-JSON
contains-json 断言检查 LLM 输出是否包含有效的 JSON 结构。
示例:
assert:
- type: contains-json
你可以选择设置一个 value 作为 JSON 模式,以便验证 JSON 内容:
assert:
- type: contains-json
value:
required:
- latitude
- longitude
type: object
properties:
latitude:
minimum: -90
type: number
maximum: 90
longitude:
minimum: -180
type: number
maximum: 180
JSON 是有效的 YAML,因此你也可以直接复制任何 JSON 模式:
assert:
- type: contains-json
value:
{
'required': ['latitude', 'longitude'],
'type': 'object',
'properties':
{
'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 },
'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 },
},
}
如果你的 JSON 模式很大,可以从文件中导入:
assert:
- type: contains-json
value: file://./path/to/schema.json
另见:is-json
Contains-Sql
此断言确保输出是有效的 SQL,或者包含带有有效 SQL 的代码块。
assert:
- type: contains-sql
有关高级用法,包括特定数据库类型和表与列的允许列表,请参见 is-sql。
Cost
cost 断言检查 LLM 调用的成本是否低于指定阈值。
这需要 LLM 提供者返回成本信息。目前仅支持 OpenAI GPT 模型和自定义提供者。
示例:
providers:
- openai:gpt-4o-mini
- openai:gpt-4
assert:
# 如果 LLM 调用成本低于 $0.001,则通过
- type: cost
threshold: 0.001
Equality
equals 断言检查 LLM 输出是否等于预期值。
示例:
assert:
- type: equals
value: 'The expected output'
你也可以检查它是否匹配预期的 JSON 格式。
assert:
- type: equals
value: { 'key': 'value' }
如果你的预期 JSON 很大,可以从文件中导入:
assert:
- type: equals
value: 'file://path/to/expected.json'
Is-JSON
is-json 断言检查 LLM 输出是否是有效的 JSON 字符串。
示例:
assert:
- type: is-json
你可以选择设置一个 value 作为 JSON 模式。如果设置,输出将根据此模式进行验证:
assert:
- type: is-json
value:
required:
- latitude
- longitude
type: object
properties:
latitude:
minimum: -90
type: number
maximum: 90
longitude:
minimum: -180
type: number
maximum: 180
JSON 是有效的 YAML,因此你也可以直接复制任何 JSON 模式:
assert:
- type: is-json
value:
{
'required': ['latitude', 'longitude'],
'type': 'object',
'properties':
{
'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 },
'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 },
},
}
如果你的 JSON 模式很大,可以从文件中导入:
assert:
- type: is-json
value: file://./path/to/schema.json
Is-XML
is-xml 断言检查整个 LLM 输出是否是有效的 XML 字符串。它还可以验证 XML 结构中是否存在特定元素。
示例:
assert:
- type: is-xml
此基本用法检查输出是否是有效的 XML。
你也可以指定所需的元素:
assert:
- type: is-xml
value:
requiredElements:
- root.child
- root.sibling
这检查 XML 是否有效并包含指定的元素。元素以点分隔的路径指定,允许嵌套元素检查。
工作原理
- 断言首先尝试使用解析 器(fast-xml-parser)将整个输出解析为 XML。
- 如果解析成功,则视为有效 XML。
- 如果指定了
value:- 它会检查 requiredElements 键,其中包含所需的元素数组。
- 每个元素路径(例如,"root.child")通过点进行分割。
- 它沿着这些路径遍历解析的 XML 对象。
- 如果未找到任何所需元素,断言失败。
示例
基本 XML 验证:
assert:
- type: is-xml
通过:<root><child>Content</child></root>
失败:<root><child>Content</child></root(缺少结束标签)
检查特定元素:
assert:
- type: is-xml
value:
requiredElements:
- analysis.classification
- analysis.color
通过的测试:<analysis><classification>T-shirt</classification><color>Red</color></analysis>
未通过的测试:<analysis><classification>T-shirt</classification></analysis>(缺少颜色元素)
检查嵌套元素:
assert:
- type: is-xml
value:
requiredElements:
- root.parent.child.grandchild
通过的测试:<root><parent><child><grandchild>Content</grandchild></child></parent></root>
未通过的测试:<root><parent><child></child></parent></root>(缺少grandchild元素)