Knowledge Base Actions
Knowledge Base Actions
Overview
This feature is experimental. We introduce experimental features to get feedback from our community, so we encourage you to try it out! However, the functionality might be changed or removed in the future. If you have feedback (positive or negative) please share it with us on the forum.
Using ActionQueryKnowledgeBase
Create a Knowledge Base
The data used to answer the user’s requests will be stored in a knowledge base. A knowledge base can be used to store complex data structures. We suggest you get started by using the InMemoryKnowledgeBase. Once you want to start working with a large amount of data, you can switch to a custom knowledge base (see Creating Your Own Knowledge Base).
To initialize an InMemoryKnowledgeBase, you need to provide the data in a json file. The following example contains data about restaurants and hotels.
{
"restaurant": [
{
"id": 0,
"name": "Donath",
"cuisine": "Italian",
"outside-seating": true,
"price-range": "mid-range"
},
{
"id": 1,
"name": "Berlin Burrito Company",
"cuisine": "Mexican",
"outside-seating": false,
"price-range": "cheap"
},
{
"id": 2,
"name": "I due forni",
"cuisine": "Italian",
"outside-seating": true,
"price-range": "mid-range"
}
],
"hotel": [
{
"id": 0,
"name": "Hilton",
"price-range": "expensive",
"breakfast-included": true,
"city": "Berlin",
"free-wifi": true,
"star-rating": 5,
"swimming-pool": true
},
{
"id": 1,
"name": "Hilton",
"price-range": "expensive",
"breakfast-included": true,
"city": "Frankfurt am Main",
"free-wifi": true,
"star-rating": 4,
"swimming-pool": false
},
{
"id": 2,
"name": "B&B",
"price-range": "mid-range",
"breakfast-included": false,
"city": "Berlin",
"free-wifi": false,
"star-rating": 1,
"swimming-pool": false
}
]
}
Define the NLU Data
In this section, we will introduce a new intent, query_knowledge_base and annotate mention entities so that our model detects indirect mentions of objects. For the bot to understand that the user wants to retrieve information from the knowledge base, you need to define a new intent. We will call it query_knowledge_base.
The intent should contain variations of user queries such as:
## intent:query_knowledge_base
- what [restaurants](object_type:restaurant) can you recommend?
- list some [restaurants](object_type:restaurant)
- can you name some [restaurants](object_type:restaurant) please?
- can you show me some [restaurant](object_type:restaurant) options
- list [German](cuisine) [restaurants](object_type:restaurant)
- do you have any [mexican](cuisine) [restaurants](object_type:restaurant)?
...```
### Create an Action to Query your Knowledge Base
To create your own knowledge base action, you need to inherit `ActionQueryKnowledgeBase` and pass the knowledge base to its constructor.
```python
class MyKnowledgeBaseAction(ActionQueryKnowledgeBase):
def __init__(self):
knowledge_base = InMemoryKnowledgeBase("data.json")
super().__init__(knowledge_base)
How It Works
ActionQueryKnowledgeBase looks at both the entities that were picked up in the request as well as the previously set slots to decide what to query for.
Query the Knowledge Base for Objects
Example user input:
Can you please name some restaurants?
Query the Knowledge Base for an Attribute of an Object
If the user wants to obtain specific information about an object, the request should include the object and attribute of interest.
Resolve Mentions
Users may refer to objects indirectly using terms like “the first one” or “it”. Our action is able to resolve these mentions to actual objects in the knowledge base.
Customization
You can overwrite the two functions of ActionQueryKnowledgeBase if you’d like to customize what the bot says to the user.
utter_objects()utter_attribute_value()
Creating Your Own Knowledge Base Actions
ActionQueryKnowledgeBase should allow you to easily get started with integrating knowledge bases into your actions. However, it can handle only two kinds of user requests:
- The user wants to get a list of objects from the knowledge base.
- The user wants to get the value of an attribute for a specific object.
For complex use cases, you can write your own custom action.
Customizing the InMemoryKnowledgeBase
You can customize your InMemoryKnowledgeBase by overwriting methods such as get_key_attribute_of_object() and get_representation_function_of_object().