Skip to main content

模型评分指标

promptfoo 支持多种类型的模型评分断言:

基于输出的:

  • llm-rubric - 使用语言模型根据评分标准检查 LLM 输出是否符合给定要求。
  • model-graded-closedqa - 类似于上述内容,是一种“标准检查”评估,确保答案满足特定要求。使用 OpenAI 公开评估中的提示。
  • factuality - 一种事实一致性评估,给定完成 A 和参考答案 B,评估 A 是否是 B 的子集,A 是否是 B 的超集,A 和 B 是否等价,A 和 B 是否不一致,或者 A 和 B 是否不同,但从事实角度来看差异无关紧要。使用 OpenAI 公开评估中的提示。
  • answer-relevance - 确保 LLM 输出与原始查询相关
  • classifier - 参见 分类器评分文档
  • moderation - 参见 审核评分文档
  • select-best - 比较多个测试用例的输出并选择最佳者

基于 RAG 的(需要 query 和/或 context 变量):

  • context-recall - 确保真实情况出现在上下文中
  • context-relevance - 确保上下文与原始查询相关
  • context-faithfulness - 确保 LLM 输出使用上下文

示例(基于输出)

llm-rubric 和/或 model-graded-closedqa 的示例:

assert:
- type: model-graded-closedqa # 或 llm-rubric
# 确保 LLM 输出符合此标准:
value: 不道歉

事实检查的示例:

assert:
- type: factuality
# 确保 LLM 输出与此陈述一致:
value: 萨克拉门托是加利福尼亚的首府

有关事实性的更多信息,请参阅 LLM 事实性指南

以下是一个基于 LLM 评估的 PASS/FAIL 示例输出(查看示例设置和输出):

LLM 提示质量评估,PASS/FAIL 预期

在评分标准中使用变量

您可以在 LLM 评分标准中使用测试 vars。此示例使用 question 变量来帮助检测幻觉:

providers:
- openai:gpt-4o-mini
prompts:
- file://prompt1.txt
- file://prompt2.txt
defaultTest:
assert:
- type: llm-rubric
value: '表示不确定或无法回答问题:"{{question}}"'
tests:
- vars:
question: 纽约的天气如何?
- vars:
question: 巨人和49人之间的最新足球比赛谁赢了?

示例(基于 RAG)

RAG 指标需要名为 contextquery 的变量。您还必须在测试中设置 threshold 属性(所有分数在 0 到 1 之间归一化)。

以下是一个基于 RAG 的知识机器人配置示例,该机器人评估 RAG 上下文指标:

prompts:
- |
您是一个内部企业聊天机器人。
回应此查询:{{query}}
以下是您可以用来撰写回复的一些上下文:{{context}}
providers:
- openai:gpt-4
tests:
- vars:
query: 不需要批准的最大购买金额是多少?
context: file://docs/reimbursement.md
assert:
- type: contains
value: '$500'
- type: factuality
value: 员工经理负责审批
- type: answer-relevance
threshold: 0.9
- type: context-recall
threshold: 0.9
value: 无需批准的最大购买价格是 $500。提交任何内容之前先与 Fred 交谈。
- type: context-relevance
threshold: 0.9
- type: context-faithfulness
threshold: 0.9
- vars:
query: 产假有多少周?
context: file://docs/maternity.md
assert:
- type: factuality
value: 产假为 4 个月
- type: answer-relevance
threshold: 0.9
- type: context-recall
threshold: 0.9
value: 公司提供 4 个月的产假,除非你是大象,否则你将获得 22 个月的产假。
- type: context-relevance
threshold: 0.9
- type: context-faithfulness
threshold: 0.9

示例(比较)

select-best 断言类型用于比较同一 TestCase 行中的多个输出,并选择最符合指定标准的输出。

以下是如何在配置文件中使用 select-best 的示例:

prompts:
- '写一条关于{{topic}}的推文'
- '写一条非常简洁、有趣的关于{{topic}}的推文'

providers:
- openai:gpt-4

tests:
- vars:
topic: 香蕉
assert:
- type: select-best
value: 选择最有趣的推文

- vars:
topic: 纽约市
assert:
- type: select-best
value: 选择包含最多事实的推文

覆盖LLM评分器

默认情况下,模型评分的断言使用GPT-4进行评分。如果你无法访问GPT-4或不希望使用它,你可以覆盖评分器。有几种方法可以做到这一点,具体取决于你偏好的工作流程:

  1. 使用 --grader CLI 选项:

    promptfoo eval --grader openai:gpt-4o-mini
  2. 在每个测试或测试套件的基础上使用 test.optionsdefaultTest.options

    defaultTest:
    options:
    provider: openai:gpt-4o-mini
    tests:
    - description: 使用LLM评估输出
    assert:
    - type: llm-rubric
    value: 是否像海盗一样说话
  3. 在每个断言的基础上使用 assertion.provider

    tests:
    - description: 使用LLM评估输出
    assert:
    - type: llm-rubric
    value: 是否像海盗一样说话
    provider: openai:gpt-4o-mini

使用 provider.config 字段设置自定义参数:

provider:
- id: openai:gpt-4o-mini
config:
temperature: 0

还要注意,自定义提供者 也是支持的。

多个评分器

某些断言(如 answer-relevance)使用多种类型的提供者。要分别覆盖嵌入和文本提供者,你可以这样做:

defaultTest:
options:
provider:
text:
id: azureopenai:chat:gpt-4-deployment
config:
apiHost: xxx.openai.azure.com
embedding:
id: azureopenai:embeddings:text-embedding-ada-002-deployment
config:
apiHost: xxx.openai.azure.com

如果你正在实现一个自定义提供者,text 提供者需要一个返回 ProviderResponsecallApi 函数,而嵌入提供者需要一个返回 ProviderEmbeddingResponsecallEmbeddingApi 函数。

覆盖评分提示

为了最大程度地控制 llm-rubric 的输出,你可以使用 TestCaseAssertionrubricPrompt 属性设置自定义提示。

评分提示有两个内置变量可以使用:

  • {{output}} - LLM 的输出(你可能想使用这个)
  • {{rubric}} - llm-rubric assert 对象的 value

在这个例子中,我们在 defaultTest 下设置 rubricPrompt,这会将其应用于该测试套件中的每个测试:

defaultTest:
options:
rubricPrompt: >
[
{
"role": "system",
"content": "根据以下规格评分输出,并记录得分:\n\n输出是否提到 {{x}}?+1 分\n输出是否描述了 {{y}}?+1 分\n输出是否要求澄清 {{z}}?+1 分\n\n计算分数但总是通过测试。以以下 JSON 格式输出你的响应:\n{pass: true, score: number, reason: string}"
},
{
"role": "user",
"content": "输出: {{ output }}"
}
]

参见 完整示例

select-best 评分提示

为了控制 select-best 评分提示,你可以使用变量 {{outputs}}(字符串列表)和 {{criteria}}(字符串)。它期望 LLM 输出包含获胜输出的索引。

分类器

分类器可用于检测语气、偏见、毒性、有用性等。参见 分类器文档

其他断言类型

有关断言的更多信息,参见 测试断言