模型回答有时会有复杂的格式和评分要求。例如,模型回答是 JSON 格式,并且有多个字段,用户希望对不同字段分别定义不同的评分规则,最后再聚合一个总的分数。Prompt 优解支持一种领域特定语言 (DSL) 来满足上述复杂评分需求。目前平台支持多种常见内置的评分函数供使用。
举例:假设参考答案和模型回答均为JSON格式,内容如下,注意下划线中不一样的部分。
{ "核心标签": "电影", "主题": "一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片", }
{ "核心标签": "电影", "主题": "一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片" }
这里的回答为JSON格式,有“核心标签”和“主题”两个字段。为了给模型回答的每个字段单独评分,可以使用下面的DSL示例。
# DSL 核心标签:精确匹配 主题:模糊匹配 主题:字数限制:60 @聚合方式:min @格式限制:JSON
评分函数 | 定义 | 返回值 | 举例 |
---|---|---|---|
精确匹配 | 每一个字都相同 | 如果是返回5,否则返回1 |
|
模糊匹配 | 语义相同即可,不要求每一个字都相同。 | 1-5整数 |
|
字数限制 | 字数在给定的字数范围内。
| 如果是返回5,否则返回1 |
|
格式限制 | 模型回答必须满足某种数据格式要求,可以是JSON,XML,或字符串 | 如果是返回5,否则返回1 |
|
常量等于 | 判断是否等于一个常量,例如字段“答案”等于常量“是”。可用于答案过滤条件。 | 如果和常量相等返回5,否则返回1 |
|
常量不等于 | 判断是否不等于一个常量,例如字段“答案”不等于常量“是”。可用于答案过滤条件。 | 如果和常量不相等返回5,否则返回1 |
|
精确存在于 | 模型回答精确匹配参考答案在该字段下的一个子集 | 如果是返回5,否则返回1 |
|
精确全包括 | 参考答案精确匹配模型回答在该字段下的一个子集 | 如果是返回5,否则返回1 |
|
自然语言规则 | 用户对某一字段进行自定义的自然语言评分标准 | 1-5整数 |
|
目前平台支持的模型回答格式有字符串、JSON、XML三种。以下为三种模型回答格式的示例。
"核心标签:电影,主题:一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片"
"核心标签:电影,主题:一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片"
# DSL @单个字段:模糊匹配 @聚合方式:min @格式限制:字符串
{ "核心标签": "电影", "主题": "一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片" }
{ "核心标签": "电影", "主题": "一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片" }
# DSL 核心标签:精确匹配 主题:模糊匹配 主题:字数限制:60 @聚合方式:min @格式限制:JSON
<核心标签>电影</核心标签> <主题>一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片</主题>
<核心标签>电影</核心标签> <主题>一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片</主题>
# DSL 核心标签:精确匹配 主题:模糊匹配 @聚合方式:min @格式限制:XML
<content> <核心标签>电影</核心标签> <主题>一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片</主题> </content>
<content> <核心标签>电影</核心标签> <主题>一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片</主题> </content>
# DSL 核心标签:精确匹配 主题:模糊匹配 @聚合方式:min @格式限制:XML:content
# DSL 字段名1:评分函数名 字段名2:评分函数名:评分函数参数 字段名3:Python代码:代码标签1 字段名4:自然语言规则:规则标签1 字段名5:Python代码:代码标签2 字段名6:自然语言规则:规则标签2 @聚合方式:mode @格式限制:格式名称 <代码标签1> def compare_function_1(ref_answer, model_answer): return 5 if ref_answer == model_answer else 1 </代码标签1> <规则标签1> 1. 这是一段自然语言评分规则 2. 这段规则可以写多行 </规则标签1> <代码标签2> def compare_function_2(model_answer, ref_answer): return 5 if int(ref_answer) >= int(model_answer) else 1 </代码标签2> <规则标签2> 1. 这是另一段自然语言评分规则 2. 这段规则可以写多行 </规则标签2>