Detailed chat process (Rasa robot)
sketch:
Rasa is a framework that can be used to build a robot dialogue system. Building a robot dialogue system based on rasa framework can be used in various industrial voice intelligent service scenarios, such as telemedicine consultation, intelligent customer service, insurance product sales, financial collection services, manual intelligent assistant and other fields. Support the construction of dialogue system based on rules, slot filling and machine learning. The main modules include: NLU (intention recognition and entity extraction) and Core (reply based on model and rules). It provides a scaffold for building a dialogue system.
Common commands are:
rasa init # Create project rasa train # Training NLU and Core models rasa run actions # Start the action service (mainly the actions written by yourself, the default actions of the system, and do not need to be started separately) rasa shell # Start the dialogue robot (the default action service will be started automatically) rasa x # Start rasa x visualization service
1. New construction
First, execute the following command to create a new project:
rasa init
or
rasa init --no-prompt
rasa init command will create all the files required by rasa project and train a simple chat robot on the initialization sample data. If the command does not carry the – no prompt flag, you will encounter some questions about the project settings.
Use rasa init to create the mybot project. The directory results are as follows:
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-dgtikq2l-1645008096429) (/ users / liuzepei / library / Application Support / typera user images / image-20220216181439694. PNG)]
The following files will be created:
init.py | help python Find an empty file for your feature |
---|---|
actions.py | In this file, you can customize the code to perform actions |
config.yml '*' | Rasa NLU and Rasa Core model profiles |
credentials.yml | Detailed configuration of connecting to other services |
data/nlu.yml '*' | Rasa NLU training data |
data/stories.yml '*' | Story writing document |
domain.yml '*' | Intelligent assistant function definition domain file |
endpoints.yml | Detailed configuration of connecting to channels like fb messenger |
models/.tar.g | Initialization model |
The '*' marks are very important documents, which are explained in detail in this tutorial.
2. View and build NLU training data
The first part of Rasa intelligent assistant is the NLU model. NLU is the abbreviation of Natural Language Understanding, which means to convert various user information into structured data. To use rasa to complete this function, you need to provide training corpus, through which rasa can learn how to understand user information. And rasa can use these corpora to train the model.
In the new project directory of rasa init command, run the following command to view the training configuration file:
cat data/nlu.yml
Sample data:
nlu.yml is used to train the training data of NLU model
version: "2.0" nlu: - intent: greet examples: | - Hello - Good morning - Good noon - hi - intent: goodbye examples: | - bye - see you around - good night - intent: affirm examples: | - yes - have - of course - Sounds good - intent: deny examples: | - no - No - No, - No, - I don't like it - intent: mood_great examples: | - Great - I feel good - very nice - intent: mood_unhappy examples: | - unhappy - Feel depressed - unhappy - just so so - intent: bot_challenge examples: | - Are you a robot? - Are you human? - Am I talking to a robot? - Am I talking to humans? - intent: request_names examples: | - I want to tell you your name - Do you know my name? - lookup: names examples: | - Zhu Bajie - Sun WuKong - Sha Wujing - Tang Sanzang
rules.yml rules, according to the user's intention, carry out specific actions (including query, slot filling, reply, etc.)
version: "2.0" rules: - rule: Say goodbye anytime the user says goodbye steps: - intent: goodbye - action: utter_goodbye - rule: Say 'I am a bot' anytime the user challenges steps: - intent: bot_challenge - action: utter_iamabot - rule: Activate form steps: - intent: request_names - action: name_form - active_loop: name_form - rule: Submit form condition: - active_loop: name_form steps: - action: name_form - active_loop: null - slot_was_set: - requested_slot: null - action: utter_submit - action: utter_slots_values
3. Define model configuration
Define the components of Rasa NLU and Rasa Core required by your model through the configuration file. In this example, the NLU model will use supervised_embeddings pipe. You can use the page here Understand the different NLU pipes.
View the model configuration file through the following command:
cat config.yml # That is, the configuration of NLU and Core models cat domain.yml # Domain configuration credentials.yml # Certificate configuration, which is used to call the interface of voice channel endpoints.yml # Endpoint configuration, such as the model, action and storage service to be used by the robot
language and pipeline mainly determine how to build Rasa NLU model. Policies mainly defines the policies used by the Rasa Core model policies.
The configuration files involved are:
config.yml is the configuration of NLU and Core models
# Configuration for Rasa NLU. # https://rasa.com/docs/rasa/nlu/components/ language: zh pipeline: # # No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model. # # If you'd like to customize it, uncomment and adjust the pipeline. # # See https://rasa.com/docs/rasa/tuning-your-model for more information. # - name: WhitespaceTokenizer - name: JiebaTokenizer #Support Chinese - name: RegexFeaturizer - name: LexicalSyntacticFeaturizer - name: CountVectorsFeaturizer - name: CountVectorsFeaturizer analyzer: char_wb min_ngram: 1 max_ngram: 4 - name: DIETClassifier epochs: 100 constrain_similarities: true - name: EntitySynonymMapper - name: ResponseSelector epochs: 100 constrain_similarities: true - name: FallbackClassifier threshold: 0.3 ambiguity_threshold: 0.1 # Configuration for Rasa Core. # https://rasa.com/docs/rasa/core/policies/ policies: # # No configuration for policies was provided. The following default policies were used to train your model. # # If you'd like to customize them, uncomment and adjust the policies. # # See https://rasa.com/docs/rasa/policies for more information. - name: MemoizationPolicy - name: TEDPolicy max_history: 5 epochs: 100 constrain_similarities: true - name: RulePolicy
domain.yml domain configuration
version: '2.0' config: store_entities_as_slots: true session_config: session_expiration_time: 60 carry_over_slots_to_new_session: true intents: - greet: use_entities: true - deny: use_entities: true - request_names: use_entities: true - goodbye: use_entities: true - affirm: use_entities: true - mood_great: use_entities: true - mood_unhappy: use_entities: true - bot_challenge: use_entities: true entities: [] slots: first_name: type: rasa.shared.core.slots.TextSlot initial_value: null auto_fill: true influence_conversation: true last_name: type: rasa.shared.core.slots.TextSlot initial_value: null auto_fill: true influence_conversation: true name_spelled_correctly: type: rasa.shared.core.slots.BooleanSlot initial_value: null auto_fill: true influence_conversation: true requested_slot: type: rasa.shared.core.slots.UnfeaturizedSlot initial_value: null auto_fill: true influence_conversation: false responses: utter_greet: - text: Hi, how are you? utter_cheer_up: - image: https://i.imgur.com/nGF1K8f.jpg text: 'It's something that lifts you up:' utter_did_that_help: - text: Does this help you? utter_happy: - text: Great, go on! utter_goodbye: - text: bye utter_iamabot: - text: I'm a robot, by Rasa Framework support. utter_ask_first_name: - text: What's your family name?? utter_ask_last_name: - text: Your Name? utter_ask_name_spelled_correctly: - buttons: - payload: /affirm title: yes - payload: /deny title: no text: surname {first_name} Is the spelling right? utter_submit: - text: That's fine. Thank you! utter_slots_values: - text: I remember you, {first_name} {last_name}! actions: - utter_greet - utter_slots_values - utter_submit - validate_name_form forms: name_form: first_name: - type: from_text last_name: - type: from_text e2e_actions: []
credentials.yml certificate configuration is used to call the interface of voice channel
# This file contains the credentials for the voice & chat platforms # which your bot is using. # https://rasa.com/docs/rasa/messaging-and-voice-channels rest: # # you don't need to provide anything here - this channel doesn't # # require any credentials #facebook: # verify: "<verify>" # secret: "<your secret>" # page-access-token: "<your page access token>" #slack: # slack_token: "<your slack token>" # slack_channel: "<the slack channel>" # slack_signing_secret: "<your slack signing secret>" #socketio: # user_message_evt: <event name for user message> # bot_message_evt: <event name for bot messages> # session_persistence: <true/false> #mattermost: # url: "https://<mattermost instance>/api/v4" # token: "<bot token>" # webhook_url: "<callback URL>" # This entry is needed if you are using Rasa X. The entry represents credentials # for the Rasa X "channel", i.e. Talk to your bot and Share with guest testers. rasa: url: "http://localhost:5002/api"
endpoints.yml endpoint configuration, such as the model, action and storage service to be used by the robot
# This file contains the different endpoints your bot can use. # Server where the models are pulled from. # https://rasa.com/docs/rasa/model-storage#fetching-models-from-a-server #models: # url: http://my-server.com/models/default_core@latest # wait_time_between_pulls: 10 # [optional](default: 100) # Server which runs your custom actions. # https://rasa.com/docs/rasa/custom-actions #action_endpoint: # url: "http://localhost:5055/webhook" action_endpoint: url: "http://localhost:5055/webhook" # Tracker store which is used to store the conversations. # By default the conversations are stored in memory. # https://rasa.com/docs/rasa/tracker-stores #tracker_store: # type: redis # url: <host of the redis instance, e.g. localhost> # port: <port of your redis instance, usually 6379> # db: <number of your database within redis, e.g. 0> # password: <password used for authentication> # use_ssl: <whether or not the communication is encrypted, default false> #tracker_store: # type: mongod # url: <url to your mongo instance, e.g. mongodb://localhost:27017> # db: <name of the db within your mongo instance, e.g. rasa> # username: <username used for authentication> # password: <password used for authentication> tracker_store: type: SQL dialect: sqlite db: trackers.db # Event broker which all conversation events should be streamed to. # https://rasa.com/docs/rasa/event-brokers #event_broker: # url: localhost # username: username # password: password # queue: queue event_broker: type: SQL dialect: sqlite db: events.db
names.txt list of names used in this case
Sun WuKong Zhu Bajie Tang Sanzang Sha Wujing Qing-Yun Zhuge
4. Write your first story
In this section, you will teach your assistant how to respond to your message. This is called conversation management and is handled by your Rasa Core model. The Rasa Core model learns from real session data by training "stories". A story represents the real conversation process between users and assistants.
The contents and entities lines reflect the user's input, and the action names show how the assistant responds to the user's input.
An example of dialogue. The user said hello and the assistant replied hello. That's why it looks like a story. You can Stories View details in.
The line starting with - is the assistant's action. In this session, all actions return the user's information as it is, like utter_greet. However, generally, action can do anything, including calling api, interacting with external and so on.
Run the following command to view data / stories Example of story in MD file:
cat data/stories.md
stories.yml storyline, describing the process of dialogue
version: "2.0" stories: - story: happy path steps: - intent: greet - action: utter_greet - intent: mood_great - action: utter_happy - story: sad path 1 steps: - intent: greet - action: utter_greet - intent: mood_unhappy - action: utter_cheer_up - action: utter_did_that_help - intent: affirm - action: utter_happy - story: sad path 2 steps: - intent: greet - action: utter_greet - intent: mood_unhappy - action: utter_cheer_up - action: utter_did_that_help - intent: deny - action: utter_goodbye - story: interactive_story_1 steps: - intent: greet - action: utter_greet - intent: request_names - action: name_form - active_loop: name_form - slot_was_set: - requested_slot: first_name - slot_was_set: - name_spelled_correctly: None - slot_was_set: - first_name: None - slot_was_set: - requested_slot: last_name - slot_was_set: - name_spelled_correctly: None - slot_was_set: - last_name: None - slot_was_set: - requested_slot: null - active_loop: null - action: utter_submit - action: utter_slots_values
5. Defining areas
Next, we will define a domain. This field defines the boundaries that your assistant can handle: what information you want the user to input, what actions you can predict, how to respond to the user, and what information you store. The realm of the assistant is stored in the file domain. XML In YML:
cat domain.yml
So what do the different parts mean?
intents | What you want users to say |
---|---|
actions | What an assistant can do and say |
templates | Script template of assistant |
How are these combined? The job of Rasa Core is to select a correct action to execute at each step of the session. In this example, our actions simply send a message to the user. These simple words are executed in the domain with the word "utter"_ Actions at the beginning. The assistant selects a template response message from templates. reference resources Custom Actions Create a custom action.
The configuration files involved have been listed one by one above. Let's take a look at how the user-defined action is written. It mainly completes the process of input verification. The default action is based on utter_ First, the system defaults to payment
import yaml import pathlib from typing import Text, List, Any, Dict, Optional from rasa_sdk import Tracker, FormValidationAction from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.types import DomainDict names = pathlib.Path("names.txt").read_text().split("\n") class ValidateNameForm(FormValidationAction): def name(self) -> Text: return "validate_name_form" async def required_slots( self, slots_mapped_in_domain: List[Text], dispatcher: "CollectingDispatcher", tracker: "Tracker", domain: "DomainDict", ) -> Optional[List[Text]]: first_name = tracker.slots.get("first_name") if first_name is not None: if first_name not in names: return ["name_spelled_correctly"] + slots_mapped_in_domain return slots_mapped_in_domain async def extract_name_spelled_correctly( self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict ) -> Dict[Text, Any]: intent = tracker.get_intent_of_latest_message() return {"name_spelled_correctly": intent == "affirm"} def validate_name_spelled_correctly( self, slot_value: Any, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict, ) -> Dict[Text, Any]: """Validate `first_name` value.""" if tracker.get_slot("name_spelled_correctly"): return {"first_name": tracker.get_slot("first_name"), "name_spelled_correctly": True} return {"first_name": None, "name_spelled_correctly": None} def validate_first_name( self, slot_value: Any, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict, ) -> Dict[Text, Any]: """Validate `first_name` value.""" # If the name is super short, it might be wrong. print(f"surname = {slot_value} length = {len(slot_value)}") if len(slot_value) <=1: dispatcher.utter_message(text=f"The last name is too short. Are you sure you spelled it right?") return {"first_name": None} else: return {"first_name": slot_value} def validate_last_name( self, slot_value: Any, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict, ) -> Dict[Text, Any]: """Validate `last_name` value.""" # If the name is super short, it might be wrong. print(f"name = {slot_value} length = {len(slot_value)}") if len(slot_value) <= 1: dispatcher.utter_message(text=f"The name is too short. Are you sure you spelled it right?") return {"last_name": None} else: return {"last_name": slot_value}
6. Training model
Once we add new NLU or Core data, or update the domain or configuration, we need to retrain the neural network on the sample story and NLU data. The neural network can be retrained by using the following command. This command will call Rasa's Core and NLU training functions and store the trained model in the models / folder. This command will automatically retrain Rasa's data or configuration change part of the model.
rasa train
The rasa train command will find the data of NLU and CORE and train the combined model.
Illustration:
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-qvfxkayp-1645008096430) (/ users / liuzepei / library / Application Support / typera user images / image-20220216182032542. PNG)]
7. Use your assistant
congratulations! You have just set up an assistant that is completely driven by machine learning.
The next step is to test it! If you are learning this tutorial locally, start starting and using your assistant with the following command:
rasa shell
Start the robot for dialogue
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-xhbgqhxw-1645008096430) (/ users / liuzepei / library / Application Support / typera user images / image-20220216182605475. PNG)]
8. Create rasa x
You can use Rasa X to collect more sessions to improve your assistant:
Start the rasa X command under the project directory as follows:
rasa x
Startup example:
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (IMG alnrlgfv-1645008096431) (/ users / liuzepei / library / Application Support / typera user images / image-20220216182943485. PNG)]
If the service is started on the server, fill in the ip address of the server when logging in the IE browser, for example: 192.168.10.192:5002
Illustration:
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-aaekzhkk-1645008096431) (/ users / liuzepei / library / Application Support / typera user images / image-20220216183320305. PNG)]
Input password:
[the external chain image transfer fails. The source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-tc6g2spi-1645008096431) (/ users / liuzepei / library / Application Support / typera user images / image-20220216183545033. PNG)]
Post login Icon:
[the external chain image transfer fails, and the source station may have an anti-theft chain mechanism. It is recommended to save the image and upload it directly (img-xttir2a5-1645008096431) (/ users / liuzepei / library / Application Support / typera user images / image-20220216183650359. PNG)]