针对JSON输出的LLM评估技术
让LLM输出有效的JSON可能是一项艰巨的任务。存在几种失败模式:
- 幻觉:OpenAI的函数调用和其他新兴框架以产生幻觉函数和参数而闻名。
- 无效的JSON:要求LLM生成JSON输出是不可靠的。一些推理引擎,如llama.cpp,支持使用GBNF语法进行约束输出。OpenAI在2023年末通过响应格式参数开始支持这一点。
- 模式不一致:让模型输出JSON只是战斗的一半。JSON可能是格式错误或不完整的。
本指南解释了一些评估技术,通过确保输出对象中存在特定字段来测试模型的JSON质量输出。这对于调整提示和模型以确保其输出符合您期望的规范的有效JSON非常有用。
前提条件
在继续之前,请确保您对如何设置测试用例和断言有基本的了解。更多信息请参阅入门指南和预期输出文档。
示例场景
假设您的语言模型输出如下JSON对象:
{
"color": "Yellow",
"location": "Guatemala"
}
您希望创建针对color
和location
值的断言。以下是如何做到这一点。
确保输出是有效的JSON
为了确保您的语言模型的输出是有效的JSON,您可以使用is-json
断言类型。此断言将检查输出是否为有效的JSON字符串,并在提供JSON模式的情况下可选地对其进行验证。
以下是一个不带模式的is-json
断言的示例:
assert:
- type: is-json
如果您想验证JSON输出的结构,可以定义一个JSON模式。以下是一个使用is-json
断言的示例,要求color
为字符串,countries
为字符串列表:
prompts:
- "输出一个包含`color`和`countries`键的JSON对象,描述以下对象:{{item}}"
tests:
- vars:
item: Banana
assert:
- type: is-json
value:
required: ["color", "countries"]
type: object
properties:
color:
type: string
countries:
type: array
items:
type: string
这将确保输出是包含所需字段且数据类型正确的有效JSON。
确保特定JSON字段的有效性
要断言JSON输出的特定字段,请使用javascript
断言类型。这允许您编写自定义JavaScript代码来对JSON字段执行逻辑检查。
以下是一个配置示例,演示如何断言color
等于"Yellow"且countries
包含"Ecuador":
prompts:
- "输出一个包含`color`和`countries`键的JSON对象,描述以下对象:{{item}}"
tests:
- vars:
item: Banana
assert:
- type: is-json
# ...
# 解析JSON并测试内容
- type: javascript
value: JSON.parse(output).color === 'yellow' && JSON.parse(output).countries.includes('Ecuador')
如果您不想在每个断言中添加JSON.parse
,可以在test.options
下添加一个转换,在结果传递给断言之前解析JSON:
tests:
- vars:
item: Banana
options:
transform: JSON.parse(output)
assert:
- type: is-json
# ...
- type: javascript
# `output`现在是一个解析后的对象
value: output.color === 'yellow' && output.countries.includes('Ecuador')
提取特定JSON字段进行测试
对于模型评级的断言,如相似性和基于评分标准的评估,在运行检查之前预处理输出以提取所需字段。可以使用transform
指令来实现这一点,它适用于整个测试用例。
以下是如何使用transform
来断言location
与给定值的相似性:
tests:
- vars:
item: banana
options:
transform: JSON.parse(output).countries
assert:
- type: contains-any
value:
- 危地马拉
- 哥斯达黎加
- 印度
- 印度尼西亚
- type: llm-rubric
value: 是可能找到{{item}}的地方
示例
查看完整的示例在 Github。
结论
通过在断言中使用 JavaScript,您可以对 JSON 输出执行复杂的检查,包括针对特定字段。transform
可用于为相似性检查定制输出。
promptfoo 是免费的开源软件。要安装 promptfoo 并开始使用,请参阅入门指南。
有关可用断言类型的更多信息,请参阅断言文档。您可能还会对评估 RAG 管道指南感兴趣,该指南提供了有关评估检索增强生成应用程序的见解。