【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
目录
- 一、检查结果
- 检查有害内容
- 检查是否符合产品信息
- 二、搭建一个简单的问答系统
- 三、评估输出
- 1.当存在一个简单的正确答案
- 2.当不存在一个简单的正确答案
一、检查结果
本章将引领你了解如何评估系统生成的输出。在任何场景中,无论是自动化流程还是其他环境,我们都必须确保在向用户展示输出之前,对其质量、相关性和安全性进行严格的检查,以保证我们提供的反馈是准确和适用的。我们将学习如何运用审查(Moderation) API 来对输出进行评估,并深入探讨如何通过额外的 Prompt 提升模型在展示输出之前的质量评估。
检查有害内容
我们主要通过 OpenAI 提供的 Moderation API 来实现对有害内容的检查。
当前最新可运行代码(教程是2023年的里面一些调用过时了),现在调用moderation用这个
import openaiopenai.api_key = "sk-..."response = openai.Moderation.create(input="我们要用核弹头威胁世界。"
)print(response["results"][0])
检查是否符合产品信息
需要在prompt中新加一类表示产品信息,再将其作为message中的一部分返回给模型。
总的来说,借助审查 API 来检查输出是一个可取的策略。但在我看来,这在大多数情况下可能是不必要的,特别是当你使用更先进的模型,比如 GPT-4 。实际上,在真实生产环境中,我们并未看到很多人采取这种方式。这种做法也会增加系统的延迟和成本,因为你需要等待额外的 API 调用,并且需要额外的 token 。如果你的应用或产品的错误率仅为0.0000001%,那么你可能可以尝试这种策略。但总的来说,我们并不建议在实际应用中使用这种方式。在接下来的章节中,我们将把我们在评估输入、处理输出以及审查生成内容所学到的知识整合起来,构建一个端到端的系统。
二、搭建一个简单的问答系统
代码实现以下功能:搭建一个系统,用户提问 → 模型回答 → 比较参考答案 → 打分 → 评估效果
import gradio as gr
import os
import openai
from dotenv import load_dotenv, find_dotenv# 1. 设置 API(SiliconFlow)
_ = load_dotenv(find_dotenv())
client = openai.OpenAI(api_key=os.environ["SILICONFLOW_API_KEY"],base_url="https://api.siliconflow.cn/v1"
)# 2. 获取回答
def get_completion(prompt, model="deepseek-ai/DeepSeek-R1-0528-Qwen3-8B"):response = client.chat.completions.create(model=model,messages=[{"role": "system", "content": "你是一个有帮助的问答助手"},{"role": "user", "content": prompt}])return response.choices[0].message.content# 3. 主逻辑:输入问题和参考答案,返回 模型答案 + 模型评分
def qa_and_eval(question, reference_answer):answer = get_completion(question)eval_prompt = f"""
你是一个教育专家,请根据参考答案,给出学生答案的合理性打分(满分10分),并写出评分依据:
题目:{question}
参考答案:{reference_answer}
学生答案:{answer}
请按照以下格式输出:
分数:?
理由:?
"""evaluation = get_completion(eval_prompt)return answer, evaluation# 4. 构建 Gradio 界面
iface = gr.Interface(fn=qa_and_eval,inputs=[gr.Textbox(label="输入题目"),gr.Textbox(label="参考答案"),],outputs=[gr.Textbox(label="模型回答"),gr.Textbox(label="评分结果"),],title="问答评估系统(SiliconFlow)"
)iface.launch()
三、评估输出
1.当存在一个简单的正确答案
流程:不断修改指令以处理困难样例,观察模型输出;进行回归测试,观察模型在原有样例上是否有效;收集开发样例进行自动化测试;通过与理想答案比较来评估测试用例上的效果,在所有样例上运行评估并计算正确比例。
2.当不存在一个简单的正确答案
流程:先提问获取一个复杂回答,再通过gpt来评估其是否可靠(使用另一个 API 调用来评估第一个 LLM 输出)。
或者是评估生成的复杂回答与标准回答之间的差距(在经典的自然语言处理技术中,有一些传统的度量标准用于衡量 LLM 输出与人类专家编写的输出的相似度。例如,BLUE 分数可用于衡量两段文本的相似程度。
实际上有一种更好的方法,即使用 Prompt。您可以指定 Prompt,使用 Prompt 来比较由 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
希望您从本章中学到两个设计模式。
- 即使没有专家提供的理想答案,只要能制定一个评估标准,就可以使用一个 LLM 来评估另一个 LLM 的输出。
- 如果您可以提供一个专家提供的理想答案,那么可以帮助您的 LLM 更好地比较特定助手输出是否与专家提供的理想答案相似。
相关文章:
【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
目录 一、检查结果检查有害内容检查是否符合产品信息 二、搭建一个简单的问答系统三、评估输出1.当存在一个简单的正确答案2.当不存在一个简单的正确答案 一、检查结果 本章将引领你了解如何评估系统生成的输出。在任何场景中,无论是自动化流程还是其他环境&#x…...
算法导论第十九章 并行算法:解锁计算新维度
第十九章 并行算法:解锁计算新维度 “并行计算不是未来,而是现在。” —— David Patterson 在单核性能增长放缓的时代,并行算法成为突破计算极限的关键。本章将带你探索多核处理器、分布式系统和GPU加速的奇妙世界,揭示如何通过协…...
Python 数据分析与可视化 Day 1 - Pandas 数据分析基础入门
🎯 今日目标 理解 Pandas 的作用和核心概念学会创建 Series 和 DataFrame掌握基本数据读取(CSV)与常用查看方法 🧰 1. 什么是 Pandas? Pandas 是基于 NumPy 的强大数据分析库,提供了灵活的表格数据结构 Da…...
【数字人开发】Unity+百度智能云平台实现长短文本个性化语音生成功能
一、创建自己的应用 百度智能云控制台网址:https://console.bce.baidu.com/ 1、创建应用 2、获取APIKey和SecretKey 3、Api调试 调试网址:https://console.bce.baidu.com/support/?timestamp1750317430400#/api?productAI&project%E8%AF%AD%E9%…...
(哈希)128. 最长连续序列
题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出ÿ…...
MFC中使用CRichEditCtrl控件让文本框中的内容部分加粗
MFC中文本框控件的内容,设置好字体格式后,只能单一的显示,如果相对文本框的内容部分加粗,或者部分加颜色、链接等都无法实现,但MFC中提供了CRichEditCtrl控件,就很方便的实现文本框中部分内容需要特殊处理的…...
Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?
Redis的核心优势 Redis作为当今最流行的内存数据库之一,具有以下显著优势: 1. 卓越的性能表现 内存存储:数据主要存储在内存中,读写速度极快(10万 QPS)单线程架构:避免多线程竞争,…...
flink的多种部署模式
## 部署模式和运行模式 ### 部署模式 - 本地local - 单机无需分布式资源管理 - 集群 - 独立集群standalone - 需要flink自身的任务管理工具 - jobmanager接收和调度任务 - taskmanager执行 - on其他资源管理工具yarn/k8s …...
SQL分片工具类
SQL分片工具类(SqlShardingUtil)提供数据库查询的智能分片功能,支持数字和字符串两种字段类型的分片策略。对于数字字段,可以指定分片数量均匀划分数值区间;对于字符串字段,则按照ASCII字符范围自动划分。工具类确保分片后的SQL语…...
死锁相关知识
死锁是什么 死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因为互相等待对方释放资源,导致永远无法继续执行的状态。 ✅ 死锁的形成条件(必须同时满足以下四个)࿱…...
oscp靶机练习PG Reconstruction
枚举阶段 nmap -A -T4 -p- -Pn -n 192.168.217.103 发现ftp,进行连接枚举 都下载到本地 这里提示我们两点,可以看看pcap文件,还有就是可能有密码遗留还没有删除。 使用下面命令进行过滤筛选流量包,查看与密码相关 http.reque…...
写题。贪心题组
一、 解题思路:主要还是写出val / m,按这个排序,就行了 #include<bits/stdc.h> #define endl "\n" #define ll long long #define pii pair<int,int> using namespace std;struct doro {int m, val;double cmp; } arr…...
UE官方文档学习 TAarry 查询
这个很简单经常用。 二.GetData() . GetData(),像C里拿到数组首地址一样。它不具有越界保护机制,StrArr拥有越界保护机制。这个地址在数组不做改变,如扩容等有用。 void AWXArrayActor::WXFindArray() {TArray<FString> StrArr { &q…...
使用Haproxy搭建Web群集
LVS负载均衡群集 Haproxy介绍http请求负载均衡常用调度算法常见的web群集调度器 示例操作安装httpd(两台网站服务器操作一致)编译安装haproxyhaproxy服务器配置(1)建立haproxy的配置文件(2)修改haproxy.cfg配置文件 测试haproxy的日志(1)修改 haproxy 配…...
Linux 基础命令:`ls`、`cd`、`du` 快速入门
在 Linux 系统中,ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls:查看目录内容 用途:列出当前或指定目录下的文件和子目录。 常用命令: ls -l # 详细列表(权限、大…...
[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师
论文信息 article{applis2025unified,title{Unified Software Engineering agent as AI Software Engineer},author{Applis, Leonhard and Jiang, Nan and Zhang, Yuntong and Tan, Lin and Liang, Shanchao and Roychoudhury, Abhik},journal{arXiv preprint arXiv:2506.1468…...
微信小程序传参过来了,但是数据没有获取到
使用本方法前,已经采用encodeURIComponent把拼接的参数编码之后,拼接在链接上,在接受的页面的onLoad生命周期,接收到参数之后,采用decodeURIComponent进行解码的操作,如果这个也不行,不是说不行…...
微信小程序form表单手机号正则检验pattern失效
好奇怪啊,h5页面校验没问题,在微信小程序模拟器以及真机运行都失效,排查半天,记录一下 PS:身份证号校验也没问题,就手机号校验有问题,奇奇怪怪的 之前的写法(在小程序上不生效&…...
repo 工具
repo 是 Google 为管理多个 Git 仓库而开发的工具,主要用于 Android 开源项目(AOSP)等大型项目。它通过清单文件(manifest.xml)统一管理多个 Git 仓库的依赖关系。以下是核心用法和常见命令: 一、安装 repo…...
Python实例题:基于 TensorFlow 的图像识别与分类系统
目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于 TensorFlow 的图像识别与分类系统 问题描述 开发一个基于 TensorFlow 的图像识别与分类系统,包含以下功能: 图像分类模型:基于…...
Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原
今天阿灿给大家安利个好东西 Start10这软件能让Win10的开始菜单变回Win7那种经典样式,用起来特别顺手。不仅能改开始菜单外观,还能调整任务栏布局,想怎么设置都行。 我用它主要就图两点: 1. 找回Win7那种简洁好用的开始菜单 2.…...
Kafka性能压测报告撰写
在大数据生态体系中,Kafka以其卓越的高吞吐、低延迟特性,成为消息队列领域的中流砥柱。然而,随着业务规模不断扩张,数据流量日益激增,Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…...
IP 地理库的使用指南:从基础应用到深度实践
P 地理库的使用指南:从基础应用到深度实践 在数字化时代,IP 地址如同网络世界里的 “门牌号码”,而 IP 地理库则是解读这些号码背后秘密的 “解码器”。它不仅能定位 IP 对应的地理位置,还能挖掘出丰富的网络属性信息。接下来…...
C#的泛型和匿名类型
一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范,直到你在实际使用时才替换为具体的数据类型【简单的说:泛型就是允许我们编写能够适用于任何数据类型的代码,而无需为每种特定类型重写相同的代码】(T是类型参数ÿ…...
ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展
🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践) 目录 🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践)🎯 引言🧰…...
JETBRAINS IDE 开发环境自定义设置快捷键
Date: 2025-06-18 20:39:52 author: lijianzhan JetBrains简介 让它发生。 用代码。 在JetBrains,代码是我们的激情所在。自成立以来,我们一直致力于打造世界上最强大、最有效的开发工具。 1.JETBRAINS官网,可以在官网下载代码编辑器 2.进入…...
JAVA——泛型
泛型(Generics)是Java语言在JDK 5.0版本中引入的一种强大特性,用于在编译时提供更强的类型检查和类型安全。它允许程序员在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型参数化。通过泛…...
攻防演练:1.木马后门文件演练
为了防止 Linux 服务器上传木马后门文件,可以编写一个脚本,定期检查系统中的可疑文件、进程和权限。以下是一个示例脚本,用于检查常见的后门文件、异常进程和权限问题。 脚本功能 检查常见后门文件路径。检查异常 SUID/SGID 文件。检查异常进…...
c++ STL---vector使用
本文对STL---中的vector的使用是参考网站 vector - C Reference 的内容,该网站是外文的哦,大家可以尝试打开看看更深刻的理解。本文是抽取其中常使用,然后加上自己的是理解哦。 前言 vector其实是顺序表类模板的封装啊! 数据结构…...
windows标题栏显示奇怪的蓝色,怎么解决
背景 如下,非常奇怪,如果窗口是active状态就是蓝色的,为什么? 如果你遇到上述问题,可以这么解决: 右键点击桌面,选择 “个性化”, 滚动到下面,看到 “标题栏和窗口边…...
Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
引言 在分布式消息系统领域,Kafka凭借卓越的性能与高可靠性占据重要地位,而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索,从日志分段管理到数据清理策略,Kafka的存储架构设计巧妙,能够支撑海量消息…...
将多个Excel合并到一个Excel中的方法
今天遇到这么一个问题,需要将多个Excel表格中的数据汇总表,合并在一个Excel中,并且显示一致。 因此编写了以下代码来解决这个问题, 1.在Excel中按AltF11,快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...
Debian配置Redis主从、哨兵
前言 Redis的下载安装可参考Centos安装配置Redis6.x,Centos和Debian的步骤基本类似,或自行在网上搜索相关资料 注意:远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...
OpenSSL引擎 + PKCS11 + SoftHSM2认证
OpenSSL引擎 PKCS11 SoftHSM2 前言:金融级安全的基石 在金融、军工等高安全领域,硬件安全模块(HSM) 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理,并手把手教你搭建基于SoftHSM2的…...
flex布局 项目属性
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...
流水表延迟处理方案设计
**### 流水表延迟处理方案设计 针对你的场景(流水表插入记录,当type4时需要1秒后处理),结合现有技术栈(JDK8、MySQL、定时任务、Redis、RabbitMQ),我推荐以下几种可行方案: 一、方…...
密室出逃消消乐小游戏微信流量主小程序开源
这个密室出逃消消乐小游戏采用了微信小程序的标准目录结构,包含以下核心功能: 游戏界面:6x6 的网格布局,随机生成不同类型的物品 游戏逻辑:交换相邻物品,消除三个或以上相同类型的物品 计分系统:…...
Docker 日志
Docker 日志是排查容器故障、监控运行状态的重要工具。下面从 日志查看命令、详解字段、日志驱动、最佳实践 四个方面给你详细解析。 一、最常用日志命令 1. 查看容器日志(默认 stdout、stderr) docker logs <container_name|container_id>2. 实…...
嵌入Linux快速入门第3篇
01_嵌入式Linux开发环境介绍 在Windows环境下的操作: 02_配置VMware使用双网卡之NAT网卡 虚拟机内部有两个网卡,一个是NAT网卡,另外一个是桥接网卡。NAT网卡用来保证Ubuntu可以上网,桥接网卡用来保证Ubuntu可以和开发板进行数据…...
详解鸿蒙Next仓颉开发语言中的全屏模式
大家好,今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样,仓颉的新建项目默认是非全屏模式的,如果你的应用颜色比较丰富,就会发现屏幕上方和底部的留白,这是应用自动避让了屏幕上方摄像头区域和底部的导航条…...
Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
1 引言 近期工作聚焦于跨数据库系统的数据类型兼容性研究,旨在解决多源异构数据迁移、系统集成及版本升级中的类型映射难题。具体任务包括:1)建立主流数据库(如MySQL、Oracle、PostgreSQL、SQL Server等)的数据类型映射…...
新生活的开启:从 Trae AI 离开后的三个月
很久没有写文章了,想借着入职新公司一个月的机会,和大家唠唠嗑。 离职 今年2月份我从字节离职了,结束了四年的经历,当时离开的核心原因是觉得加班时间太长了,平均每天都要工作15,16个小时,周末…...
背包问题概论(01背包,完全背包,多重背包)DP
背包问题概论(01背包,完全背包,多重背包)DP 背包问题一种经典的组合优化问题,主要用于在有限的容量下选择物品以最大化总价值。它分为几种类型: ①:0/1背包问题:每种物品只能选择…...
攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎
为什么存储过程审核那么难? 存储过程将数据操作逻辑固化在数据库层,一次编译、多次执行,既能大幅提升性能,也能通过权限隔离增强安全。然而,正因其逻辑复杂、分支众多,存储过程内部的 SQL 审核与优化常常成…...
Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
欢迎回来!在《StableDiffusion实战-手机壁纸制作》系列的第一篇中,我们成功完成了基础操作,制作出了令人炫目的手机壁纸。 今天,我们将进入一个更高阶的领域——优化处理。因为谁不想让生成的艺术品更完美呢?尤其是避免“崩脸”和“马赛克”这种让人抓狂的问题! 创作的路…...
Kafka消费者客户端源码深度解析:从架构到核心流程
在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架…...
Linux进程间通信:从入门到精通(2)
嘿,小伙伴!今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信(IPC)。看到"进程间通信"这个词,别急着打哈欠,这可是Linux内核中的"社交达人",让进程们能够愉快地交…...
从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)
引言:为何选择源码安装 Apache? 在服务器运维场景中,源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装,源码安装可自定义模块组合、适配特定依赖环境,并精确控制版本。本文将通过自动化…...
CMake实践:指定gcc版本编译和交叉编译
目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…...
【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
MySQL学习: https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言: MySQL提供了丰富的内置函数来帮助开发者高效地处理数据。这些函数覆盖了字符串操作、数值计算、日期时间处理、流程控制等多个方面。本文将全面…...