In the above site, they have a chatbot asking for name, email, and message. I want to create one for my company, can someone give me a source code or someone did like that online. Thank you!!
Hi @reddyakilesh22, Iāve seen that page has a form that allows users to input their data, assuming you want to achieve the same thing but using a rasa powered bot instead (which is an awesome idea btw), you would have to use rasa Forms (find the official info here )
Summary
Assuming you already know how to use rasa, you will need to declare 3 entities on your domain.yml file like this:
entities:
- client_name
- client_email
- client_message
then would have to declare the slots types for this 3 entities you just declared above, like this :
slots:
client_name:
type: text
client_email:
type: text
name:
type: text
client_message:
type: text
then you would have to the responses which are just the questions your assistant will ask to the users, keep in mind that they have to start with utter_ask_
. so your assistant knows it is a question he must ask to the user, like this :
responses:
utter_ask_client_name:
- text: What is your email address ?
utter_ask_client_email:
- text: What is your email address ?
utter_ask_client_message:
- text: what is the message you would like me to send to our team ?
Finally, you just have to the declare the form you will use on your actions.py file, like this:
forms:
- form_get_client_message
Now on your action.py file create a required slots function so it will loop the user till he/she writes the info you need, like this:
class ActionUserMessage(FormAction):
def name(self) -> Text:
return "form_get_client_message"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
"""A list of required slots that the form has to fill."""
return ["client_name", "client_email", "client_message"]
def submit(self,dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any],):
# Do something dramatically here, like call an API for example lol
return []
Now on your stories.md file, assuming that the intent send_message
is when the user say for example I would like to leave a message,
put something like this
## Get Info from user:
* send_message
- form_get_client_message
- form{"name": "form_get_client_message"}
- form{"name": null}
- utter_good_bye
It will activate the form, loop till it is done and deactivate it
I think the full code would be something like this
Domain.yml
entities:
- client_name
- client_email
- client_message
slots:
client_name:
type: text
client_email:
type: text
name:
type: text
client_message:
type: text
responses:
utter_ask_client_name:
- text: What is your email address ?
utter_ask_client_email:
- text: What is your email address ?
utter_ask_client_message:
- text: what is the message you would like me to send to our team ?
forms:
- form_get_client_message
Actions.py
class ActionUserMessage(FormAction):
def name(self) -> Text:
return "form_get_client_message"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
"""A list of required slots that the form has to fill."""
return ["client_name", "client_email", "client_message"]
def submit(self,dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any],):
# Do something dramatically here, like call an API for example lol
return []
Storied.md
## Get Info from user:
* send_message
- form_get_client_message
- form{"name": "form_get_client_message"}
- form{"name": null}
- utter_good_bye
Hope it helps
Thank you!! But in intents say I gave
- My name is Rohit Sharma
- John Doe
- I am Vishnu
- Peter Richard
- People call me Priya
- Jane Doe
- Max Mustermann
- You can call me Supriya
- Jonathan
- Max Meier
When I give other names say Justin itās showing me Failed to extract slot client_name with action form_get_client_message, do you have a solution for that?
I have seen somewhere that I need to use spacy pipeline and others so that my bot understands. But still I was facing the same problem but I kinda feel I didnāt give my config.yml correctly so can you try and let me know what all should be given inside config.yml. Thank you!!
Hey @reddyakilesh22,
Add form policy on your policies in config.yml
Add intents to your domain file like (client_name_entry, client_email_entry, etc etc)
Specify how the data might be given on your NLU file for each intent
Summary
Domain.yml
Add intents to your domain file like (client_name_entry, client_email_entry, etc etc)
intents:
- client_name_entry
- client_email_entry
- client_message_entry
config.yml
Add form policy on your policies in config.yml file like this :
language: en
pipeline: supervised_embeddings
policies:
- name: FormPolicy
nlu.md
On your nlu file specify how the data might be given like this:
## intent:name_entry
- My name is [Rohit Sharma] (client_name)
- [John Doe] (client_name)
- I am [Vishnu] (client_name)
- [Peter Richard] (client_name)
- People call me [Priya] (client_name)
- [Jane Doe] (client_name)
- [Max Mustermann] (client_name)
- You can call me [Supriya] (client_name)
do this for every intent with their respective entities name
Let me know if it works
Hey, I have done everything like you said. Iām still getting same error.
Your input -> hi
Hey! How can I help you?
Your input -> Sales
What is your name ?
Your input -> Divya
2020-09-16 20:14:21 ERROR rasa.core.actions.action - Failed to extract slot client_name with action form_get_client_message
Hey! How can I help you?
Your input -> Sales
Your input -> hi
Hey! How can I help you?
Your input -> Sales
What is your name ?
Your input -> Jonathan
c:\users\reddy\anaconda3\envs\bot\lib\site-packages\rasa\utils\common.py:363: UserWarning: Action āform_get_client_messageā set a slot type āclient_nameā which it never set during the
training. This can throw off the prediction. Make sure to include training examples in your stories for the different types of slots this action can return. Remember: you need to set
the slots manually in the stories by adding ā- slot{āclient_nameā: Jonathan}ā after the action.
What is your email address ?
Your input ->
You can see when I gave name saying Divya it shows error and then when I say Jonathan it goes to next step asking email.
nlu.md
intent:greet
- hey
- hello
- hi
- good morning
- good evening
- hey there
intent:goodbye
- bye
- goodbye
- see you around
- see you later
intent:affirm
- yes
- indeed
- of course
- that sounds good
- correct
intent:deny
- no
- never
- I donāt think so
- donāt like that
- no way
- not really
intent:bot_challenge
- are you a bot?
- are you a human?
- am I talking to a bot?
- am I talking to a human?
- what is your name?
intent:send_message
- Sales
intent:client_email_entry
- maxmeier@firma.de
- poddut@acme.com
- maxmeier@firma.de
- bot-fan@bots.com
- virat@yahoo.com
- vishnu@gmail.co.in
- my email is email@rasa.com
- sharmarohit11@gmail.com
intent:client_name_entry
- My name is Rohit Sharma
- John Doe
- I am Vishnu
- Peter Richard
- People call me Priya
- Jane Doe
- Max Mustermann
- You can call me Supriya
- Jonathan
- Max Meier
The highlighted ones are entities with client_name and client_email
domain.yml
session_config: session_expiration_time: 60 carry_over_slots_to_new_session: true
intents:
- greet
- goodbye
- affirm
- deny
- client_name_entry
- client_email_entry
- client_message_entry
- bot_challenge
- send_message
entities:
- client_name
- client_email
- client_message
slots:
client_name:
type: text
client_email: type: text
client_message: type: text
responses:
utter_greet: - text: Hey! How can I help you?
utter_goodbye: - text: Bye
utter_iamabot: - text: I am a bot, powered by Rasa
utter_ask_client_name: - text: What is your name ?
utter_ask_client_email: - text: What is your email address ?
utter_ask_client_message: - text: what is the message you would like me to send to our team ?
forms:
- form_get_client_message
config.yml
Configuration for Rasa NLU.
Components
language: en pipeline: supervised_embeddings
Configuration for Rasa Core.
Policies
policies:
- name: MemoizationPolicy
- name: TEDPolicy max_history: 5 epochs: 100
- name: MappingPolicy
- name: FormPolicy
stories.md
happy path
- greet
- utter_greet
- goodbye
- utter_goodbye
say goodbye
- goodbye
- utter_goodbye
bot challenge
- bot_challenge
- utter_iamabot
Get Info from user:
- send_message
- form_get_client_message
- form{ānameā: āform_get_client_messageā}
- form{ānameā: null}
- utter_goodbye
Did you specify the slot client_name on your NLU ?
e.g:
## intent:name_entry
- My name is [Rohit Sharma] (client_name)
- [John Doe] (client_name)
- I am [Vishnu] (client_name)
- [Peter Richard] (client_name)
- People call me [Priya] (client_name)
- [Jane Doe] (client_name)
- [Max Mustermann] (client_name)
- You can call me [Supriya] (client_name)
Yes
I just replicated it now, and it seems to work fine, do you mind sharing some screenshots please, in case I forgot some steps
@Tanja can you please look into this, Eden has helped me out with this problem and actually made it and put it up online on his GitHub profile GitHub - jusce17/rasa_form_example and I have done the same thing as he did and downloaded the same packages as his but still, Iām unable to solve my issue, like if I give a name which isnāt in my nlu.md file itās giving me an error. Like this:
ERROR rasa.core.actions.action - Failed to extract slot client_name with action form_get_client_message
@akelad can you please look into this!!
@reddyakilesh22 To extract names of people, you can add spacy to your pipeline (SpacyNLP, SpacyTokenizer and SpacyFeaturizer). After than you can add PERSON
as an entity in your domain file.
Spacy will identify and extract peoples name for you automatically without any training data from you. Once you have the PERSON entity extracted, you can fill it in any slots you like.
@a-anand-91119 Can you share the entity example? That how you can define the PERSON as entity in domain.yml file