Condividi tramite


Aggiunta della generazione aumentata di recupero (RAG) agli agenti del kernel semantico

Avvertimento

La funzionalità RAG dell'agente del kernel semantico è sperimentale, soggetta a modifica e verrà finalizzata solo in base al feedback e alla valutazione.

Uso di TextSearchProvider per RAG

Microsoft.SemanticKernel.Data.TextSearchProvider Consente agli agenti di recuperare i documenti pertinenti in base all'input dell'utente e inserirli nel contesto dell'agente per risposte più informate. Integra un'istanza Microsoft.SemanticKernel.Data.ITextSearch con gli agenti Semantic Kernel. Esistono più ITextSearch implementazioni, supportando ricerche di somiglianza negli archivi vettoriali e nell'integrazione del motore di ricerca. Altre informazioni sono disponibili qui.

Forniamo inoltre un Microsoft.SemanticKernel.Data.TextSearchStore, che offre una semplice archiviazione vettoriale strutturata di dati testuali ai fini della generazione aumentata con recupero. TextSearchStore ha uno schema predefinito per l'archiviazione e il recupero di dati testuali in un archivio vettoriale. Per usare uno schema personalizzato per l'archiviazione, vedere VectorStoreTextSearch.

Configurazione di TextSearchProvider

Può TextSearchProvider essere utilizzato con un oggetto VectorStore e TextSearchStore per archiviare e cercare documenti di testo.

Nell'esempio seguente viene illustrato come configurare e usare TextSearchProvider con un TextSearchStore e InMemoryVectorStore affinché un agente possa eseguire semplici operazioni RAG su testo.

// 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,
    // This setting must be set to true when using the on-demand RAG feature
    UseImmutableKernel = true
};

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

Funzionalità avanzate: citazioni e filtri

TextSearchStore supporta funzionalità avanzate, ad esempio il filtro dei risultati in base allo spazio dei nomi e l'inclusione di citazioni nelle risposte.

Inclusione di citazioni

I documenti in TextSearchStore possono includere metadati come nomi di origine e collegamenti, abilitando la generazione di citazioni nelle risposte dell'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"]
    }
});

Quando recupera TextSearchProvider questo documento, per impostazione predefinita includerà il nome e il collegamento di origine nella risposta.

Filtro per spazio dei nomi

Quando si aggiornano i documenti, è possibile specificare facoltativamente uno o più spazi dei nomi per ogni documento. Gli spazi dei nomi possono essere qualsiasi stringa che definisce l'ambito di un documento. È quindi possibile configurare per limitare i TextSearchStore risultati della ricerca solo ai record che corrispondono allo spazio dei nomi richiesto.

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

Rag automatico e su richiesta

TextSearchProvider può eseguire ricerche automaticamente durante ogni chiamata dell'agente o consentire ricerche su richiesta tramite chiamate di strumenti quando l'agente necessita di informazioni aggiuntive.

L'impostazione predefinita è BeforeAIInvoke, il che significa che le ricerche verranno eseguite prima di ogni chiamata dell'agente usando il messaggio passato all'agente. Questa operazione può essere modificata in OnDemandFunctionCalling, che consentirà all'agente di effettuare una chiamata di strumento per eseguire ricerche usando una stringa di ricerca della scelta dell'agente.

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

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

Avvertimento

Quando si usa TextSearchProvider con OnDemandFunctionCalling, l'impostazione UseImmutableKernel dell'agente deve essere impostata su true come la funzionalità richiede la clonazione del kernel quando si richiama l'agente. Si noti che l'impostazione UseImmutableKernel su true significa che tutte le modifiche ai dati del kernel eseguite durante la chiamata dell'agente, ad esempio plug-in, non verranno mantenute al termine della chiamata.

Opzioni TextSearchProvider

TextSearchProvider Può essere configurato con varie opzioni per personalizzarne il comportamento. Le opzioni vengono fornite usando la TextSearchProviderOptions classe per il TextSearchProvider costruttore.

In alto

Specifica il numero massimo di risultati da restituire dalla ricerca di somiglianza.

  • Impostazione predefinita: 3

Tempo di Ricerca

Controlla quando viene eseguita la ricerca di testo. Le opzioni includono:

  • BeforeAIInvoke: viene eseguita una ricerca ogni volta che viene richiamato il modello/agente, subito prima della chiamata e i risultati vengono forniti al modello/agente tramite il contesto di chiamata.
  • OnDemandFunctionCalling: una ricerca può essere eseguita dal modello/agente su richiesta tramite chiamata di funzione.

PluginFunctionName

Specifica il nome del metodo plug-in che verrà reso disponibile per la ricerca se SearchTime è impostato su OnDemandFunctionCalling.

  • Impostazione predefinita: "Cerca"

PluginFunctionDescription

Fornisce una descrizione del metodo plug-in che verrà reso disponibile per la ricerca se SearchTime è impostato su OnDemandFunctionCalling.

  • Impostazione predefinita: "Consente la ricerca di informazioni aggiuntive per rispondere alla domanda dell'utente".

ContextPrompt

Quando si specificano i blocchi di testo al modello di intelligenza artificiale alla chiamata, è necessario un prompt per indicare al modello di intelligenza artificiale quali blocchi di testo sono per e come devono essere usati. Questa impostazione consente di eseguire l'override della messaggistica predefinita incorporata in TextSearchProvider.

IncludiCitazioniPrompt

Quando si specificano i blocchi di testo al modello di intelligenza artificiale alla chiamata, è necessario un prompt per indicare al modello di intelligenza artificiale se e come eseguire citazioni. Questa impostazione consente di eseguire l'override della messaggistica predefinita incorporata in TextSearchProvider.

ContextFormatter

Questo callback facoltativo può essere usato per personalizzare completamente il testo prodotto da TextSearchProvider. Per impostazione predefinita, l'oggetto TextSearchProvider produrrà testo che include

  1. Un prompt che informa il modello di intelligenza artificiale sull'uso delle porzioni di testo.
  2. Elenco di blocchi di testo con collegamenti e nomi di origine.
  3. Richiesta che indica al modello di intelligenza artificiale di includere citazioni.

È possibile scrivere un output personalizzato implementando e fornendo questo callback.

Nota: se questo delegato viene specificato, le ContextPrompt impostazioni e IncludeCitationsPrompt non verranno usate.

Combinazione di RAG con altri provider

TextSearchProvider Può essere combinato con altri provider, ad esempio mem0 o WhiteboardProvider, per creare agenti con funzionalità di memoria e recupero.

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

Combinando queste funzionalità, gli agenti possono offrire un'esperienza più personalizzata e compatibile con il contesto.

Passaggi successivi

Presto disponibili

Altre informazioni saranno presto disponibili.

Presto disponibili

Altre informazioni saranno presto disponibili.