Was ist die semantische Kerneltextsuche?

Warnung

Die Textsuchfunktion von Semantischer Kernel befindet sich in der Vorschau, und Verbesserungen, die Breaking Changes erfordern, können vor der Veröffentlichung in begrenzten Ausnahmefällen noch vorkommen.

Der semantische Kernel bietet Funktionen, mit denen Entwickler die Suche integrieren können, wenn Sie ein GROßEs Sprachmodell (LARGE Language Model, LLM) aufrufen. Dies ist wichtig, da LLMs auf festen Datensätzen trainiert werden und möglicherweise Zugriff auf zusätzliche Daten benötigen, um auf eine Benutzeranforderung genau zu reagieren.

Der Prozess der Bereitstellung zusätzlichen Kontexts beim Prompting eines LLM wird als „Retrieval-Augmented Generation“ (RAG) bezeichnet. RAG umfasst in der Regel das Abrufen zusätzlicher Daten, die für die aktuelle Benutzeranfrage relevant sind, und das Anreichern des an das LLM gesendeten Prompts mit diesen Daten. Das LLM kann seine Schulung sowie den zusätzlichen Kontext verwenden, um eine genauere Antwort zu bieten.

Ein einfaches Beispiel dafür, wann dies wichtig wird, ist, wenn die Frage des Benutzers mit aktuellen Informationen verknüpft ist, die nicht im Schulungsdatensatz des LLM enthalten sind. Durch die Durchführung einer geeigneten Textsuche und einschließlich der Ergebnisse bei der Frage des Benutzers werden genauere Antworten erzielt.

Der semantische Kernel bietet eine Reihe von Textsuchfunktionen, mit denen Entwickler Suchvorgänge mithilfe von Websuch- oder Vektordatenbanken durchführen und RAG einfach zu ihren Anwendungen hinzufügen können.

Semantischer Kernel stellt APIs zum Abrufen von Daten auf verschiedenen Abstraktionsebenen bereit.

Die Textsuche ermöglicht die Suche auf hoher Ebene im Stapel, wobei die Eingabe Text mit Unterstützung für die grundlegende Filterung ist. Die Textsuchschnittstelle unterstützt verschiedene Ausgabetypen, einschließlich der Unterstützung für die einfache Rückgabe einer einfachen Zeichenfolge. Auf diese Weise kann die Textsuche viele Implementierungen unterstützen, einschließlich Websuchmaschinen und Vektorspeichern. Das Hauptziel für die Textsuche besteht darin, eine einfache Schnittstelle bereitzustellen, die als Plug-In zum Chatabschluss verfügbar gemacht werden kann.

Tipp

Alle sofort einsatzbereiten Textsuchimplementierungen finden Sie unter Out-of-the-Box-Textsuche.

Die Vektorsuche befindet sich auf einer niedrigeren Ebene im Stapel, wobei die Eingabe ein Vektor ist. Sie unterstützt auch die grundlegende Filterung sowie die Auswahl eines Vektors aus dem Datenspeicher zum Vergleichen des Eingabevektors. Es gibt ein Datenmodell zurück, das die Daten aus dem Datenspeicher enthält.

Wenn Sie RAG mit Vektorspeichern verwenden möchten, ist es sinnvoll, Textsuche und Vektorsuche zusammen zu nutzen. Dies lässt sich erreichen, indem eine Vektorspeicher-Sammlung, die die Vektorsuche unterstützt, mit einer Textsuche versehen und die Textsuche dann als Plug-In für Chat Completions bereitgestellt wird. Semantischer Kernel bietet die Möglichkeit, dies einfach aus der Box heraus zu erledigen. Weitere Informationen dazu finden Sie in den folgenden Tipps.

Tipp

Informationen zum Verfügbarmachen der Vektorsuche zum Chatabschluss finden Sie unter Wie sie Vektorspeicher mit Semantischer Kernel Textsuche verwenden.

Tipp

Weitere Informationen zu Vektorspeichern und Vektorsuche finden Sie unter What are Semantischer Kernel Vector Store connectors?.

Im folgenden Beispielcode können Sie zwischen der Verwendung von Bing oder Google zum Ausführen von Websuchvorgängen wählen.

Tipp

Um die auf dieser Seite gezeigten Beispiele auszuführen, wechseln Sie zu GettingStartedWithTextSearch/Step1_Web_Search.cs.

Erstellen einer Textsuchinstanz

Jedes Beispiel erstellt eine Textsuchinstanz und führt dann einen Suchvorgang aus, um Ergebnisse für die bereitgestellte Abfrage abzurufen. Die Suchergebnisse enthalten einen Textausschnitt der Webseite, der den Inhalt beschreibt. Dies bietet nur einen begrenzten Kontext, d. h. eine Teilmenge des Webseiteninhalts und keinen Link zur Quelle der Informationen. In späteren Beispielen wird gezeigt, wie diese Einschränkungen behoben werden.

Tipp

Der folgende Beispielcode verwendet den Semantischer Kernel OpenAI-Connector und Web-Plugins; installieren Sie diese mit den folgenden Befehlen:

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

Tipp

Weitere Informationen dazu, welche Arten von Suchergebnissen abgerufen werden können, finden Sie in der Dokumentation zu Text search Plugins.

Verwenden Sie Suchergebnisse einer Textsuche, um eine Eingabeaufforderung zu ergänzen

Die nächsten Schritte sind, ein Plug-In aus der Webtextsuche zu erstellen und das Plug-In aufzurufen, um die Suchergebnisse zum Prompt hinzuzufügen.

Der folgende Beispielcode zeigt, wie Sie dies erreichen:

  1. Erstellen Sie ein Kernel, in dem ein OpenAI-Dienst registriert ist. Dies wird verwendet, um das gpt-4o Modell mit dem Prompt aufzurufen.
  2. Erstellen Sie eine Textsuchinstanz.
  3. Erstellen Sie ein Such-Plug-In aus der Textsuchinstanz.
  4. Erstellen Sie eine Eingabeaufforderungsvorlage, die das Such-Plug-In mit der Abfrage aufruft und Suchergebnisse zusammen mit der ursprünglichen Abfrage in die Eingabeaufforderung einschließt.
  5. Rufen Sie die Eingabeaufforderung auf, und zeigen Sie die Antwort an.

Das Modell liefert eine Antwort, die auf die neuesten Informationen basiert, die bei einer Websuche verfügbar sind.

Bing-Websuche

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

Google-Websuche

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

Es gibt eine Reihe von Problemen mit dem obigen Beispiel:

  1. Die Antwort enthält keine Zitierungen der Webseiten, die als Kontextgrundlage verwendet wurden.
  2. Die Antwort enthält Daten von jeder Website, es wäre besser, dies auf vertrauenswürdige Websites zu beschränken.
  3. Es wird nur ein Codeausschnitt jeder Webseite verwendet, um dem Modell einen Erdungskontext bereitzustellen, der Codeausschnitt enthält möglicherweise nicht die Daten, die erforderlich sind, um eine genaue Antwort bereitzustellen.

Sehen Sie sich die Seite an, auf der Textsuch-Plug-Ins für Lösungen für diese Probleme beschrieben werden.

Als Nächstes empfehlen wir einen Blick auf Textsuchabstraktionen.

In Kürze verfügbar

Mehr in Kürze verfügbar.

In Kürze verfügbar

Mehr in Kürze verfügbar.

Nächste Schritte