Sdílet prostřednictvím


Co jsou moduly plug-in sémantického vyhledávání textu jádra?

Sémantické jádro používá moduly plug-in k propojení existujících rozhraní API s AI. Tyto moduly plug-in mají funkce, které je možné použít k přidání relevantních dat nebo příkladů k zobrazení výzev nebo k automatickému provádění akcí umělé inteligence.

Abychom mohli integrovat vyhledávání textu se sémantickým jádrem, musíme ho převést na modul plug-in. Jakmile máme modul plug-in Pro vyhledávání textu, můžeme ho použít k přidání relevantních informací pro výzvy nebo načtení informací podle potřeby. Vytvoření modulu plug-in z hledání textu je jednoduchý proces, který vysvětlíme níže.

Tip

Pokud chcete spustit ukázky uvedené na této stránce, přejděte na GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Modul plug-in základního vyhledávání

Sémantické jádro poskytuje výchozí implementaci šablony, která podporuje nahrazení proměnných a volání funkcí. Zahrnutím výrazu, jako {{MyPlugin.Function $arg1}} je například v šabloně výzvy, MyPlugin.Function se zadaná funkce vyvolá pomocí zadaného argumentu arg1 (který se přeloží z KernelArguments). Návratová hodnota z vyvolání funkce se vloží do výzvy. Tuto techniku lze použít k vložení relevantních informací do výzvy.

Následující ukázka ukazuje, jak vytvořit modul plug-in pojmenovaný SearchPlugin z instance BingTextSearch. Použití CreateWithSearch vytvoří nový modul plug-in s jedinou Search funkcí, která volá implementaci základního vyhledávání textu. Přidá SearchPlugin se do Kernel něj, aby bylo možné volat během vykreslování výzvy. Šablona výzvy obsahuje volání {{SearchPlugin.Search $query}} , které vyvolá výsledky SearchPlugin související s aktuálním dotazem. Výsledky se pak před odesláním do modelu AI vloží do vykreslené výzvy.

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

Vyhledávací modul plug-in s citacemi

Následující ukázka opakuje vzor popsaný v předchozí části s několika zajímavými změnami:

  1. CreateWithGetTextSearchResults slouží k vytvoření, SearchPlugin která volá metodu GetTextSearchResults z implementace základního textového vyhledávání.
  2. Šablona výzvy používá syntaxi úchytů. Díky tomu může šablona iterovat výsledky hledání a vykreslit název, hodnotu a odkaz pro každý výsledek.
  3. Výzva obsahuje pokyn k zahrnutí citací, takže model AI provede do odpovědi práci přidávání citací.
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
));

Vyhledávací modul plug-in s filtrem

Ukázky, které se zatím zobrazují, budou k poskytování podkladových dat používat nejlépe seřazené výsledky hledání na webu. Chcete-li zajistit větší spolehlivost dat, může být vyhledávání na webu omezeno tak, aby vracely pouze výsledky ze zadaného webu.

Následující ukázka vychází z předchozího příkladu a přidá filtrování výsledků hledání. Klauzule TextSearchFilter rovnosti se používá k určení, že do výsledků hledání se zahrnou jenom výsledky z webu Microsoft Developer Blogs (site == 'devblogs.microsoft.com').

Ukázka používá KernelPluginFactory.CreateFromFunctions k vytvoření objektu SearchPlugin. Pro modul plug-in je k dispozici vlastní popis. Metoda ITextSearch.CreateGetTextSearchResults rozšíření se používá k vytvoření KernelFunction , který vyvolá vyhledávací službu textu.

Tip

Filtr site je specifický pro Bing. Pro vyhledávání na webu Google použijte 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
));

Tip

Další informace o filtrování odpovědí, které Bing vrací, najdete na odkazu.

Modul plug-in vlastního vyhledávání

V předchozí ukázce se na operace vyhledávání použil filtr statického webu. Co když potřebujete, aby byl tento filtr dynamický?

Další ukázka ukazuje, jak můžete provést větší přizpůsobení hodnoty SearchPlugin filtru tak, aby byla dynamická. Ukázka používá KernelFunctionFromMethodOptions k určení následujících možností SearchPlugin:

  • FunctionName: Vyhledávací funkce je pojmenovaná GetSiteResults , protože použije filtr webu, pokud dotaz obsahuje doménu.
  • Description: Popis popisuje, jak tato specializovaná vyhledávací funkce funguje.
  • Parameters: Parametry zahrnují další volitelný parametr, site aby bylo možné zadat doménu.

Pokud chcete poskytnout více specializovaných vyhledávacích funkcí, je potřeba přizpůsobit funkci vyhledávání. V zobrazení výzvy můžete použít názvy funkcí, aby byla šablona čitelnější. Pokud používáte volání funkce, model použije název a popis funkce k výběru nejlepší funkce vyhledávání, která se má vyvolat.

Při spuštění této ukázky se jako zdroj relevantních dat použije odpověď techcommunity.microsoft.com .

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

Již brzy

Další připravujeme.

Již brzy

Další připravujeme.

Další kroky