Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering 8.2.0

dotnet add package Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering --version 8.2.0                
NuGet\Install-Package Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering -Version 8.2.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering" Version="8.2.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering --version 8.2.0                
#r "nuget: Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering, 8.2.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering as a Cake Addin
#addin nuget:?package=Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering&version=8.2.0

// Install Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering as a Cake Tool
#tool nuget:?package=Encamina.Enmarcha.SemanticKernel.Plugins.QuestionAnswering&version=8.2.0                

Semantic Kernel - Question Answering Plugin

Nuget package

The Question Answering Plugin is a project that provides functionality as a plugin for answering questions based on a given context or based on the information stored in the Semantic Kernel's memory.

Setup

Nuget package

First, install NuGet. Then, install Encamina.Enmarcha.SemanticKernel.QuestionAnswering.Plugins from the package manager console:

PM> Install-Package Encamina.Enmarcha.SemanticKernel.QuestionAnswering.Plugins

.NET CLI:

Install .NET CLI. Next, install Encamina.Enmarcha.SemanticKernel.QuestionAnswering.Plugins from the .NET CLI:

dotnet add package Encamina.Enmarcha.SemanticKernel.QuestionAnswering.Plugins

How to use

Within the QuestionAnsweringPlugin, there are two available functions for answering questions. On the one hand, there is a function in QuestionAnsweringFromContext, which, given a context and a question, it answers the question based on the provided context. On the other hand, the plugin QuestionAnsweringFromMemoryQuery searches within Semantic Kernel's memory for the most relevant results to the posed question, which are provided as the context to answer the question.

QuestionAnsweringFromContext Function

This is a semantic function (skprompt.txt/config.json) within Semantic Kernel that provides an answer to a question based on a provided context using Language Model Models (LLMs) such as OpenAI, Azure OpenAI, to name but a few.

To use it, the first step is to import it into Semantic Kernel.

// Entry point
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
   // ...
});

// ... 

builder.Services.AddScoped(sp =>
{
    var kernel = new KernelBuilder()
        .WithAzureChatCompletionService("<YOUR DEPLOYMENT NAME>", "<YOUR AZURE ENDPOINT>", "<YOUR API KEY>", alsoAsTextCompletion: true)
        //.WithAzureTextCompletionService("<YOUR DEPLOYMENT NAME>", "<YOUR AZURE ENDPOINT>", "<YOUR API KEY>")
        /// ...
        .Build();

    // ...

    kernel.ImportQuestionAnsweringPlugin(sp, ILengthFunctions.LengthByTokenCount);

    return kernel;
});

Now you can inject the kernel via constructor, and the question capabilities are already available.

public class MyClass
{
    private readonly Kernel kernel;

    public MyClass(Kernel kernel)
    {
        this.kernel = kernel;
    }

    public async Task TestQuestionAnsweringFromContextAsync()
    {
        var contextVariables = new ContextVariables();
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromContext.Parameters.Input, "What year was the French Revolution?");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromContext.Parameters.Context, 
            @"The French Revolution[a] was a period of radical political and societal change in France that began with the Estates General of 1789, 
and ended with the formation of the French Consulate in November 1799. Many of its ideas are considered fundamental principles of liberal democracy,
while the values and institutions it created remain central to French political discourse. Its causes are generally agreed to be a combination of social,
political and economic factors, which the Ancien Régime proved unable to manage. In May 1789, widespread social distress led to the convocation of the Estates General,
which was converted into a National Assembly in June. Continuing unrest culminated in the Storming of the Bastille on 14 July, which led to a series of radical 
measures by the Assembly, including the abolition of feudalism, the imposition of state control over the Catholic Church in France, and extension of the right 
to vote.");

        var functionQuestionAnswering = kernel.Func(PluginsInfo.QuestionAnsweringPlugin.Name, PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromContext.Name);

        var resultContext = await kernel.RunAsync(contextVariables, functionQuestionAnswering);
    }
}

In the previous example, the question has been included within the Input parameter, and the context from which the answer is derived is in the Context parameter. Within resultContext, you will find texts that say something like The French Revolution began in 1789.

QuestionAnsweringFromMemoryQuery Function

This is a native function of Semantic Kernel that, given a question, searches for the most relevant result within Semantic Kernel's memory and uses that context to call the semantic function QuestionAnsweringFromContext in order to generate a response.

To use it, the first step is to import it into Semantic Kernel.

// Entry point
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
   // ...
});

// ... 

builder.Services.AddScoped(sp =>
{
    var kernel = new KernelBuilder()
        .WithAzureChatCompletionService("<YOUR DEPLOYMENT NAME>",  "<YOUR AZURE ENDPOINT>", "<YOUR API KEY>", alsoAsTextCompletion: true)
        .WithAzureTextEmbeddingGenerationService("<YOUR DEPLOYMENT NAME>",  "<YOUR AZURE ENDPOINT>", "<YOUR API KEY>")
        //.WithAzureTextCompletionService("<YOUR DEPLOYMENT NAME>", "<YOUR AZURE ENDPOINT>", "<YOUR API KEY>")
        //.WithOpenAITextEmbeddingGenerationService("<YOUR MODEL ID>", "<YOUR API KEY>", "<YOUR API KEY>")
        /// ...
        .Build();

    // ...
    
    var questionAnsweringPlugin = new QuestionAnsweringPlugin(kernel, "<YOUR DEPLOYMENT NAME>", ILengthFunctions.LengthByTokenCount);

    kernel.ImportQuestionAnsweringPlugin(sp, ILengthFunctions.LengthByTokenCount);

    // Requires Encamina.Enmarcha.SemanticKernel.Plugins.Memory nuget
    kernel.ImportMemoryPlugin(ILengthFunctions.LengthByTokenCount);

    return kernel;
});

Now you can inject the kernel via constructor, and the memory question capabilities are already available.

public class MyClass
{
    private readonly Kernel kernel;

    public MyClass(Kernel kernel)
    {
        this.kernel = kernel;
    }

    public async Task TestQuestionAnsweringFromMemoryAsync()
    {
        var contextVariables = new ContextVariables();
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.Question, "What year was the French Revolution?");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.CollectionSeparator, ",");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.CollectionsStr, "collection-1,collection-2");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.MinRelevance, "0.8");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.ResultsLimit, "1");
        contextVariables.Set(PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Parameters.ResponseTokenLimit, "300");

        var functionQuestionAnswering = kernel.Func(PluginsInfo.QuestionAnsweringPlugin.Name, PluginsInfo.QuestionAnsweringPlugin.Functions.QuestionAnsweringFromMemoryQuery.Name);

        var resultContext = await kernel.RunAsync(contextVariables, functionQuestionAnswering);
    }
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
8.2.0 90 10/22/2024
8.2.0-preview-01-m01 91 9/17/2024
8.1.9-preview-02 57 10/22/2024
8.1.9-preview-01 178 10/4/2024
8.1.8 148 9/23/2024
8.1.8-preview-07 135 9/12/2024
8.1.8-preview-06 143 9/11/2024
8.1.8-preview-05 89 9/10/2024
8.1.8-preview-04 210 8/16/2024
8.1.8-preview-03 130 8/13/2024
8.1.8-preview-02 95 8/13/2024
8.1.8-preview-01 93 8/12/2024
8.1.7 95 8/7/2024
8.1.7-preview-09 112 7/3/2024
8.1.7-preview-08 70 7/2/2024
8.1.7-preview-07 85 6/10/2024
8.1.7-preview-06 89 6/10/2024
8.1.7-preview-05 105 6/6/2024
8.1.7-preview-04 98 6/6/2024
8.1.7-preview-03 91 5/24/2024
8.1.7-preview-02 92 5/10/2024
8.1.7-preview-01 105 5/8/2024
8.1.6 140 5/7/2024
8.1.6-preview-08 57 5/2/2024
8.1.6-preview-07 94 4/29/2024
8.1.6-preview-06 254 4/26/2024
8.1.6-preview-05 87 4/24/2024
8.1.6-preview-04 149 4/22/2024
8.1.6-preview-03 82 4/22/2024
8.1.6-preview-02 116 4/17/2024
8.1.6-preview-01 94 4/15/2024
8.1.5 124 4/15/2024
8.1.5-preview-15 89 4/10/2024
8.1.5-preview-14 123 3/20/2024
8.1.5-preview-13 79 3/18/2024
8.1.5-preview-12 106 3/13/2024
8.1.5-preview-11 97 3/13/2024
8.1.5-preview-10 118 3/13/2024
8.1.5-preview-09 92 3/12/2024
8.1.5-preview-08 84 3/12/2024
8.1.5-preview-07 100 3/8/2024
8.1.5-preview-06 208 3/8/2024
8.1.5-preview-05 102 3/7/2024
8.1.5-preview-04 93 3/7/2024
8.1.5-preview-03 88 3/7/2024
8.1.5-preview-02 154 2/28/2024
8.1.5-preview-01 132 2/19/2024
8.1.4 181 2/15/2024
8.1.3 126 2/13/2024
8.1.3-preview-07 77 2/13/2024
8.1.3-preview-06 81 2/12/2024
8.1.3-preview-05 91 2/9/2024
8.1.3-preview-04 85 2/8/2024
8.1.3-preview-03 84 2/7/2024
8.1.3-preview-02 87 2/2/2024
8.1.3-preview-01 89 2/2/2024
8.1.2 128 2/1/2024
8.1.2-preview-9 100 1/22/2024
8.1.2-preview-8 88 1/19/2024
8.1.2-preview-7 81 1/19/2024
8.1.2-preview-6 89 1/19/2024
8.1.2-preview-5 84 1/19/2024
8.1.2-preview-4 90 1/19/2024
8.1.2-preview-3 83 1/18/2024
8.1.2-preview-2 87 1/18/2024
8.1.2-preview-16 69 1/31/2024
8.1.2-preview-15 91 1/31/2024
8.1.2-preview-14 165 1/25/2024
8.1.2-preview-13 88 1/25/2024
8.1.2-preview-12 101 1/23/2024
8.1.2-preview-11 99 1/23/2024
8.1.2-preview-10 91 1/22/2024
8.1.2-preview-1 75 1/18/2024
8.1.1 132 1/18/2024
8.1.0 92 1/18/2024
8.0.3 145 12/29/2023
8.0.1 159 12/14/2023
8.0.0 158 12/7/2023
6.0.4.3 145 12/29/2023
6.0.4.2 148 12/20/2023
6.0.4.1 110 12/19/2023
6.0.4 177 12/4/2023
6.0.3.20 154 11/27/2023
6.0.3.19 139 11/22/2023