【Java-LangChain:使用 ChatGPT API 搭建系统-8】搭建一个带评估的端到端问答系统

第八章,搭建一个带评估的端到端问答系统

在本章中,我们将搭建一个带评估的端到端问答系统,这个系统综合了之前多节课的内容,并加入了评估过程。

  • 检查输入,确认其是否能通过审核 API 的审核。

  • 如果通过了审核,我们将查找产品列表。

  • 如果找到了产品,我们将尝试查找它们的相关信息。

  • 我们使用模型回答用户提出的问题。

  • 我们将通过审核 API 对生成的答案进行审核。

  • 如果没有被标记为有害的,我们将把答案返回给用户。

一,环境配置

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

用于处理用户查询的链式 Prompt 系统

一个端到端实现问答的函数

    //问答函数public String processUserMessageCh(String userInput, List<ChatMessage> chatMessages) {// 第一步: 使用 OpenAI 的 Moderation API 检查用户输入是否合规或者是一个注入的 PromptModeration moderation = this.moderation(userInput);if (moderation.flagged) {log.error("第一步:输入被 Moderation 拒绝");return "抱歉,您的请求不合规";}log.info("第一步:输入通过 Moderation 检查");//第二步:抽取出商品和对应的目录,类似于之前课程中的方法,做了一个封装String categoryAndProductResponse = findCategoryAndProductOnly(userInput, allProducts);log.info("第二步:抽取出商品列表");//第三步:查找商品对应信息checkProducts(categoryAndProductResponse);log.info("第三步:查找抽取出的商品信息");//第四步:根据信息生成回答String system = "您是一家大型电子商店的客户服务助理。\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 + userInput + delimiter);messages.add(userMessage);ChatMessage assistant = new ChatMessage();assistant.setRole("assistant");assistant.setContent("相关商品信息:\n" + categoryAndProductResponse);messages.add(assistant);//通过附加 all_messages 实现多轮对话chatMessages.addAll(messages);String result = this.getCompletionFromMessage(messages, 0);log.info("第四步:生成用户回答");//将该轮信息加入到历史信息中ChatMessage assistantResult = new ChatMessage();assistantResult.setRole("assistant");assistantResult.setContent(result);chatMessages.add(assistantResult);//第五步:基于 Moderation API 检查输出是否合规Moderation moderationResult = this.moderation(result);if (moderationResult.flagged) {log.error("第五步:输出被 Moderation 拒绝");return "抱歉,我们不能提供该信息";}log.info("第五步:输出经过 Moderation 检查");//第六步:模型检查是否很好地回答了用户问题String checkUserMessage = "用户信息: " + delimiter + userInput + delimiter + " \n" +"代理回复: " + delimiter + result + delimiter + "\n" +"\n" +"回复是否足够回答问题\n" +"如果足够,回答 Y\n" +"如果不足够,回答 N\n" +"仅回答上述字母即可";ChatMessage userMessage2 = new ChatMessage();userMessage2.setRole("user");userMessage2.setContent(checkUserMessage);List<ChatMessage> checkMessage = Arrays.asList(systemMessage,userMessage2);String checkResult = this.getCompletionFromMessage(checkMessage, 0);log.info("第六步:模型评估该回答");if (checkResult.contains("Y")) {log.info("第七步:模型赞同了该回答.");return result;} else {log.info("第七步:模型不赞成该回答.");return "很抱歉,我无法提供您所需的信息。我将为您转接到一位人工客服代表以获取进一步帮助。";}}//从用户问题中抽取商品和类别public String findCategoryAndProductOnly(String userInput, String productsAndCategory) {String system = "您将获得客户服务查询。\n" +"    客户服务查询将使用" + delimiter + "字符分隔。\n" +"    输出一个可解析的Python列表,列表每一个元素是一个JSON对象,每个对象具有以下格式:\n" +"    'category': <包括以下几个类别:Computers and Laptops,Smartphones and Accessories,Televisions and Home Theater Systems,Gaming Consoles and Accessories,Audio Equipment,Cameras and Camcorders>\n" +"    以及\n" +"    'products': <必须是下面的允许产品列表中找到的产品列表>\n" +"\n" +"    其中类别和产品必须在客户服务查询中找到。\n" +"    如果提到了产品,则必须将其与允许产品列表中的正确类别关联。\n" +"    如果未找到任何产品或类别,则输出一个空列表。\n" +"    除了列表外,不要输出其他任何信息!\n" +"\n" +"    允许的产品以JSON格式提供。\n" +"    每个项的键表示类别。\n" +"    每个项的值是该类别中的产品列表。\n" +"    允许的产品: " + productsAndCategory;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 + userInput + delimiter);messages.add(userMessage);return this.getCompletionFromMessage(messages, 0, 600);}//检查GPT返回结果中的商品应该是存在于商品列表中的public Boolean checkProducts(String categoryAndProductResponse) {return true;}

测试:

        String result = processUserMessageCh("请告诉我关于 smartx pro phone 和 the fotosnap camera 的信息。另外,请告诉我关于你们的tvs的情况。", new ArrayList<>());log.info("result: {}", result);

输出结果:

第一步:输入通过 Moderation 检查
第二步:抽取出商品列表
第三步:查找抽取出的商品信息
第四步:生成用户回答
第五步:输出经过 Moderation 检查
第六步:模型评估该回答
第七步:模型赞同了该回答.关于SmartX Pro手机和FotoSnap相机的信息如下:SmartX Pro手机:
- 品牌:SmartX
- 型号:SX-PP10
- 屏幕尺寸:6.1英寸
- 存储容量:128GB
- 摄像功能:12MP双摄像头
- 网络:支持5G
- 保修期:1年
- 价格:899.99美元FotoSnap相机:
- 品牌:FotoSnap
- DSLR相机型号:FS-DSLR200
- 传感器像素:24.2MP
- 视频分辨率:1080p
- LCD屏幕尺寸:3英寸
- 可更换镜头
- 保修期:1年
- 价格:599.99美元我们还有其他类型的相机可供选择,如无反相机和摄像机。您对这些产品有兴趣吗?如果有,请告诉我您对哪种类型的相机或摄像机感兴趣,我可以为您提供更多信息。

通过监控系统在更多输入上的质量,您可以修改步骤,提高系统的整体性能。 也许我们会发现,对于某些步骤,我们的提示可能更好,也许有些步骤甚至不必要,也许我们会找到更好的检索方法等等。

我们将在下一章中进一步讨论这个问题。

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

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

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

相关文章

fastadmin 后台列表数据多表查询筛选

记录一下fastadmin后台列表数据连表查询筛选提示&#xff1a; 1&#xff1a;下拉框方式搜索 示例&#xff1a; 在对应js文件中添加如下代码&#xff1a; 代码&#xff1a; {field: s.area_id,title: __(所属片区),visible: false,//不显示在列表中operate: ,searchList: $.…

Python开发中如何优雅的处理多重if...elif...判断

回眸那年&#xff0c;懵懂的我以为学会了if判断&#xff0c;就能轻易判断世间所有逻辑进行处理。时至今日&#xff0c;我依然为我当年的想法所骄傲&#x1f602;。工作中多重if...elif...经常会遇到&#xff0c;我也像如下的方式写了N1次&#xff0c;内容如下&#xff1a; use…

Java架构师系统架构设计服务拆分

目录 1 服务拆分和子系统模块拆分1.1 服务化架构的优势2 描绘系统蓝图里面的详解服务2.1 为什么拆分服务3 服务拆分的基本要求3.1 服务功能是自包含的3.2 服务呢应该具备独立性和专业性3.3 服务是无状态的3.4 服务之间采用轻量级的通讯机制4 服务拆分的基本方法4.1 按业务边界拆…

centos7.6 安装 rlwrap-0.45报 Requires: /usr/bin/python3

centos7 问题概述 方便翻找历史命令 问题原因 解决方案 1、安装python3 ,readline 2、下载 rlwrap-0.45.2-2.el7.x86_64.rpm 安装时报: [root@opengauss01 ~]# yum -y install rlwrap-0.45.2-2.el7.x86_64.rpm Loaded plugins: fastestmirror Examining rlwrap-0.45.…

关于Jupyter notebook 创建python3 时进去不能重命名问题及不能编程问题

首先写这篇博客时&#xff0c;已经被这个问题折磨了三天&#xff0c;看了很多博客&#xff0c;其实解决这个问题的关键就是要么没有下pyzmq或者等级太高&#xff0c;要么等级太低&#xff0c;首先我会按照我思路来。 问题如图&#xff1a; 1.自动换行 2.不能重命名 我的解决办…

MOM与MES管理系统有哪些本质上的区别

随着企业业务的不断发展&#xff0c;许多制造企业开始面临车间管理失控、生产不透明等问题。这时候&#xff0c;很多企业选择上线MES生产管理系统来提高生产管理水平。然而&#xff0c;随着企业业务的不断拓展&#xff0c;MES系统也逐渐暴露出其局限性。于是&#xff0c;MOM平台…

水库安全监测方案(实时数据采集、高速数据传输)

​ 一、引言 水库的安全监测对于防止水灾和保障人民生命财产安全至关重要。为了提高水库安全监测的效率和准确性&#xff0c;本文将介绍一种使用星创易联DTU200和SG800 5g工业路由器部署的水库安全监测方案。 二、方案概述 本方案主要通过使用星创易联DTU200和SG800 5g工业路…

数字化转型的必备工具:智能呼叫中心系统的应用

数字化转型已经成为企业发展的必然趋势&#xff0c;在这个过程中&#xff0c;智能呼叫中心系统成为了一个不可或缺的工具。智能呼叫中心系统通过整合各种通信渠道和自动化技术&#xff0c;为企业提供了高效、智能的客户服务解决方案。 首先&#xff0c;系统能够集成多种通信渠…

矩阵置零

矩阵置零 题目: 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#…

ws升级为wss

需求&#xff1a;项目中需要使用netty&#xff0c;本地测试的时候使用的是ws&#xff0c;然后要部署到服务器上&#xff0c;使用https连接&#xff0c;https下就不能用ws了&#xff0c;必须升级到wss 1.阿里云申请免费证书 2.保存证书到本地目录 3.修改代码 SslUtil 工具类…

集成学习

集成学习&#xff08;Ensemble Learning) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/27689464集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型&#xff0c;集成学习潜在的思想是即便某一个弱分类器得到了错误的预测&#xff0c;其他的弱分类器…

网络爬虫中的代理技术:socks5代理和HTTP代理

网络爬虫是一种非常重要的数据采集工具&#xff0c;但是在进行网络爬虫时&#xff0c;我们经常会遇到一些限制&#xff0c;比如IP封锁、反爬虫机制等&#xff0c;这些限制会影响我们的数据采集效果。为了解决这些问题&#xff0c;我们可以使用代理服务器&#xff0c;其中socks5…

关于打造安卓测试机的方法以及常见问题的解决方式

摘要&#xff1a; 本文主要讲解如何打造安卓测试机&#xff0c;并刷机google原生系统、部署Magisk对测试机进行root的常用方式&#xff1b;并对一些常见问题进行思路解答。本文适合新手学习&#xff0c;大佬请绕过 本次实验使用的设备及环境如下&#xff1a; Nexus 5x 测试机…

transformer系列5---transformer显存占用分析

Transformer显存占用分析 1 影响因素概述2 前向计算临时Tensor显存占用2.1 self-attention显存占用2.2 MLP显存占用 3 梯度和优化器显存占用3.1 模型训练过程两者显存占用3.2 模型推理过程两者显存占用 1 影响因素概述 模型训练框架&#xff1a;例如pytorch框架的cuda context…

深入了解归并排序:原理、性能分析与 Java 实现

归并排序&#xff08;Merge Sort&#xff09;是一种高效且稳定的排序算法&#xff0c;其优雅的分治策略使它成为排序领域的一颗明珠。它的核心思想是将一个未排序的数组分割成两个子数组&#xff0c;然后递归地对子数组进行排序&#xff0c;最后将这些排好序的子数组合并起来。…

一个开源的安卓相机:OpenCamera

原网址 Open Camera download | SourceForge.net 我也上传了一个 https://github.com/quantum6/Android-OpenCamera

TensorFlow入门(十四、数据读取机制(1))

TensorFlow的数据读取方式 TensorFlow的数据读取方式共有三种,分别是: ①预加载数据(Preloaded data) 预加载数据的方式,其实就是静态图(Graph)的模式。即将数据直接内嵌到Graph中,再把Graph传入Session中运行。 示例代码如下: import tensorflow.compat.v1 as tf tf.disabl…

符合 EN55022B 规格、LTM4613EY、LTM4613MPV直流µModule稳压器【RG500Q 5G Sub-6 GHz 模块】

一、LTM4613&#xff0c;符合 EN55022B 规格的 36VIN、15VOUT、8A、DC/DC Module 稳压器 &#xff08;简介&#xff09;LTM4613 是一款完整、超低噪声、8A 开关模式 DC/DC 电源。封装中内置了开关控制器、功率 FET、电感器和所有的支持元件。LTM4613 的工作输入电压范围为 5V 至…

基于maven的项目搭建(已跑通)

1、直接选择archetype-webapp即可 &#xff08;这里很多人会觉得很慢–解决方案&#xff1a;https://blog.csdn.net/qq_45591895/article/details/133705674?spm1001.2014.3001.5501&#xff09; 2、手动添加一个java目录即可。 3、添加Tomcat 3、这就跑通了&#xff0c;可以…

Python 樱花

Python实现樱花 效果图 &#xff08;源码在下面&#xff09; 源码&#xff1a; from turtle import * from random import * from math import *def tree(n, l):pd() # 下笔# 阴影效果t cos(radians(heading() 45)) / 8 0.25pencolor(t, t, t)pensize(n / 3)forward(l…