跳到主要内容

评价

在Colab打开

许多公司面临着评估大型语言模型(LLM)是否适合其特定用例并确定哪些LLM提供最佳性能的挑战。评估一种模式是否可以有效地取代另一种模式,并确保所选的LLM符合公司的独特要求,这一点至关重要。然而,评估LLM的过程可能既复杂又令人困惑。本指南提供了一种全面的方法来评估各种应用的LLM。我们将首先讨论评估的目标、评估数据集的创建,然后我们将在笔记本中通过详细的Python代码演练深入探讨三种主要的评估方法。

  • 你到底想解决什么任务?
  • 如何创建评估数据集?
  • 如何评价?
    • 基于指标的评估
    • 基于LLM的评估
    • 以人为本的评价

你的任务是什么?

在我们开始评估过程之前,重要的是要考虑一下你想用LLM解决什么确切的任务。准确定义任务至关重要。

一些糟糕的例子:

  • 做一个乐于助人的助手(在你的语境中,“乐于助人”是什么意思?)
  • 将文本转换为代码(什么类型的文本和代码?)
  • 提高文件质量(什么是高质量与低质量?)

一些很好的例子:

  • 做客户投诉的助理。确保以礼貌和有益的方式回答投诉,并给出不超过3句话的简洁答案。
  • 如果你不知道答案,一定要通知用户。
  • 将伪代码转换为Python代码
  • 通过改进所有拼写和语法错误来重新表述文档,并为文本提供更专业的语调
  • 从医疗记录中提取所有相关信息(该用例将受特定适用法规的约束)
  • 总结各种类型的文件,如法律协议、新闻文章或科学论文

不同的目标和用例可能需要不同的评估策略。有些用例可能会优先考虑准确性,而另一些用例可能会强调简洁性和有用性。因此,在开始评估过程之前,确切地知道你想解决什么任务是至关重要的。

如何创建评估数据集?

有许多公共基准可用于评估大型语言模型(LLM),如MMLU、GSMK8等。首先要考虑的问题是,这些现有的基准是否可以用于您的特定用例。如果适用,则从现有的基准数据集开始。

然而,我们经常观察到,现有的基准测试本质上是学术性的,可能不涵盖现实世界的客户用例,或者只涉及有限的范围。因此,通常最好创建自己的评估数据集。

一旦你确立了目标并确定了现有的基准是否合适,你就可以继续创建针对特定用例量身定制的自定义评估数据集。

标记数据

在许多情况下,创建标记数据很重要。例如,如果你的任务是使用LLM从符合特定适用法规的医疗记录中提取信息,你可以使用人工注释来标记数据,并获得包括你想提取的所有信息在内的黄金答案,例如。, {“年龄”:60,“性别”:“男性”,“诊断”:“糖尿病”,“体重”:210,“吸烟”:“是”}.

您需要多少数据注释?这取决于任务。你应该始终把质量放在数量之上。如果你有高质量的数据,100个测试用例就足以提供有意义的信号。

此外,建议使用有区别的基准,这意味着它既不太容易也不太难。如果每个被测试的模型都达到了90%以上的准确率,那么它们之间的差异可能没有意义,这表明需要一个更好的基准。目标是创建能够有效区分模型的数据。创建有区别的数据可能具有挑战性,因此请专注于您的特定任务。多种型号的性能可能足以满足您的需求。一个好的评估数据集应该带来与模型大小一致的性能,即较大的模型的性能与较小的模型相当或更好(除非较小的模型已经过专门的训练)。

以下是不同功能的各种提示和黄金答案的一些示例:

任务提示/上下文黄金答案/标准
信息提取60岁的男性患者约翰逊先生出现了口渴加剧、尿频、疲劳和不明原因的体重减轻等症状。经过评估,他被诊断为糖尿病,血糖水平升高证实了这一点。约翰逊先生的体重为210磅。他被开处方服用二甲双胍,每天两次,随餐服用。咨询期间注意到,患者目前正在吸烟。{“年龄”:60,“性别”:“男性”,“诊断”:“糖尿病”,“体重”:210,“吸烟”:“是”}
Python代码生成编写一个python函数,使用位运算符检查给定的数字是否为奇数。assert is_odd(5)==True
总结为三年级学生总结以下内容:“水是一种由两个氢原子与一个氧原子结合而成的化合物,化学式为H2O。氢原子通过极性共价键与氧原子结合,这意味着键中的电子在原子之间分配不均,导致氧原子上带轻微的负电荷,氢原子上带微小的正电荷。这使水分子具有弯曲或V形的结构,并允许它们与其他水分子形成氢键,这是水的许多独特性质的原因,如高沸点和表面张力。”水是一种特殊的物质,由两个称为原子的微小部分组成,具体来说,是两个氢原子和一个氧原子。这些原子以一种弯曲的方式粘在一起,这使得水具有一些惊人的特性。例如,水可以粘在自己身上,这有助于它以液体的形式保持在一起,而不仅仅是变成气体。这也使得水具有高沸点,这意味着它需要大量的热量才能转化为气体。水的独特性质使其成为我们生活和地球的重要组成部分。
多语种将这份大学家庭作业翻译成高级西班牙语,用于高级写作课程:“写一篇500字的个人文章,讲述你家庭中的一个关键时刻,描述这一事件、它对家庭关系的影响以及围绕它的情感和想法。你的文章应该结构清晰,有引言、正文和结论,并使用富有表现力和精确的语言。它将根据清晰度、连贯性、深度和原创性进行评估。”在对家庭至关重要的时刻,为500名家庭成员安排一次私人会议,描述事件、对家庭关系的影响以及对家庭的情感和压力。我们需要一个清晰的结构,一个介绍,一个总结,一个表达和精确的语言。对清晰、连贯、深刻和原创的基础进行评估。
闲聊你是一名八年级拉丁语班的导师,你的工作是帮助学生记住他们每周的单词表测试。你不给学生答案,而是帮助他们自己找到答案。在辅导课开始时,问你的学生他们需要什么单词表来帮助记忆。记住要鼓励学生,并要求他们“展示他们的作品”,即阐明他们是如何得出这个答案的。你好!我希望你今天过得愉快。作为你的拉丁语导师,我在这里帮助你进行每周单词表测试。那么,让我们开始吧!你能告诉我本周你需要帮助记忆哪个单词表吗?记住,目标不仅仅是记住单词,还要理解它们的含义以及如何在上下文中使用它们。
一旦你选择了一个词,我希望你试着回忆它的意思或在句子中使用它。然后,我希望你能通过解释你是如何得出这个答案来“展示你的工作”。这将有助于加强你的理解,使你更容易记住。听起来不错吗?让我们潜入水中!

未标记数据:

在某些情况下,您可能无法轻松创建标记数据。您可以使用LLM生成必要的数据。例如,你可以要求法学硕士根据给定的文本生成问题和答案。以下是两个用于生成问题和答案的提示模板:

  • 根据上下文生成问题的提示模板:
上下文信息如下。
---------------------
{context_str}
---------------------
给定上下文信息而不是先验知识。根据上下文生成{num_questions_per_chunk}个问题。文件中的问题应具有多样性。将问题限制在提供的上下文信息范围内。
  • 根据上下文和从上一个提示模板生成的问题生成答案的提示模板:
上下文信息如下
---------------------
{context_str}
---------------------
给定上下文信息而不是先验知识,
回答问题。
查询:{generated_Query_str}
答案:

然而,LLM生成的数据通常需要进一步细化和过滤。最好从现实世界的来源,特别是专家那里得到问题。然而,当真实数据难以获得或稀缺时,LLM生成的数据仍然有用。

如何评价

基于指标的评估

基于指标的评估是许多公共基准评估的标准方法。有许多指标可用于评估和比较模型生成的答案与黄金答案。最受欢迎的是精确匹配准确率、召回率、精确度、F1得分。

  • 精确匹配准确率:此指标衡量模型生成的答案与黄金答案完全匹配的比例。它对模型生成精确响应的能力进行了严格评估。
  • 召回:Recall计算模型生成的答案成功检索到的黄金答案中相关信息的分数。较高的召回率表明模型可以捕获更多相关信息。
  • 精确:精度评估模型生成的答案中相关信息的比例。更高的精度意味着模型会生成更准确和相关的响应。
  • F1得分F1分数是召回率和精确度的调和平均值,在这两个指标方面对模型的性能进行了平衡的评估。

除了这些流行的指标外,还有其他NLP评估指标,如BLEU(双语评估理解)和ROUGE(面向回忆的Gisting评估理解)。BLEU主要用于机器翻译任务,而ROUGE通常用于文本摘要。然而,出于对其可靠性和可能产生误导性结果的担忧,我们不建议使用。

示例1:以准确率评估信息提取

示例1:以准确率评估信息提取

评价数据

第一个例子涉及从病历中提取患者信息。为了进行评估,评估数据中需要医疗记录和正确/预期的答案(称为“黄金答案”)。以下是两个示例测试用例:

提示 = {
“约翰逊”: {
“医学笔记”: “一位60岁的男性患者,约翰逊先生,出现了口渴、尿频、疲劳和不明原因的体重减轻等症状。经评估,他被诊断为糖尿病,血糖水平升高证实了这一点。约翰逊先生的体重为210磅。他已被开处方二甲双胍,每天随餐服用两次。咨询期间注意到,该患者目前是吸烟者。”,
“golden_answer”: {
“年龄”: 60,
“性别”: “男性”,
“诊断”: “糖尿病”,
“重量”: 210,
“吸烟”: “是”,
},
},
“史密斯”: {
“医学笔记”: 史密斯先生是一名55岁的男性患者,他的膝盖和手出现了严重的关节疼痛和僵硬,以及肿胀和活动范围有限。经过彻底的检查和诊断测试,他被诊断出患有关节炎。史密斯先生保持健康的体重(目前为150磅)并戒烟很重要,因为这些因素会加剧关节炎的症状并导致关节损伤,
“golden_answer”: {
“年龄”: 55,
“性别”: “男性”,
“诊断”: “关节炎”,
“重量”: 150,
“吸烟”: “是”,
},
},
}

如何评价?

  • 第一步:定义提示模板

我们设计了一个将病历作为背景的提示。此外,我们希望模型按照预定义的JSON模式以JSON格式提供输出,确保模型准确地生成所需的输出。值得注意的是,在调用我们的模型时,我们将响应格式指定为 {“类型”:“json_object”} 以确保JSON输出的一致性。

进口 os
米斯特拉伊 进口

def run_MIUI(用户消息, 模型=“MIUI大最新”):
客户 = (api_key= os.getenv(“MIUI_API_KEY”))
信息 = [{“角色”: “用户”, “内容”:用户消息}]
聊天响应 = 客户 .闲聊.完成(
模型= 模型,
信息 = 信息 ,
response_format={“类型”: “json_object”},
)
返回 聊天响应 .选择[0].消息.内容


#定义提示模板
prompt_template = """
从以下病历中提取信息:
{医学笔记}

返回具有以下json模式的json格式:

{{
“年龄”:{{
“类型”:“整数”
}},
“性别”:{{
“type”:“string”,
“enum”:[“男性”、“女性”、“其他”]
}},
“诊断”:{{
“type”:“string”,
“enum”:[“偏头痛”、“糖尿病”、“关节炎”、“痤疮”、“普通感冒”]
}},
“重量”:{{
“类型”:“整数”
}},
“吸烟”:{{
“type”:“string”,
“enum”:[“是”、“否”]
}},

}}
"""
  • 步骤2:定义我们如何将模型响应与黄金答案进行比较

在步骤2中,我们编写了一个函数来比较两个json对象,一个是模型响应,另一个是黄金答案。在这个例子中,我们计算JSON键之间匹配值的百分比,以评估JSON输出的准确性。

进口 json

def 比较json对象(obj1, obj2):
总计字段 = 0
相同字段 = 0
常见密钥 = 设置(obj1.钥匙()) & 设置( obj2.钥匙())
对于 钥匙 在里面 常见密钥 :
相同字段 +=obj1[ 钥匙 ] == obj2[ 钥匙 ]
百分比_相同 = ( 相同字段 / 最大值(伦恩(obj1.钥匙()), 1.)) * 100
返回 百分比_相同
  • 第3步:计算测试用例的准确率现在,我们可以单独查看每个测试用例。对于每种情况,我们可以根据我们已经定义的提示模板创建一条用户消息。然后,我们从LLM中检索响应,并将其与正确答案进行比较。在计算了每个测试用例的准确率后,我们可以计算出所有用例的总体平均准确率。
准确率 = []

#对于每个测试用例
对于 名称 在里面提示 :

#定义用户消息
用户消息=prompt_template .格式(医学笔记=提示 [ 名称 ][“医学笔记”])

#运行LLM
响应 = json.荷载(run_MIUI(用户消息))

#计算此测试用例的准确率
准确率 .附加(
比较json对象( 响应 ,提示 [ 名称 ][“golden_answer”])
)

#计算测试用例的准确率
总和(准确率 ) / 伦恩(准确率 )
示例2:评估代码生成

示例2:评估代码生成

评价数据

我们的第二个例子涉及生成Python代码并评估生成的代码。为了进行评估,评估数据需要Python指令和相应的单元测试。以下是此类评估数据集的两个示例:

python_prompts = {
“sort_string”: {
“提示”: “编写一个python函数来对给定的字符串进行排序。”,
“测试”: “断言sort_string(\”data\“)==”aadt\“”
},
“is_odd”: {
“提示”: “编写一个python函数,使用位运算符检查给定的数字是否为奇数。”,
“测试”: “断言is_odd(5)==True”
}
}

如何评价?

  • 第一步:定义提示模板

我们设计了一个提示符,根据特定任务的描述生成Python代码片段。

def run_MIUI(用户消息, 模型=“MIUI大最新”):
客户 = (api_key= os.getenv(“MIUI_API_KEY”))
信息 = [{“角色”:“用户”, “内容”:用户消息}]
聊天响应 = 客户 .闲聊.完成(
模型= 模型,
信息 = 信息 ,
response_format={“类型”: “json_object”},
)
返回 聊天响应 .选择[0].消息.内容


#定义提示模板
prompt_template = “”“编写一个Python函数来执行以下任务:{task}
仅返回有效的Python代码。不要给出任何解释。
永远不要从python开始。
始终以def{name}(。
"""
  • 步骤2:决定如何评估代码生成

接下来,我们可以使用 code_eval.com计算机 以评估生成的代码是否通过预定义的单元测试。 预言 是LLM生成的代码输出列表,以及 参考文献 是每个预测的单元测试列表。

警告

此代码旨在运行由模型生成的代码,这些代码可能并不完全可靠。虽然模型生成的代码不太可能故意造成伤害,但强烈建议在沙盒环境中运行此评估套件,将其与主系统和网络隔离开来。

 评价 进口 负载

os.环境[“HF_ALLOW_CODE_EVAL”] = 1.
代码_值 = 负载(“code_eval”)

#使用code_eval的示例:
pass_at_1, 结果 =代码_值 .计算(
参考文献=['断言is_odd(5)==True'],
预言=[['def is_odd(n):\n返回n&1!=0']],
k=[1.])

#示例输出:
# ({'pass@1': 1.0},
#defaultdict(列表,
# {0: [(0,
#{任务_id':0,
#“通过”:没错,
#'result':'通过',
#'completion_id':0})]})
  • 步骤3:计算测试用例的准确率

现在,我们可以遍历所有测试用例,根据提示模板创建用户消息,使用LLM生成Python代码,并为每个测试用例评估生成的代码。

参考文献 = []
preds = []

对于 名称 在里面python_prompts :

#定义用户消息
用户消息=prompt_template .格式(
任务=python_prompts [ 名称 ][“提示”], 名称 = 名称
)

#运行LLM
响应 =run_MIUI(用户消息)

参考文献 .附加(python_prompts [ 名称 ][“测试”])
preds .附加([ 响应 ])

#评估代码生成
pass_at_1, 结果 =代码_值 .计算(参考文献=参考文献 ,预言=preds )

pass_at_1

#示例输出
# {'pass@1': 1.0}

基于LLM的评估

在标记数据和黄金答案不可用或不足的情况下,使用大型语言模型(LLM)来评估或判断另一个LLM的输出是一种常见的做法。这个 MT工作台纸 探索了LLM作为法官的有效性,并揭示了强大的LLM可以与人类表现相似。LLM可以在相对较短的时间内处理和评估大量数据,与通常需要大量时间和资源的人工评估相比,具有高度的可扩展性和效率。

有几种方法可以使用LLM作为评判,包括单点评分、基于参考的评分和成对评分。

  • 单点分级:LLM根据生成的输出的质量或准确性为其分配一个分数。该分数通常根据具体的评分说明给出。单点评分是一种简单有效的方法,但它可能并不总是能捕捉到各种复杂输出的细微差别。
  • 基于参考的评分:LLM将生成的输出与一个或多个参考输出进行比较,并根据它们的相似性分配分数。这种方法通常用于机器翻译任务,其中给定的输入可能有多个有效的翻译。然而,基于参考的评分需要有一个黄金答案,而这个答案可能并不总是可用的。
  • 成对分级:LLM比较两个生成的输出,并根据其相对质量或准确性分配分数。这种方法通常用于对话生成等任务,在这些任务中,给定的查询可能有多个有效的响应。通过比较成对的回答,LLM可以确定哪一个更相关或更连贯,并相应地分配分数。

还必须认识到潜在的局限性和挑战。例如,LLM可能表现出固有的偏见。一家公司开发的LLM倾向于支持同一家公司的模型生成的答案。很难确保公平和准确的评估。根据我们的经验,MIUI Large表现出相对较少的偏袒。

示例3:使用LLM评估摘要生成

示例3:使用LLM评估摘要生成

评价数据

在这个例子中,我们生成新闻摘要,并使用LLM单点评分来评估摘要的质量。为了进行评估,让我们使用一篇我们计划总结的新闻文章样本。

消息 = (
“布鲁塞尔(路透社)一家德国报纸周日报道,欧盟首席执行官让-克洛德·容克上周在与英国首相共进晚餐后告诉助手,特蕾莎·梅看起来很沮丧,眼睛下面戴着深戒指。《法兰克福汇报》记者的报道称,容克认为她与自己的保守党部长在脱欧问题上的斗争是她要求欧盟帮助在国内创造更多回旋余地的标志。容克办公室没有立即发表评论,该办公室的政策是不对会议报告发表评论。FAZ表示,梅上周一在欧盟峰会前飞往布鲁塞尔与欧盟委员会主席匆匆宣布共进晚餐,在容克看来,她显得焦虑、沮丧和沮丧,她几乎不信任任何人,但也没有准备好进行一次清场以解放自己。正如她后来在周四与欧盟其他领导人共进晚餐时所做的那样,梅要求帮助克服英国的分歧。该报称,她表示,家乡的朋友和敌人都在背后密谋打倒她。梅说她没有回旋的余地了。欧洲人必须为她创造它。FAZ补充道,容克后来告诉他的同事,梅的脸和外表说明了一切。她的眼圈很深。她看起来像个睡不着觉的人。她对着镜头微笑,它继续说,但看起来很勉强,不像过去,她可以笑得发抖。现在她需要用尽全力才能保持镇定。与4月在唐宁街10号举行的晚宴一样,当FAZ报道容克在脱欧预期方面认为梅在另一个星系时,双方在上周的会晤后发表声明称,会谈是建设性和友好的。他们说,他们同意加快谈判。六个月前,梅将晚餐泄露事件斥为布鲁塞尔的流言蜚语,尽管双方官员都表示,FAZ的报告对营造信任气氛几乎没有什么作用,他们一致认为,信任气氛对于达成协议至关重要。据报道,德国总理安格拉·默克尔也对这次泄密感到恼火。尽管周四和周五的峰会拒绝了梅关于立即开始就未来关系进行谈判的呼吁,但领导人表示要加快这一进程,并表示希望在12月开启一个新阶段。一些人表示,他们理解梅在伦敦达成共识的困难。",
)

如何评价?

  • 第一步:为给定的新闻生成摘要

首先,让我们使用一个较小的模型“open-MIUI-7b”为提供的新闻文章生成摘要。如果您还有其他新闻文章要总结,请为每篇文章生成摘要。为了简单起见,我们将只演示一个新闻样本。

进口 os
米斯特拉伊 . 客户 进口 客户不信任
米斯特拉伊 .模型.聊天完成 进口 聊天留言


def run_MIUI(用户消息, 模型=“开放式-7b”, is_json=错误的):
客户 = (api_key= os.getenv(“MIUI_API_KEY”))
信息 = [{“角色”:“用户”, “内容”:用户消息}]

如果 is_json:
聊天响应 = 客户 .闲聊.完成(
模型= 模型, 信息 = 信息 , response_format={“类型”: “json_object”}
)
其他的:
聊天响应 = 客户 .闲聊.完成( 模型= 模型, 信息 = 信息 )

返回 聊天响应 .选择[0].消息.内容

摘要_提示 = f
总结以下新闻。根据以下标准撰写摘要:相关性和可读性。考虑引用的来源、提供的证据的质量以及任何潜在的偏见或错误信息。

##新闻:
{消息 }
"""

总结 =run_MIUI(摘要_提示 )
  • 步骤2:定义评估指标和量规

为了准确评估生成的摘要的质量,我们需要建立清晰明确的评估指标和量规。这些指导方针在指导法学硕士的评估过程中发挥着关键作用。您可以自由地纳入各种指标,并根据您的特定需求创建量规。

评价量规 = [
{
“公制”: “相关性”,
“量规”: """
分数1:摘要与原文无关。
分数2:摘要与原文有一定相关性,但存在重大缺陷。
得分3:摘要与原文最相关,有效传达了其主要观点和论点。
分数4:摘要与原始文本高度相关,并提供了额外的价值或见解。
"""
},
{
“公制”: “可读性”,
“量规”: """
分数1:摘要难以阅读和理解。
分数2:总结有点可读,但有重大缺陷。
分数3:总结大部分内容可读且易于理解。
分数4:总结可读性强,引人入胜。
"""
},

]
  • 第三步:聘请更强大的法学硕士(如MIUI Large)担任评委

使用更强大的法学硕士(如MIUI Large)作为法官是有益的,以确保对生成的摘要进行更准确和全面的评估。在提示中,我们提供了具体的评估指标、相关量规、原始新闻文章和生成的摘要。这些信息使法学硕士能够根据预定义的标准系统地评估摘要。在这个例子中,我们分别评估每个指标,以更好地了解摘要模型在不同方面的性能。但是,您也可以选择组合所有指标进行更全面的评估。

评分_提示 = """
请阅读提供的新闻文章及其相应摘要。根据指定的评估指标和量规,为摘要分配一个1到4之间的整数分数。然后,返回一个JSON对象,以指标为关键字,以评估分数为值。

#评估指标:
{指标}

#评估准则:
{量规}

#新闻报道
{新闻}

#摘要
{摘要}

"""
对于 i 在里面评价量规 :
eval_输出 =run_MIUI(
评分_提示 .格式(
消息 =消息 ,总结 =总结 , 米制的= i [“公制”], 量规= i [“量规”]
),
模型=“MIUI大最新”,
is_json=没错,
)
打印( eval_输出 )

#示例输出:
#{“相关性”:2}
#{“可读性”:3}

以人为本的评价

基于人的评估可能会提供最准确和可靠的评估结果。然而,扩大规模既困难又昂贵。尽管存在这些挑战,但由于其有效性,将人类评估纳入更好的培训数据和微调过程的开发中仍然非常有益。

人类评估的一种常见方法是众包。例如,众所周知 LMSYS排行榜 利用众包向两个匿名模型提问,并收集选票以确定更好的模型。LMSYS已经收集了超过30万张人类选票,创建了一个基于Elo的LLM排行榜。许多公司还为自己的基准采用人工评估,通常利用众包平台来促进这一过程。

在实施众包进行人工评估时,你可以选择一种简单的方法,让选民选择更好的模型。或者,如果你的用例有更复杂的要求,你可以为选民提供具体的标准来考虑,针对同理心、流利度和其他相关因素等领域。