Table of Contents | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Prolog and Patterns
We will begin with implementing a pattern for allowing a user to express they are done, and then get back to what is still missing to implement requests to remove a filter.
A user does not want to specify more recipe constraints
The pattern that we want to implement to enable a user to express they do not want to provide more information is the following:
...
There is still one thing missing… Just by talking the agent will not change the page that is displayed. Recall that you have created two pages for the a50recipeSelect
pattern for https://socialrobotics.atlassian.net/wiki/pages/createpage.action?spaceKey=PM2&title=2025%20Capability%205%3A%20Filter%20Recipes%20by%20Ingredients%20and%20Cuisine. Filtering by Inclusion . When the agent grants the user’s request we still need to make sure that the second recipe recommendation page showing the recipe pictures is displayed. To make that happen, we need to change the condition for showing that page. We need the store the fact that the user requested this. The idea is to use the conversational memory of the agent for that and update it with this information. Therefore, when the agent grants the user's request, the version of that pattern should end with the agent updating its memory using an [agent, update(['show'='true'])]
actor-intent pair. To change the condition for showing the page in the html.pl
file, we can then use the memoryKeyValue/2
predicate defined in the dialog.pl
file to add an alternative condition for showing this page.You now must find a way to pass information that the recipe overview pages should change.
Finishing the implementation for removing filters
Most of the work that needs to be done to remove filters again has already been done. Various patterns implementing the a21removeKeyFromMemory
have already been included in the patterns.pl
file (check them out to better understand the variants added for this pattern). The specification of the agent response featureInquiry
used in several of these variants, however, is still missing It is up to you to add these in the responses.pl
file. The idea is to define four different types of these responses. Each of these feature inquiry responses should be different based on how many recipes there are still left after applying all the filters, and will require you to define the conditions for when a response is available:
First Rule for Large Number of Recipes
We want to prompt the user for more specific preferences if there are many recipes left. This version of the response should be triggered when the length of the list of recipes is still large (say greater than 800):
Start with the
text/2
predicate, where the first argument isfeatureInquiry
.For the second argument you can use a response text such as "What kind of recipe would you like?".
Use the
recipesFiltered/1
predicate to get the list of recipes, thelength/2
predicate to determine the number of recipes, and add a condition that the length must be greater than 800.
Second Rule for a Moderate Number of Recipes
If there's a moderate number of recipes left (more than 15 but less than or equal to 800), we ask the user to add more preferences unless the memory key-value pair to show recipes has been set (see above):
Use a response text similar to e.g. "What other preference would you like to add?".
Add a condition to check that more than 15 but less than 800 recipes are left.
Also include a condition to check that the memory does not have the key-value pair
'show', 'true'
.
Third Rule for No Recipes
If there are no recipes left after filtering, we want to inform the user to remove some feature requests.
Use a response text similar to "There are no recipes, please remove more requirements.".
Use the
recipesFiltered/1
predicate again to check that no recipes are left.
Fourth Rule for a Small Number of Recipes or a Show Command
This rule handles two scenarios: either there's a small number of recipes, or the user has explicitly asked to show the recipes even when the number is greater than 15.
Use a response text similar to "Here are some recipes that fit your requirements.".
Use the
recipesFiltered/1
predicate to get the filtered list, and check that the length is less than 16 but more than 0, or (use a semicolon;
which represents a logical OR) check that the memory key-value pair ‘show', 'true'
is stored in the agent’s conversational memory.Note the terms used here can be used to condition the recipe overview pages in your javascript and html.
This completes the implementation of all the different cases for the agent’s response. The patterns for removing filters should now work!
Visuals
What you do visually for this capability is up to you. Think about the fact that users could end up going from Recipe Overview 2 page to Recipe Overview 1.
Test it Out
Now https://socialrobotics.atlassian.net/wiki/pages/createpage.action?spaceKey=PM2&title=2025%20Run%20your%20Conversational%20Agent Run your Conversational Agent again and try to remove some of the recipe constraints after you added them.