Delen via


Wat zijn Semantic Kernel Text Search-invoegtoepassingen?

Semantische kernel maakt gebruik van invoegtoepassingen om bestaande API's te verbinden met AI. Deze invoegtoepassingen hebben functies die kunnen worden gebruikt om relevante gegevens of voorbeelden toe te voegen om te vragen, of om de AI toe te staan automatisch acties uit te voeren.

Als u Tekst zoeken wilt integreren met Semantische kernel, moet u deze omzetten in een invoegtoepassing. Zodra we een invoegtoepassing Tekst zoeken hebben, kunnen we deze gebruiken om relevante informatie toe te voegen om vragen of om informatie op te halen als dat nodig is. Het maken van een invoegtoepassing van Text Search is een eenvoudig proces, dat hieronder wordt uitgelegd.

Tip

Als u de voorbeelden wilt uitvoeren die op deze pagina worden weergegeven, gaat u naar GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Basiszoekinvoegtoepassing

Semantische kernel biedt een standaardsjabloon-implementatie die ondersteuning biedt voor het vervangen van variabelen en het aanroepen van functies. Door een expressie zoals {{MyPlugin.Function $arg1}} in een promptsjabloon op te geven, wordt de opgegeven functie, bijvoorbeeld, MyPlugin.Function aangeroepen met het opgegeven argument arg1 (dat wordt omgezet vanuit KernelArguments). De retourwaarde van de functie-aanroep wordt ingevoegd in de prompt. Deze techniek kan worden gebruikt om relevante informatie in een prompt te injecteren.

In het onderstaande voorbeeld ziet u hoe u een invoegtoepassing maakt met de naam SearchPlugin van een exemplaar van BingTextSearch. Met behulp van CreateWithSearch maakt u een nieuwe invoegtoepassing met één Search functie die de onderliggende implementatie van tekstzoekopdrachten aanroept. De SearchPlugin waarde wordt toegevoegd aan de Kernel weergave waardoor deze beschikbaar is om te worden aangeroepen tijdens het weergeven van prompts. De promptsjabloon bevat een aanroep {{SearchPlugin.Search $query}} waarmee de SearchPlugin resultaten worden aangeroepen die betrekking hebben op de huidige query. De resultaten worden vervolgens ingevoegd in de weergegeven prompt voordat deze naar het AI-model wordt verzonden.

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

Zoekinvoegtoepassing met bronvermeldingen

In het onderstaande voorbeeld wordt het patroon herhaald dat in de vorige sectie wordt beschreven, met enkele belangrijke wijzigingen:

  1. CreateWithGetTextSearchResults wordt gebruikt om een SearchPlugin methode te maken die de GetTextSearchResults methode aanroept op basis van de onderliggende implementatie van tekstzoekopdrachten.
  2. De promptsjabloon maakt gebruik van de syntaxis van handlebars. Hierdoor kan de sjabloon de zoekresultaten herhalen en de naam, waarde en koppeling voor elk resultaat weergeven.
  3. De prompt bevat een instructie voor het opnemen van bronvermeldingen, zodat het AI-model het werk doet om bronvermeldingen toe te voegen aan het antwoord.
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
));

Zoekinvoegtoepassing met een filter

De voorbeelden die tot nu toe worden weergegeven, gebruiken de meest gerangschikte zoekresultaten op internet om de grondgegevens te leveren. Als u meer betrouwbaarheid wilt bieden in de gegevens, kan de zoekopdracht op internet worden beperkt tot het alleen retourneren van resultaten van een opgegeven site.

Het onderstaande voorbeeld is gebaseerd op het vorige voorbeeld om filters van de zoekresultaten toe te voegen. Een TextSearchFilter met een gelijkheidsclausule wordt gebruikt om op te geven dat alleen resultaten van de Microsoft Developer Blogs-site (site == 'devblogs.microsoft.com') moeten worden opgenomen in de zoekresultaten.

In het voorbeeld wordt gebruikgemaakt KernelPluginFactory.CreateFromFunctions van het maken van de SearchPlugin. Er wordt een aangepaste beschrijving opgegeven voor de invoegtoepassing. De ITextSearch.CreateGetTextSearchResults extensiemethode wordt gebruikt om de KernelFunction methode te maken waarmee de zoekservice voor tekst wordt aangeroepen.

Tip

Het site filter is specifiek voor Bing. Gebruik voor google webzoekopdrachten 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

Volg de koppeling voor meer informatie over het filteren van de antwoorden die door Bing worden geretourneerd.

Aangepaste zoekinvoegtoepassing

In het vorige voorbeeld is een statisch sitefilter toegepast op de zoekbewerkingen. Wat gebeurt er als u dit filter nodig hebt om dynamisch te zijn?

In het volgende voorbeeld ziet u hoe u meer aanpassingen kunt uitvoeren, SearchPlugin zodat de filterwaarde dynamisch kan zijn. Het voorbeeld gebruikt KernelFunctionFromMethodOptions om het volgende op te geven voor:SearchPlugin

  • FunctionName: De zoekfunctie heeft de naam GetSiteResults omdat er een sitefilter wordt toegepast als de query een domein bevat.
  • Description: In de beschrijving wordt beschreven hoe deze gespecialiseerde zoekfunctie werkt.
  • Parameters: De parameters bevatten een extra optionele parameter voor het site domein, zodat het domein kan worden opgegeven.

Het aanpassen van de zoekfunctie is vereist als u meerdere gespecialiseerde zoekfuncties wilt opgeven. In prompts kunt u de functienamen gebruiken om de sjabloon beter leesbaar te maken. Als u functie aanroepen gebruikt, gebruikt het model de functienaam en beschrijving om de beste zoekfunctie te selecteren die moet worden aangeroepen.

Wanneer dit voorbeeld wordt uitgevoerd, gebruikt het antwoord techcommunity.microsoft.com als de bron voor relevante gegevens.

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

Binnenkort beschikbaar

Binnenkort meer beschikbaar.

Binnenkort beschikbaar

Binnenkort meer beschikbaar.

Volgende stappen