Condividi tramite


Che cosa sono i plug-in Ricerca testo kernel semantico?

Il kernel semantico usa plug-in per connettere le API esistenti con l'intelligenza artificiale. Questi plug-in dispongono di funzioni che possono essere usate per aggiungere dati o esempi pertinenti alle richieste o per consentire all'intelligenza artificiale di eseguire automaticamente le azioni.

Per integrare Ricerca testo con il kernel semantico, è necessario trasformarlo in un plug-in. Dopo aver creato un plug-in Ricerca testo, è possibile usarlo per aggiungere informazioni pertinenti alle richieste o per recuperare le informazioni in base alle esigenze. La creazione di un plug-in da Ricerca testo è un processo semplice, che verrà illustrato di seguito.

Suggerimento

Per eseguire gli esempi visualizzati in questa pagina, passare a GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Plug-in di ricerca di base

Il kernel semantico fornisce un'implementazione di modello predefinita che supporta la sostituzione delle variabili e la chiamata di funzioni. Includendo un'espressione come {{MyPlugin.Function $arg1}} in un modello di prompt, la funzione specificata, ad esempio, MyPlugin.Function verrà richiamata con l'argomento arg1 specificato (risolto da KernelArguments). Il valore restituito dalla chiamata di funzione viene inserito nel prompt. Questa tecnica può essere usata per inserire informazioni pertinenti in un prompt.

L'esempio seguente illustra come creare un plug-in denominato SearchPlugin da un'istanza di BingTextSearch. Usando CreateWithSearch crea un nuovo plug-in con una singola Search funzione che chiama l'implementazione della ricerca di testo sottostante. L'oggetto SearchPlugin viene aggiunto all'oggetto Kernel che lo rende disponibile per essere chiamato durante il rendering della richiesta. Il modello di richiesta include una chiamata a {{SearchPlugin.Search $query}} cui richiamerà l'oggetto SearchPlugin per recuperare i risultati correlati alla query corrente. I risultati vengono quindi inseriti nel prompt sottoposto a rendering prima che venga inviato al modello di intelligenza artificiale.

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

Plug-in di ricerca con citazioni

L'esempio seguente ripete il modello descritto nella sezione precedente con alcune modifiche rilevanti:

  1. CreateWithGetTextSearchResults viene usato per creare un SearchPlugin oggetto che chiama il GetTextSearchResults metodo dall'implementazione della ricerca di testo sottostante.
  2. Il modello di prompt usa la sintassi handlebars. In questo modo il modello può scorrere i risultati della ricerca ed eseguire il rendering del nome, del valore e del collegamento per ogni risultato.
  3. Il prompt include un'istruzione per includere citazioni, quindi il modello di intelligenza artificiale eseguirà il lavoro di aggiunta di citazioni alla risposta.
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
));

Plug-in di ricerca con un filtro

Gli esempi mostrati finora useranno i risultati di ricerca Web classificati più in alto per fornire i dati di base. Per garantire maggiore affidabilità nei dati, la ricerca Web può essere limitata solo per restituire risultati da un sito specificato.

L'esempio seguente si basa su quello precedente per aggiungere filtri dei risultati della ricerca. Un TextSearchFilter oggetto con una clausola di uguaglianza viene usato per specificare che solo i risultati del sito Blog per sviluppatori Microsoft (site == 'devblogs.microsoft.com') devono essere inclusi nei risultati della ricerca.

L'esempio usa KernelPluginFactory.CreateFromFunctions per creare .SearchPlugin Viene fornita una descrizione personalizzata per il plug-in. Il ITextSearch.CreateGetTextSearchResults metodo di estensione viene usato per creare l'oggetto KernelFunction che richiama il servizio di ricerca del testo.

Suggerimento

Il site filtro è specifico di Bing. Per la ricerca Web google usare 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
));

Suggerimento

Seguire il collegamento per altre informazioni su come filtrare le risposte restituite da Bing.

Plug-in di ricerca personalizzato

Nell'esempio precedente è stato applicato un filtro sito statico alle operazioni di ricerca. Cosa accade se è necessario che questo filtro sia dinamico?

L'esempio seguente mostra come è possibile eseguire una maggiore personalizzazione di SearchPlugin in modo che il valore del filtro possa essere dinamico. L'esempio usa KernelFunctionFromMethodOptions per specificare quanto segue per :SearchPlugin

  • FunctionName: la funzione di ricerca è denominata GetSiteResults perché applicherà un filtro del sito se la query include un dominio.
  • Description: la descrizione descrive il funzionamento di questa funzione di ricerca specializzata.
  • Parameters: i parametri includono un parametro facoltativo aggiuntivo per in site modo che sia possibile specificare il dominio.

La personalizzazione della funzione di ricerca è necessaria se si desidera fornire più funzioni di ricerca specializzate. Nei prompt è possibile usare i nomi delle funzioni per rendere il modello più leggibile. Se si usa la chiamata di funzione, il modello userà il nome della funzione e la descrizione per selezionare la funzione di ricerca migliore da richiamare.

Quando questo esempio viene eseguito, la risposta userà techcommunity.microsoft.com come origine per i dati pertinenti.

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

Presto disponibile

Altre informazioni saranno presto disponibili.

Presto disponibile

Altre informazioni saranno presto disponibili.

Passaggi successivi