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

news2024/11/15 11:06:39

上一章我们探索了如何评估 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 response

evaluation_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_answer
    
    system_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 系统的输出,以便在开发期间持续监测系统的性能,并使用这些工具不断评估和改进系统的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灯塔:CSS笔记(2)

一 选择器进阶 后代选择器:空格 作用:根据HTML标签的嵌套关系,,选择父元素 后代中满足条件的元素 选择器语法:选择器1 选择器2{ css } 结果: *在选择器1所找到标签的后代(儿子 孙子 重孙子…

Docker常见命令使用

Docker命令是使用Docker的基础。这里记录下Docker日常运维过程中经常使用到的一些命令,更全面的命令还请参考Docker官网。 docker用法概述 Docker命令可以通过CLI工具实现与服务器的交互。Docker命令的语法如下: docker [DOCKER-COMMAND] [OPTIONS] […

【高效开发工具系列】Windows 系统下将 Windows 键盘的 ctrl 和 alt 互换

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

vscode 配置opengl (glut), lib链接可参考

这里假定你已经配置好基础的vscode c环境 json介绍 这里其实主要配置的3种json, vscode其实就是通过launch.json和tasks.json来自动生成指令的 launch.json 这个用于启动程序用的,但是由于其可以指定preLaunchTask-即在启动之前需要做什么事情,所以这…

【面试精讲】Java动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

Java动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别? 目录 一、Java动态代理的实现 1、使用JDK Proxy实现动态代理 2、使用CGLib实现动态代理 二、JDK Proxy 与 CGLib 的区别 三、Spring中的动态代理 四、 Lombok代理原理 总结 前言 本文…

做跨境电商,选哪个浏览器好?跨境电商浏览器推荐

在我们的日常生活中,有很多浏览器可供选择,比如百度浏览器、谷歌浏览器和360、火狐等等。但是在跨境电商行业中,是否有特别适合我们卖家使用的浏览器呢?所谓跨境电商浏览器,就是为跨境电商用户设计的浏览器&#xff0c…

【LeetCode 算法专题突破】---二分查找(⭐⭐⭐)

前言 我在算法题目的海洋中畅游已久,也曾在算法竞赛中荣获佳绩。然而,我发现自己对于算法的学习,还缺乏一个系统性的总结和归类。尽管我已经涉猎过不少算法类型,但心中仍旧觉得有所欠缺,未能形成完整的算法体系。 因…

官方阴阳怪气?双标?《Nature》专访《中科院预警名单》,中国作者为何炸裂?

毕业推荐 SCIE: • 计算机类,6.5-7.0,JCR1区,中科院2区 • 2个月19天录用,6天见刊,36天检索 SCI&EI(CCF-C类) • 算法类,2.0-3.0,JCR3区&#xff0c…

Springboot+vue的养老院管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的养老院管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的养老院管理系统,采用M(model)V&…

SpringBoot 多平台文件配置

目录 一 主配置文件和辅配置文件 二 具体使用 1. 通过直接修改 application.yml 中的属性值 2. 通过 maven 进行配置修改 当我们需要部署项目的时候, 肯定会遇到不同的部署环境下, 需要有不同的配置. 例如开发环境下和生产环境下的配置肯定就不会是完全相同的, 如数据库的…

pytorch 批量归一化BatchNorm的BatchNorm1d和BatchNorm2d理解

BatchNorm即批量归一化,是深度学习中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,是神经网络训练必不可少的一部分。 BatchNorm作用:在进行批量训练过程中,每个batch具有不同的分布,使数据分布…

图片二维码不限扫码次数怎么做?长期有效的图片二维码在线生成技巧

图片制作二维码能长期使用吗?在生活中很多地方都可以看到很多存有图片的二维码,通过扫码后查看图片内容,比如一些公共场所、产品介绍、景区等场所中都有图片转二维码的应用。那么怎么做出可以长期扫码展示图片二维码呢,其实方法很…

CSS 弹性盒子模型

它主要是在一个大的容器当中里面子元素的一个设置。一个大的盒子里面里面的子元素如何摆放由我们的弹性盒子说的算。 之前的盒子模型是一个元素,内边距外边距,边框来调整在页面所显示的位置。 弹性盒子,在大容器里面,里面有很多…

基于C++的配置文件解析器/编码器——toml库

在平常的软件开发过程中,配置文件是重要的一环,使用配置文件在软件开发过程中具有以下好处和必要性: 灵活性:配置文件允许在不修改代码的情况下更改应用程序的行为,通过修改配置文件,可以调整应用程序的参…

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数,call函数其实和init是类似的; GitHub - XuHugo/xwasm 构建属性宏,要在cargo.toml里面设置一些参数,这是必须的。一般来说,过程宏必须是一个库,或者作为工程的子库&…

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高,传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题,影响了科研和生产的进度。为了解决这些问题,开发了一套基于LabVIEW开…

【Web安全】htaccess攻击

.htaccess攻击 文章目录 .htaccess攻击1. .htaccess文件2. 常见用法2.1. 自定义出错界面2.2. 强制文件执行方式2.3. PCRE绕过正则匹配2.4. php_value修改php设定2.5. php_value文件包含2.6. 把htaccess当作php 1. .htaccess文件 .htaccess是Apache网络服务器一个配置文件&#…

MATLAB读取.nc(数据集)文件

MATLAB读取.nc(数据集)文件 以中国1km逐月潜在蒸散发数据集(1901-2022)为例 首先用FileZilla下载特定年份的数据集 用matlab进行处理,代码如下: clear;clc;ncdisp("pet_2022.nc") %读数据集的具体信息和变量eva ncr…

JAVA中YML:几个用法

项目有一些配置文件,ini、prop类型的配置文件都考虑过后,还是选择yml文件,如上图:xxconfig.yml。 要求: 1、允许实施人员手动配置 2、配置文件要能轻便的转化为一个JAVA对象 3、程序启动后,打印这些配置项&…

蓝桥省赛倒计时 35 天-线性 dp 练习

文章目录 数学三角形最长上升子序列 数学三角形 思路&#xff1a;就是下一层通过上一层的条件转移过来&#xff0c;注意数可以是负数&#xff0c;所以边界得取-INF&#xff0c;这样求上层 max 的时候不会被初始化的数如 0 影响。 #include<bits/stdc.h> using namespace…