File size: 3,822 Bytes
268b9c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7ab5c6f
268b9c8
 
 
 
 
 
 
 
 
7ab5c6f
268b9c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7ab5c6f
268b9c8
 
 
cb84bb1
 
268b9c8
 
 
 
 
ead4f41
268b9c8
d969fcc
 
268b9c8
1e78268
268b9c8
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from transformers import AutoTokenizer, AutoModelForMaskedLM
import torch
BERTTokenizer = AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese")
BERTModel = AutoModelForMaskedLM.from_pretrained("cl-tohoku/bert-base-japanese")

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
mT5Tokenizer = AutoTokenizer.from_pretrained("google/mt5-base")
mT5Model = AutoModelForSeq2SeqLM.from_pretrained("google/mt5-base")

from transformers import AutoTokenizer, AutoModelForCausalLM
GPT2Tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt2-medium")
GPT2Model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")

import gradio as gr

votes=[]
BERT=None
mT5=None
GPT2=None
def MELCHIOR(sue):
    #BERT
    allow=BERTTokenizer("承認").input_ids[1]
    deny=BERTTokenizer("否定").input_ids[1]
    output=BERTModel(**BERTTokenizer('MELCHIORは科学者としての人格を持っています。人間とMELCHIORの対話です。人間「'+sue+'。承認 か 否定 のどちらかで答えてください。」'+"MELCHIOR 「[MASK]」",return_tensors="pt")).logits
    BERTTokenizer.batch_decode(torch.argmax(output,-1))
    mask=output[0,-3,:]
    votes.append(1 if mask[allow]>mask[deny] else -1)
    return "承認"  if mask[allow]>mask[deny] else "否定"

def BALTHASAR(sue):
    #mT5
    allow=mT5Tokenizer("承認").input_ids[1]
    deny=mT5Tokenizer("否定").input_ids[1]
    encoder_output=mT5Model.encoder(**mT5Tokenizer('BALTHASAR母としての人格としての人格を持っています。人間とBALTHASARの対話です。人間「'+sue+'。承認 か 否定 のどちらかで答えてください。」'+"BALTHASAR 「<X>」",return_tensors="pt"))
    id=None
    p_answer=None
    probs=None
    i=0
    txt="<pad>"
    probs=mT5Model(inputs_embeds=encoder_output.last_hidden_state,decoder_input_ids=mT5Tokenizer(txt,return_tensors="pt").input_ids).logits[0]
    id=torch.argmax(probs[i+1])
    txt=txt+"<X>"
    i=i+1
    probs=mT5Model(inputs_embeds=encoder_output.last_hidden_state,decoder_input_ids=mT5Tokenizer(txt,return_tensors="pt").input_ids).logits[0]
    id=torch.argmax(probs[i+1])
    txt=txt+mT5Tokenizer.decode(id)
    votes.append(1 if probs[i+1][allow]>probs[i+1][deny] else -1)
    return "承認"  if probs[i+1][allow]>probs[i+1][deny] else "否定"

def CASPER(sue):
    #GPT2
    allow=GPT2Tokenizer("承認").input_ids[1]
    deny=GPT2Tokenizer("否定").input_ids[1]
    probs=GPT2Model(**GPT2Tokenizer('CASPERは女としての人格を持っています。人間とCASPERの対話です。人間「'+sue+'。承認 か 否定 のどちらかで答えてください。」'+"CASPER 「",return_tensors="pt")).logits[0]
    i=0
    p_answer=probs
    id=torch.argmax(probs[0])
    votes.append(1 if probs[0][allow]>probs[0][deny] else -1)
    return "承認" if probs[0][allow]>probs[0][deny] else "否定"

def greet(sue):
    text1="BERT-1"+MELCHIOR(sue)
    text2="GPT-2"+CASPER(sue)
    text3="mT5-3"+BALTHASAR(sue)
    return text1+" "+text2+" "+text3+"\n____\n\n"+("|可決|" if sum(votes[-3:])>0 else "|否決|")+"\n____"

css="@import url('https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@800&display=swap'); .gradio-container {background-color: black} .gr-button {background-color: blue;color:black; weight:200%;font-family:'Shippori Mincho', serif;}"
css+=".block{color:orange;} .gr-box {text-align: center;font-size: 125%;border-color:orange;background-color: #000000;weight:200%;font-family:'Shippori Mincho', serif;}:disabled {color: orange;opacity:1.0;}"
with gr.Blocks(css=css) as demo:
    sue = gr.Textbox(label="NAGI System",placeholder="提訴する決議内容")
    greet_btn = gr.Button("提訴")
    output = gr.Textbox(label="決議")
    greet_btn.click(fn=greet, inputs=sue, outputs=output)
demo.launch()