<TLDR>
太长了,没看
</TLDR>
评估由大型语言模型生成的输出对于构建稳健的应用程序至关重要,因为它允许将复杂的AI应用程序拆分为具有内置错误控制的简单阶段。
在监督模式下评估生成的输出相对简单,因为“正确答案”可以由人工评价者提供或通过计算得出。
同时,在许多实际的大型语言模型应用场景中,监督方法过于严格,需要能够应对开放式问题的评估方法。构建无监督评估器的最简单方式是让大型语言模型自我评价。然而,生成模型检测其输出中错误的能力尚不明确。
我们展示了通过迭代自我反思可以提高自我评估的质量。类似于“思维链”技术,这种方法以最终结果的稳健性为代价,换取推理时的计算量。
</TLDR>
点击访问包含示例的 Google Colab 笔记本(内含示例)
点击此处访问Colab链接: https://colab.research.google.com/drive/1q_dChQBMbnUXZ377JVwYsjvn7lZ_7qlZ?usp=sharing
图片来源:Flux 1. Pro模型提示为‘机器人评估其他机器人’
这里是一些介绍在使用大型语言模型构建处理管道的过程中,经常提到的问题是生成输出的质量问题。如果有良好的评估流程,它可以突出表现不佳的案例,并触发进一步的动作,如LLM微调、调整提示、升级到人工代理——或者同时触发这些动作。
这里是一个使用评估进行训练的典型工作流程:一个大型语言模型(LLM)会遍历输入数据集中的数据,评估器检测到的任何输出差异都将用于生成合成数据来进一步训练模型。只有在满足目标质量指标后,应用才会被部署。
作者提供的图片:LLM的微调评估流程图
在生产环境中使用LLM模型非常相似——只不过发现的差异通常会转交给人类操作员,以确保流程继续进行,即使出现了错误标志。
然而,构建一个好的大型语言模型(LLM)评估器其实挺难的。这种复杂性主要来自两个实际的限制条件。
首先,尽量减少人为干预是非常理想的。例如,想象一下,聊天机器人和用户互动时,未能识别常见的口语省略模式(用一个词代替完整的句子输出):
Bot: 你说的是对的吗?
User: 对
Bot: 没听清楚,请再说一遍。
User: 对的,没错。
鉴于这段对话,人类应该能够轻松发现聊天机器人的回应中的缺点,并提出一些改进意见。然而,为了发现这些问题,评估者必须阅读整个对话(这可能非常长)。这种方法在大规模使用时行不通——这意味着我们应该努力实现不用人工的评估。
第二,在不知道“实际情况”的情况下判断大语言模型的输出,其难度与原任务相当。这意味着最先进的大语言模型所能用的评估者(很可能就是它自己)能力也差不多,因此这种评估的有效性受到质疑。
监督性评估我们会发现这些方法大多集中在监督或半监督的应用场景上。
如果训练数据集包含“真实答案”,评估就变得简单多了——甚至可以驱动优化框架,比如DSPy。同样,当测试企业LLM应用程序时,如果与人类代理处理过的案例进行对比,这里的“真实答案”就是这些代理的判断。
另一个机会是检查输出是否符合“ground truth”,比如当LLM生成的输出可以被正式验证时,例如可以编译和测试的计算机代码。虽然程序实现方式多种多样,正确的代码应能通过所有测试,无论实现方式如何。
当生成输出无法正式验证时,通常需要引入人类参与。例如,可以使用RLHF依据人的喜好对LLM输出进行评分,从而让网络更倾向于复杂的和微妙的策略。
无监督自我评估与此同时,有许多开放式的评估案例中,“地面真理”方法无法实施,而RLHF又过于耗时或成本过高。这也就解释了为什么人们会对无监督自我评估技术感兴趣。
那么,假设我们有一个通常需要人工评估的大语言模型的开放性问题——比如“这个聊天机器人怎么才能改进”——我们能如何做来实现自动化?
可以构建一个经济有效的评估工具,如果假设具有丰富语义表示的现代大型语言模型固有的自我评估能力。这意味着你可以简单地让模型评估自己的输出,或者使用另一个 LLM 来完成相同任务以避免它们训练集之间的交叉污染。
不幸的是, LLM 自我评判的简单地实现可能会出问题。这可能有以下几个原因。
首先是最明显的:一个大型语言模型 (LLM)在没有反映在其训练数据集中的主题或无法通过检索工具(如网络搜索)获取的信息上,无法保证输出连贯性。例如,考虑这个来自Google地图的片段,它描绘了加利福尼亚州的一个小镇叫矿物镇(Mineral),以及流经该镇的一条小溪(马丁溪)。
矿物镇, 加州附近(来源:Google地图)
矿物镇并没有自己的维基百科页面,而且大多数语言模型在训练时并不使用地理信息系统(GIS)数据,所以当被问到哪条溪流穿过这个小镇时,这些模型很容易会胡说八道:
GPT-4幻觉示例(错误示例)
_米勒溪_是一个真实存在的水体,环绕更大的普查指定区域(Mineral)。然而,_米勒溪_并没有流经矿物镇的中心地带,因此,GPT-4o的答案并不正确。
直觉上感觉,由于主题不在知识范围之内且无法通过常用工具(比如网络搜索)得到信息,这种失败在普通的 LLM 推理中不应容易被模型自我发现。
第二个导致自评失败的原因较为微妙,这与大型语言模型输出的随机特性有关。在需要包含多个观察结果的评估中,这一点容易展示为。来看用户与聊天机器人之间的对话:
Bot: 我是来帮助您找到最适合的手机套餐的聊天机器人。
User: 我需要至少500GB的数据,而且价格要低于50美元。
Bot: “终极自由”套餐提供无限制的网络流量,价格为79.99美元。
User: 这可能行得通。
Bot: 您想更改当前的套餐吗?
User: “终极自由”套餐只是国内使用吗?我可以使用国际漫游吗?
Bot: 对不起,我没听清楚您的问题。请再试一次,好吗?
User: 我现在结束了,暂时不要做任何更改。
如果我们反复要求一个大型语言模型(LLM)列出根据此对话可以对机器人进行的改进,我们会发现不同运行下的输出列表并不稳定。其中一个版本可能如下所示:
{["确保机器人在提出建议后能回答后续问题。",
"提高机器人识别告别信息的能力。",
"确保机器人能帮助用户查询其他功能或套餐信息。"]}
另一个可能看起来是这样的。
{["确保机器人能够切换上下文并回答后续问题。",
"让机器人能够判断对话何时结束。",
"增强机器人提供额外服务选项的能力。",
"支持接收关于成本限制的信息,例如用户提到期望的价格。"]}
尽管这两个回答有很多重叠,很明显,在这两种情况中都没有产生详尽的建议列表。
不经意的自我反省的力量一旦我们概述了评估中的典型失败模式,使用LLM来自我评判似乎不是一个明智的选择。毕竟,这就像让一个勤奋的学生自己检查答案一样。一个好学生通常不会犯太多拼写错误,重新检查只是重复现有的知识,不会带来任何改进。
然而,这是我们对LLM(大型语言模型)的直觉可能完全错的地方。
实际上,即使在超出其知识范围的地方,大多数大型的语言模型也具备自我纠正的能力。
为了说明这一现象,让我们回到GPT-4o示例中关于跨越加利福尼亚州矿物_镇的水域的幻觉。有意思的是,在自我评估过程中可以纠正这个特定的幻觉。
在GPT-4O中的自我评价能够纠正幻觉。
那么,这神奇的地方在哪里呢?
在这个例子中,LLM 没有相应的知识或工具来获取正确答案,因此它会编造一个“最可能”的答案。然而,当被要求评估自己的回答时,它会发现,自己能获取的信息并不能支持之前的说法。尽管 GPT-4o 不知道正确答案,它仍能指出错误答案的不足。
更复杂的模型(比如GPT-4o1)可能稍微难一点用同样的方式来处理,因为它倾向于产生更细腻的回答。
GPT-4o1生成的内容在不一致方面更为微妙的差异。
而不是编造一个它无法验证的话题,GPT-4o1可能会选择回答一个它从未被问过的问题——比如“美国内华达州矿物市附近的主要河流是什么?”这种回避方式意味着,一个直接的自我评估提示,比如“评估为真或假”,可能会不起作用。
然而,更谨慎地要求自我评估仍然可以成功,即使需要反复尝试也行。
这种大型语言模型能够迭代地自我反思的能力当然是众所周知的这一点,且在诸如代码生成等应用中被视为理所当然。在这里,我们只是将同样的技术应用于自我评估。
缓存的预期效果:同样的迭代反思概念也适用于倾向于产生不完整输出的大型语言模型(LLM)任务。如果我们再次看看机器人对话的例子,并允许大型语言模型在改进列表上迭代,我们会发现模型最初很少对结果感到“满意”。
也就是说,如果我们这样设计提示:
迭代提示信息 = """
请看以下用户与聊天机器人之间的对话。
机器人的目标是根据用户提供的信息推荐更便宜的移动套餐计划。
用户的回答可能不会始终一致或连贯。
此对话已由一个大型语言模型(LLM)评估,评价结果如下所示。
你的任务是评估评价的质量,并在没有任何需要添加的内容时,请回复“success”=True并重复原操作列表。
如果评价中缺少某些内容,用“success”=False并提供一个新的操作列表,以改进用户体验,结合旧列表和新建议。确保列表中的项目是唯一且不重复。
"""
然后通常需要2到4次遍历改进列表,直到LLM达到稳定推荐并认定评估任务成功。
🍩
success='False' action_items=['启用机器人理解用户关于国际通话附加套餐的查询请求。', '改进机器人处理诸如“byebye”这类非正式或随意告别语的能力。']
🍩
success='False' action_items=['启用机器人理解用户关于国际通话附加套餐的查询请求。', '改进机器人处理诸如“byebye”这类非正式或随意告别语的能力。', '增强机器人推荐更符合用户预算的套餐的能力,例如当用户指定10美元预算时,推荐10美元左右的套餐而不是14美元的套餐。']
🍩
success='False' action_items=['启用机器人理解用户关于国际通话附加套餐的查询请求。', '改进机器人处理诸如“byebye”这类非正式或随意告别语的能力。', '增强机器人推荐更符合用户预算的套餐的能力,例如当用户指定10美元预算时,推荐10美元左右的套餐而不是14美元的套餐。', '确保机器人确认用户是否有兴趣选择没有包含国际通话分钟数的套餐,根据用户的旅行习惯。', '增加机器人在预算有限的情况下建议使用VoIP进行国际通话的功能。', '提高机器人推荐兼顾成本与用户需求的方案的能力,例如考虑用户的旅行习惯和所需功能。']
🍩
success='True' action_items=['启用机器人理解用户关于国际通话附加套餐的查询请求。', '改进机器人处理诸如“byebye”这类非正式或随意告别语的能力。', '增强机器人推荐更符合用户预算的套餐的能力,例如当用户指定10美元预算时,推荐10美元左右的套餐而不是14美元的套餐。', '确保机器人确认用户是否有兴趣选择没有包含国际通话分钟数的套餐,根据用户的旅行习惯。', '增加机器人在预算有限的情况下建议使用VoIP进行国际通话的功能。', '提高机器人推荐兼顾成本与用户需求的方案的能力,例如考虑用户的旅行习惯和所需功能。']
经过这最初的对话热身阶段,我们可以继续给模型输入更多的对话样例,看看结果如何。
就像人类评估员一样,GPT-4o 模型认为许多对话样本不值得重新生成推荐(一次运行就足够了)——但有些样本可能需要更深入地分析。
以下是取自ExpBot数据集的最初50个对话中LLM的调用次数,直到达到收敛状态(作者绘制的图表)。
最终我们将得到一份详尽的关于改进聊天bot的建议列表
最终建议:
["提高机器人避免用户输入模糊或重复时反复问候和重启的能力,以创建更流畅的对话流程。",
"增强机器人的主动倾听能力,确认用户需求和担忧,防止建议重新开始而增加用户不满。",
"增加允许用户就计划细节进行询问的功能,例如超额使用费用和漫游费等。",
"开发一个机制,使机器人能够检测并纠正用户输入中的拼写错误和货币符号不匹配。",
"提供替代方案,即使不符合所有标准,但能根据用户数据给出其他领域显著节省或好处的建议。",
"实现一个反馈系统,让用户体验后可以对计划建议的准确性和有用性进行评分,有助于不断改进。",
"设置一个训练机制,使机器人能够处理格式不规范或包含多余信息的回复。",
"增加机器人在遇到复杂问题或用户不满意时,建议寻求人工帮助的功能。",
"增强机器人处理各种表达和非正式用语的语言处理能力,以准确理解用户意图。",
"提高机器人动态请求用户澄清信息的能力,以确保对话流程更加顺畅。",
"提升机器人验证用户信息的准确性,减少误解和用户不满意的情况。",
"改进机器人处理不切实际或不一致输入的方式,引导对话回到相关问题。",
"整合识别不合逻辑输入的功能,并引导用户提供准确信息的流程。",
"提供更清晰的解释,确保用户了解计划建议与他们提及的需求之间的差异。",
"改进对与重新计算无关问题的响应,避免不必要的循环。"]
这里有一些关于这个例子的技术备注:
- 为了简单起见,我们将评估和生成合并成一个提示,依赖于OpenAI的结构化输出来生成期望的结果。
- 缓存机制的固有局限性要求按顺序处理样本数据。这在处理长数据集时可能需要一些时间,这也阻碍了我们利用批处理调用进行低成本的推理。
为了进一步提升性能,我们可以利用数据集中的大多数样本并不会带来新的见解这一事实。这意味着我们可以通过按顺序处理一个小样本子集来生成初步的推荐列表,并通过DataChain库(或使用OpenAI API批量处理)并行处理剩余的数据集,标记出“有趣的”案例,从而根据您的偏好,可以将处理时间和费用预算分别减少30-50%。
最后大型语言模型可以并且应该被用来进行无监督评估(包括自我评估)。重要的是采用周密考虑的方法——这通常意味着采取迭代的方式来改进并精炼判断。
这里有一个Google Colab上的示例链接。
https://colab.research.google.com/drive/1q_dChQBMbnUXZ377JVwYsjvn7lZ_7qlZ?usp=sharing
共同学习,写下你的评论
评论加载中...
作者其他优质文章