This site is obsolete and should be used for reference only. The information in this documentation is not guaranteed to work for Bot Framework SDK versions past 4.9.1.

Beta Release 0.8

QnA Maker updates

Summarizes key updates made to the Virtual Assistant enabling you to easily update parts of your existing Assistant


Transition to QnAMakerDialog

With the R7 release of the Bot Framework SDK a new QnAMakerDialog class was introduced providing key new capabilities which has enabled the Virtual Assistant to transition to this formal SDK capability.

QnAMakerDialog introduces support for Follow-Up prompts and Active learning along with use of cards for cases of ambiguity.


The first change is to move away from creation of QnAMaker instances for each QnAMaker knowledgebase as part of the BotServices class in your project.

The specific code change is shown below, it uses a new QnAConfiguration property and persists the QnAMakerEndpoint. This can also be seen here as part of the Sample project.

foreach (var kb in config.Knowledgebases)
    var qnaEndpoint = new QnAMakerEndpoint()
        KnowledgeBaseId = kb.KbId,
        EndpointKey = kb.EndpointKey,
        Host = kb.Hostname,

    set.QnAConfiguration.Add(kb.Id, qnaEndpoint);

CognitiveModelSets.Add(language, set);

Initialise QnAMakerDialog for each Knowledgebase

The second change is to initialise a QnAMaker dialog for each registered knowledgebase as part of the MainDialog constructor.

The specific code change is shown below, this will select the appropriate knowledgebase for the required locale and create a new dialog. Language Generation prompts are used to ensure the QnAMaker dialog uses localised responses for prompts it generates. This can also be seen here as part of the Sample project.

// Register a QnAMakerDialog for each registered knowledgebase and ensure localised responses are provided.
var localizedServices = _services.GetCognitiveModels();
foreach (var knowledgebase in localizedServices.QnAConfiguration)
    var qnaDialog = new QnAMakerDialog(
        knowledgeBaseId: knowledgebase.Value.KnowledgeBaseId,
        endpointKey: knowledgebase.Value.EndpointKey,
        hostName: knowledgebase.Value.Host,
        noAnswer: _templateEngine.GenerateActivityForLocale("UnsupportedMessage"),
        activeLearningCardTitle: _templateEngine.GenerateActivityForLocale("QnaMakerAdaptiveLearningCardTitle").Text,
        cardNoMatchText: _templateEngine.GenerateActivityForLocale("QnaMakerNoMatchText").Text)
        Id = knowledgebase.Key

Activating the QnAMakerDialog

The third change is to invoke the appropriate QnAMakerDialog when Dispatch indicates QnAMaker should process a given utterance.

The specific code change to RouteStepAsync is shown below and can also be seen here as part of the Sample project.

 else if (dispatchIntent == DispatchLuis.Intent.q_Faq)
    await innerDc.BeginDialogAsync("Faq");
else if (dispatchIntent == DispatchLuis.Intent.q_Chitchat)

    await innerDc.BeginDialogAsync("Chitchat");

LG Updates

The final change is adding two additional LG responses to your MainResponses.lg file in your Response folder. These are used by the QnAMakerDialog to provide follow-up prompts supporting Active Learning.

These are shown below and can also be seen here as part of the Sample project.

# QnaMakerAdaptiveLearningCardTitle
- Did you mean:
- One of these?

# QnaMakerNoMatchText
- None of the above.
- None of these.