// Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Data; using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.PromptTemplates.Handlebars; namespace RAG; /// /// This example shows how to perform RAG with an . /// public sealed class Bing_RagWithTextSearch(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a default from an and use it to /// add grounding context to a prompt. /// [Fact] public async Task RagWithBingTextSearchAsync() { // Create a kernel with OpenAI chat completion IKernelBuilder kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: TestConfiguration.OpenAI.ChatModelId, apiKey: TestConfiguration.OpenAI.ApiKey); Kernel kernel = kernelBuilder.Build(); // Create a text search using Bing search var textSearch = new BingTextSearch(new(TestConfiguration.Bing.ApiKey)); // Build a text search plugin with Bing search and add to the kernel var searchPlugin = textSearch.CreateWithSearch("SearchPlugin"); kernel.Plugins.Add(searchPlugin); // Invoke prompt and use text search plugin to provide grounding information var query = "What is the Semantic Kernel?"; KernelArguments arguments = new() { { "query", query } }; Console.WriteLine(await kernel.InvokePromptAsync("{{SearchPlugin.Search $query}}. {{$query}}", arguments)); } /// /// Show how to create a default from an and use it to /// add grounding context to a Handlebars prompt and include citations in the response. /// [Fact] public async Task RagWithBingTextSearchIncludingCitationsAsync() { // Create a kernel with OpenAI chat completion IKernelBuilder kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: TestConfiguration.OpenAI.ChatModelId, apiKey: TestConfiguration.OpenAI.ApiKey); Kernel kernel = kernelBuilder.Build(); // Create a text search using Bing search var textSearch = new BingTextSearch(new(TestConfiguration.Bing.ApiKey)); // Build a text search plugin with Bing search and add to the kernel var searchPlugin = textSearch.CreateWithGetTextSearchResults("SearchPlugin"); kernel.Plugins.Add(searchPlugin); // Invoke prompt and use text search plugin to provide grounding information var query = "What is the Semantic Kernel?"; string promptTemplate = """ {{#with (SearchPlugin-GetTextSearchResults query)}} {{#each this}} Name: {{Name}} Value: {{Value}} Link: {{Link}} ----------------- {{/each}} {{/with}} {{query}} Include citations to the relevant information where it is referenced in the response. """; KernelArguments arguments = new() { { "query", query } }; HandlebarsPromptTemplateFactory promptTemplateFactory = new(); Console.WriteLine(await kernel.InvokePromptAsync( promptTemplate, arguments, templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat, promptTemplateFactory: promptTemplateFactory )); } /// /// Show how to create a default from an and use it to /// add grounding context to a Handlebars prompt and include citations in the response. /// [Fact] public async Task RagWithBingTextSearchIncludingTimeStampedCitationsAsync() { // Create a kernel with OpenAI chat completion IKernelBuilder kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: TestConfiguration.OpenAI.ChatModelId, apiKey: TestConfiguration.OpenAI.ApiKey); Kernel kernel = kernelBuilder.Build(); // Create a text search using Bing search var textSearch = new BingTextSearch(new(TestConfiguration.Bing.ApiKey)); // Build a text search plugin with Bing search and add to the kernel var searchPlugin = textSearch.CreateWithGetSearchResults("SearchPlugin"); kernel.Plugins.Add(searchPlugin); // Invoke prompt and use text search plugin to provide grounding information var query = "What is the Semantic Kernel?"; string promptTemplate = """ {{#with (SearchPlugin-GetSearchResults query)}} {{#each this}} Name: {{Name}} Snippet: {{Snippet}} Link: {{DisplayUrl}} Date Last Crawled: {{DateLastCrawled}} ----------------- {{/each}} {{/with}} {{query}} Include citations to and the date of the relevant information where it is referenced in the response. """; KernelArguments arguments = new() { { "query", query } }; HandlebarsPromptTemplateFactory promptTemplateFactory = new(); Console.WriteLine(await kernel.InvokePromptAsync( promptTemplate, arguments, templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat, promptTemplateFactory: promptTemplateFactory )); } #pragma warning disable CS0618 // Suppress obsolete warnings for legacy TextSearchOptions/TextSearchFilter usage /// /// Show how to create a default from an and use it to /// add grounding context to a Handlebars prompt that include full web pages. /// [Fact] public async Task RagWithBingTextSearchUsingDevBlogsSiteAsync() { // Create a kernel with OpenAI chat completion IKernelBuilder kernelBuilder = Kernel.CreateBuilder(); kernelBuilder.AddOpenAIChatCompletion( modelId: TestConfiguration.OpenAI.ChatModelId, apiKey: TestConfiguration.OpenAI.ApiKey); Kernel kernel = kernelBuilder.Build(); // Create a text search using Bing search var textSearch = new BingTextSearch(new(TestConfiguration.Bing.ApiKey)); // Build a text search plugin with Bing search and add to the kernel var filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com"); var searchOptions = new TextSearchOptions() { Filter = filter }; var searchPlugin = KernelPluginFactory.CreateFromFunctions( "SearchPlugin", "Search Microsoft Developer Blogs site only", [textSearch.CreateGetTextSearchResults(searchOptions: searchOptions)]); kernel.Plugins.Add(searchPlugin); // Invoke prompt and use text search plugin to provide grounding information var query = "What is the Semantic Kernel?"; string promptTemplate = """ {{#with (SearchPlugin-GetTextSearchResults query)}} {{#each this}} Name: {{Name}} Value: {{Value}} Link: {{Link}} ----------------- {{/each}} {{/with}} {{query}} Include citations to the relevant information where it is referenced in the response. """; KernelArguments arguments = new() { { "query", query } }; HandlebarsPromptTemplateFactory promptTemplateFactory = new(); Console.WriteLine(await kernel.InvokePromptAsync( promptTemplate, arguments, templateFormat: HandlebarsPromptTemplateFactory.HandlebarsTemplateFormat, promptTemplateFactory: promptTemplateFactory )); } #pragma warning restore CS0618 }