Udostępnij za pośrednictwem


Używanie wtyczek do pobierania rozszerzonej generacji (RAG)

Często agenci sztucznej inteligencji muszą pobierać dane ze źródeł zewnętrznych, aby generować odpowiedzi uziemione. Bez tego dodatkowego kontekstu agenci sztucznej inteligencji mogą oprzeć się lub podać nieprawidłowe informacje. Aby rozwiązać ten problem, możesz użyć wtyczek do pobierania danych ze źródeł zewnętrznych.

Rozważając wtyczki dla rozszerzonej generacji pobierania (RAG), należy zadać sobie dwa pytania:

  1. W jaki sposób (lub agent sztucznej inteligencji) "wyszukaj" wymagane dane? Czy potrzebujesz wyszukiwania semantycznego lub wyszukiwania klasycznego?
  2. Czy wiesz już, że dane potrzebne agentowi sztucznej inteligencji są wymagane przed upływem czasu (wstępnie pobrane dane) lub czy agent sztucznej inteligencji musi dynamicznie pobierać dane?
  3. Jak zapewnić bezpieczeństwo danych i zapobiec nadmiernemu udostępnianiu poufnych informacji?

Podczas opracowywania wtyczek do pobierania rozszerzonej generacji (RAG) można użyć dwóch typów wyszukiwania: wyszukiwania semantycznego i wyszukiwania klasycznego.

Wyszukiwanie semantyczne wykorzystuje wektorowe bazy danych do zrozumienia i pobrania informacji na podstawie znaczenia i kontekstu zapytania, a nie tylko pasujących słów kluczowych. Ta metoda umożliwia aparatowi wyszukiwania zrozumienie niuansów języka, takich jak synonimy, powiązane pojęcia i ogólna intencja za zapytaniem.

Wyszukiwanie semantyczne wyróżnia się w środowiskach, w których zapytania użytkowników są złożone, otwarte lub wymagają głębszego zrozumienia zawartości. Na przykład wyszukiwanie "najlepszych smartfonów do fotografii" daje wyniki, które uwzględniają kontekst funkcji fotograficznych w smartfonach, a nie tylko dopasowanie słów "najlepsze", "smartfony" i "fotografia".

W przypadku udostępniania usługi LLM z funkcją wyszukiwania semantycznego zwykle trzeba tylko zdefiniować funkcję za pomocą pojedynczego zapytania wyszukiwania. Funkcja LLM będzie następnie używać tej funkcji do pobierania niezbędnych informacji. Poniżej przedstawiono przykład funkcji wyszukiwania semantycznego, która używa usługi Azure AI Search do znajdowania dokumentów podobnych do danego zapytania.

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

Wyszukiwanie klasyczne, nazywane również wyszukiwaniem opartym na atrybutach lub kryteriach, opiera się na filtrowaniu i dopasowywaniu dokładnych terminów lub wartości w zestawie danych. Jest to szczególnie skuteczne w przypadku zapytań bazy danych, wyszukiwań spisu i sytuacji, w której konieczne jest filtrowanie według określonych atrybutów.

Jeśli na przykład użytkownik chce znaleźć wszystkie zamówienia złożone przez określony identyfikator klienta lub pobrać produkty w określonym zakresie cen i kategorii, wyszukiwanie klasyczne zapewnia dokładne i niezawodne wyniki. Wyszukiwanie klasyczne jest jednak ograniczone przez brak możliwości zrozumienia kontekstu lub odmian języka.

Napiwek

W większości przypadków istniejące usługi obsługują już wyszukiwanie klasyczne. Przed zaimplementowaniem wyszukiwania semantycznego należy rozważyć, czy istniejące usługi mogą zapewnić niezbędny kontekst dla agentów sztucznej inteligencji.

Na przykład wtyczka, która pobiera informacje o kliencie z systemu CRM przy użyciu wyszukiwania klasycznego. W tym miejscu sztuczna inteligencja musi po prostu wywołać GetCustomerInfoAsync funkcję z identyfikatorem klienta, aby pobrać niezbędne informacje.

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

Osiągnięcie tej samej funkcjonalności wyszukiwania za pomocą wyszukiwania semantycznego prawdopodobnie byłoby niemożliwe lub niepraktyczne ze względu na niedeterministyczny charakter zapytań semantycznych.

Kiedy należy używać każdego

Wybór między wyszukiwaniem semantycznym i klasycznym zależy od charakteru zapytania. Jest to idealne rozwiązanie dla środowisk o dużej zawartości, takich jak baza wiedzy i obsługa klienta, w których użytkownicy mogą zadawać pytania lub szukać produktów przy użyciu języka naturalnego. Z drugiej strony należy stosować wyszukiwanie klasyczne, gdy precyzja i dokładne dopasowania są ważne.

W niektórych scenariuszach może być konieczne połączenie obu podejść w celu zapewnienia kompleksowych możliwości wyszukiwania. Na przykład czatbot pomagający klientom w sklepie handlu elektronicznego może użyć wyszukiwania semantycznego, aby zrozumieć zapytania użytkowników i wyszukiwanie klasyczne w celu filtrowania produktów na podstawie określonych atrybutów, takich jak cena, marka lub dostępność.

Poniżej przedstawiono przykład wtyczki, która łączy semantyczne i klasyczne wyszukiwanie w celu pobrania informacji o produkcie z bazy danych handlu elektronicznego.

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
    }
}

Pobieranie danych dynamicznych i pobranych wstępnie

Podczas tworzenia wtyczek dla generacji rozszerzonej pobierania (RAG) należy również rozważyć, czy proces pobierania danych jest statyczny, czy dynamiczny. Dzięki temu można zoptymalizować wydajność agentów sztucznej inteligencji, pobierając dane tylko wtedy, gdy jest to konieczne.

Dynamiczne pobieranie danych

W większości przypadków zapytanie użytkownika określi dane, które musi pobrać agent sztucznej inteligencji. Na przykład użytkownik może poprosić o różnicę między dwoma różnymi produktami. Następnie agent sztucznej inteligencji będzie musiał dynamicznie pobierać informacje o produkcie z bazy danych lub interfejsu API, aby wygenerować odpowiedź przy użyciu wywołania funkcji. Niepraktyczne byłoby wstępne pobranie wszystkich możliwych informacji o produkcie przed upływem czasu i przekazanie ich agentowi sztucznej inteligencji.

Poniżej znajduje się przykład czatu z powrotem i z powrotem między użytkownikiem a agentem sztucznej inteligencji, w którym konieczne jest dynamiczne pobieranie danych.

Rola Komunikat
🔵Użytkownik Czy możesz mi powiedzieć o najlepszych materacach?
🔴Asystent (wywołanie funkcji) Products.Search("mattresses")
🟢Tool (Narzędzie dostępu do centrum danych) [{"id": 25323, "name": "Cloud Nine"},{"id": 63633, "name": "Best Sleep"}]
🔴Asystent Oczywiście. Mamy zarówno chmurę Nine, jak i najlepszy sen
🔵Użytkownik Jaka jest różnica między nimi?
🔴Asystent (wywołanie funkcji) Products.GetDetails(25323) Products.GetDetails(63633)
🟢Tool (Narzędzie dostępu do centrum danych) { "id": 25323, "name": "Cloud Nine", "price": 1000, "material": "Memory foam" }
🟢Tool (Narzędzie dostępu do centrum danych) { "id": 63633, "name": "Best Sleep", "price": 1200, "material": "Latex" }
🔴Asystent Chmura Nine jest wykonana z pianki pamięci i kosztuje 1000 USD. Best Sleep jest wykonany z lateksu i kosztuje $1200.

Pobieranie danych wstępnie pobranych

Pobieranie danych statycznych obejmuje pobieranie danych ze źródeł zewnętrznych i zawsze dostarczanie ich agentowi sztucznej inteligencji. Jest to przydatne, gdy dane są wymagane dla każdego żądania lub gdy dane są stosunkowo stabilne i nie zmieniają się często.

Weźmy na przykład agenta, który zawsze odpowiada na pytania dotyczące lokalnej pogody. Zakładając, że masz WeatherPluginelement , możesz wstępnie pobrać dane pogodowe z interfejsu API pogody i udostępnić je w historii czatów. Dzięki temu agent może wygenerować odpowiedzi dotyczące pogody bez marnowania czasu na żądanie danych z interfejsu 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);

Zabezpieczanie danych

Podczas pobierania danych ze źródeł zewnętrznych należy upewnić się, że dane są bezpieczne i że poufne informacje nie są ujawniane. Aby zapobiec nadmiernemu udostępnianiu poufnych informacji, można użyć następujących strategii:

Strategia opis
Korzystanie z tokenu uwierzytelniania użytkownika Unikaj tworzenia jednostek usługi używanych przez agenta sztucznej inteligencji do pobierania informacji dla użytkowników. Dzięki temu trudno jest sprawdzić, czy użytkownik ma dostęp do pobranych informacji.
Unikaj ponownego tworzenia usług wyszukiwania Przed utworzeniem nowej usługi wyszukiwania z wektorową bazą danych sprawdź, czy istnieje już dla usługi, która ma wymagane dane. Korzystając z istniejących usług, można uniknąć duplikowania poufnej zawartości, korzystać z istniejących mechanizmów kontroli dostępu i korzystać z istniejących mechanizmów filtrowania, które zwracają tylko dane, do których użytkownik ma dostęp.
Przechowywanie odwołania w wektorowych baz danych zamiast zawartości Zamiast duplikować zawartość wrażliwą do wektorowych baz danych, można przechowywać odwołania do rzeczywistych danych. Aby użytkownik mógł uzyskać dostęp do tych informacji, należy najpierw użyć tokenu uwierzytelniania w celu pobrania rzeczywistych danych.

Następne kroki

Teraz, gdy już wiesz, jak uziemić agentów sztucznej inteligencji przy użyciu danych ze źródeł zewnętrznych, możesz teraz dowiedzieć się, jak zautomatyzować procesy biznesowe za pomocą agentów sztucznej inteligencji. Aby dowiedzieć się więcej, zobacz Korzystanie z funkcji automatyzacji zadań.