As usual it’s been a while since I’ve updated the blog, so as to keep it alive here is a quick update. For this post I’m going to show two simple techniques using the intents object over the #Intents reference.
As always I recommend that you only implement these if there is evidence it is needed.
A common issue with end users is that they don’t always understand the answer they get. It is very common for the user to gloss over what has been shown to them, and they can miss the actual answer they wanted.
More often than not, the user just doesn’t read the answer. 🙂
By default the user asks the question in a slightly different way, gets the same intent and asks again. One of the ways to detect how to work on answers is to look for this pattern in the logs.
Another option is to change up the conversation like a human would. To this end, we will detect if they got the same answer. First we create a $last_intent context variable, and check that like so:
Now if this node doesn’t trigger it’s important to clear the $last_intent
But this node needs to jump back to the branch to continue on. You will notice that I created a dummy node to jump to. This is a good coding convention. You put any further nodes below the jump node. This prevents the jump logic breaking if you add nodes.
Another thing to notice is the Answer General Questions condition logic:
This allows you to group similar context intents into a single node. Normally most people will just pick the related intents for the condition block. So you end up with something like this:
The problem with above is that you will be more prone to making mistakes. While some of you might have spotted the “and” mistake, what is less noticeable is the missing intent #General_Ending. You can spend ages wondering why your message isn’t being displayed despite being in the node. With the one line code earlier, you don’t have to worry about any of this.
Here is the sample skill to play with.
Next up is compound questions. I discussed this before, but from a code perspective. This example we are going to try doing it from within the skill itself.
- Watson Assistant Plus already has this feature.
- Due to how skills work, this example cannot exceed 50 intents. Watson Assistant will disable the dialog logic if it hits the same node 50 times. This is to prevent a possible endless loop.
- This will likely not work if you have any slots.
If you need it for more than 50 nodes then you will need to do it with code, or WA Plus (which is much easier).
First we start by creating a multi-response node (main condition is anything_else). The first response you should edit in the advanced tab and set as follows:
The condition block is just a way to see if the first intent and second intent are close. There are a number of ways to do this, for example K-Means, or difference in percent rather than scaled. While K-Means is not easily done in WA, this method works but tends to be a bit more sensitive. So play around and see which you prefer.
Once the condition is hit we set a $answer_counter to 1 and $compound_found to true.
If it’s not hit we just set $compound_found to false. We don’t need to worry about the $answer_counter as it will always be 0 when in this position.
For the intent matching in the dialog nodes you cannot use the #Intent shortcuts. Instead you do the following:
intent[$answer_counter].intent == "General_Greetings"
If the counter is set to 1, it will respond with the second intent first. Then we decrement that counter and loop through all intents again. You end up with something like this:
Again, here is a sample skill: