Che cos'è la ricerca di testo del kernel semantico?

Avviso

La funzionalità Ricerca testo del kernel semantico è in anteprima e i miglioramenti che richiedono modifiche di rilievo possono verificarsi in circostanze limitate prima del rilascio.

Il kernel semantico offre funzionalità che consentono agli sviluppatori di integrare la ricerca quando si chiama un modello LLM (Large Language Model). Questo aspetto è importante perché il training di LLM viene eseguito su set di dati fissi e potrebbe dover accedere ad altri dati per rispondere in modo accurato a una richiesta dell'utente.

Il processo di fornitura di contesto aggiuntivo quando viene richiesto un LLM è denominato Retrieval-Augmented Generation (RAG). RAG prevede in genere il recupero di dati aggiuntivi rilevanti per la richiesta corrente dell'utente e l'arricchimento del prompt inviato all'LLM con questi dati. L'LLM può usare il proprio addestramento insieme al contesto aggiuntivo per fornire una risposta più accurata.

Un semplice esempio di quando questo diventa importante è quando la richiesta dell'utente è correlata alle informazioni aggiornate non incluse nel set di dati di training LLM. Eseguendo una ricerca di testo appropriata e includendo i risultati con la richiesta dell'utente, verranno ottenute risposte più accurate.

Il kernel semantico offre un set di funzionalità di ricerca testo che consentono agli sviluppatori di eseguire ricerche usando Ricerca Web o Database vettoriali e aggiungere facilmente RAG alle applicazioni.

Kernel semantico fornisce API per eseguire il recupero dei dati a diversi livelli di astrazione.

La ricerca di testo consente la ricerca a un livello elevato nello stack, in cui l'input è testo con supporto per il filtro di base. L'interfaccia di ricerca del testo supporta vari tipi di output, incluso il supporto per la semplice restituzione di una stringa semplice. Ciò consente alla ricerca di testo di supportare molte implementazioni, inclusi i motori di ricerca Web e gli archivi vettoriali. L'obiettivo principale per la ricerca di testo è fornire una semplice interfaccia che può essere esposta come plug-in per il completamento della chat.

Suggerimento

Per tutte le implementazioni predefinite della ricerca di testo, vedere Ricerca testo predefinita.

La ricerca vettoriale si trova a un livello inferiore nello stack, dove l'input è un vettore. Supporta anche il filtro di base, oltre a scegliere un vettore dall'archivio dati per confrontare il vettore di input con . Restituisce un modello di dati contenente i dati dall'archivio dati.

Quando si vuole eseguire RAG con archivi Vector, è opportuno usare la ricerca di testo e la ricerca vettoriale insieme. Il modo per farlo consiste nell'incapsulare una raccolta di un archivio vettoriale, che supporta la ricerca vettoriale, con la ricerca testuale e quindi nell'esporre la ricerca testuale come plug-in per il completamento della chat. Kernel semantico consente di eseguire facilmente questa operazione. Per altre informazioni su come eseguire questa operazione, vedere i suggerimenti seguenti.

Suggerimento

Per informazioni su come esporre la ricerca vettoriale al completamento della chat, vedere Come usare gli archivi vettoriali con ricerca testo Kernel semantico.

Suggerimento

Per ulteriori informazioni sugli archivi vettoriali e sulla ricerca vettoriale, vedi Che cosa sono i connettori degli archivi vettoriali di Kernel semantico?.

Nel codice di esempio seguente è possibile scegliere tra l'uso di Bing o Google per eseguire operazioni di ricerca Web.

Suggerimento

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

Creare un'istanza di ricerca di testo

Ogni esempio crea un'istanza di ricerca di testo e quindi esegue un'operazione di ricerca per ottenere i risultati per la query fornita. I risultati della ricerca conterranno un frammento di testo dalla pagina Web che ne descrive il contenuto. Ciò fornisce solo un contesto limitato, ad esempio un subset del contenuto della pagina Web e nessun collegamento all'origine delle informazioni. Gli esempi successivi illustrano come risolvere queste limitazioni.

Suggerimento

Il seguente codice di esempio utilizza il connettore OpenAI di Kernel semantico e i plug-in Web; installali con i seguenti comandi:

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Web

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

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

var query = "What is the Semantic Kernel?";

// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
    Console.WriteLine(result);
}
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Google;

// Create an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
    searchEngineId: "<Your Google Search Engine Id>",
    apiKey: "<Your Google API Key>");

var query = "What is the Semantic Kernel?";

// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
    Console.WriteLine(result);
}

Suggerimento

Per altre informazioni sui tipi di risultati della ricerca che è possibile recuperare, vedere la documentazione relativa ai plug-in di ricerca testo.

Usare i risultati della ricerca testuale per arricchire un prompt

I passaggi successivi sono creare un plug-in dalla ricerca di testo Web e richiamare il plug-in per aggiungere i risultati della ricerca al prompt.

Il codice di esempio seguente illustra come ottenere questo risultato:

  1. Crea un Kernel che ha un servizio OpenAI registrato. Verrà utilizzato per chiamare il gpt-4o modello con il prompt.
  2. Creare un'istanza di ricerca di testo.
  3. Creare un plug-in di ricerca dall'istanza di ricerca di testo.
  4. Creare un modello di richiesta che richiamerà il plug-in di ricerca con la query e includerà i risultati della ricerca nella richiesta insieme alla query originale.
  5. Richiamare il prompt e visualizzare la risposta.

Il modello fornirà una risposta in base alle informazioni più recenti disponibili in una ricerca Web.

Ricerca Web Bing

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

Ricerca Web google

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

// 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 an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
    searchEngineId: "<Your Google Search Engine Id>",
    apiKey: "<Your Google API Key>");

// Build a text search plugin with Google 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));

Esistono diversi problemi con l'esempio precedente:

  1. La risposta non include citazioni che mostrano le pagine Web usate per fornire contesto di base.
  2. La risposta includerà i dati di qualsiasi sito Web, sarebbe preferibile limitarlo a siti attendibili.
  3. Solo un frammento di pagina Web viene usato per fornire contesto di base al modello, il frammento di codice potrebbe non contenere i dati necessari per fornire una risposta accurata.

Vedere la pagina che descrive i plug-in di ricerca di testo per le soluzioni a questi problemi.

È quindi consigliabile esaminare le astrazioni della ricerca di testo.

Presto disponibile

Altre informazioni saranno presto disponibili.

Presto disponibile

Altre informazioni saranno presto disponibili.

Passaggi successivi