-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathConversational_AI_ChatBot.py
135 lines (119 loc) · 5.09 KB
/
Conversational_AI_ChatBot.py
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
""" Conversational AI Chatbot
by RAJKUMAR LAKSHMANAMOORTHY
source code at https://github.com/RajkumarGalaxy/Conversational-AI-ChatBot
more details at README.md in the repo
refer requirements.txt in the repo to meet the code needs
find complete article on Kaggle
https://www.kaggle.com/rajkumarl/conversational-ai-chatbot
"""
# import
import numpy as np
import time
import os
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# Download Microsoft's DialoGPT model and tokenizer
# The Hugging Face checkpoint for the model and its tokenizer is `"microsoft/DialoGPT-medium"`
# checkpoint
checkpoint = "microsoft/DialoGPT-medium"
# download and cache tokenizer
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# download and cache pre-trained model
model = AutoModelForCausalLM.from_pretrained(checkpoint)
# A ChatBot class
# Build a ChatBot class with all necessary modules to make a complete conversation
class ChatBot():
# initialize
def __init__(self):
# once chat starts, the history will be stored for chat continuity
self.chat_history_ids = None
# make input ids global to use them anywhere within the object
self.bot_input_ids = None
# a flag to check whether to end the conversation
self.end_chat = False
# greet while starting
self.welcome()
def welcome(self):
print("Initializing ChatBot ...")
# some time to get user ready
time.sleep(2)
print('Type "bye" or "quit" or "exit" to end chat \n')
# give time to read what has been printed
time.sleep(3)
# Greet and introduce
greeting = np.random.choice([
"Welcome, I am ChatBot, here for your kind service",
"Hey, Great day! I am your virtual assistant",
"Hello, it's my pleasure meeting you",
"Hi, I am a ChatBot. Let's chat!"
])
print("ChatBot >> " + greeting)
def user_input(self):
# receive input from user
text = input("User >> ")
# end conversation if user wishes so
if text.lower().strip() in ['bye', 'quit', 'exit']:
# turn flag on
self.end_chat=True
# a closing comment
print('ChatBot >> See you soon! Bye!')
time.sleep(1)
print('\nQuitting ChatBot ...')
else:
# continue chat, preprocess input text
# encode the new user input, add the eos_token and return a tensor in Pytorch
self.new_user_input_ids = tokenizer.encode(text + tokenizer.eos_token, \
return_tensors='pt')
def bot_response(self):
# append the new user input tokens to the chat history
# if chat has already begun
if self.chat_history_ids is not None:
self.bot_input_ids = torch.cat([self.chat_history_ids, self.new_user_input_ids], dim=-1)
else:
# if first entry, initialize bot_input_ids
self.bot_input_ids = self.new_user_input_ids
# define the new chat_history_ids based on the preceding chats
# generated a response while limiting the total chat history to 1000 tokens,
self.chat_history_ids = model.generate(self.bot_input_ids, max_length=1000, \
pad_token_id=tokenizer.eos_token_id)
# last ouput tokens from bot
response = tokenizer.decode(self.chat_history_ids[:, self.bot_input_ids.shape[-1]:][0], \
skip_special_tokens=True)
# in case, bot fails to answer
if response == "":
response = self.random_response()
# print bot response
print('ChatBot >> '+ response)
# in case there is no response from model
def random_response(self):
i = -1
response = tokenizer.decode(self.chat_history_ids[:, self.bot_input_ids.shape[i]:][0], \
skip_special_tokens=True)
# iterate over history backwards to find the last token
while response == '':
i = i-1
response = tokenizer.decode(self.chat_history_ids[:, self.bot_input_ids.shape[i]:][0], \
skip_special_tokens=True)
# if it is a question, answer suitably
if response.strip() == '?':
reply = np.random.choice(["I don't know",
"I am not sure"])
# not a question? answer suitably
else:
reply = np.random.choice(["Great",
"Fine. What's up?",
"Okay"
])
return reply
# build a ChatBot object
bot = ChatBot()
# start chatting
while True:
# receive user input
bot.user_input()
# check whether to end chat
if bot.end_chat:
break
# output bot response
bot.bot_response()
# Happy Chatting!