|
import gradio as gr |
|
import random |
|
import torch |
|
from transformers import AutoConfig |
|
from transformers import GPT2Tokenizer, GPT2LMHeadModel |
|
from itertools import chain |
|
|
|
|
|
config = AutoConfig.from_pretrained('gorkemgoknar/gpt2chatbotenglish') |
|
model = GPT2LMHeadModel.from_pretrained('gorkemgoknar/gpt2chatbotenglish', config=config) |
|
|
|
tokenizer = GPT2Tokenizer.from_pretrained('gorkemgoknar/gpt2chatbotenglish') |
|
tokenizer.model_max_length = 1024 |
|
|
|
|
|
base_temperature = 1.3 |
|
dynamic_temperature_range = 0.15 |
|
|
|
rand_range = random.uniform(-1 * dynamic_temperature_range , dynamic_temperature_range ) |
|
temperature = base_temperature + rand_range |
|
|
|
SPECIAL_TOKENS = ["<bos>", "<eos>", "<speaker1>", "<speaker2>", "<pad>"] |
|
|
|
|
|
|
|
def get_chat_response(name,history=[], input_txt = "Hello , what is your name?"): |
|
|
|
ai_history = history.copy() |
|
|
|
|
|
ai_history_e = [tokenizer.encode(e) for e in ai_history] |
|
|
|
personality = "My name is " + name |
|
|
|
bos, eos, speaker1, speaker2 = tokenizer.convert_tokens_to_ids(SPECIAL_TOKENS[:-1]) |
|
|
|
|
|
|
|
sequence = [[bos] + tokenizer.encode(personality)] + ai_history_e + [tokenizer.encode(input_txt)] |
|
|
|
sequence = [sequence[0]] + [[speaker2 if (len(sequence)-i) % 2 else speaker1] + s for i, s in enumerate(sequence[1:])] |
|
|
|
sequence = list(chain(*sequence)) |
|
|
|
|
|
sequence_len = len(sequence) |
|
|
|
|
|
chat_history_ids = model.generate( |
|
torch.tensor(sequence).unsqueeze(0), max_length=50, |
|
pad_token_id=tokenizer.eos_token_id, |
|
no_repeat_ngram_size=3, |
|
do_sample=True, |
|
top_k=60, |
|
top_p=0.8, |
|
temperature = 1.3 |
|
) |
|
out_str = tokenizer.decode(chat_history_ids[0][sequence_len:], skip_special_tokens=True) |
|
|
|
return out_str |
|
|
|
|
|
''' |
|
| Macleod | Moran | Brenda | Ramirez | Peter Parker | Quentin Beck | Andy |
|
| Red | Norton | Willard | Chief | Chef | Kilgore | Kurtz | Westley | Buttercup |
|
| Vizzini | Fezzik | Inigo | Man In Black | Taylor | Zira | Zaius | Cornelius |
|
| Bud | Lindsey | Hippy | Erin | Ed | George | Donna | Trinity | Agent Smith |
|
| Morpheus | Neo | Tank | Meryl | Truman | Marlon | Christof | Stromboli | Bumstead |
|
| Schreber | Walker | Korben | Cornelius | Loc Rhod | Anakin | Obi-Wan | Palpatine |
|
| Padme | Superman | Luthor | Dude | Walter | Donny | Maude | General | Starkiller |
|
| Indiana | Willie | Short Round | John | Sarah | Terminator | Miller | Sarge | Reiben |
|
| Jackson | Upham | Chuckie | Will | Lambeau | Sean | Skylar | Saavik | Spock |
|
| Kirk | Bones | Khan | Kirk | Spock | Sybok | Scotty | Bourne | Pamela | Abbott |
|
| Nicky | Marshall | Korshunov | Troy | Vig | Archie Gates | Doc | Interrogator |
|
| Ellie | Ted | Peter | Drumlin | Joss | Macready | Childs | Nicholas | Conrad |
|
| Feingold | Christine | Adam | Barbara | Delia | Lydia | Cathy | Charles | Otho |
|
| Schaefer | Han | Luke | Leia | Threepio | Vader | Yoda | Lando | Elaine | Striker |
|
| Dr. Rumack | Kramer | David | Saavik | Kirk | Kruge | Holden | Deckard | Rachael |
|
| Batty | Sebastian | Sam | Frodo | Pippin | Gandalf | Kay | Edwards | Laurel |
|
| Edgar | Zed | Jay | Malloy | Plissken | Steve Rogers | Tony Stark | Scott Lang |
|
| Bruce Banner | Bruce | Edward | Two-Face | Batman | Chase | Alfred | Dick |
|
| Riddler | Din Djarin | Greef Karga | Kuiil | Ig-11 | Cara Dune | Peli Motto |
|
| Toro Calican | Ripley | Meredith | Dickie | Marge | Peter | Lambert | Kane |
|
| Dallas | Ripley | Ash | Parker | Threepio | Luke | Leia | Ben | Han | Common Bob |
|
| Common Alice | Jack | Tyler | Marla | Dana | Stantz | Venkman | Spengler | Louis |
|
| Fry | Johns | Riddick | Kirk | Decker | Spock | "Ilia | Indy | Belloq | Marion |
|
| Brother | Allnut | Rose | Qui-Gon | Jar Jar |
|
''' |
|
|
|
|
|
|
|
|
|
def greet(character,message): |
|
|
|
|
|
history = gr.get_state() or {"character": character, "message_history" : [] } |
|
|
|
|
|
|
|
if history["character"] != character: |
|
|
|
history = {"character": character, "message_history" : [] } |
|
|
|
|
|
response = get_chat_response(character,history=history["message_history"],input_txt=message) |
|
|
|
history["message_history"].append((message, response)) |
|
gr.set_state(history) |
|
|
|
|
|
html = "<div class='chatbot'>" |
|
for user_msg, resp_msg in history["message_history"]: |
|
html += f"<div class='user_msg'>You: {user_msg}</div>" |
|
html += f"<div class='resp_msg'>{character}: {resp_msg}</div>" |
|
html += "</div>" |
|
|
|
return html |
|
|
|
|
|
|
|
personality_choices = ["Gandalf", "Riddick", "Macleod", "Morpheus", "Neo","Spock","Vader","Indy"] |
|
|
|
examples= ["Gandalf", "What is your name?"] |
|
|
|
css=""" |
|
.chatbox {display:flex;flex-direction:column} |
|
.user_msg, .resp_msg {padding:4px;margin-bottom:4px;border-radius:4px;width:80%} |
|
.user_msg {background-color:cornflowerblue;color:white;align-self:start} |
|
.resp_msg {background-color:lightgray;align-self:self-end} |
|
""" |
|
|
|
|
|
|
|
personality_choices = ["Gandalf", "Riddick", "Macleod", "Morpheus", "Neo","Spock","Vader","Indy", "Ig-11","Threepio","Tony Stark","Batman","Vizzini"] |
|
title = "Metayazar - Movie Chatbot" |
|
description = "Chat with your favorite movie characters. This space demo has simple interface and simple history as gradio's state did not work need to make a global history, you will have different responses as same gradio machine will be used! Test it out in metayazar.com/chatbot for more movie/character options and history memorized." |
|
|
|
|
|
|
|
|
|
|
|
interface= gr.Interface(fn=greet, inputs=[gr.inputs.Dropdown(personality_choices) ,"text"], outputs="html",css=css, title=title, description=description) |
|
|
|
|
|
if __name__ == "__main__": |
|
interface.launch() |