Skip to content

Commit

Permalink
Added handlebar query rewriter.
Browse files Browse the repository at this point in the history
  • Loading branch information
alkampfergit committed Jul 5, 2024
1 parent a3ea95a commit a6b26f0
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 389 deletions.
16 changes: 8 additions & 8 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Alkampfer.KernelMemory.ElasticSearch" Version="0.8.0" />
<PackageVersion Include="Alkampfer.KernelMemory.ElasticSearch" Version="0.9.0-alpha0005" />
<PackageVersion Include="Azure.AI.OpenAI" Version="1.0.0-beta.17" />
<PackageVersion Include="CommandDotNet.Spectre" Version="3.0.2" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="8.6.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
<PackageVersion Include="Microsoft.KernelMemory.Abstractions" Version="0.61.240524.1" />
<PackageVersion Include="Microsoft.KernelMemory.Core" Version="0.61.240524.1" />
<PackageVersion Include="Microsoft.KernelMemory.Abstractions" Version="0.65.240620.1" />
<PackageVersion Include="Microsoft.KernelMemory.Core" Version="0.65.240620.1" />
<PackageVersion Include="Microsoft.ML.Tokenizers" Version="0.22.0-preview.24271.1" />
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.13.0" />
<PackageVersion Include="Microsoft.SemanticKernel.PromptTemplates.Handlebars" Version="1.13.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Yaml" Version="1.13.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Abstractions" Version="1.13.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Core" Version="1.13.0" />
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.15.1" />
<PackageVersion Include="Microsoft.SemanticKernel.PromptTemplates.Handlebars" Version="1.15.1" />
<PackageVersion Include="Microsoft.SemanticKernel.Yaml" Version="1.15.1" />
<PackageVersion Include="Microsoft.SemanticKernel.Abstractions" Version="1.15.1" />
<PackageVersion Include="Microsoft.SemanticKernel.Core" Version="1.15.1" />
<PackageVersion Include="Polly.Core" Version="8.4.1" />
<PackageVersion Include="TiktokenSharp" Version="1.1.4" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
using Microsoft.KernelMemory.Prompts;
using Microsoft.SemanticKernel;
using Spectre.Console;
using static KernelMemory.Extensions.QueryPipeline.SemanticKernelQueryRewriter;

namespace SemanticMemory.Samples;

Expand Down Expand Up @@ -82,11 +81,16 @@ public async Task RunSample2()
.Title("Select the query executor to use")
.AddChoices(["KernelMemory Default", "Cohere CommandR+"]));

var queryRewriterTool = AnsiConsole.Prompt(new SelectionPrompt<string>()
.Title("Select query rewriter")
.AddChoices(["Semantic Kernel Base", "Semantic Kernel Handlebar"]));

var kernelBuider = CreateBasicKernelBuilder();
var builder = CreateBasicKernelMemoryBuilder(
services,
storageToUse == "elasticsearch",
queryExecutorToUse == "Cohere CommandR+");
queryExecutorToUse == "Cohere CommandR+",
queryRewriterTool == "Semantic Kernel Handlebar");
var kernelMemory = builder.Build<MemoryServerless>();
var kernel = kernelBuider.Build();

Expand Down Expand Up @@ -221,7 +225,8 @@ private static async Task IndexDocument(MemoryServerless kernelMemory, string do
private static IKernelMemoryBuilder CreateBasicKernelMemoryBuilder(
ServiceCollection services,
bool useElasticSearch,
bool useCohereCommandRPlusForQueryExecutor)
bool useCohereCommandRPlusForQueryExecutor,
bool useHandlebarQueryRewriter)
{
// we need a series of services to use Kernel Memory, the first one is
// an embedding service that will be used to create dense vector for
Expand Down Expand Up @@ -283,6 +288,7 @@ private static IKernelMemoryBuilder CreateBasicKernelMemoryBuilder(

services.AddSingleton<IKernelMemoryBuilder>(kernelMemoryBuilder);
services.AddSingleton<CohereReRanker>();
services.AddSingleton<HandlebarSemanticKernelQueryRewriter>();
services.AddSingleton<SemanticKernelQueryRewriter>();
services.AddSingleton<StandardVectorSearchQueryHandler>();
services.AddSingleton<KeywordSearchQueryHandler>();
Expand Down Expand Up @@ -315,7 +321,15 @@ private static IKernelMemoryBuilder CreateBasicKernelMemoryBuilder(
}

config.SetReRanker<CohereReRanker>();
config.SetQueryRewriter<SemanticKernelQueryRewriter>();

if (useHandlebarQueryRewriter)
{
config.SetQueryRewriter<HandlebarSemanticKernelQueryRewriter>();
}
else
{
config.SetQueryRewriter<SemanticKernelQueryRewriter>();
}
});
return kernelMemoryBuilder;
}
Expand Down
4 changes: 4 additions & 0 deletions src/KernelMemory.Extensions/KernelMemory.Extensions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,8 @@
<ProjectReference Include="..\KernelMemory.Extensions.Interfaces\KernelMemory.Extensions.Interfaces.csproj" />
</ItemGroup>

<ItemGroup>
<Folder Include="QueryPipeline\data\" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
using System.Threading.Tasks;

namespace KernelMemory.Extensions.QueryPipeline;
Expand Down Expand Up @@ -66,14 +68,80 @@ be a standalone question that contains also the previous context. If there is no

return result?.ToString() ?? question;
}
}

/// <summary>
/// Allows some parametrization of the rewriter.
/// </summary>
public class SemanticKernelQueryRewriterOptions
{
public string? ModelId { get; set; }

public float Temperature { get; set; } = 0.0f;
}

/// <summary>
/// Allows some parametrization of the rewriter.
/// </summary>
public class SemanticKernelQueryRewriterOptions
public class HandlebarSemanticKernelQueryRewriter : IConversationQueryRewriter
{
private readonly SemanticKernelQueryRewriterOptions _semanticKernelQueryRewriterOptions;
private readonly Kernel _kernel;
private readonly KernelFunction _chatFunction;

public HandlebarSemanticKernelQueryRewriter(
SemanticKernelQueryRewriterOptions semanticKernelQueryRewriterOptions,
Kernel kernel)
{
public string? ModelId { get; set; }
_semanticKernelQueryRewriterOptions = semanticKernelQueryRewriterOptions;
_kernel = kernel;

// Create a template for chat with settings
_chatFunction = kernel.CreateFunctionFromPrompt(new PromptTemplateConfig()
{
Name = "TestRewrite",
Description = "Rewrite a query for kernel memory.",
Template = @"system:
* Given the following conversation history and the users next question,rephrase the question to be a stand alone question.
If the conversation is irrelevant or empty, just restate the original question.
Do not add more details than necessary to the question.
chat history:
{{#each history}}
question:
{{question}}
answer:
{{answer}}
{{/each}}
Follow up Input: {{ chat_input }}
Standalone Question:",
TemplateFormat = "handlebars",
InputVariables =
[
new() { Name = "chat_input", Description = "New question of the user", IsRequired = false, Default = "" },
new() { Name = "history", Description = "The history of the RAG CHAT.", IsRequired = true }
],
ExecutionSettings =
{
{ "default", new OpenAIPromptExecutionSettings()
{
MaxTokens = 1000,
Temperature = 0,
ModelId = "gpt35",
}
},
}
},
promptTemplateFactory: new HandlebarsPromptTemplateFactory());
}

public float Temperature { get; set; } = 0.0f;
public async Task<string> RewriteAsync(Conversation conversation, string question)
{
KernelArguments ka = new();
ka["chat_input"] = question;

ka["history"] = conversation.GetQuestions();

var result = await _kernel.InvokeAsync(_chatFunction, ka);

return result?.ToString() ?? question;
}
}
Loading

0 comments on commit a6b26f0

Please sign in to comment.