import time
import openpyxl
import os
import openai
import concurrent.futures
import gradio as gr
from tqdm import tqdm
import tempfile
import datetime
from DataFormat import DataFormat
from DataFormat import GetTokenforStr
import uploadData
import json
def ChatV2(params):
systemPrompt,ques,gptVersion,temperature=params
completion = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model=gptVersion,
messages=[{"role": "system", "content": systemPrompt}, {"role": "user", "content": ques}],
temperature=temperature,
timeout=30
)
return systemPrompt, ques, completion['choices'][0]['message']['content']
def ChatV2_estimate(params):
checkBox=["GPT生成结果翻译成中文", "文本语法解析"]
systemPrompt,prompt,ques,gptVersion,inetuneGptVersion,temperature,Checkboxgourd=params
maxNum=4
for i in range(maxNum):
try:
if '{Q1}' in prompt:
gptques=prompt.replace('{Q1}',ques)
else:
gptques=prompt+ques
print(gptques)
completion = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
model=gptVersion,
messages=[{"role": "system", "content": systemPrompt}, {"role": "user", "content":gptques}],
temperature=temperature,
timeout=30
)
print([{"role": "system", "content": systemPrompt}, {"role": "user", "content":gptques}])
FineTunecompletion = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model=inetuneGptVersion,
messages=[{"role": "system", "content": systemPrompt}, {"role": "user", "content": gptques}],
temperature=temperature,
timeout=30
)
except Exception as e:
print(e)
print('第{}次错误,错误文本:{}'.format(i+1,ques))
time.sleep(6*(i+1)) #如果请求失败则过10s重新请求
if i==maxNum-1:
return systemPrompt, ques,'',str(e),''
time.sleep(1)
gptText=completion['choices'][0]['message']['content']
gptText2=FineTunecompletion['choices'][0]['message']['content']
extData=[]
for Checkbox in Checkboxgourd:
if Checkbox == 'GPT生成结果翻译成中文':
systemTran='你是一个对中文和日语非常了解的语言大师'
prompt_tran='请将给你的一组文本全部翻译成连贯流畅的中文,一组文本主要有三部分待翻译:text1:文本1 text2:文本2 text3:文本3。然后你需要将其翻译并按照json格式输出:{"tran_text1":"将用户输入的文本翻译成中文的文本","tran_text2":"将gpt改写文本翻译成中文的文本","tran_text3":"将gpt改写的文本翻译成中文的文本"},下面是你要翻译的文本:"""{Q1}"""'
transques="text1:{} text2:{} text3:{}".format(ques,gptText,gptText2)
for i in range(2):
try:
transCn = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model=gptVersion,
messages=[{"role": "system", "content": systemTran}, {"role": "user", "content": prompt_tran.replace('{Q1}',transques)}],
temperature=temperature,
timeout=30
)
transCnText=json.loads(transCn['choices'][0]['message']['content'])
extData.append(transCnText)
break
except Exception as e:
print('error:'+str(e))
pass
if Checkbox == 'test2':
systemTran='你是一个对中文和日语非常了解的翻译官'
prompt_tran='在不改变原意的情况下,请将给你的文本翻译成中文,下面是你要翻译的文本:'
transCn = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model=gptVersion,
messages=[{"role": "system", "content": systemTran}, {"role": "user", "content": prompt_tran+ques}],
temperature=temperature)
transCnText=transCn['choices'][0]['message']['content']
extData.append(transCnText)
return systemPrompt, ques, completion['choices'][0]['message']['content'], FineTunecompletion['choices'][0]['message']['content'],extData
def Chat(systemPrompt,ques,gptVersion,temperature):
completion = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model=gptVersion,
messages=[{"role": "system", "content": systemPrompt}, {"role": "user", "content": ques}],
temperature=temperature)
return completion['choices'][0]['message']['content']
def ChatDemo():
systemText = """You are Japanese large language model trained by simejiAI. Your task is to understand the meaning of what I provide and rewrite text into Japanese with cute and interesting expressions, Write some cute elements into this and add some kaomojis and emojis. Keep sentence within 200 characters and make it one-line. If you encounter any pornographic or violent malicious content, you need to refuse to answer or mercilessly counterattack.
You should not include any additional information or modify the original meaning.
Please note that the text should not involve any dialogue and the rewritten version will not include any responses. Just give one rewriting text. """
quesText = "ごめん寝てた"
ques=Chat(systemText,quesText)
print(ques)
def AI_Produst(systemText,quesList,gptVersion,temperature,num,outputPath,progress):
progress(0, desc="Starting...")
wb=openpyxl.Workbook()
ws=wb.active
ws.append(["System",'User','GPT_Output'])
maxNum=min(num,len(quesList))
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as excutor:
futures=[]
for i in range(maxNum):
params=systemText,quesList[i],gptVersion,temperature
task=excutor.submit(ChatV2,params)
futures.append(task)
prad=tqdm(total=len(futures))
for futrue in concurrent.futures.as_completed(futures):
prad.update(1)
systemPrompt,ques,GPTAnswer=futrue.result()
print(systemPrompt)
print(ques)
ws.append([systemPrompt,ques,GPTAnswer])
prad.close()
wb.save(outputPath)
return outputPath
def AI_Produst_estimate(systemText,prompt,quesList,gptVersion,inetuneGptVersion,temperature,num,outputPath,Checkbox,progress):
global stopFlag
stopFlag=False
progress(0, desc="Starting...")
wb=openpyxl.Workbook()
ws=wb.active
ws.append(["System",'User','GPT_Output','是否合格','FineTune GPT_Output','是否合格','Tran_User','Tran_GPT_Output','Tran_FineTune GPT_Output'])
maxNum=min(num,len(quesList))
print('最大数字'+str(maxNum))
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as excutor:
futures=[]
for i in range(maxNum):
params=systemText,prompt,quesList[i],gptVersion,inetuneGptVersion,temperature,Checkbox
task=excutor.submit(ChatV2_estimate,params)
futures.append(task)
prad=tqdm(total=len(futures))
for futrue in concurrent.futures.as_completed(futures):
if stopFlag:
break
try:
prad.update(1)
try:
systemPrompt,ques,GPTAnswer,FineTuneGPTAnswer,exdata=futrue.result(timeout=30)
except Exception as e:
print('如果本次请求异常则自动退出')
ws.append([systemPrompt,ques,'',str(e),''])
continue
#print(systemPrompt)
print(ques)
if len(exdata)==1:
try:
translate=exdata[0]
#加入翻译
ws.append([systemPrompt,ques,GPTAnswer,'',FineTuneGPTAnswer,'',translate['tran_text1'],translate['tran_text2'],translate['tran_text3']])
except Exception as e:
ws.append([systemPrompt, ques, GPTAnswer, '', FineTuneGPTAnswer])
print('error:'+str(e))
print(exdata[0])
else:
ws.append([systemPrompt,ques,GPTAnswer,'',FineTuneGPTAnswer])
except:
time.sleep(10)
prad.close()
wb.save(outputPath)
return outputPath
def AIProdustDemo():
outputPath=r'E:\renpyExcu\bigLLM\text.xlsx'
num=10
temperature=0.6
gptVersion='gpt-3.5-turbo'
quesList=[]
book=openpyxl.load_workbook(r'E:\renpyExcu\bigLLM\testData.xlsx')
sheet=book.active
maxnum=sheet.max_row
for i in range(2,maxnum+1):
quesList.append(sheet.cell(i,1).value)
systemText = """You are Japanese large language model trained by simejiAI. Your task is to understand the meaning of what I provide and rewrite text into Japanese with cute and interesting expressions, Write some cute elements into this and add some kaomojis and emojis. Keep sentence within 200 characters and make it one-line. If you encounter any pornographic or violent malicious content, you need to refuse to answer or mercilessly counterattack.
You should not include any additional information or modify the original meaning.
Please note that the text should not involve any dialogue and the rewritten version will not include any responses. Just give one rewriting text. """
AI_Produst(systemText,quesList,gptVersion,temperature,num,outputPath)
def AIProdust_batch(systemText,prompt,inputFile,textInput_APIKEY,temperature,gptVersion,num,progress=gr.Progress(track_tqdm=True)):
openai.api_key=textInput_APIKEY
inputFile=inputFile.name
nowTime=str(datetime.datetime.now()).split('.')[0].replace(' ','_').replace(':','_')
outputPath="{}/{}_{}_{}_{}".format(os.path.dirname(inputFile),num,nowTime,gptVersion,os.path.basename(inputFile))
print(inputFile)
num=int(num)
quesList=[]
book=openpyxl.load_workbook(inputFile)
sheet=book.active
maxnum=sheet.max_row
for i in range(2,maxnum+1):
quesList.append(prompt+sheet.cell(i,1).value)
AI_Produst(systemText,quesList,gptVersion,temperature,num,outputPath,progress)
return outputPath
def AIProdust_batch_estimate(systemText,prompt,inputFile,textInput_APIKEY,temperature,gptVersion,fintuneGPTVersion,num,Checkbox,progress=gr.Progress(track_tqdm=True)):
openai.api_key=textInput_APIKEY
inputFile=inputFile.name
nowTime=str(datetime.datetime.now()).split('.')[0].replace(' ','_').replace(':','_')
outputPath="{}/{}_{}_{}_{}".format(os.path.dirname(inputFile),num,nowTime,gptVersion,os.path.basename(inputFile))
print(inputFile)
num=int(num)
quesList=[]
book=openpyxl.load_workbook(inputFile)
sheet=book.active
maxnum=sheet.max_row
for i in range(2,maxnum+1):
if sheet.cell(i,1).value is not None:
ques=str.strip(sheet.cell(i,1).value)
if len(ques)!=0:
quesList.append(ques)
AI_Produst_estimate(systemText,prompt,quesList,gptVersion,fintuneGPTVersion,temperature,num,outputPath,Checkbox,progress)
return outputPath
def Lines2Excel(lines):
global tmpdir
nowTime = str(datetime.datetime.now()).split('.')[0].replace(' ', '_').replace(':', '_')
outputPath=os.path.join(tmpdir,nowTime+'_temp.xlsx')
print(outputPath)
wb=openpyxl.Workbook()
ws=wb.active
ws.append(['input'])
lines=lines.split('\n')
lines = [line for line in lines if len(str.strip(line))>0]
for line in lines:
ws.append([line])
wb.save(outputPath)
return outputPath
def stopprodust():
global stopFlag
stopFlag=True
return stopFlag
def AIProdust():
global tmpdir
GPTVersion = ['gpt-4', 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-16k',
'gpt-3.5-turbo-16k-0613']
with tempfile.TemporaryDirectory(dir='.') as tmpdir:
with gr.Blocks() as demo:
gr.Markdown('# GPT3.5 Fine Tune 可视化系统')
gr.Markdown('GPT3.5 Fine Tune 可视化系统')
with gr.Tab('多行文本转Excel文件'):
textInput_Ques = gr.Textbox(label='Lines2Excel', lines=2, placeholder='多行输入,一个输入一行...')
outPutFile=gr.components.File(label="下载文件")
button_tran=gr.Button("开始转化")
button_tran.click(Lines2Excel,inputs=textInput_Ques,outputs=outPutFile)
with gr.Tab('批量请求GPT'):
textInput_Sys = gr.Textbox(label='SystemMessage', lines=2,placeholder='...')
textInput_Prompt = gr.Textbox(label='Prompt', lines=2, placeholder='...')
input_ExcelFile=gr.components.File(label="待批量请求的文件")
textInput_APIKEY = gr.Textbox(label='OpenAI_APIKEY', lines=2, placeholder='...')
drop = gr.components.Dropdown(label="GPTVersion", choices=GPTVersion,
value='gpt-3.5-turbo')
slider = gr.components.Slider(0, 1, label="Temperature", step=None, value=0.7)
num=gr.Number(label='请求的次数',value=5)
outPutFile = gr.components.File(label="下载文件")
button_ques = gr.Button("开始请求")
button_ques.click(AIProdust_batch, inputs=[textInput_Sys,textInput_Prompt,input_ExcelFile,textInput_APIKEY,slider,drop,num], outputs=outPutFile)
with gr.Tab('微调数据格式化'):
gr.Markdown('### 微调数据格式化模块')
input_ExcelFile = gr.components.File(label="待执行格式化的文件")
drop = gr.components.Dropdown(label="GPTVersion", choices=GPTVersion,
value='gpt-3.5-turbo')
outPutFile = gr.components.File(label="gpt微调数据集")
outPutResText = gr.Textbox(label="格式化结果",lines=2,placeholder='...')
button_format = gr.Button("开始格式化")
button_format.click(DataFormat,
inputs=[input_ExcelFile, drop],
outputs=[outPutFile,outPutResText])
gr.Markdown('
')
gr.Markdown('### 字符串token计算模块')
input_text = gr.Textbox(label="待计算Tokens的字符串", lines=2, placeholder='...')
outPuttoken= gr.Number(label="token计算结果")
button_cal = gr.Button("开始计算")
button_cal.click(GetTokenforStr,
inputs=input_text,
outputs=outPuttoken)
with gr.Tab('微调数据集上传至OpenAI'):
gr.Markdown("注:Fine Tune至少需要10个case")
input_FineTuningFile=gr.components.File(label="gpt微调数据集",file_count='multiple')
input_APIKey=gr.Textbox(label="Openai_APIKEY",lines=2,placeholder='...')
output_FileTuningFile=gr.Json(label='上传文件状态')
button_updata=gr.Button('开始上传')
button_updata.click(uploadData.upData_OpenAI,
inputs=[input_FineTuningFile,input_APIKey],
outputs=output_FileTuningFile)
gr.Markdown("注:后续训练需要提供要微调的数据集的ID,如:file-ZnJlydArU8******NKzWaf8d")
with gr.Tab('启动微调Task'):
input_DataId = gr.Textbox(label="FineTune DataId", lines=2, placeholder='...')
input_APIKey = gr.Textbox(label="Openai_APIKEY", lines=2, placeholder='...')
output_CreateTaskjson = gr.Json(label='创建微调任务状态')
button_createTask = gr.Button('开始创建')
button_createTask.click(uploadData.createTask,
inputs=[input_DataId, input_APIKey],
outputs=output_CreateTaskjson)
gr.Markdown("注:只有等上一轮任务执行完毕,你才能创建新的微调任务")
gr.Markdown("
")
gr.Markdown("### APIKey创建的微调任务状态查询'")
input_APIKey = gr.Textbox(label="Openai_APIKEY", lines=2, placeholder='...')
button_createTask = gr.Button('微调状态查询')
output_TaskSatejson = gr.Json(label='创建微调任务状态')
button_createTask.click(uploadData.GetFineTuningJobState,
inputs=[input_APIKey],
outputs=output_TaskSatejson)
with gr.Tab('Finetune Model测试'):
textInput_Sys1 = gr.Textbox(label='SystemMessage', lines=2, placeholder='...')
textInput_Prompt1 = gr.Textbox(label='Prompt_ques', lines=2, placeholder='...')
input_fine_tuned_model = gr.Textbox(label='fine_tuned_model', lines=2, placeholder='...')
textInput_APIKEY = gr.Textbox(label='OpenAI_APIKEY', lines=2, placeholder='...')
outPutText = gr.Textbox(label="运行结果",lines=2, placeholder='...')
button_ques = gr.Button("开始请求")
button_ques.click(uploadData.userFineTuneLLM,
inputs=[textInput_Sys1, textInput_Prompt1, input_fine_tuned_model, textInput_APIKEY], outputs=outPutText)
with gr.Tab('Finetune Model 效果评估'):
fintunetextInput_Sys = gr.Textbox(label='SystemMessage', lines=2, placeholder='...')
fintunetextInput_Prompt = gr.Textbox(label='Prompt', lines=2, placeholder='...')
fintuneinput_ExcelFile = gr.components.File(label="待批量请求的文件")
textInput_APIKEY = gr.Textbox(label='OpenAI_APIKEY', lines=2, placeholder='...')
fintunedrop = gr.components.Dropdown(label="GPTVersion", choices=GPTVersion,
value='gpt-3.5-turbo')
fintuneGPTVersion=gr.Textbox(label='FineTune_GPTVersion', lines=2, placeholder='...')
fintuneslider = gr.components.Slider(0, 1, label="Temperature", step=None, value=0.7)
fintunenum = gr.Number(label='请求的次数', value=5)
Checkbox=gr.CheckboxGroup(["GPT生成结果翻译成中文", "文本语法解析(暂不支持)"], label="GPT额外功能", info="为了提高审核速度你要增加什么?")
fintuneoutPutFile = gr.components.File(label="下载文件")
fintunebutton_ques = gr.Button("开始请求")
fintunebutton_ques.click(AIProdust_batch_estimate,
inputs=[fintunetextInput_Sys, fintunetextInput_Prompt, fintuneinput_ExcelFile, textInput_APIKEY, fintuneslider,
fintunedrop,fintuneGPTVersion, fintunenum,Checkbox], outputs=fintuneoutPutFile)
fintunebutton_quesStop = gr.Button("终止运行")
fintunebutton_quesStop.click(stopprodust,outputs=gr.Textbox(label='状态'))
gr.Markdown("
")
gr.Markdown("### APIKey创建的微调任务状态查询'")
input_APIKey = gr.Textbox(label="Openai_APIKEY", lines=2, placeholder='...')
button_createTask = gr.Button('微调任务查询')
output_TaskSatejson = gr.Json(label='查询微调任务状态')
button_createTask.click(uploadData.GetFineTuningJobState,
inputs=[input_APIKey],
outputs=output_TaskSatejson)
demo.queue().launch(share=True)
if __name__=="__main__":
# ChatDemo()
# AIProdustDemo() #AIGC 批量生成内容并加在Excel文件
#
AIProdust()