Delen via


Invoegtoepassingen gebruiken voor Het ophalen van Augmented Generation (RAG)

Vaak moeten uw AI-agents gegevens ophalen uit externe bronnen om geaarde antwoorden te genereren. Zonder deze aanvullende context kunnen uw AI-agents hallucinaeren of onjuiste informatie verstrekken. U kunt dit oplossen door invoegtoepassingen te gebruiken om gegevens op te halen uit externe bronnen.

Wanneer u invoegtoepassingen voor Retrieval Augmented Generation (RAG) overweegt, moet u uzelf twee vragen stellen:

  1. Hoe zoekt u (of uw AI-agent) naar de vereiste gegevens? Hebt u semantische zoekopdrachten of klassieke zoekopdrachten nodig?
  2. Weet u al welke gegevens de AI-agent van tevoren nodig heeft (vooraf opgehaalde gegevens) of moet de AI-agent de gegevens dynamisch ophalen?
  3. Hoe zorgt u ervoor dat uw gegevens veilig blijven en voorkomen dat gevoelige informatie wordt overschreven?

Bij het ontwikkelen van invoegtoepassingen voor Het ophalen van Augmented Generation (RAG), kunt u twee typen zoeken gebruiken: semantische zoekopdrachten en klassieke zoekopdrachten.

Semantisch zoeken maakt gebruik van vectordatabases om informatie te begrijpen en op te halen op basis van de betekenis en context van de query in plaats van alleen overeenkomende trefwoorden. Met deze methode kan de zoekmachine de nuances van taal begrijpen, zoals synoniemen, gerelateerde concepten en de algehele intentie achter een query.

Semantisch zoeken excelleert in omgevingen waarin gebruikersquery's complex, open-ended zijn of een dieper inzicht in de inhoud vereisen. Als u bijvoorbeeld zoekt naar 'beste smartphones voor fotografie', levert dit resultaten op die rekening houden met de context van fotografiefuncties in smartphones, in plaats van alleen de woorden 'beste', 'smartphones' en 'fotografie' te vinden.

Wanneer u een LLM met een semantische zoekfunctie oplevert, hoeft u doorgaans slechts een functie met één zoekquery te definiëren. De LLM gebruikt deze functie vervolgens om de benodigde informatie op te halen. Hieronder ziet u een voorbeeld van een semantische zoekfunctie die gebruikmaakt van Azure AI Search om documenten te vinden die vergelijkbaar zijn met een bepaalde query.

using System.ComponentModel;
using System.Text.Json.Serialization;
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Models;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Embeddings;

public class InternalDocumentsPlugin
{
    private readonly ITextEmbeddingGenerationService _textEmbeddingGenerationService;
    private readonly SearchIndexClient _indexClient;

    public AzureAISearchPlugin(ITextEmbeddingGenerationService textEmbeddingGenerationService, SearchIndexClient indexClient)
    {
        _textEmbeddingGenerationService = textEmbeddingGenerationService;
        _indexClient = indexClient;
    }

    [KernelFunction("Search")]
    [Description("Search for a document similar to the given query.")]
    public async Task<string> SearchAsync(string query)
    {
        // Convert string query to vector
        ReadOnlyMemory<float> embedding = await _textEmbeddingGenerationService.GenerateEmbeddingAsync(query);

        // Get client for search operations
        SearchClient searchClient = _indexClient.GetSearchClient("default-collection");

        // Configure request parameters
        VectorizedQuery vectorQuery = new(embedding);
        vectorQuery.Fields.Add("vector");

        SearchOptions searchOptions = new() { VectorSearch = new() { Queries = { vectorQuery } } };

        // Perform search request
        Response<SearchResults<IndexSchema>> response = await searchClient.SearchAsync<IndexSchema>(searchOptions);

        // Collect search results
        await foreach (SearchResult<IndexSchema> result in response.Value.GetResultsAsync())
        {
            return result.Document.Chunk; // Return text from first result
        }

        return string.Empty;
    }

    private sealed class IndexSchema
    {
        [JsonPropertyName("chunk")]
        public string Chunk { get; set; }

        [JsonPropertyName("vector")]
        public ReadOnlyMemory<float> Vector { get; set; }
    }
}

Klassieke zoekopdrachten, ook wel bekend als zoekopdracht op basis van kenmerken of criteria, is afhankelijk van filteren en overeenkomende exacte termen of waarden in een gegevensset. Het is met name effectief voor databasequery's, inventariszoekopdrachten en elke situatie waarin filteren op specifieke kenmerken nodig is.

Als een gebruiker bijvoorbeeld alle orders wil vinden die zijn geplaatst door een bepaalde klant-id of producten binnen een specifiek prijsbereik en een specifieke categorie wil ophalen, biedt klassieke zoekopdracht nauwkeurige en betrouwbare resultaten. Klassieke zoekopdrachten worden echter beperkt door het niet kunnen begrijpen van context of variaties in taal.

Tip

In de meeste gevallen ondersteunen uw bestaande services al klassieke zoekopdrachten. Voordat u een semantische zoekopdracht implementeert, moet u overwegen of uw bestaande services de benodigde context voor uw AI-agents kunnen bieden.

Neem bijvoorbeeld een invoegtoepassing die klantgegevens ophaalt uit een CRM-systeem met behulp van klassieke zoekopdrachten. Hier hoeft de AI de GetCustomerInfoAsync functie aan te roepen met een klant-id om de benodigde informatie op te halen.

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class CRMPlugin
{
    private readonly CRMService _crmService;

    public CRMPlugin(CRMService crmService)
    {
        _crmService = crmService;
    }

    [KernelFunction("GetCustomerInfo")]
    [Description("Retrieve customer information based on the given customer ID.")]
    public async Task<Customer> GetCustomerInfoAsync(string customerId)
    {
        return await _crmService.GetCustomerInfoAsync(customerId);
    }
}

Het bereiken van dezelfde zoekfunctionaliteit met semantische zoekopdrachten is waarschijnlijk onmogelijk of onpraktisch vanwege de niet-deterministische aard van semantische query's.

Wanneer gebruikt u elk

Het kiezen tussen semantische en klassieke zoekopdrachten is afhankelijk van de aard van de query. Het is ideaal voor omgevingen met veel inhoud, zoals knowledge bases en klantenondersteuning, waar gebruikers vragen kunnen stellen of producten kunnen zoeken met natuurlijke taal. Klassieke zoekopdrachten moeten daarentegen worden gebruikt wanneer precisie en exacte overeenkomsten belangrijk zijn.

In sommige scenario's moet u mogelijk beide benaderingen combineren om uitgebreide zoekmogelijkheden te bieden. Een chatbot die klanten in een e-commercewinkel helpt, kan bijvoorbeeld semantische zoekopdrachten gebruiken om gebruikersquery's en klassieke zoekopdrachten te begrijpen om producten te filteren op basis van specifieke kenmerken, zoals prijs, merk of beschikbaarheid.

Hieronder ziet u een voorbeeld van een invoegtoepassing waarin semantische en klassieke zoekopdrachten worden gecombineerd om productgegevens op te halen uit een e-commercedatabase.

using System.ComponentModel;
using Microsoft.SemanticKernel;

public class ECommercePlugin
{
    [KernelFunction("search_products")]
    [Description("Search for products based on the given query.")]
    public async Task<IEnumerable<Product>> SearchProductsAsync(string query, ProductCategories category = null, decimal? minPrice = null, decimal? maxPrice = null)
    {
        // Perform semantic and classic search with the given parameters
    }
}

Dynamisch versus vooraf opgehaalde gegevens ophalen

Bij het ontwikkelen van invoegtoepassingen voor Het ophalen van Augmented Generation (RAG), moet u ook overwegen of het proces voor het ophalen van gegevens statisch of dynamisch is. Hierdoor kunt u de prestaties van uw AI-agents optimaliseren door alleen gegevens op te halen wanneer dat nodig is.

Dynamisch ophalen van gegevens

In de meeste gevallen bepaalt de gebruikersquery de gegevens die de AI-agent moet ophalen. Een gebruiker kan bijvoorbeeld vragen om het verschil tussen twee verschillende producten. De AI-agent moet vervolgens de productgegevens dynamisch ophalen uit een database of API om een antwoord te genereren met behulp van functieoproepen. Het zou onpraktisch zijn om alle mogelijke productinformatie vooraf op te halen en deze aan de AI-agent te geven.

Hieronder ziet u een voorbeeld van een back-and-forth-chat tussen een gebruiker en een AI-agent waarbij dynamische gegevens ophalen nodig is.

Role Bericht
🔵Gebruiker Kun je me vertellen over de beste matrasjes?
🔴Assistent (functieoproep) Products.Search("mattresses")
🟢Tool [{"id": 25323, "name": "Cloud Nine"},{"id": 63633, "name": "Best Sleep"}]
🔴Assistent Natuurlijk! We hebben zowel Cloud Nine als Beste Slaapstand
🔵Gebruiker Wat is het verschil tussen beide?
🔴Assistent (functieoproep) Products.GetDetails(25323) Products.GetDetails(63633)
🟢Tool { "id": 25323, "name": "Cloud Nine", "price": 1000, "material": "Memory foam" }
🟢Tool { "id": 63633, "name": "Best Sleep", "price": 1200, "material": "Latex" }
🔴Assistent Cloud Nine is gemaakt van geheugenschuim en kost $ 1000. Beste slaap is gemaakt van latex en kost $ 1200.

Vooraf opgehaalde gegevens ophalen

Statische gegevens ophalen omvat het ophalen van gegevens uit externe bronnen en het altijd verstrekken aan de AI-agent. Dit is handig wanneer de gegevens vereist zijn voor elke aanvraag of wanneer de gegevens relatief stabiel zijn en niet regelmatig worden gewijzigd.

Neem bijvoorbeeld een agent die altijd vragen beantwoordt over het lokale weer. Ervan uitgaande dat u een WeatherPlugin, kunt u vooraf weergegevens ophalen uit een weer-API en deze opgeven in de chatgeschiedenis. Hierdoor kan de agent antwoorden over het weer genereren zonder tijd te verspillen aan het aanvragen van de gegevens van de API.

using System.Text.Json;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;

IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey);
builder.Plugins.AddFromType<WeatherPlugin>();
Kernel kernel = builder.Build();

// Get the weather
var weather = await kernel.Plugins.GetFunction("WeatherPlugin", "get_weather").InvokeAsync(kernel);

// Initialize the chat history with the weather
ChatHistory chatHistory = new ChatHistory("The weather is:\n" + JsonSerializer.Serialize(weather));

// Simulate a user message
chatHistory.AddUserMessage("What is the weather like today?");

// Get the answer from the AI agent
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
var result = await chatCompletionService.GetChatMessageContentAsync(chatHistory);

Gegevens veilig houden

Bij het ophalen van gegevens uit externe bronnen is het belangrijk om ervoor te zorgen dat de gegevens veilig zijn en dat gevoelige informatie niet wordt weergegeven. U kunt de volgende strategieën gebruiken om oversharing van gevoelige informatie te voorkomen:

Strategie Beschrijving
Het verificatietoken van de gebruiker gebruiken Vermijd het maken van service-principals die door de AI-agent worden gebruikt om informatie voor gebruikers op te halen. Als u dit doet, is het lastig om te controleren of een gebruiker toegang heeft tot de opgehaalde gegevens.
Het opnieuw maken van zoekservices voorkomen Voordat u een nieuwe zoekservice maakt met een vectordatabase, controleert u of er al een bestaat voor de service met de vereiste gegevens. Door bestaande services opnieuw te gebruiken, kunt u voorkomen dat gevoelige inhoud wordt gedupliceerd, bestaande besturingselementen voor toegang worden gebruikt en bestaande filtermechanismen worden gebruikt die alleen gegevens retourneren waartoe de gebruiker toegang heeft.
Verwijzing opslaan in vector-DB's in plaats van inhoud In plaats van gevoelige inhoud te dupliceren naar vector-DB's, kunt u verwijzingen naar de werkelijke gegevens opslaan. Een gebruiker moet eerst het verificatietoken gebruiken om de echte gegevens op te halen.

Volgende stappen

Nu u nu weet hoe u uw AI-agents kunt grondwerken met gegevens uit externe bronnen, kunt u nu leren hoe u AI-agents kunt gebruiken om bedrijfsprocessen te automatiseren. Zie voor meer informatie over het gebruik van taakautomatiseringsfuncties.