Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
- Mensaje que indica al modelo de IA para qué son los fragmentos de texto.
- Lista de fragmentos de texto con vínculos y nombres de origen.
- 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.