# 评分DSL

> 全部文档的索引见 [llms.txt](https://ark.volcengine.com/llms.txt)；在任一文档页面地址后追加 `.md` 可获取该页的 Markdown 版本。

<span id="0d746f77"></span>
# 快速上手

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

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

* **模型回答**：

```JSON
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感，充满视觉震撼和深刻反思的暑期档科幻大片"
}
```

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

```Plain Text
# DSL
核心标签：精确匹配
主题：模糊匹配
主题：字数限制：60
@聚合方式：min
@格式限制：JSON
```

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

<span id="182df1df"></span>
# 内置评分函数

|**评分函数** |**定义** |**返回值** |**举例** |
|---|---|---|---|
|精确匹配 |每一个字都相同 |如果是返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |核心标签：精确匹配 | \
| | | |@聚合方式：mean | \
| | | |@格式限制：JSON | \
| | | |``` |
|模糊匹配 |语义相同即可，不要求每一个字都相同。 |1-5整数 |```Plain Text | \
| | | |# DSL | \
| | | |主题：模糊匹配 | \
| | | |@聚合方式：mean | \
| | | |@格式限制：JSON | \
| | | |``` |
|字数限制 |字数在给定的字数范围内。 |如果是返回5，否则返回1 |* 单个数字指定字数上限 | \
| | | | | \
| |* 可以用单个数字指定字数上限 | |```Plain Text | \
| |* 可以用区间指定(字数下限，字数上限) | |# DSL | \
| | | |主题：字数限制：60 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` | \
| | | | | \
| | | | | \
| | | |* 区间指定字数下限和字数上限 | \
| | | | | \
| | | |```Plain Text | \
| | | |# DSL | \
| | | |主题：字数限制：(20, 60) | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` |
|格式限制 |模型回答必须满足某种数据格式要求，可以是JSON，XML，或字符串 |如果是返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |核心标签：精确匹配 | \
| | | |@聚合方式：min | \
| | | |@格式限制：XML | \
| | | |``` |
|常量等于 |判断是否等于一个常量，例如字段“答案”等于常量“是”。可用于答案过滤条件。 |如果和常量相等返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |主题：常量等于：喜剧 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` |
|常量不等于 |判断是否不等于一个常量，例如字段“答案”不等于常量“是”。可用于答案过滤条件。 |如果和常量不相等返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |主题：常量不等于：科幻 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` |
|精确存在于 |模型回答精确匹配参考答案在该字段下的一个子集 |如果是返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |主题：精确存在于：未来科技和人类情感 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` |
|精确全包括 |参考答案精确匹配模型回答在该字段下的一个子集 |如果是返回5，否则返回1 |```Plain Text | \
| | | |# DSL | \
| | | |核心标签：精确全包括：电影 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |``` |
|自然语言规则 |用户对某一字段进行自定义的自然语言评分标准 |1-5整数 |```Plain Text | \
| | | |# DSL | \
| | | |主题：自然语言规则：规则标签1 | \
| | | |@聚合方式：min | \
| | | |@格式限制：JSON | \
| | | |<规则标签1> | \
| | | |模型回答主题和参考答案主题意思接近即可得5分，如主题完全不相同，直接为1分。其它情况根据模型回答相关程度给2-4分。 | \
| | | |</规则标签1> | \
| | | |``` |

<span id="ab67b61f"></span>
# 更多模型回答格式示例

目前平台支持的模型回答格式有字符串、JSON、XML三种。以下为这三种模型回答格式的示例（其中XML包含两种情况）。
* **字符串示例**：

    * **参考答案**：

```Plain Text
"核心标签：电影，主题：一部融合了未来科技和人类情感的科幻巨作，充满视觉震撼和深刻反思的暑期档大片"
```

* **模型答案**：

```Plain Text
"核心标签：电影，主题：一部融合了未来科技和人类情感，充满视觉震撼和深刻反思的暑期档科幻大片"
```

* **评分标准**：

```Plain Text
# DSL
@单个字段：模糊匹配
@聚合方式：min
@格式限制：字符串
```

* **JSON示例**：

    * **参考答案**：

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

* **模型答案**：

```JSON
{
  "核心标签": "电影",
  "主题": "一部融合了未来科技和人类情感，充满视觉震撼和深刻反思的暑期档科幻大片"
}
```

* **评分标准**：

```Plain Text
# DSL
核心标签：精确匹配
主题：模糊匹配
主题：字数限制：60
@聚合方式：min
@格式限制：JSON
```

* **XML示例 (不包含根元素的标签对)** ：

    * **参考答案**：

```XML
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感的科幻巨作，充满视觉震撼和深刻反思的暑期档大片</主题>
```

* **模型答案**：

```XML
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感，充满视觉震撼和深刻反思的暑期档科幻大片</主题>
```

* **评分标准**：

```Plain Text
# DSL
核心标签：精确匹配
主题：模糊匹配
@聚合方式：min
@格式限制：XML
```

* **XML示例 (包含根元素的严格XML格式)** ：

    * **参考答案**：

```XML
<content>
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感的科幻巨作，充满视觉震撼和深刻反思的暑期档大片</主题>
</content>
```

* **模型答案**：

```XML
<content>
<核心标签>电影</核心标签>
<主题>一部融合了未来科技和人类情感，充满视觉震撼和深刻反思的暑期档科幻大片</主题>
</content>
```

* **评分标准**：

```Plain Text
# DSL
核心标签：精确匹配
主题：模糊匹配
@聚合方式：min
@格式限制：XML：content
```

<span id="1370bb40"></span>
# 评分DSL模板

```Plain Text
# DSL
字段名1：评分函数名
字段名2：评分函数名：评分函数参数
字段名3：自然语言规则：规则标签1
字段名4：自然语言规则：规则标签2
@聚合方式：聚合函数名
@格式限制：格式名称
<规则标签1>
1. 这是一段自然语言评分规则
2. 这段规则可以写多行
</规则标签1>
<规则标签2>
1. 这是另一段自然语言评分规则
2. 这段规则可以写多行
</规则标签2>
```

<span id="170ef6e8"></span>
# 解释说明

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