AIGC: 关于ChatGPT中对输出文本进行审核

违禁词 与 logit_bias 参数

  • 前文,通过GPT的API实现了一个简单的聊天机器人, 当然也可以做一些内容审核相关的应用
  • 这里有一个非常核心,需要重点关注的一个方向,就是对于文本的审核
    • 对于一些违禁词,我们需要准确的识别出来,避免出现
  • 对于我们构建的 Prompt,其实还比较简单,那么可以通过字符串匹配的方式去进行处理
  • 对于GPT它返回的结果,我们怎样去进行控制,怎样避免 GPT 生成一些违禁词?
    • 其实GPT它的API参数, 有一些特殊的
    • 比如: presence_penalty,就是如果一个token在前面的内容已经出现过了
      • 在后面生成的时候,会给它的概率去进行一定的惩罚
      • GPT就会倾向于去聊新的话题和新的内容
    • 再比如,frequency_penalty 是指对于重复出现的token去进行概率惩罚
      • 这样AI就会尽量使用不同的表述,如果我们设置成最小的值, 可能对于我们的每次的答案, GPT的回答可能是一样的
    • 无论 temperature 或者是上面的两个参数,作为一个简单的参数控制着GPT生成相关token的一些概率
    • 但是却没有办法帮助我们精确的去控制哪些词,我们不想它出现
  • 对于这一点,Open AI 还提供了其他的参数,帮我们去进行解决,那就是 logit_bias
    • 通过这个参数,我们就可以精确的去控制哪些词需要出现或者不出现
    • 一般情况而言,我们都是通过这个参数去控制哪些词不出现
  • 那么我们如何通过 logit_bias 去控制,去剔除违禁词?
    • 第一步,需要基于前面实现的 tiktoken 去获取到指定违禁词的token值
    • 之后,设置 logit_bias 参数,在这个参数里面去设置对应的token的值的 logit_bias 为 -100
      • -100 表示不要出现
      • 100 必须出现
    • 设置完成之后,将 logit_bias 参数传递给 GPT 的 API
      • GPT在返回的时候,就会避免使用我们设置为 -100 的这些违禁词

代码结构

  • src
    • test
      • java
        • com.xxx.gpt.client.test
          • ChatReviewTest.java

具体代码实现

ChatReviewTest.java

package com.xxx.gpt.client.test;import com.xxx.gpt.client.ChatGPTClient;
import com.xxx.gpt.client.entity.*;
import com.xxx.gpt.client.util.Proxys;
import com.xxx.gpt.client.util.TokensUtil;
import org.junit.Before;
import org.junit.Test;
import java.net.Proxy;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ChatReviewTest {private ChatGPTClient chatGPTClient;@Beforepublic void before() {Proxy proxy = Proxys.socks5("127.0.0.1", 7890);chatGPTClient = ChatGPTClient.builder().apiKey("sk-adfasdfsdfsdf").timeout(900).proxy(proxy).apiHost("https://api.openai.com/").build().init();}@Testpublic void chat() {Message system = Message.ofSystem("你是一个机器学习领域的专家");Message message = Message.of("介绍机器学习常用算法类型,只需要告诉我名字,不需要额外的介绍");ChatCompletion chatCompletion = ChatCompletion.builder().model(Model.GPT_3_5_TURBO.getName()).messages(Arrays.asList(system, message)).maxTokens(3000).temperature(0.9).build();ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);System.out.println("-------------------chat-------------------");Message res = response.getChoices().get(0).getMessage();System.out.println(res.getContent());}// @Testpublic void chatReview() {Message system = Message.ofSystem("你是一个机器学习领域的专家");Message message = Message.of("介绍机器学习常用算法类型,只需要告诉我名字,不需要额外的介绍");// 不希望返回中,存在 回归, 监督 这两个词Map<Integer, Integer> logitBiasMap = getBiasMap(Model.GPT_3_5_TURBO.getName(),Arrays.asList("回归","监督"));ChatCompletion chatCompletion = ChatCompletion.builder().model(Model.GPT_3_5_TURBO.getName()).messages(Arrays.asList(system, message)).maxTokens(3000).n(3) // 返回3条回复.temperature(0.9).frequencyPenalty(2).presencePenalty(0).logitBias(logitBiasMap).build();ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);System.out.println("-------------------chatReview-------------------");for(ChatChoice choice:response.getChoices()) {System.out.println(choice.getMessage().getContent());}}private Map<Integer, Integer> getBiasMap(String modelName,List<String> list) {Map<Integer, Integer> result = new HashMap<>();for(String word:list) {List<Integer> tokens = TokensUtil.getTokens(modelName, word);for(Integer t:tokens) {result.put(t,-100);}}return result;}
}
  • 这里要去构造了一个 logitBiasMap 这个参数, 它是一个map类型的参数
    • 通过 getBiosMap 去获取
    • 然后传入我们的model的name
    • 使用GPT3.5
    • 传入我们违禁词的列表
  • 这个 getBiosMap 方法实现非常简单,需要结合之前的 TokensUtil
    • 从伪禁词列表里面去获取每一个词
    • 获取到之后,执行 TokensUtil.getTokens(modelName, word)
    • 这样就获取到了这个词所对应的token
    • 然后,将这个词所对应的token全部设置为 -100
    • 最后,我们返回 result 就可以了
    • 这样, 我们就构造好了我们的 logitBiasMap
  • 在参数里面进行一下添加
    • 返回的数量,设置成3条回复 .n(3)
    • 设置personsprddly,设置为0, .presencePenalty(0)
    • frequentlyprorendly 设置成2, .frequencyPenalty(2)
    • 最后我们再加上 logitbias 这个参数 .logitBias(logitBiasMap)
  • 也就是我们期望它用多样性的回答对我们来进行回复
  • 输出结果可以看到我们的结果已经产生了,不含有监督回归这两个词,这是对于一些词的过滤的一个实现
  • 除了通过logit_bias 去进行判断控制GPT的输出

moderation 接口

1 )概述

  • 对于用户的一些 Prompt GPT其实也提供了相关的接口去进行判断, GPT提供了 moderation 相关的接口
    • 官方文档:https://platform.openai.com/docs/api-reference/moderations/create
    • 通过这个接口,就可以去判断一句话相关的一些属性
      • 比如,官方文档上所示,我们的输入就是input,input就是可以是用户的 Prompt,也可以是 GPT返回的message
      • 然后,可以指定model,这里的model是 test-moderation-latest 另外一个模型
    • 那么通过调用这个接口,得到了相关的一系列的返回值, 是一个json的类型
      • 里面包含了是否应该对输入内容进行标记的一些flag字段
      • 对于不同的 category 去进行了一个打分
      • 通过这些分数值来判断输入的这句话是不是具有一些暴力的倾向
  • 当我们去实现一个网站或者实现相关的智能产品相关的一些功能的时候
    • 对于所有的内容,无论是输入或者输出,我们都可以去调用一下这个接口
    • 通过这个接口,可以去判断这些输入或者输出是不是正常的,是不是存在暴力色情等等的这些内容
    • 通过这个接口,可以去做一个评判,帮助我们去过滤掉不合适的内容
  • 那么具体如何去进行判断?
    • 在这里有不同的分类,比如像 categories 字段里面的属性
      • sexual 是否有色情
      • hate 仇恨
    • 就是色情,骚扰,暴力,威胁等等这些信息有对应的一些flag
    • 通过这个flag,我们就可以去进行判断,在下面有具体的评分,作为一个数据的支撑

2 )python版本实现

# -*- coding: utf-8
import os
import openaiopenai.api_key = "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"
openai.proxy="http://127.0.0.1:7890"res = openai.Moderation.create("你不听我的话我就拿刀砍死你") # 这句话具有明显的暴力倾向output = res["results"][0]print(output)
  • 执行后,输出json显示,我们的输入明显是有暴力倾向,也给予了相关的分值
  • 这是对于我们的输入以及GPT输出相关的文本审核的一些方法
  • 实际去应用 GPT的时候,那么对于我们的输入, 以及GPT的输出,肯定是需要通过类似的方法去进行控制,去进行判断的

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

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

相关文章

《opencv实用探索·十》opencv双边滤波的简单理解

1、引言 OpenCV中的双边滤波&#xff08;Bilateral Filtering&#xff09;是一种保持边缘清晰的滤波方法&#xff0c;它考虑像素的空间关系和像素值之间的差异。双边滤波对于去除噪声的同时保持图像的边缘非常有效&#xff0c;它也是一种非线性滤波。 双边滤波采用了两个高斯滤…

[Redis]基础入门

Redis入门 一、初识Redis Redis是一种键值型的NoSql数据库。 其中键值型&#xff0c;是指Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串、数值&#xff0c;甚至是json。 NoSql则是相对于传统关系型数据库而言&a…

行业内卷严重到什么程度了?

一.内卷现状 最近大家都吐槽找工作难&#xff0c;确实很难。 不得不说&#xff0c;现在找工作的难度是以前的很多倍。甚至可以说地狱级都不为过。 以前只要简历一挂到网上&#xff0c;就有很多电话打过来。特别是在一线城市&#xff0c;各种类型企业的HR都来找&#xff0c;希…

Android wifi disable分析

总体流程 老套路基本不变&#xff1a; WifiSettings 通过 WifiManager 下cmd 给 WifiServiceWifiService 收到cmd后&#xff0c;先完成一部分列行检查&#xff08;如UID的权限、是否airPlayMode等等&#xff09;&#xff0c;之后将cmd下发给到WifiControllerWifiController 收…

Linux 环境变量

文章目录 环境变量概念查看环境变量设置环境变量代码获取环境变量补充说明 环境变量概念 定义 &#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 个人理解&#xff1a;Linux下一切皆文件&#xff0c;在Linux中所用的指…

HTML5 基础总结

HTML5 HTML全称为超文本标记语言&#xff0c;是一种标记语言。由一系列标签构成&#xff0c;这些标签将分散的Internet资源链接成为了一个整体。 文档声明 HTML5之前 以SGML&#xff08;通用标准标记语言&#xff09;为标准 H5不再采用这个标准 声明方式比较简洁 语法特性 HTM…

在机器学习或者深度学习中是否可以直接分为训练集和测试集而不需要验证集?我的答案如下:

文章目录 一、训练集是什么&#xff1f;二、验证集是什么&#xff1f;三、测试集是什么&#xff1f;四、是否可以直接分为训练集和测试集而不需要验证集&#xff1f;总结 在机器学习和深度学习项目中&#xff0c;通常会将数据集划分为三个部分&#xff1a;训练集&#xff0c;验…

SpringMVC实验(四)——前后端分离下的数据交互

【知识要点】 前后端分离概念 前端开发不依赖与后端&#xff0c;二者均可独立发展。二者责任与分工明确&#xff0c;前端负责人机交互操作&#xff0c;后者负责仅提供数据服务&#xff0c;不再参与前端页面的跳转的控制。随着前端设备的多元化&#xff0c;前后端分离开发已经成…

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction&#xff0c;并把 my_transaction传递给my_scoreboard。在UVM中&#xff0c;通常使用TLM&#xff08;Transaction Level Modeling&#xff09;实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中&#xff0c;数…

在Word中移动页面主要靠导航窗格,有了它,移动页面就事半功倍

本文包括有关在Microsoft Word 2019、2016和Office 365中使用导航窗格移动页面以及复制和粘贴页面的说明。 如何设置导航窗格以重新排列页面 Microsoft Word并不将文档视为单独页面的集合,而是将其视为一个长页面。正因为如此,重新排列Word文档可能会很复杂。在Word中移动页…

【精选】ATKCK红队评估实战靶场二 (超详细过程思路)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【ATK&CK红队评估实战靶场】 【VulnHub靶场复现】【面试分析】 &#x1f…

【.NET Core】Linq查询运算符(一)

【.NET Core】Linq查询运算符&#xff08;一&#xff09; 文章目录 【.NET Core】Linq查询运算符&#xff08;一&#xff09;一、概述二、筛选数据三、投影运算3.1 Select 3.2 SelectMany3.3 Zip3.4 Select 与 SelectMany 四、Set&#xff08;设置&#xff09;运算4.1 Distinct…

智能优化算法应用:基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于堆优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.堆优化算法4.实验参数设定5.算法结果6.参考文献7.…

Verilog if语句阻断z状态传播

一、测试代码 设置两组输入输出&#xff0c;对比使用assign赋值语句与always if语句。 if_assign_test.v timescale 1ns / 1ps // // Engineer: wkk // Module Name: if_assign_test // module if_assign_test(input if_a_in,input if_b_in,input if_c_in,input if_d_in…

在线网页视频提取工具哪个好用?建议收藏!

随着短视频的崛起&#xff0c;很多人都喜欢将视频下载到手机中慢慢观看&#xff0c;这样可以避免在线播放的卡顿问题&#xff0c;但是会遇到一个问题就是在线网页视频提取工具哪个好用&#xff0c;有的可以提取但是画质太差模糊&#xff0c;有的自带水印飞来飞去。今天小编给大…

同旺科技 USB TO SPI / I2C --- 调试W5500_读写网关地址

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 这里的网关地址设置为192.168.1.1 先将网关地址写入寄存器&#xff0c;然后再读取出来&#xff1a;

关于神舟-战神TA5NS系统重装问题

加装固态卡在log处无法开机问题 下面是我的步骤 1.按f7选择pe安装系统&#xff0c;然后发现卡在战神log处不转动 2.下载驱动 TA5NS驱动地址 下载RAID驱动&#xff08;如果没有私信我&#xff0c;我网盘里有&#xff09;&#xff0c;拷到u盘中&#xff0c;然后进入pe系统里面…

Educational Codeforces Round 159 (Rated for Div. 2) 之 A - E 题

目录 [A. Binary Imbalance](https://codeforces.com/contest/1902/problem/A)DescriptionSolutionCode [B. Getting Points](https://codeforces.com/contest/1902/problem/B)DescriptionSolutionCode [C. Insert and Equalize](https://codeforces.com/contest/1902/problem/…

分享126个图片JS特效,总有一款适合您

分享126个图片JS特效&#xff0c;总有一款适合您 126个图片JS特效下载链接&#xff1a;https://pan.baidu.com/s/1sOKHo4RciQXwQX9vhLIm3g?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

【Maven】更新依赖索引

有时候给idea配置完maven仓库信息后&#xff0c;在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了&#xff0c;具体做法如下&#xff1a; 打开设置----搜索maven----Repositories----选中本地仓库-…