You need to enable JavaScript to run this app.
导航
评分DSL
最近更新时间:2024.12.16 15:39:02首次发布时间:2024.12.16 15:39:02

快速上手

模型回答有时会有复杂的格式和评分要求。例如,模型回答是 JSON 格式,并且有多个字段,用户希望对不同字段分别定义不同的评分规则,最后再聚合一个总的分数。Prompt 优解支持一种领域特定语言 (DSL) 来满足上述复杂评分需求。目前平台支持多种常见内置的评分函数供使用。
举例:假设参考答案和模型回答均为JSON格式,内容如下,注意下划线中不一样的部分。

  • 参考答案
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片",  
}
  • 模型回答
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片"
}

这里的回答为JSON格式,有“核心标签”和“主题”两个字段。为了给模型回答的每个字段单独评分,可以使用下面的DSL示例。

# DSL
核心标签:精确匹配
主题:模糊匹配
主题:字数限制:60
@聚合方式:min
@格式限制:JSON
  • 首行必须是“# DSL”。“#”和“DSL”之间为空格。
  • 每一行为“字段名称:评分函数名称”的形式。比如“核心标签:精确匹配”。其中中英文冒号“:”都可以接受。
  • 特别的,如果所有字段都用相同评分函数评分,可以写“@全部字段:评分函数名称”。
  • 特别的,如果模型回答为字符串,没有字段名称,或者不属于平台支持的,可以分字段评分的数据格式(如JSON,XML等)。可以写“@单个字段:评分函数名称”。此时将对*模型回答作为一个整体进行评分*。
  • 可选的,用户可以指定各个字段评分的聚合方式,比如“@聚合方式:min”。聚合方式有min(最小值)、max(最大值)、mean(平均数)、median(中位数)、mode(众数)。系统默认为取平均数mean,即每一个字段评分的平均值。
  • 用户必须指定答案的数据格式,比如“@格式限制:JSON”。如果模型回答没有通过指定的格式检测,评分会被设为1分。

内置评分函数

评分函数

定义

返回值

举例

精确匹配

每一个字都相同

如果是返回5,否则返回1

# DSL
核心标签:精确匹配
@聚合方式:mean
@格式限制:JSON

模糊匹配

语义相同即可,不要求每一个字都相同。

1-5整数

# DSL
主题:模糊匹配
@聚合方式:mean
@格式限制:JSON

字数限制

字数在给定的字数范围内。

  • 可以用单个数字指定字数上限
  • 可以用区间指定(字数下限,字数上限)

如果是返回5,否则返回1

  • 单个数字指定字数上限
# DSL
主题:字数限制:60
@聚合方式:min
@格式限制:JSON
  • 区间指定字数下限和字数上限
# DSL
主题:字数限制:(20, 60)
@聚合方式:min
@格式限制:JSON

格式限制

模型回答必须满足某种数据格式要求,可以是JSON,XML,或字符串

如果是返回5,否则返回1

# DSL
核心标签:精确匹配
@聚合方式:min
@格式限制:XML

常量等于

判断是否等于一个常量,例如字段“答案”等于常量“是”。可用于答案过滤条件。

如果和常量相等返回5,否则返回1

# DSL
主题:常量等于:喜剧
@聚合方式:min
@格式限制:JSON

常量不等于

判断是否不等于一个常量,例如字段“答案”不等于常量“是”。可用于答案过滤条件。

如果和常量不相等返回5,否则返回1

# DSL
主题:常量不等于:科幻
@聚合方式:min
@格式限制:JSON

精确存在于

模型回答精确匹配参考答案在该字段下的一个子集

如果是返回5,否则返回1

# DSL
主题:精确存在于:未来科技和人类情感
@聚合方式:min
@格式限制:JSON

精确全包括

参考答案精确匹配模型回答在该字段下的一个子集

如果是返回5,否则返回1

# DSL
核心标签:精确全包括:电影
@聚合方式:min
@格式限制:JSON

自然语言规则

用户对某一字段进行自定义的自然语言评分标准

1-5整数

# DSL
主题:自然语言规则:规则标签1
@聚合方式:min
@格式限制:JSON
<规则标签1>
模型回答主题和参考答案主题意思接近即可得5分,如主题完全不相同,直接为1分。其它情况根据模型回答相关程度给2-4分。
</规则标签1>

Python代码

用户自定义的Python编程代码
Python代码注意事项:
1. 所有的代码开头第一行都必须是 def func_name(model_answer, ref_answer):
可以在该函数内部嵌套函数,但是不能写多个同一级别的函数
2. 输入的ref_answer和model_answer为str,ref_answer为参考答案,model_answer为模型答案,如果有必要可以在下方的代码里转换格式
3. 返回值包括score和analysis两项,score的分值为1-5的int,
analysis是对评判结果分析的字符串, 如果没有analysis信息,可以只返回score
4. 所有需要import的package需要写在下方,不保证已安装相应的package,如果有需求可以提oncall
5. 建议先在本地测试python代码,确保可以正常执行,可以在代码内部添加必要的try catch来保证运行,
提交后的Python代码执行失败会返回缺省的score=-1和analysis="N/A", 导致无法有效进行优化

1-5整数

# DSL
核心标签:Python代码:代码标签1
@聚合方式:min
@格式限制:JSON
<代码标签1>
def compare(model_answer, ref_answer):
    if ref_answer == model_answer:
        score= 5
        analysis = "核心标签一致"
    else:
        score = 1
        analysis = "核心标签不一致"
    return score, analysis
</代码标签1>

更多模型回答格式示例

目前平台支持的模型回答格式有字符串、JSON、XML三种。以下为三种模型回答格式的示例。

  • 字符串示例
    • 参考答案
"核心标签:电影,主题:一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片"
  • 模型答案
"核心标签:电影,主题:一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片"
  • 评分标准
# DSL
@单个字段:模糊匹配
@聚合方式:min
@格式限制:字符串
  • JSON示例
    • 参考答案
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片"
}
  • 模型答案
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片"
}
  • 评分标准
# DSL
核心标签:精确匹配
主题:模糊匹配
主题:字数限制:60
@聚合方式:min
@格式限制:JSON
  • XML示例 (不包含根元素的标签对)
    • 参考答案
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片</主题>
  • 模型答案
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片</主题>
  • 评分标准
# DSL
核心标签:精确匹配
主题:模糊匹配
@聚合方式:min
@格式限制:XML
  • XML示例 (包含根元素的严格XML格式)
    • 参考答案
<content>
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感的科幻巨作,充满视觉震撼和深刻反思的暑期档大片</主题>
</content>
  • 模型答案
<content>
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感,充满视觉震撼和深刻反思的暑期档科幻大片</主题>
</content>
  • 评分标准
# DSL

核心标签:精确匹配
主题:模糊匹配
@聚合方式:min
@格式限制:XML:content

评分DSL模板
# 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>

解释说明
  • 评分函数所支持的答案格式:字符串(即将答案整体视为一个字符串,不考虑形式上的格式也不考虑字段名),JSON,XML(正式XML格式(有根元素)和多个标签对(无根元素)),模型答案和参考答案的格式要保持一致并且模型答案和参考答案都必须包含需要比较的字段
  • 当答案格式为字符串时,只能使用“@单个字段”进行比较,即将回答看作一个整体。
  • 必须在评分标准中指定答案的格式,例如“@格式限制: JSON”。如果模型答案没有通过指定的格式检测,评分会被设为1分。
  • 可以在评分标准中指定聚合分数的方法,例如“@聚合方式:min”,系统默认取平均值mean。支持聚合方式有min(最小值)、max(最大值)、mean(平均数)、median(中位数)、mode(众数)。
  • 如果答案的格式不属于“JSON,XML”,可以将答案的格式指定为字符串。然后使用“自然语言规则”或“Python代码”对回答进行精细的评价。
  • 红色高亮内容(首行“# DSL”,以及“@格式限制:格式名称”)为必须输入的内容,绝对不能省略
  • 字段名,评分函数名,评分函数参数需要以”:“或”:“分隔,中文/英文冒号均可。
  • Python代码对应的代码标签必须以“代码”两字开头,否则无法读取对应代码内容
  • 自然语言规则对应的规则标签必须以“规则”两字开头,否则无法读取对应规则内容
  • 评分函数、聚合方式必须写在“@格式限制:格式名称”的上侧,代码和规则的内容必须写在“@格式限制:格式名称”的下侧。否则无法读取输入内容
  • <代码标签>和</代码标签>,以及<规则标签>和</规则标签>必须成对出现,否则无法读取对应内容