Compartir a través de


¿Qué son los complementos de búsqueda de texto de kernel semántico?

El kernel semántico usa complementos para conectar las API existentes con IA. Estos complementos tienen funciones que se pueden usar para agregar datos o ejemplos relevantes a las solicitudes, o para permitir que la inteligencia artificial realice acciones automáticamente.

Para integrar Text Search con kernel semántico, es necesario convertirlo en un complemento. Una vez que tengamos un complemento Text Search, podemos usarlo para agregar información relevante a mensajes o para recuperar información según sea necesario. La creación de un complemento a partir de Text Search es un proceso sencillo, que explicaremos a continuación.

Sugerencia

Para ejecutar los ejemplos que se muestran en esta página, vaya a GettingStartedWithTextSearch/Step2_Search_For_RAG.cs.

Complemento de búsqueda básico

El kernel semántico proporciona una implementación de plantilla predeterminada que admite la sustitución de variables y la llamada a funciones. Al incluir una expresión como {{MyPlugin.Function $arg1}} en una plantilla de solicitud, se invocará la función especificada, es decir, MyPlugin.Function con el argumento arg1 proporcionado (que se resuelve desde KernelArguments). El valor devuelto de la invocación de función se inserta en el símbolo del sistema. Esta técnica se puede usar para insertar información relevante en un mensaje.

En el ejemplo siguiente se muestra cómo crear un complemento denominado SearchPlugin a partir de una instancia de BingTextSearch. El uso CreateWithSearch de crea un complemento con una sola Search función que llama a la implementación de búsqueda de texto subyacente. SearchPlugin se agrega a , Kernel que hace que esté disponible para que se llame durante la representación del símbolo del sistema. La plantilla de solicitud incluye una llamada a la {{SearchPlugin.Search $query}} SearchPlugin que invocará para recuperar los resultados relacionados con la consulta actual. A continuación, los resultados se insertan en el símbolo del sistema representado antes de enviarlos al modelo de IA.

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

Complemento de búsqueda con citas

En el ejemplo siguiente se repite el patrón descrito en la sección anterior con algunos cambios importantes:

  1. CreateWithGetTextSearchResults se usa para crear un SearchPlugin objeto que llama al GetTextSearchResults método desde la implementación de búsqueda de texto subyacente.
  2. La plantilla prompt usa la sintaxis handlebars. Esto permite que la plantilla itera en los resultados de la búsqueda y represente el nombre, el valor y el vínculo de cada resultado.
  3. El mensaje incluye una instrucción para incluir citas, por lo que el modelo de IA realizará el trabajo de agregar citas a la respuesta.
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
));

Complemento de búsqueda con un filtro

Los ejemplos que se muestran hasta ahora usarán los resultados de búsqueda web de clasificación superior para proporcionar los datos de base. Para proporcionar más confiabilidad en los datos, la búsqueda web solo se puede restringir para devolver resultados de un sitio especificado.

El ejemplo siguiente se basa en el anterior para agregar el filtrado de los resultados de búsqueda. Con TextSearchFilter una cláusula de igualdad se usa para especificar que solo se incluirán los resultados del sitio blogs para desarrolladores de Microsoft (site == 'devblogs.microsoft.com') en los resultados de búsqueda.

En el ejemplo se usa KernelPluginFactory.CreateFromFunctions para crear .SearchPlugin Se proporciona una descripción personalizada para el complemento. El ITextSearch.CreateGetTextSearchResults método de extensión se usa para crear el KernelFunction que invoca el servicio de búsqueda de texto.

Sugerencia

El site filtro es específico de Bing. Para la búsqueda web de Google, use 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
));

Sugerencia

Siga el vínculo para obtener más información sobre cómo filtrar las respuestas que Devuelve Bing.

Complemento de búsqueda personalizado

En el ejemplo anterior, se aplicó un filtro de sitio estático a las operaciones de búsqueda. ¿Qué ocurre si necesita que este filtro sea dinámico?

En el ejemplo siguiente se muestra cómo puede realizar más personalización de para que el valor del SearchPlugin filtro pueda ser dinámico. El ejemplo usa KernelFunctionFromMethodOptions para especificar lo siguiente para :SearchPlugin

  • FunctionName: la función de búsqueda se denomina GetSiteResults porque aplicará un filtro de sitio si la consulta incluye un dominio.
  • Description: la descripción describe cómo funciona esta función de búsqueda especializada.
  • Parameters: los parámetros incluyen un parámetro opcional adicional para site para que se pueda especificar el dominio.

La personalización de la función de búsqueda es necesaria si desea proporcionar varias funciones de búsqueda especializadas. En los mensajes, puede usar los nombres de función para que la plantilla sea más legible. Si usa una llamada a función, el modelo usará el nombre y la descripción de la función para seleccionar la mejor función de búsqueda que se va a invocar.

Cuando se ejecuta este ejemplo, la respuesta usará techcommunity.microsoft.com como origen de los datos pertinentes.

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

Próximamente

Más próximamente.

Próximamente

Más próximamente.

Pasos siguientes