使用 Promptfoo 评估 C# LLM Eventparser
测试常规代码很简单。你调用一个函数,得到一个结果,然后检查它是否符合你的预期。
测试 LLM 则完全不同。LLM 在一次运行中可能会返回 "3 PM",而在另一次运行中返回 "15:00"。两者都是正确的,但精确匹配测试会失败。你需要检查答案是否“好”,而不是是否“完全一致”。
我构建了一个名为 EventParser 的小型应用来测试这一点。它接收像 "Team sync on Friday at 3 PM" 这样的非正式消息,并将其转换为结构化数据。
以下是如何使用 Promptfoo 和 LLM-as-a-judge(LLM 作为评委)工作流来测试它的方法。
设置
该应用使用单个提示词文件:extract_event.txt。C# 代码在运行时读取此文件。Promptfoo 在测试时也读取同一个文件。这确保了你测试的是用户实际看到的提示词。
工作流
我们不使用人工检查每个输出,而是使用一个评委模型(judge model)。这个过程涉及两个角色:
• 被测模型:提供答案的模型。 • 评委模型:一个更快、更便宜的用于给答案评分的模型。
评委如何决策
评委使用评分标准(rubric)。评分标准是用纯英文编写的规则。你不是检查特定的 JSON 字符串,而是告诉评委答案应该包含什么内容。
示例评分标准: "The answer should extract the event title, day, time, and location. It must not add details not mentioned in the message."(答案应提取活动标题、日期、时间和地点。不得添加消息中未提及的细节。)
测试错误
我故意通过添加一条错误的指令破坏了提示词:"If the message mentions coffee, set the location to Starbucks."(如果消息中提到了咖啡,请将地点设置为 Starbucks。)
当我运行评估时,评委发现了错误。原始消息并未提到 Starbucks。模型产生了幻觉(hallucinated)出了一个地点。精确匹配测试会漏掉这一点,但评委模型可以捕捉到语义错误。
为什么这种方法有效:
• 符合实际情况:它接受各种正确的格式,如 "3 PM" 或 "15:00"。 • 使用易读的规则:纯英文的评分标准易于理解。 • 捕捉语义 Bug:它能发现幻觉和逻辑错误。 • 具有成本效益:你可以使用廉价模型来为更昂贵的模型评分。
这种方法让 LLM 测试感觉就像真实的软件测试一样。
Source: https://dev.to/bigboybamo/evaluating-a-c-llm-eventparser-with-promptfoo-4b87
Optional learning community: https://t.me/GyaanSetuAi
