Udostępnij za pośrednictwem


Co to są wtyczki wyszukiwania tekstu jądra semantycznego?

Semantyczne jądro używa wtyczek do łączenia istniejących interfejsów API za pomocą sztucznej inteligencji. Te wtyczki mają funkcje, które mogą służyć do dodawania odpowiednich danych lub przykładów do monitów lub zezwalania sztucznej inteligencji na automatyczne wykonywanie akcji.

Aby zintegrować wyszukiwanie tekstu z jądrem semantycznym, musimy przekształcić je w wtyczkę. Gdy mamy wtyczkę wyszukiwania tekstu, możemy użyć jej do dodania odpowiednich informacji, aby wyświetlić monity lub pobrać informacje zgodnie z potrzebami. Tworzenie wtyczki z wyszukiwania tekstu to prosty proces, który wyjaśnimy poniżej.

Napiwek

Aby uruchomić przykłady wyświetlane na tej stronie, przejdź do pozycji GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Wtyczka wyszukiwania podstawowego

Jądro semantyczne udostępnia domyślną implementację szablonu, która obsługuje zastępowanie zmiennych i wywoływanie funkcji. Po włączeniu wyrażenia, takiego jak {{MyPlugin.Function $arg1}} w szablonie monitu, określona funkcja MyPlugin.Function zostanie wywołana przy użyciu podanego argumentu arg1 (który jest rozpoznawany z KernelArguments). Wartość zwracana z wywołania funkcji jest wstawiana do monitu. Ta technika może służyć do wstrzykiwania odpowiednich informacji do monitu.

W poniższym przykładzie pokazano, jak utworzyć wtyczkę o nazwie SearchPlugin na podstawie wystąpienia programu BingTextSearch. Za pomocą polecenia CreateWithSearch tworzy nową wtyczkę z jedną Search funkcją, która wywołuje podstawową implementację wyszukiwania tekstu. Element SearchPlugin jest dodawany do Kernel elementu , który udostępnia go do wywołania podczas renderowania monitu. Szablon monitu zawiera wywołanie, do {{SearchPlugin.Search $query}} którego wywoła element SearchPlugin w celu pobrania wyników związanych z bieżącym zapytaniem. Wyniki zostaną następnie wstawione do renderowanego monitu przed wysłaniem ich do modelu AI.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// 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?";
var prompt = "{{SearchPlugin.Search $query}}. {{$query}}";
KernelArguments arguments = new() { { "query", query } };
Console.WriteLine(await kernel.InvokePromptAsync(prompt, arguments));

Wtyczka wyszukiwania z cytatami

Poniższy przykład powtarza wzorzec opisany w poprzedniej sekcji z kilkoma istotnych zmianami:

  1. CreateWithGetTextSearchResults służy do tworzenia metody, która wywołuje metodę SearchPlugin GetTextSearchResults z podstawowej implementacji wyszukiwania tekstu.
  2. Szablon monitu używa składni paska obsługi. Dzięki temu szablon może iterować wyniki wyszukiwania i renderować nazwę, wartość i link dla każdego wyniku.
  3. Monit zawiera instrukcję dołączania cytatów, więc model sztucznej inteligencji wykona pracę nad dodaniem cytatów do odpowiedzi.
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// 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
));

Wtyczka wyszukiwania z filtrem

Próbki pokazane do tej pory będą używać najwyżej sklasyfikowanych wyników wyszukiwania w Sieci Web w celu udostępnienia danych uziemienia. Aby zapewnić większą niezawodność danych, wyszukiwanie internetowe może być ograniczone tylko do zwracania wyników z określonej witryny.

Poniższy przykład opiera się na poprzednim, aby dodać filtrowanie wyników wyszukiwania. Klauzula TextSearchFilter z równości służy do określania, że w wynikach wyszukiwania mają zostać uwzględnione tylko wyniki z witryny Blogi dla deweloperów firmy Microsoft (site == 'devblogs.microsoft.com').

W przykładzie użyto KernelPluginFactory.CreateFromFunctions metody do utworzenia elementu SearchPlugin. Dla wtyczki podano opis niestandardowy. Metoda ITextSearch.CreateGetTextSearchResults rozszerzenia służy do tworzenia metody KernelFunction , która wywołuje usługę wyszukiwania tekstu.

Napiwek

Filtr site jest specyficzny dla usługi Bing. W przypadku wyszukiwania w Internecie Google użyj polecenia siteSearch.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Create a filter to search only the Microsoft Developer Blogs site
var filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com");
var searchOptions = new TextSearchOptions() { Filter = filter };

// Build a text search plugin with Bing search and add to the kernel
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
));

Napiwek

Aby uzyskać więcej informacji na temat filtrowania odpowiedzi zwracanych przez usługę Bing, postępuj zgodnie z linkiem.

Wtyczka wyszukiwania niestandardowego

W poprzednim przykładzie do operacji wyszukiwania zastosowano filtr witryny statycznej. Co zrobić, jeśli ten filtr będzie dynamiczny?

W następnym przykładzie pokazano, jak można wykonać większe dostosowanie SearchPlugin elementu , aby wartość filtru mogła być dynamiczna. W przykładzie użyto KernelFunctionFromMethodOptions metody , aby określić następujące elementy dla elementu SearchPlugin:

  • FunctionName: funkcja wyszukiwania ma nazwę GetSiteResults , ponieważ zastosuje filtr witryny, jeśli zapytanie zawiera domenę.
  • Description: Opis opisuje sposób działania tej wyspecjalizowanej funkcji wyszukiwania.
  • Parameters: Parametry zawierają dodatkowy opcjonalny parametr dla parametru site , aby można było określić domenę.

Dostosowanie funkcji wyszukiwania jest wymagane, jeśli chcesz udostępnić wiele wyspecjalizowanych funkcji wyszukiwania. W monitach możesz użyć nazw funkcji, aby szablon był bardziej czytelny. Jeśli używasz wywołania funkcji, model użyje nazwy funkcji i opisu, aby wybrać najlepszą funkcję wyszukiwania do wywołania.

Po wykonaniu tego przykładu odpowiedź będzie używać techcommunity.microsoft.com jako źródła odpowiednich danych.

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

// Build a text search plugin with Bing search and add to the kernel
var options = new KernelFunctionFromMethodOptions()
{
    FunctionName = "GetSiteResults",
    Description = "Perform a search for content related to the specified query and optionally from the specified domain.",
    Parameters =
    [
        new KernelParameterMetadata("query") { Description = "What to search for", IsRequired = true },
        new KernelParameterMetadata("top") { Description = "Number of results", IsRequired = false, DefaultValue = 5 },
        new KernelParameterMetadata("skip") { Description = "Number of results to skip", IsRequired = false, DefaultValue = 0 },
        new KernelParameterMetadata("site") { Description = "Only return results from this domain", IsRequired = false },
    ],
    ReturnParameter = new() { ParameterType = typeof(KernelSearchResults<string>) },
};
var searchPlugin = KernelPluginFactory.CreateFromFunctions("SearchPlugin", "Search specified site", [textSearch.CreateGetTextSearchResults(options)]);
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-GetSiteResults query)}}  
        {{#each this}}  
        Name: {{Name}}
        Value: {{Value}}
        Link: {{Link}}
        -----------------
        {{/each}}  
    {{/with}}  

    {{query}}

    Only include results from techcommunity.microsoft.com. 
    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
));

Wkrótce

Wkrótce pojawi się więcej.

Wkrótce

Wkrótce pojawi się więcej.

Następne kroki