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:
CreateWithGetTextSearchResults
służy do tworzenia metody, która wywołuje metodęSearchPlugin
GetTextSearchResults
z podstawowej implementacji wyszukiwania tekstu.- 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.
- 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 parametrusite
, 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.