Knowledge Base Actions

Knowledge Base Actions

Warning

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. The json structure should contain a key for every object type, i.e. "restaurant" and "hotel".

{
    "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:

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.

## 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)?
- do you know the [price range](attribute:price-range) of [that one](mention)?
- what [cuisine](attribute) is [it](mention)?
- do you know what [cuisine](attribute) the [last one](mention:LAST) has?
- does the [first one](mention:1) have [outside seating](attribute:outside-seating)?
- what is the [price range](attribute:price-range) of [Berlin Burrito Company](restaurant)?
- what about [I due forni](restaurant)?
- can you tell me the [price range](attribute) of [that restaurant](mention)?
- what [cuisine](attribute) do [they](mention) have?
 ...

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 the constructor of ActionQueryKnowledgeBase.

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

In order to query the knowledge base for any kind of object, the user’s request needs to include the object type.

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 both the object and attribute of interest.

Resolve Mentions

Users may not always refer to restaurants by their names. The action is able to resolve these mentions to the actual object in the knowledge base.