Compartir a través de


Añadir la generación de recuperación aumentada (RAG) a los agentes del kernel semántico

Advertencia

La funcionalidad RAG del agente de kernel semántico es experimental, está sujeta a cambios y solo se finalizará en función de los comentarios y la evaluación.

Uso de TextSearchProvider para RAG

Microsoft.SemanticKernel.Data.TextSearchProvider Permite a los agentes recuperar documentos relevantes en función de la entrada del usuario e insertarlos en el contexto del agente para obtener respuestas más informadas. Integra una Microsoft.SemanticKernel.Data.ITextSearch instancia con agentes de kernel semántico. Existen varias ITextSearch implementaciones que admiten búsquedas de similitud en almacenes de vectores y integración del motor de búsqueda. Puede encontrar más información aquí.

También proporcionamos un almacenamiento vectorial simple y estructurado de datos textuales con el propósito de generación aumentada para recuperación. TextSearchStore tiene un esquema integrado para almacenar y recuperar datos textuales en un almacén de vectores. Si desea usar su propio esquema para el almacenamiento, consulte VectorStoreTextSearch.

Configuración de TextSearchProvider

TextSearchProvider se puede usar con VectorStore y TextSearchStore para almacenar y buscar documentos de texto.

En el ejemplo siguiente se muestra cómo configurar y usar el TextSearchProvider con TextSearchStore y InMemoryVectorStore para que un agente realice un RAG simple sobre texto.

// Create an embedding generator using Azure OpenAI.
var embeddingGenerator = new AzureOpenAIClient(new Uri("<Your_Azure_OpenAI_Endpoint>"), new AzureCliCredential())
    .GetEmbeddingClient("<Your_Deployment_Name>")
    .AsIEmbeddingGenerator(1536);

// Create a vector store to store documents.
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });

// Create a TextSearchStore for storing and searching text documents.
using var textSearchStore = new TextSearchStore<string>(vectorStore, collectionName: "FinancialData", vectorDimensions: 1536);

// Upsert documents into the store.
await textSearchStore.UpsertTextAsync(new[]
{
    "The financial results of Contoso Corp for 2024 is as follows:\nIncome EUR 154 000 000\nExpenses EUR 142 000 000",
    "The Contoso Corporation is a multinational business with its headquarters in Paris."
});

// Create an agent.
Kernel kernel = new Kernel();
ChatCompletionAgent agent = new()
{
    Name = "FriendlyAssistant",
    Instructions = "You are a friendly assistant",
    Kernel = kernel
};

// Create an agent thread and add the TextSearchProvider.
ChatHistoryAgentThread agentThread = new();
var textSearchProvider = new TextSearchProvider(textSearchStore);
agentThread.AIContextProviders.Add(textSearchProvider);

// Use the agent with RAG capabilities.
ChatMessageContent response = await agent.InvokeAsync("Where is Contoso based?", agentThread).FirstAsync();
Console.WriteLine(response.Content);

Características avanzadas: citas y filtrado

TextSearchStore Admite características avanzadas, como filtrar los resultados por espacio de nombres e incluir citas en respuestas.

Inclusión de citas

Los documentos de TextSearchStore pueden incluir metadatos como nombres de origen y vínculos, lo que permite la generación de citas en las respuestas del agente.

await textSearchStore.UpsertDocumentsAsync(new[]
{
    new TextSearchDocument
    {
        Text = "The financial results of Contoso Corp for 2023 is as follows:\nIncome EUR 174 000 000\nExpenses EUR 152 000 000",
        SourceName = "Contoso 2023 Financial Report",
        SourceLink = "https://www.contoso.com/reports/2023.pdf",
        Namespaces = ["group/g2"]
    }
});

TextSearchProvider Cuando recupera este documento, incluirá de forma predeterminada el nombre de origen y el vínculo en su respuesta.

Filtrado por espacio de nombres

Al subir documentos, puede proporcionar opcionalmente uno o varios espacios de nombres para cada documento. Los espacios de nombres pueden ser cualquier cadena que defina el ámbito de un documento. Después, puede configurar para limitar los TextSearchStore resultados de búsqueda solo a los registros que coinciden con el espacio de nombres solicitado.

using var textSearchStore = new TextSearchStore<string>(
    vectorStore,
    collectionName: "FinancialData",
    vectorDimensions: 1536,
    new() { SearchNamespace = "group/g2" }
);

RAG automático frente a bajo demanda

Puede TextSearchProvider realizar búsquedas automáticamente durante cada invocación del agente o permitir búsquedas bajo demanda a través de llamadas a herramientas cuando el agente necesita información adicional.

La configuración predeterminada es BeforeAIInvoke, lo que significa que las búsquedas se realizarán antes de cada invocación del agente mediante el mensaje pasado al agente. Esto se puede cambiar a OnDemandFunctionCalling, lo que permitirá al Agente realizar una llamada de herramienta para realizar búsquedas mediante una cadena de búsqueda de la elección del agente.

var options = new TextSearchProviderOptions
{
    SearchTime = TextSearchProviderOptions.RagBehavior.OnDemandFunctionCalling,
};

var provider = new TextSearchProvider(mockTextSearch.Object, options: options);

Opciones de TextSearchProvider

TextSearchProvider se puede configurar con varias opciones para personalizar su comportamiento. Las opciones se proporcionan mediante la TextSearchProviderOptions clase para el TextSearchProvider constructor.

Mejores

Especifica el número máximo de resultados que se van a devolver de la búsqueda de similitud.

  • Valor predeterminado: 3

TiempoDeBúsqueda

Controla cuándo se realiza la búsqueda de texto. Entre las opciones se incluyen:

  • BeforeAIInvoke: se realiza una búsqueda cada vez que se invoca el modelo o agente, justo antes de la invocación, y los resultados se proporcionan al modelo o agente a través del contexto de invocación.
  • OnDemandFunctionCalling: el modelo o agente puede realizar una búsqueda a petición a través de una llamada de función.

PluginFunctionName

Especifica el nombre del método de complemento que estará disponible para buscar si SearchTime está establecido en OnDemandFunctionCalling.

  • Valor predeterminado: "Buscar"

DescripciónDeFunciónDelPlugin

Proporciona una descripción del método de complemento que estará disponible para buscar si SearchTime está establecido en OnDemandFunctionCalling.

  • Valor predeterminado: "Permite buscar información adicional para ayudar a responder a la pregunta del usuario".

ContextPrompt

Al proporcionar los fragmentos de texto al modelo de INTELIGENCIA ARTIFICIAL en la invocación, se requiere una solicitud para indicar al modelo de IA cuáles son los fragmentos de texto y cómo se deben usar. Esta configuración permite sobrescribir la mensajería predeterminada integrada en TextSearchProvider.

IncluirSolicitudDeCitas

Al proporcionar los fragmentos de texto al modelo de inteligencia artificial en la invocación, se requiere una solicitud para indicar al modelo de IA si y cómo realizar citas. Esta configuración permite sobrescribir la mensajería predeterminada integrada en el TextSearchProvider.

ContextFormatter

Este método de retorno opcional se puede usar para personalizar completamente el texto generado por el TextSearchProvider. De forma predeterminada, TextSearchProvider generará texto que incluya

  1. Mensaje que indica al modelo de IA para qué son los fragmentos de texto.
  2. Lista de fragmentos de texto con vínculos y nombres de origen.
  3. Una instrucción que guía al modelo de IA para incluir citas.

Puede escribir su propia salida implementando y usando esta devolución de llamada.

Nota: Si se proporciona este delegado, no se usarán las configuraciones ContextPrompt y IncludeCitationsPrompt.

Combinación de RAG con otros proveedores

TextSearchProvider se puede combinar con otros proveedores, como mem0 o WhiteboardProvider, para crear agentes con capacidades de recuperación y memoria.

// Add both mem0 and TextSearchProvider to the agent thread.
agentThread.AIContextProviders.Add(mem0Provider);
agentThread.AIContextProviders.Add(textSearchProvider);

// Use the agent with combined capabilities.
ChatMessageContent response = await agent.InvokeAsync("What was Contoso's income for 2023?", agentThread).FirstAsync();
Console.WriteLine(response.Content);

Al combinar estas características, los agentes pueden ofrecer una experiencia más personalizada y con reconocimiento del contexto.

Pasos siguientes

Próximamente

Más información próximamente.

Próximamente

Más información próximamente.