#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2

本文主要是介绍#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一章我们探索了如何评估 LLM 模型在 有明确正确答案 的情况下的性能,并且我们学会了编写一个函数来验证 LLM 是否正确地进行了分类列出产品。
在使用LLM生成文本的场景下,评估其回答准确率可以是一个挑战。由于LLM是基于大规模的训练数据进行训练的,因此无法像传统的分类问题那样使用准确率来评估其性能。

一、运行问答系统获得一个复杂回答

我们首先运行在之前章节搭建的问答系统来获得一个复杂的、不存在一个简单正确答案的回答:

import utils_zh'''
注意:限于模型对中文理解能力较弱,中文 Prompt 可能会随机出现不成功,可以多次运行;也非常欢迎同学探究更稳定的中文 Prompt
'''
# 用户消息
customer_msg = f"""
告诉我有关 the smartx pro phone 和 the fotosnap camera, the dslr one 的信息。
另外,你们这有什么 TVs ?"""# 从问题中抽取商品名
products_by_category = utils_zh.get_products_from_query(customer_msg)
# 将商品名转化为列表
category_and_product_list = utils_zh.read_string_to_list(products_by_category)
# 查找商品对应的信息
product_info = utils_zh.get_mentioned_product_info(category_and_product_list)
# 由信息生成回答
assistant_answer = utils_zh.answer_user_msg(user_msg=customer_msg, product_info=product_info)print(assistant_answer) 
关于SmartX Pro手机和FotoSnap DSLR相机的信息:1. SmartX Pro手机(型号:SX-PP10)是一款功能强大的智能手机,拥有6.1英寸显示屏、128GB存储空间、12MP双摄像头和5G网络支持。价格为899.99美元,保修期为1年。2. FotoSnap DSLR相机(型号:FS-DSLR200)是一款多功能的单反相机,拥有24.2MP传感器、1080p视频拍摄、3英寸液晶屏和可更换镜头。价格为599.99美元,保修期为1年。关于电视的信息:我们有以下电视可供选择:
1. CineView 4K电视(型号:CV-4K55)- 55英寸显示屏,4K分辨率,支持HDR和智能电视功能。价格为599.99美元,保修期为2年。
2. CineView 8K电视(型号:CV-8K65)- 65英寸显示屏,8K分辨率,支持HDR和智能电视功能。价格为2999.99美元,保修期为2年。
3. CineView OLED电视(型号:CV-OLED55)- 55英寸OLED显示屏,4K分辨率,支持HDR和智能电视功能。价格为1499.99美元,保修期为2年。请问您对以上产品有任何特别的要求或其他问题吗?

二、使用 GPT 评估回答是否正确

我们希望您能从中学到一个设计模式,即当您可以指定一个评估 LLM 输出的标准列表时,您实际上可以使用另一个 API 调用来评估您的第一个 LLM 输出。

from tool import get_completion_from_messages# 问题、上下文
cust_prod_info = {'customer_msg': customer_msg,'context': product_info
}def eval_with_rubric(test_set, assistant_answer):"""使用 GPT API 评估生成的回答参数:test_set: 测试集assistant_answer: 助手的回复"""cust_msg = test_set['customer_msg']context = test_set['context']completion = assistant_answer# 人设system_message = """\你是一位助理,通过查看客户服务代理使用的上下文来评估客户服务代理回答用户问题的情况。"""# 具体指令user_message = f"""\你正在根据代理使用的上下文评估对问题的提交答案。以下是数据:[开始]************[用户问题]: {cust_msg}************[使用的上下文]: {context}************[客户代理的回答]: {completion}************[结束]请将提交的答案的事实内容与上下文进行比较,忽略样式、语法或标点符号上的差异。回答以下问题:助手的回应是否只基于所提供的上下文?(是或否)回答中是否包含上下文中未提供的信息?(是或否)回应与上下文之间是否存在任何不一致之处?(是或否)计算用户提出了多少个问题。(输出一个数字)对于用户提出的每个问题,是否有相应的回答?问题1:(是或否)问题2:(是或否)...问题N:(是或否)在提出的问题数量中,有多少个问题在回答中得到了回应?(输出一个数字)
"""messages = [{'role': 'system', 'content': system_message},{'role': 'user', 'content': user_message}]response = get_completion_from_messages(messages)return responseevaluation_output = eval_with_rubric(cust_prod_info, assistant_answer)
print(evaluation_output)
助手的回应只基于所提供的上下文。是
回答中不包含上下文中未提供的信息。是
回应与上下文之间不存在任何不一致之处。是
用户提出了2个问题。
对于用户提出的每个问题,都有相应的回答。
问题1:是
问题2:是
在提出的问题数量中,有2个问题在回答中得到了回应。

三、评估生成回答与标准回答的差距

在经典的自然语言处理技术中,有一些传统的度量标准用于衡量 LLM 输出与人类专家编写的输出的相似度。例如,BLUE 分数可用于衡量两段文本的相似程度。
实际上有一种更好的方法,即使用 Prompt。您可以指定 Prompt,使用 Prompt 来比较由 LLM 自动生成的客户服务代理响应与人工理想响应的匹配程度。

'''基于中文Prompt的验证集'''
test_set_ideal = {'customer_msg': """\
告诉我有关 the Smartx Pro 手机 和 FotoSnap DSLR相机, the dslr one 的信息。\n另外,你们这有什么电视 ?""",'ideal_answer':"""\
SmartX Pro手机是一款功能强大的智能手机,拥有6.1英寸显示屏、128GB存储空间、12MP双摄像头和5G网络支持。价格为899.99美元,保修期为1年。
FotoSnap DSLR相机是一款多功能的单反相机,拥有24.2MP传感器、1080p视频拍摄、3英寸液晶屏和可更换镜头。价格为599.99美元,保修期为1年。我们有以下电视可供选择:
1. CineView 4K电视(型号:CV-4K55)- 55英寸显示屏,4K分辨率,支持HDR和智能电视功能。价格为599.99美元,保修期为2年。
2. CineView 8K电视(型号:CV-8K65)- 65英寸显示屏,8K分辨率,支持HDR和智能电视功能。价格为2999.99美元,保修期为2年。
3. CineView OLED电视(型号:CV-OLED55)- 55英寸OLED显示屏,4K分辨率,支持HDR和智能电视功能。价格为1499.99美元,保修期为2年。"""
}

我们首先在上文中定义了一个验证集,其包括一个用户指令与一个标准回答。
接着我们可以实现一个评估函数,该函数利用 LLM 的理解能力,要求 LLM 评估生成回答与标准回答是否一致。

def eval_vs_ideal(test_set, assistant_answer):"""评估回复是否与理想答案匹配参数:test_set: 测试集assistant_answer: 助手的回复"""cust_msg = test_set['customer_msg']ideal = test_set['ideal_answer']completion = assistant_answersystem_message = """\您是一位助理,通过将客户服务代理的回答与理想(专家)回答进行比较,评估客户服务代理对用户问题的回答质量。请输出一个单独的字母(A 、B、C、D、E),不要包含其他内容。 """user_message = f"""\您正在比较一个给定问题的提交答案和专家答案。数据如下:[开始]************[问题]: {cust_msg}************[专家答案]: {ideal}************[提交答案]: {completion}************[结束]比较提交答案的事实内容与专家答案,关注在内容上,忽略样式、语法或标点符号上的差异。你的关注核心应该是答案的内容是否正确,内容的细微差异是可以接受的。提交的答案可能是专家答案的子集、超集,或者与之冲突。确定适用的情况,并通过选择以下选项之一回答问题:(A)提交的答案是专家答案的子集,并且与之完全一致。(B)提交的答案是专家答案的超集,并且与之完全一致。(C)提交的答案包含与专家答案完全相同的细节。(D)提交的答案与专家答案存在分歧。(E)答案存在差异,但从事实的角度来看这些差异并不重要。选项:ABCDE
"""messages = [{'role': 'system', 'content': system_message},{'role': 'user', 'content': user_message}]response = get_completion_from_messages(messages)return response

这个评分标准来自于 OpenAI 开源评估框架,这是一个非常棒的框架,其中包含了许多评估方法,既有 OpenAI 开发人员的贡献,也有更广泛的开源社区的贡献。
在这个评分标准中,我们要求 LLM 针对提交答案与专家答案进行信息内容的比较,并忽略其风格、语法和标点符号等方面的差异,但关键是我们要求它进行比较,并输出从A到E的分数,具体取决于提交的答案是否是专家答案的子集、超集或完全一致,这可能意味着它虚构或编造了一些额外的事实。
LLM 将选择其中最合适的描述。
LLM 生成的回答为:
print(assistant_answer)

关于SmartX Pro手机和FotoSnap DSLR相机的信息:1. SmartX Pro手机(型号:SX-PP10)是一款功能强大的智能手机,拥有6.1英寸显示屏、128GB存储空间、12MP双摄像头和5G网络支持。价格为899.99美元,保修期为1年。2. FotoSnap DSLR相机(型号:FS-DSLR200)是一款多功能的单反相机,拥有24.2MP传感器、1080p视频拍摄、3英寸液晶屏和可更换镜头。价格为599.99美元,保修期为1年。关于电视的信息:我们有以下电视可供选择:
1. CineView 4K电视(型号:CV-4K55)- 55英寸显示屏,4K分辨率,支持HDR和智能电视功能。价格为599.99美元,保修期为2年。
2. CineView 8K电视(型号:CV-8K65)- 65英寸显示屏,8K分辨率,支持HDR和智能电视功能。价格为2999.99美元,保修期为2年。
3. CineView OLED电视(型号:CV-OLED55)- 55英寸OLED显示屏,4K分辨率,支持HDR和智能电视功能。价格为1499.99美元,保修期为2年。请问您对以上产品有任何进一步的问题或者需要了解其他产品吗?
eval_vs_ideal(test_set_ideal, assistant_answer)

‘C’
对于该生成回答,GPT 判断生成内容与标准答案一致

assistant_answer_2 = "life is like a box of chocolates"eval_vs_ideal(test_set_ideal, assistant_answer_2)

‘D’
对于明显异常答案,GPT 判断为不一致
希望您从本章中学到两个设计模式。

  1. 即使没有专家提供的理想答案,只要能制定一个评估标准,就可以使用一个 LLM 来评估另一个 LLM 的输出。
  2. 如果您可以提供一个专家提供的理想答案,那么可以帮助您的 LLM 更好地比较特定助手输出是否与专家提供的理想答案相似。

希望这可以帮助您评估 LLM 系统的输出,以便在开发期间持续监测系统的性能,并使用这些工具不断评估和改进系统的性能。

这篇关于#LLM入门|Prompt#2.10_评估、自动化测试效果(下)——当不存在一个简单的正确答案时 Evaluation Part2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793034

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的