【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时

第十章,评估(下)-当不存在一个简单的正确答案时

在上一章中,了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出,我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。

然而,如果 LLM 用于生成文本,而不仅仅是分类问题的答案呢?接下来,我们将探讨如何评估这种类型的 LLM 输出的方法。

一,环境配置

参考第二章的 环境配置小节内容即可。

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

String delimiter = "###";String customer = "告诉我有关 the smartx pro phone 和 the fotosnap camera, the dslr one 的信息。\n" +"另外,你们这有什么 TVs ?";//从问题中抽取商品大类和名称String result = this.getProductsFromQuery(customer);JSONArray jsonArray = JSONUtil.parseArray(result);//查找商品对应信息List<JSONObject> products = this.getMentionedProductInfo(jsonArray);List<ChatMessage> messages = new ArrayList<>();String system = "您是一家大型电子商店的客户服务助理。\n" +"请用友好和乐于助人的口吻回答问题,提供简洁明了的答案。\n" +"确保向用户提出相关的后续问题。";ChatMessage systemMessage = new ChatMessage();systemMessage.setRole("system");systemMessage.setContent(system);messages.add(systemMessage);ChatMessage userMessage = new ChatMessage();userMessage.setRole("user");userMessage.setContent(delimiter + customer + delimiter);messages.add(userMessage);ChatMessage assistantMessage = new ChatMessage();assistantMessage.setRole("assistant");assistantMessage.setContent("相关产品信息:\n" + JSONUtil.toJsonStr(products));messages.add(assistantMessage);String answer = this.getCompletionFromMessage(messages, 0);log.info("test1:\n{}", answer);
test1: 
我们有以下产品可供您选择:1. SmartX ProPhone - 这是一款功能强大的智能手机,拥有6.1英寸的显示屏,128GB的存储空间,12MP的双摄像头和5G网络支持。售价为899.99美元。2. FotoSnap DSLR Camera - 这是一款多功能的单反相机,拥有24.2MP的传感器,1080p的视频拍摄能力,3英寸的LCD屏幕和可更换镜头。售价为599.99美元。关于电视,我们有以下几款可供选择:1. CineView 4K TV - 这是一款55英寸的4K电视,支持HDR和智能电视功能。售价为599.99美元。2. CineView 8K TV - 这是一款65英寸的8K电视,支持HDR和智能电视功能。售价为2999.99美元。3. CineView OLED TV - 这是一款55英寸的OLED电视,支持4K分辨率、HDR和智能电视功能。售价为1499.99美元。请问您对以上产品有什么具体的要求或者其他问题吗?

三,使用 GPT 评估回答是否正确

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

    /*** 使用 GPT API 评估生成的回答** @param customerMsg     用户的输入* @param context         回答需要的上下文内容* @param assistantAnswer GPT的回答*/public String evalWithRubric(String customerMsg, String context, String assistantAnswer) {String delimiter = "###";String system = "你是一位助理,通过查看客户服务代理使用的上下文来评估客户服务代理回答用户问题的情况。";String user = "你正在根据代理使用的上下文评估对问题的提交答案。以下是数据:\n" +"    [开始]\n" +"    ************\n" +"    [用户问题]: " + customerMsg + "\n" +"    ************\n" +"    [使用的上下文]: " + context + "\n" +"    ************\n" +"    [客户代理的回答]: " + assistantAnswer + "\n" +"    ************\n" +"    [结束]\n" +"\n" +"    请将提交的答案的事实内容与上下文进行比较,忽略样式、语法或标点符号上的差异。\n" +"    回答以下问题:\n" +"    助手的回应是否只基于所提供的上下文?(是或否)\n" +"    回答中是否包含上下文中未提供的信息?(是或否)\n" +"    回应与上下文之间是否存在任何不一致之处?(是或否)\n" +"    计算用户提出了多少个问题。(输出一个数字)\n" +"    对于用户提出的每个问题,是否有相应的回答?\n" +"    问题1:(是或否)\n" +"    问题2:(是或否)\n" +"    ...\n" +"    问题N:(是或否)\n" +"    在提出的问题数量中,有多少个问题在回答中得到了回应?(输出一个数字)";List<ChatMessage> messages = new ArrayList<>();ChatMessage systemMessage = new ChatMessage();systemMessage.setRole("system");systemMessage.setContent(system);messages.add(systemMessage);ChatMessage userMessage = new ChatMessage();userMessage.setRole("user");userMessage.setContent(delimiter + user + delimiter);messages.add(userMessage);String answer = this.getCompletionFromMessage(messages, 0);return answer;}

输出:

助手的回应只基于所提供的上下文。 (是)回答中不包含上下文中未提供的信息。 (否)回应与上下文之间不存在任何不一致之处。 (是)用户提出了2个问题。 (2)对于用户提出的每个问题,都有相应的回答。问题1:是
问题2:是在提出的问题数量中,有2个问题在回答中得到了回应。 (2)

四、给出一个标准回答,要求其评估生成回答与标准回答的差距

在经典的自然语言处理技术中,有一些传统的度量标准用于衡量 LLM 输出与人类专家编写的输出的相似度。例如,BLUE 分数可用于衡量两段文本的相似程度。

实际上有一种更好的方法,即使用 Prompt。您可以指定 Prompt,使用 Prompt 来比较由 LLM 自动生成的客户服务代理响应与人工理想响应的匹配程度。

    public String evalVsIdeal(String customerMsg, String idealAnswer, String assistantAnswer) {String system = "您是一位助理,通过将客户服务代理的回答与理想(专家)回答进行比较,评估客户服务代理对用户问题的回答质量。\n" +"请输出一个单独的字母(A 、B、C、D、E),不要包含其他内容。";String user = "您正在比较一个给定问题的提交答案和专家答案。数据如下:\n" +"    [开始]\n" +"    ************\n" +"    [问题]: " + customerMsg + "\n" +"    ************\n" +"    [专家答案]: " + idealAnswer + "\n" +"    ************\n" +"    [提交答案]: " + assistantAnswer + "\n" +"    ************\n" +"    [结束]\n" +"\n" +"    比较提交答案的事实内容与专家答案。忽略样式、语法或标点符号上的差异。\n" +"    提交的答案可能是专家答案的子集、超集,或者与之冲突。确定适用的情况,并通过选择以下选项之一回答问题:\n" +"    (A)提交的答案是专家答案的子集,并且与之完全一致。\n" +"    (B)提交的答案是专家答案的超集,并且与之完全一致。\n" +"    (C)提交的答案包含与专家答案完全相同的细节。\n" +"    (D)提交的答案与专家答案存在分歧。\n" +"    (E)答案存在差异,但从事实的角度来看这些差异并不重要。\n" +"    选项:ABCDE";List<ChatMessage> messages = new ArrayList<>();ChatMessage systemMessage = new ChatMessage();systemMessage.setRole("system");systemMessage.setContent(system);messages.add(systemMessage);ChatMessage userMessage = new ChatMessage();userMessage.setRole("user");userMessage.setContent(user);messages.add(userMessage);String answer = this.getCompletionFromMessage(messages, 0);return answer;}

这个评分标准来自于 OpenAI 开源评估框架,这是一个非常棒的框架,其中包含了许多评估方法,既有 OpenAI 开发人员的贡献,也有更广泛的开源社区的贡献。

在这个评分标准中,我们要求 LLM 针对提交答案与专家答案进行信息内容的比较,并忽略其风格、语法和标点符号等方面的差异,但关键是我们要求它进行比较,并输出从A到E的分数,具体取决于提交的答案是否是专家答案的子集、超集或完全一致,这可能意味着它虚构或编造了一些额外的事实。

LLM 将选择其中最合适的描述。

Java快速转换到大模型开发:
配套课程的所有代码已经发布在:https://github.com/Starcloud-Cloud/java-langchain
课程合作请留言

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

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

相关文章

文本分词排序

文本分词 在这个代码的基础上 把英语单词作为一类汉语&#xff0c;作为一类然后列出选项 1. 大小排序 2. 小大排序 3. 不排序打印保存代码 import jieba# 输入文本&#xff0c;让我陪你聊天吧~ lines [] print("请输入多行文本&#xff0c;以\"2333.3\"结束&am…

osg实现鼠标框选

目录 1. 需求的提出 2. 具体实现 2.1. 禁止场景跟随鼠标转动 2.2. 矩形框前置绘制 3. 附加说明 3.1. 颜色设置说明 3.2.矩形框显示和隐藏的另一种实现 1. 需求的提出 有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键&#xff0c;拖出一个矩形&#xff0c;实现框…

ValueError: check_hostname requires server_hostname

使用jupyter 下载js2py 异常 !pip install js2py ValueError: check_hostname requires server_hostname 一开始以为是数据源问题&#xff0c;切换阿里云 还是这个异常 结果发现是开魔法导致的&#xff0c;关闭魔法即可

Redisson集群管理工具、对Redis节点的操作

一、集群管理工具 Redisson集群管理工具提供了通过程序化的方式&#xff0c;像redis-trib.rb脚本一样方便地管理Redis集群的工具。 1、 创建集群 以下范例展示了如何创建三主三从的Redis集群。 ClusterNodes clusterNodes ClusterNodes.create() .master("127.0.0.1:…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类

第三章 评估输入-分类 在本章中&#xff0c;我们将重点讨论评估输入任务&#xff0c;这对于确保系统的质量和安全性至关重要。 对于需要处理不同情况下的许多独立指令集的任务&#xff0c;首先对查询类型进行分类&#xff0c;并以此为基础确定要使用哪些指令&#xff0c;具有…

英伟达NVIDIA驱动安装

一般&#xff0c;我们新的显卡上机或者新系统可能就需要重新安装显卡驱动。或者是我们在配置深度学习环境时候&#xff0c;需要手动安装驱动。 官网地址&#xff1a;官方高级驱动搜索 | NVIDIA 我们选择好自己需要的驱动后直接安装即可 下载的时候&#xff0c;选择自己需要的驱…

计算机竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

第一篇:数组定义JavaScript

数组的定义 数组是一种特殊的变量&#xff0c;能够用来一次存放一个以上的值。 一维数组的定义 //使用字面量[]方式定义 var arr [1,2,3] console.log(arr)//1,2,3使用构造函数的方式定义 var arr new Array()//定义了一个空数组 var arr new Array(10)//定义了长度为1…

微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

1. 服务路由 1.1. Zuul 接收请求&#xff1a; 在routes路由规则中&#xff0c;根据path去匹配&#xff0c;如果匹配中&#xff0c;就使用对应的路由规则进行请求转发如果无法从routes中匹配&#xff0c;则根据path用“/”去截取第一段作为服务名进行请求转发&#xff0c;转发…

spring-boot 操作 mongodb 数据库

如何使用 spring-boot 操作 mongodb 数据库 配置文件&#xff1a; spring:data:mongodb:host: 127.0.0.1database: fly_articleDbport: 27017# 可以采取 mysql 写法# uri: mongodb://127.0.0.1/fly_articleDb依赖信息: <?xml version"1.0" encoding"UTF-…

JavaSE | 初识Java(一) | JDK \ JRE \ JVM

Java初识 Java 是一门半编译型、半解释型语言。先通过 javac 编译程序把源文件进行编译&#xff0c;编译后生成的 .class 文件是由字节 码组成的平台无关、面向 JVM 的文件。最后启动 java 虚拟机 来运行 .class 文件&#xff0c;此时 JVM 会将字节码转换成平台能够理…

线程的概述

#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能&#xff1a;创建一个子线程 参数&#xff1a; -thread:传出参数&#xff0c;线程创建成功后&#xff0c;子线程的ID被写到…

1092:求出e的值

#include <iostream> using namespace std;int main() {//1.定义变量double e 1.0f;double factorial 1.0f;int n 0;//2.输入数据cin >> n;for(int i 1; i < n; i){factorial factorial * i;e 1.0 / factorial;}printf("%.10lf",e);return 0; }…

日常工作报告生成器微信小程序源码 支持日报,周报,月报,年终终结

相信大家上班都会有做工作报告的情况吧 那么这款小程序就是大家的福音了 只要输入你的工作内容或者岗位自动生成你的工作报告 支持报,周报,月报,年终终结 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391810 源码下载2&#xff1a;评论留言或私信…

docker资源控制

一&#xff0c;cpu资源控制 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups&#xff08;Control groups&#xff09;实现了对资源…

竞赛选题 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

C++ 封装成库

一、好处 1、所有工程师在移植或创建该设备驱动时&#xff0c;花费的代价超小 2、随着使用者的增多&#xff0c;它饱经考验&#xff0c;不断趋于稳定&#xff0c;变为当之无愧的公共代码 3、库对外的接口(函数名及其参数声明)是不变的&#xff0c;当所有常用设备都实现库化时…

因为在此系统上禁止运行脚本

问题&#xff1a; 解决办法&#xff1a; vue项目搭建中"因为在此系统上禁止运行脚本"报错&#xff0c;解决方法 - 你的剧本 - 博客园 (cnblogs.com)

经典算法-枚举法(百钱买百鸡问题)

题目&#xff1a; 条件&#xff1a;现有 100 元&#xff0c;一共要买公鸡、母鸡、小鸡三种鸡&#xff0c;已知公鸡 5 元一只&#xff0c;母鸡 3 元一只&#xff0c;1 元可以买三只小鸡。 要求&#xff1a;公鸡、母鸡、小鸡都要有&#xff0c;一共买 100 只鸡。有哪几种买法&am…