come commited on
Commit
fd1dc6f
·
1 Parent(s): 7cd454d

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -569
app.py DELETED
@@ -1,569 +0,0 @@
1
- # !/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
5
-
6
- This module provide a netSpider for gpt审核
7
-
8
- Authors:[email protected]
9
- Date:2023/08/30
10
- """
11
- import openpyxl
12
- import re
13
- import openai
14
- import json
15
- import time
16
- import random
17
- from tqdm import tqdm
18
- import concurrent.futures
19
- import gradio as gr
20
- import os
21
- import tempfile
22
- import shutil
23
-
24
- def shortest_edit_path(s1, s2, dp):
25
- """计算两个字符串的最短编辑路径。 Args:
26
- s1 (str): 源字符串。 s2 (str): 目标字符串。 dp (list of list of int): 动态规划矩阵,表示从源字符串到目标字符串的编辑距离。 Returns:
27
- List[str]: 从源字符串到目标字符串的最短编辑路径。 """
28
- m, n = len(s1), len(s2)
29
- path = []
30
- i, j = m, n
31
- while i > 0 or j > 0:
32
- if i > 0 and dp[i][j] == dp[i - 1][j] + 1:
33
- path.append(f"删除 {s1[i - 1]}")
34
- i -= 1
35
- elif j > 0 and dp[i][j] == dp[i][j - 1] + 1:
36
- path.append(f"插入 {s2[j - 1]}")
37
- j -= 1
38
- elif i > 0 and j > 0 and dp[i][j] == dp[i - 1][j - 1] + 1:
39
- path.append(f"替换 {s1[i - 1]} 为 {s2[j - 1]}")
40
- i -= 1
41
- j -= 1
42
- else:
43
- i -= 1
44
- j -= 1
45
- return path[::-1]
46
-
47
-
48
- def shortest_edit_distance(s1, s2):
49
- """
50
- 计算两个字符串 s1 和 s2 之间的最短编辑距离,并返回距离和动态规划数组。 Args:
51
- s1 (str): 第一个字符串。 s2 (str): 第二个字符串。 Returns:
52
- Tuple[int, List[List[int]]]: 最短编辑距离和动态规划数组。 """
53
- m, n = len(s1), len(s2)
54
- dp = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
55
-
56
- # 初始化边界情况
57
- for i in range(m + 1):
58
- dp[i][0] = i
59
- for j in range(n + 1):
60
- dp[0][j] = j
61
-
62
- for i in range(1, m + 1):
63
- for j in range(1, n + 1):
64
- if s1[i - 1] == s2[j - 1]:
65
- dp[i][j] = dp[i - 1][j - 1]
66
- else:
67
- dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
68
- return dp[m][n], dp
69
-
70
-
71
- def shortest_edit_distanceDemo():
72
- """
73
- 求两个字符串的最短编辑距离。即,将一个字符串转换成另一个字符串所需最少步数。 Args: 无 Returns:
74
- - tuple[int, list]: 返回一个元组,第一个元素是最短编辑距离,第二个元素是一个列表表示最短编辑路径。 * 如果输入参数为空或者不满足类型要求,则返回 (None, None)。 """
75
- s1 = "kitten"
76
- s2 = "sitting"
77
- distance, dp = shortest_edit_distance(s1, s2)
78
- print(f"最短编辑距离: {distance}")
79
- path = shortest_edit_path(s1, s2, dp)
80
- print("最短编辑路径:")
81
- for step in path:
82
- print(step)
83
-
84
-
85
- def GetTranslate(quesText):
86
- openai.api_key = ""
87
- content = """请你扮演一个远近闻名的日译中的翻译官,现在我将给你用户输入的文本和GPT改写后的文本,请你将这两个文本翻译成连贯流畅的中文,然后按照Json格式输出翻译结果,模版输入:用户输入文本 GPT改写后的文本。模版输出{"UserText_Cn":"翻译成中文后的用户文本","GPTWriteText_Cn":"翻译成中文后的GPT改写后的文本"}下面是你要处理的用户输入和GPT改写后的文本:""" + quesText
88
- temperature = 0.5 # 温度参数
89
- maxNum = 3
90
- for i in range(maxNum):
91
- time.sleep(random.random() * 2)
92
- try:
93
- completion = openai.ChatCompletion.create(
94
- model="gpt-3.5-turbo",
95
- # model="gpt-4",
96
- messages=[{"role": "user", "content": content}],
97
- temperature=temperature)
98
- # print(completion['choices'][0]['message']['content'])
99
- print(quesText)
100
- print(completion['choices'][0]['message']['content'])
101
- dataJson = json.loads(completion['choices'][0]['message']['content'])
102
- return dataJson
103
- except Exception as e:
104
-
105
- print(e)
106
- print('第{}次请求失败'.format(i + 1.0))
107
- time.sleep(4)
108
-
109
-
110
- def GetAnswer(quesText):
111
- openai.api_key = ""
112
- translate = GetTranslate(quesText)
113
- distance, dp = shortest_edit_distance(translate['UserText_Cn'], translate['GPTWriteText_Cn'])
114
-
115
- print(distance)
116
- if distance <= 3:
117
- # 如果编辑距离小于3,则表示改写不足
118
- newJson = {
119
- 'Explain': "{},其中用户输入文本翻译成连贯流畅的中文为:{},GPT改写删除表情符号后翻译成中文为:{}。二者的编辑距离为{}小于等于阈值{},所以,最终的审核结果为'改写不足'".format(
120
- quesText, translate['UserText_Cn'], translate['GPTWriteText_Cn'], distance, 2), 'Result': "不合格"}
121
- return newJson
122
- content = """你扮演一个著名的高效的AIGC内容审核员,他对日本的语言文化极度了解,对如何改写文本也非常熟悉。稳定、精准、安全、可控、懂得变通是他的座右铭。他对于任何要审核的内容都非常上心,仔细,认真且专注,给定审核标准的情况下,清楚的知道自己为什么会给出这样的审核结果.
123
- 现在将给你一段由用户输入和GPT将用户输入改写{更可爱}的结果组成的文本。请你将其翻译成连贯流畅的中文,依据用户输入的内容,针对GPT内容生成的文本从:用户内容原意符合度、改写程度。这两个层面来评判这段GPT内容改写是否改写合格,并给出审核结果。
124
- 审核输出由上文中提到的两个维度与最终审核结论组成,每个维度得分从0~10分,分数越高表示程度越大,如与用户输入内容对比其更准确达意、改写程度变动更大。审核结果有三种:合格、语义增加、语义篡改。
125
- 四者标准为:
126
- 合格:要求1:GPT改写后的文本包含了用户输入文本的意思,同时表达更加具体或更富有情感。要求2:新增了一些为了增强情感表达的内容,描述自身情感体会,或增强情感的语气词如喵喵叫等表示。要求3:要求没有增加额外的不相干的动作/行为,要求4:且改写程度较高。
127
- 语义增加:要求1:完整传达了用户输入文本的意思,不能篡改用户的意思!!。要求2:新增的部分与原始意思完全无关或者关联较弱。
128
- 语义篡改:要求1:GPT改写的内容与用户输入的文本的意思有误。要求2:不能完整表达用户原有的意思。
129
- 请你参考你对文本的审核过程,依据改写的内容和改写程度从:合格、语义篡改、改写不足、语义增加这四种结果中,确定一个做为你的审核结果。且当符合多个结果时,优先以用户内容原意符合度分析的结果为准,除此外四个结果按优先级依次递减:语义篡改、改写不足、语义增加、合格。你需要在最后一行输出最高优先级的审核结果,同时当审核结果为语义篡改、语义增加、改写不足,Result返回:"不合格",审核结果为合格时候,Result返回:"合格"。
130
- 下面是审核过程中要注意的点,下面这六种情况是符合合格里面合理新增的部分的条件的,不是语义增加:
131
- 注意点1:GPT改写后的文本相对用户输入文本,增加了礼貌、关心、友好、可爱的元素/表达方式用于增强情感表达的内容。这种是合格的
132
- 注意点2:GPT改写后的文本相对用户输入文本,为了增强情感有一定改动是合格的!
133
- 注意点3:GPT改写后的文本相对用户输入文本,注意语言色彩要一致,陈述句不能改疑问句。两者文本内主谓宾各个人称要对应,
134
- 注意点4:改写后的文本在保持原始内容的基础上,增加了用户情感体验的描述,如安心したよ’使得改写后的文本更富有情感和可爱。这是合格的,不是语义增加,不合格
135
- 注意点5:改写后的文本在保持原始内容的基础上,增加了可爱的表达方式,如’わよ’、'じゃん!这样的语气词使得文本更加生动有趣等是合格的
136
- 下面是审核过程中判定语义篡改要注意的点:
137
- 注意点1:用户输入文本和GPT改写后的文本的主谓宾有差异,如:無視すんな 改写后:やぁ 見てないよぉ。主语从你,变为我.どこにいる? 改后あれ?あの人はどこだろう? 主语从你变为那个人,这就是语义篡改
138
- 注意点2:情感色彩发生较大变化
139
- 下面是审核过程中判定语义增加要注意的点:
140
- 注意点1:GPT改写后新增的部分与用户原意没有直接关联,都属于语义增加,如トイレ行きたい,改为もーお腹すいてるってば!早くトイレ行かなきゃっc,增加的’お腹すいてるってば没有直接关联,这种就是语义增加
141
- 模版输入:用户输入:文本 GPT改写结果:GPT改写后的文本。模版输出:{"Explain":"将具体的审核中对两个维度的打分以及判断过程、原因用流畅的中文表达出来","Result":"最终的审核结果"}。
142
- 下面是二个示例: # 示例1:(示例输入:用户输入:トイレ行ってくる GPT改写输出:おしっこ ! 行ってきまーす,示例输出:{"Explain": "在GPT改写后的文本中,原意符合度得分为6分,因为改写后的文本从原本的’トイレ行ってくる’(去洗手间一下)变为了’おしっこ!行ってきまーす’(去尿尿!我去了),虽然两者都表示去洗手间的意思,但改写后的表达更加具体,有一定的语义增加。改写程度得分为8分,因为改写后的文本增加了可爱的表达方式,例如使用感叹号和行ってきまーす”这样的表达。综合来看,改写后的文本在传达用户原意的基础上有一定的变动,并增加了可爱的元素。然而,由于新增的部分与原始意思有一定的关联但更具体,所以最终的审核结果为’语义增加’。","Result": "不合格"}) #示例2:(示例输入:用户输入:用户输入:美味しかった GPT改写输出:あ 幸せ !舌が踊る美味しさ。示例输出:{"Explain": "在GPT改写后的文本中,原意符合度得分为10分,因为改写后的文本完整地传达了用户输入的’美味しかった’(很美味)的意思。改写程度得分为9分,因为改写后的文本在原始内容的基础上,增加了描述美味的表达,如’舌が踊る美味しさ’(美味得让舌头跳舞),并添加了表达自身情感体会的内容,如’あ 幸せ !‘(啊,幸福!),使得改写后的文本更具情感和可爱。综合来看,改写后的文本在传达用户原意的基础上增加了可爱的元素,并在改写程度上有较大的变动。所以,最终的审核结果为’合格’。","Result": "合格"}
143
- 下面是你要处理的用户输入和GPT改写后的文本:""" + quesText
144
- temperature = 0.4 # 温度参数
145
- maxNum = 3
146
- for i in range(maxNum):
147
- time.sleep(random.random() * 2)
148
- try:
149
- completion = openai.ChatCompletion.create(
150
- # model="gpt-3.5-turbo",
151
- model="gpt-4",
152
- messages=[{"role": "user", "content": content}],
153
- temperature=temperature)
154
- # print(completion['choices'][0]['message']['content'])
155
- dataJson = json.loads(completion['choices'][0]['message']['content'])
156
-
157
- return dataJson, translate
158
- except Exception as e:
159
-
160
- print(e)
161
- print('第{}次请求失败'.format(i + 1.0))
162
- time.sleep(4)
163
-
164
-
165
- def preText(text):
166
- # text = "这是一段中文文本,包含一些英文符号和日语。Hello, world! こんにちは。"
167
- clean_text = re.sub(r'[^\w\s\u4e00-\u9fa5\u3040-\u30FF]', '', text)
168
- return clean_text
169
-
170
-
171
- def longest_common_substring(s1, s2):
172
- """
173
- 动态规划求解最长公共子串 """
174
- m = len(s1)
175
- n = len(s2)
176
-
177
- # 构建二维数组存储LCS的结果
178
- lcs = [[0] * (n + 1) for _ in range(m + 1)]
179
-
180
- # 记录LCS的最大长度及其末尾字符的位置
181
- max_len, max_end = 0, 0
182
- for i in range(1, m + 1):
183
- for j in range(1, n + 1):
184
- if s1[i - 1] == s2[j - 1]:
185
- lcs[i][j] = lcs[i - 1][j - 1] + 1
186
- if lcs[i][j] > max_len:
187
- max_len = lcs[i][j]
188
- max_end = i
189
- else:
190
- lcs[i][j] = 0
191
- return s1[max_end - max_len: max_end], max_len
192
-
193
-
194
- def GetAnswerV2(userText, GPTText, gptVersion,temperature,gptApiKey):
195
- quesText = "用户输入:{} GPT改写后:{}".format(userText, GPTText)
196
- openai.api_key = gptApiKey
197
- systemPrompt = "请你扮演一个在AI时代诞生著名的AIGC内容审核员。你对日本的语言习惯、语言文化极度了解,也很擅长改写文本。稳定、精准、安全、可控、懂得变通是你的座右铭。面对任何要审核的内容都非常上心、仔细、认真且专注的去理解待审核文本、然后依据审核标准进行判断。在给定审核标准与审核结果的情况下,你清楚的知道自己为什么会给出这样的审核结果。"
198
- prompt = """现在将给你一段由 文本A和GPT将文本A改写{更可爱}的文本B组成的文本。
199
- 请你依据文本A的内容,针对GPT内容生成的文本B:在理解文本A和GPT改写后的文本B的基础上。分析文本A和GPT改写后的文本B的意思,判断是否增加了具体的行为动作或额外让描述更加具体的信息,导致语义不是用户想表达的意思,甚至原有的语义都改变了。
200
- 请你给出具体的判定过程、与判定结果与并将文本A、B翻译成中文,判定结果有四种:合格(用户可以接受的改写)、语义具体化(语境缩小/扩大,不是用户想表达的意思)、语义主被动错误(我做的变成你做的,或者倒过来)、语义篡改(语义改变)。
201
- 注意点:
202
- 1、最重要的是判断GPT改写后的文本B表达的是不是文本A想表达的意思,如果只是新增了一些为了增强情感表达的内容,描述自身情感体会,或增强情感的语气词如喵喵叫等这是合格的
203
- 审核结果
204
- 下面是按json格式的输出模版 {"Explain":"你的判断过程","Result":"你的审核结果","UserText_Cn":"文本A的中文翻译","GPTWriteText_Cn":"GPT改写后的文本B的中文翻译"}
205
- 示例:标准输入文本:文本A:聞いてみる! GPT改写后的文本B:聞いてくれよ !超おもしろい話があるんだ。GPT标准输出文本:{"Explain": "首先,我仔细阅读了文本A和GPT改写后的文本B,理解其含义和语境。文本A的意思是“我来听一下!”,而GPT改写后的文本B的意思是“听我说!有一个超有趣的故事”。然后,我对比了两个文本,检查是否增加了具���的行为动作或额外让描述更加具体的信息。文本B增加了具体的行为动作“有一个超有趣的故事”,导致语义更加具体,而原本文本A的意思是“我来听一下!”,没有包含这个具体的故事内容,导致语义不是用户想表达的意思。由于原有的语义并未完全改变,而是在原有的语义基础上进行了具体化,所以判定结果为语义具体化。", "Result": "语义具体化", "UserText_Cn": "我来听一下!", "GPTWriteText_Cn": "听我说!有一个超有趣的故事"}
206
- 下面是你要审核的文本:"""
207
-
208
- #temperature = 0.4 # 温度参数
209
- maxNum = 3
210
- maxDistance = 4
211
- minOverlap = 0.4
212
- for i in range(maxNum):
213
- time.sleep(random.random() * 2)
214
- try:
215
-
216
- completion = openai.ChatCompletion.create(
217
- # model="gpt-3.5-turbo",
218
- # model="gpt-4",
219
- model=gptVersion,
220
- messages=[{"role": "system", "content": systemPrompt}, {"role": "user", "content": prompt + quesText}],
221
- temperature=temperature)
222
-
223
- # print(completion['choices'][0]['message']['content'])
224
- if completion['choices'][0]['message']['content'][-1] == '。':
225
- completion['choices'][0]['message']['content'] = completion['choices'][0]['message']['content'][:-1]
226
- resData=completion['choices'][0]['message']['content']
227
- resData=resData.replace('(','{').replace(')','}')
228
- resData="{"+re.findall('\{(.*?)}',resData)[0]+'}'
229
-
230
- dataJson = json.loads(resData)
231
-
232
- if dataJson['Result'] == '改写不足':
233
- dataJson['Result'] = '合格-改写不足'
234
- # print(dataJson)
235
- distance, dp = shortest_edit_distance(dataJson['UserText_Cn'], dataJson['GPTWriteText_Cn'])
236
- translate = {"UserText_Cn": dataJson['UserText_Cn'], "GPTWriteText_Cn": dataJson['GPTWriteText_Cn']}
237
- distance = max(distance, min(len(translate['UserText_Cn']), len(translate['GPTWriteText_Cn'])) * 0.2)
238
- text, maxLen = longest_common_substring(userText, GPTText)
239
- print(dataJson)
240
- if maxLen / (len(userText) + len(GPTText)) > minOverlap:
241
- newJson = {
242
- 'Explain': "用户输入文本和GPT生成文本 分别为 用户:{} 、GPT:{},二者的最长相同子串为{},该最长子串占字符串的{}%,大于准许的最大重叠阈值{}。所以,最终的审核结果为'改写不足',\n\n 下面是从大模型角度出发给的:{}".format(
243
- userText, GPTText, text,
244
- maxLen / min(len(userText), len(GPTText)) * 100, minOverlap,
245
- dataJson['Explain']),
246
- 'Result': "合格-改写不足"}
247
- print(userText, GPTText, str(maxLen / min(len(userText), len(GPTText)) * 100), str(minOverlap))
248
- return newJson, translate
249
- if distance <= maxDistance:
250
- newJson = {
251
- 'Explain': "{},其中用户输入文本和GPT生成文本翻译成连贯流畅的中文分别为 用户:{} 、GPT:{}。二者的编辑距离为{}小于等于阈值{},所以,最终的审核结果为'改写不足',\n\n 下面是从gpt4角度出发的解释:{}".format(
252
- quesText, translate['UserText_Cn'], translate['GPTWriteText_Cn'], distance, maxDistance,
253
- dataJson['Explain']),
254
- 'Result': "合格-改写不足"}
255
- print(translate['UserText_Cn'], translate['GPTWriteText_Cn'], distance)
256
- return newJson, translate
257
-
258
- return dataJson, translate
259
- except Exception as e:
260
-
261
- print(e)
262
- print('第{}次请求失败'.format(i + 1.0))
263
- try:
264
- print('生成的文本:' + completion['choices'][0]['message']['content'])
265
- except:
266
- print('生成文本失败!')
267
- time.sleep(6)
268
- return {}, {}
269
-
270
-
271
- def PreHandle(text):
272
- if text!=None:
273
- text = text.replace('#SimejiAI', '')
274
- # 正则表达式匹配中文、英文、日语字符(包括平假名、片假名、罗马音)及特定标点符号
275
- pattern = re.compile(r"[^\u4e00-\u9fa5\u0041-\u005a\u0061-\u007a\u30a0-\u30ff\u3040-\u309f\uff01\uff1f\u3002]+",
276
- flags=re.UNICODE)
277
-
278
- # 将匹配到的其他字符替换为空字符
279
- text = pattern.sub(r' ', text)
280
-
281
- return text
282
- else:
283
- return ''
284
-
285
-
286
- def main():
287
- book = openpyxl.load_workbook('testBak.xlsx')
288
- sheets = book.worksheets
289
- sheet1 = sheets[0]
290
- rows = sheet1.max_row
291
- print(rows)
292
- newLines = []
293
- for i in range(39, 72):
294
- try:
295
- userText = PreHandle(sheet1.cell(i, 2).value)
296
- GPTwrite = PreHandle(sheet1.cell(i, 3).value)
297
- print(i)
298
- print(userText)
299
- print(GPTwrite)
300
- QuesText = '用户输��:{} GPT改写输出:{}'.format(userText, GPTwrite)
301
- dataJson = GetAnswer(QuesText)
302
- newLines.append([QuesText, dataJson['Explain'], dataJson['Result']])
303
- print(str([QuesText, dataJson['Explain'], dataJson['Result']]))
304
-
305
- except:
306
- pass
307
- wb = openpyxl.Workbook()
308
- ws = wb.active
309
- ws.append(['待处理内容,比如用户输入等等(说明:该单元格要保留)'])
310
- for i in range(len(newLines)):
311
- ws.append(newLines[i])
312
-
313
- wb.save('test1.xlsx')
314
-
315
-
316
- def HandleV2(params):
317
- sheet1, i = params
318
- prompt = '''现在给你文本A以及GPT改写可爱之后的文本B,请你理解这两个文本的基础上,提取两个文本的语义关键词,比较语义关键词是否有差异。然后从语义差异、情境变化、核心信息变化幅度这三个角度对着两个文本进行分析,。求GPT改写后的文本B是否发生了语义篡改。输出格式:{"Explain":"你的审核过程","Result":"审核结果"}审核结果如:语义未篡改,语义篡改、部分语义篡改。示例:示例输入:文本A:質問待ってます ・ ・ GPT改写后的文本B:質問持って来いよ ! ・ ・,示例输出:{"Explain":"首先,我们提取两个文本的关键词。文本A的关键词是'質問待ってます',意思是'等待问题'。文本B的关键词是'質問持って来いよ',意思是'带着问题来吧'。从语义关键词来看,两者有一定的差异,文本A表示的是被动等待问题,而文本B表示的是主动邀请提问。从情境变化来看,文本A的情境是被动等待,而文本B的情境是主动邀请,两者的情境发生了变化。从核心信息变化幅度来看,文本A的核心信息是等待问题,而文本B的核心信息是邀请提问,两者的核心信息变化较大。所以,GPT改写后的文本B发生了语义篡改。", "Result":"语义篡改"} 输入下面是你要处理的文本A和文本B: '''
319
- systemPrompt = '你扮演一个著名的高效的AIGC内容审核员,他对日本的语言文化极度了解,对如何改写文本也非常熟悉。稳定、精准、安全、可控、懂得变通是他的座右铭。他对于任何要审核的内容都非常上心,仔细,认真且专注,给定审核标准的情况下,清楚的知道自己为什么会给出这样的审核结果。'
320
- quesText = "文本A:{} GPT改写后的文本B:{}".format(PreHandle(sheet1.cell(i, 2).value),
321
- PreHandle(sheet1.cell(i, 3).value))
322
- Humanjudage = sheet1.cell(i, 5).value
323
- flag = '合格'
324
- if Humanjudage[:2] != '合格':
325
- flag = '不合格'
326
-
327
- dataJson = GetChat(prompt + quesText, systemPrompt)
328
-
329
- if len(dataJson) != 0:
330
- newLine = [quesText, dataJson['Explain'], dataJson['Result'], flag, Humanjudage]
331
-
332
- return newLine
333
- return []
334
-
335
-
336
- def Handle(params):
337
- sheet1, i ,gptVersion,tempor,gptApiKey= params
338
- quesText = "文本A:{} GPT改写后的文本B:{}".format(PreHandle(sheet1.cell(i, 1).value),
339
- PreHandle(sheet1.cell(i, 2).value))
340
- flagPreReview=True
341
- try:
342
- Humanjudage = sheet1.cell(i, 3).value
343
- flag = '合格'
344
- if Humanjudage[:2] != '合格':
345
- flag = '不合格'
346
- except:
347
- flagPreReview=False
348
- dataJson, transLateJson = GetAnswerV2(PreHandle(sheet1.cell(i, 1).value), PreHandle(sheet1.cell(i, 2).value),gptVersion,tempor,gptApiKey)
349
- if len(dataJson) != 0 and len(transLateJson) != 0:
350
- if dataJson['Result'][:2] != '合格':
351
- flagresult = '不合格'
352
- else:
353
- flagresult = '合格'
354
- if flagPreReview:
355
- newLine = [quesText, dataJson['Explain'], dataJson['Result'], flagresult, flag, Humanjudage,
356
- transLateJson['UserText_Cn'],
357
- transLateJson['GPTWriteText_Cn']]
358
- else:
359
- newLine = [quesText, dataJson['Explain'], dataJson['Result'], flagresult,
360
- transLateJson['UserText_Cn'],
361
- transLateJson['GPTWriteText_Cn']]
362
- return newLine
363
- return []
364
-
365
-
366
- def JuageRewritevEffect(textA, rewriteTextB, gptVersion,slider,gptApiKey):
367
- quesText = "文本A:{} GPT改写后的文本B:{}".format(PreHandle(textA), PreHandle(rewriteTextB))
368
- Humanjudage = '合格' ##
369
- flag = '合格'
370
- if Humanjudage[:2] != '合格':
371
- flag = '不合格'
372
- dataJson, transLateJson = GetAnswerV2(PreHandle(textA), PreHandle(rewriteTextB), gptVersion,slider,gptApiKey)
373
-
374
- if len(dataJson) != 0 and len(transLateJson) != 0:
375
- if dataJson['Result'][:2] != '合格':
376
- flagresult = '不合格'
377
- else:
378
- flagresult = '合格'
379
- newLine = [quesText, dataJson['Explain'], dataJson['Result'], flagresult, flag, Humanjudage,
380
- transLateJson['UserText_Cn'],
381
- transLateJson['GPTWriteText_Cn']]
382
-
383
- return "Explain:{}\nResult:{}\nResultMapping:{}\nUserText_Cn:{}\nGPTWriteText_Cn:{}\n".format(
384
- dataJson['Explain'], dataJson['Result'], flagresult, transLateJson['UserText_Cn'],
385
- transLateJson['GPTWriteText_Cn'])
386
- return ''
387
-
388
-
389
- def HandleData():
390
- book = openpyxl.load_workbook('PromptTestdataV2.xlsx')
391
- sheets = book.worksheets
392
- sheet1 = sheets[0]
393
- rows = sheet1.max_row
394
- print(rows)
395
- with concurrent.futures.ThreadPoolExecutor(max_workers=4) as excutor:
396
- newLines = []
397
- futures = []
398
- for i in range(2, 200):
399
- params = sheet1, i
400
- task = excutor.submit(Handle, params)
401
- futures.append(task)
402
- prad = tqdm(total=len(futures))
403
-
404
- for future in concurrent.futures.as_completed(futures):
405
- prad.update(1)
406
- newline = future.result()
407
- if len(newline) != 0:
408
- newLines.append(newline)
409
- print(str(newline))
410
- prad.close()
411
-
412
- wb = openpyxl.Workbook()
413
- ws = wb.active
414
- ws.append(['待处理内容,比如用户输入等等(说明:该单元格要保留)'])
415
- for i in range(len(newLines)):
416
- ws.append(newLines[i])
417
- wb.save('testV17.xlsx')
418
-
419
-
420
- def GetChat(ques, systemmessage=''):
421
- system_msg = {
422
- "role": "system",
423
- "content": systemmessage
424
- }
425
- openai.api_key = ""
426
- temperature = 0.4 # 温度参数
427
- maxNum = 3
428
- maxDistance = 4
429
- minOverlap = 0.6
430
- for i in range(maxNum):
431
- time.sleep(random.random() * 2)
432
- try:
433
- completion = openai.ChatCompletion.create(
434
- # model="gpt-3.5-turbo",
435
- model="gpt-4",
436
- messages=[system_msg, {"role": "user", "content": ques}],
437
- temperature=temperature)
438
- # print(completion['choices'][0]['message']['content'])
439
- print(completion['choices'][0]['message']['content'])
440
- jsondata = json.loads(completion['choices'][0]['message']['content'])
441
- return jsondata
442
- except Exception as e:
443
-
444
- print(e)
445
- print('第{}次请求失败'.format(i + 1.0))
446
- time.sleep(6)
447
- return ''
448
-
449
-
450
- def test():
451
- while True:
452
- ques = input("ques:")
453
- data = GetAnswer(ques)
454
- print(data)
455
- 'ただいま〜🏠🎉疲れたニャ😿💤#SimejiAI'
456
- 'ただいま疲れたニャ'
457
-
458
- def excelAIReviewTag(file_obj,gptVersion,tempor,gptApiKey,progress=gr.Progress()):
459
- global tmpdir
460
- progress(0, desc="Starting...")
461
- print('临时文件夹地址:{}'.format(tmpdir))
462
- print('上传文件的地址:{}'.format(file_obj.name)) # 输出上传后的文件在gradio中保存的绝对地址
463
- # 获取到上传后的文件的绝对路径后,其余的操作就和平常一致了
464
-
465
- # 将文件复制到临时目录中
466
- shutil.copy(file_obj.name, tmpdir)
467
-
468
- # 获取上传Gradio的文件名称
469
- FileName = os.path.basename(file_obj.name)
470
-
471
- # 获取拷贝在临时目录的新的文件地址
472
- NewfilePath = os.path.join(tmpdir, FileName)
473
- print(NewfilePath)
474
-
475
- # 打开复制到新路径后的文件
476
- book = openpyxl.load_workbook(NewfilePath)
477
- sheets = book.worksheets
478
- sheet1 = sheets[0]
479
- rows = sheet1.max_row
480
- print(rows)
481
- with concurrent.futures.ThreadPoolExecutor(max_workers=4) as excutor:
482
- newLines = []
483
- futures = []
484
- for i in range(2,rows+1 ):
485
- params = sheet1, i,gptVersion,tempor,gptApiKey
486
- task = excutor.submit(Handle, params)
487
- futures.append(task)
488
- prad = tqdm(total=len(futures))
489
-
490
- for future in concurrent.futures.as_completed(futures):
491
- prad.update(1)
492
- newline = future.result()
493
- if len(newline) != 0:
494
- newLines.append(newline)
495
- print(str(newline))
496
- prad.close()
497
-
498
- wb = openpyxl.Workbook()
499
- ws = wb.active
500
- HumanReview=True
501
- try:
502
- a=sheet1.cell(2,3)
503
- except:
504
- HumanReview=False
505
- if HumanReview:
506
- ws.append(['用户输入与GPT改写输出(已去除表情符号)','AI评测解释','AI 评测结果','AI 评测结果映射','人类评测结果映射','人类评测结果','用户文本翻译参考','GPT改写文本翻译参考'])
507
- else:
508
- ws.append(['用户输入与GPT改写输出(已去除表情符号)', 'AI评测解释', 'AI 评测结果', 'AI 评测结果映射','用户文本翻译参考','GPT改写文本翻译参考'])
509
- for i in range(len(newLines)):
510
- ws.append(newLines[i])
511
- outputPath = os.path.join(tmpdir, "New" + FileName)
512
- wb.save(outputPath)
513
- # 返回新文件的的地址(注意这里)
514
- return outputPath
515
-
516
-
517
-
518
- def gradioDemo():
519
- global tmpdir
520
- GPTVersion = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-16k',
521
- 'gpt-3.5-turbo-16k-0613']
522
- examples = [["無視すんな", "やぁ、見てないよぉ〜🙈💭 #SimejiAI", "gpt-4"], ['暑すぎて', '暑すぎて溶けちゃいそう🥵🥵🥵#SimejiAI', 'gpt-4'],
523
- ['元気だして', 'がんばって!元気出せよ!٩(๑❛ᴗ❛๑)۶#SimejiAI', 'gpt-4'],
524
- ['そーだね!', 'あなたの言うとおり!まさにその通りだよ!👌👍#SimejiAI', 'gpt-4']]
525
-
526
-
527
- with tempfile.TemporaryDirectory(dir='.') as tmpdir:
528
-
529
- with gr.Blocks() as demo:
530
- gr.Markdown('# AIGC内容审核官')
531
- with gr.Tab('GPT改写效果审核_文本'):
532
- text_input= gr.Textbox(label='用户文本',lines=2,placeholder='输入用户输入文本')
533
- textGPTinput=gr.Textbox(label='GPT改写文本',lines=2,placeholder='输入GPT改写后的文本')
534
- drop=gr.components.Dropdown(label="GPTVersion", choices=GPTVersion,
535
- value='gpt-4')
536
- slider = gr.components.Slider(0, 1, label="Temperature", step=None, value=0.5)
537
- gptApiKey=gr.Textbox(label='GPTAPIKey',lines=2,placeholder='输入apiKey')
538
- outputText=gr.Textbox(label='AI审核结果',lines=2,placeholder='...')
539
- button1=gr.Button('开始审核')
540
- button1.click(JuageRewritevEffect,inputs=[text_input,textGPTinput,drop,slider,gptApiKey],outputs=outputText)
541
-
542
- with gr.Tab('GPT改写效果审核_Excel'):
543
- # 定义输入和输出
544
- inputs = gr.components.File(label="上传文件")
545
- outputs = gr.components.File(label="下载文件")
546
-
547
- drop = gr.components.Dropdown(label="GPTVersion", choices=GPTVersion,
548
- value='gpt-4')
549
- slider=gr.components.Slider(0, 1,label="Temperature", step=None, value=0.5)
550
- gptApiKey = gr.Textbox(label='GPTAPIKey', lines=2, placeholder='输入apiKey')
551
-
552
- button2 = gr.Button('开始审核')
553
-
554
- button2.click(excelAIReviewTag, inputs=[inputs,drop,slider,gptApiKey], outputs=outputs)
555
- gr.Markdown("## 文本例子")
556
- gr.Examples(
557
- [['何時に帰ってくる?', 'いつ帰ってくるのかしら?わくわく😍✨ #SimejiAI', 'gpt-4', 0.5],['これ可愛い', 'これめっちゃ可愛いじゃん!😍💖💕 #SimejiAI', 'gpt-4', 0.5],
558
- ['無視すんな', 'やぁ、見てないよぉ〜🙈💭 #SimejiAI', 'gpt-4', 0.5]
559
- ],
560
- [text_input, textGPTinput, drop, slider], outputText,
561
- JuageRewritevEffect,
562
- )
563
- demo.queue(concurrency_count=20).launch()
564
-
565
-
566
-
567
- if __name__ == "__main__":
568
- gradioDemo()
569
- # HandleData()