Megosztás a következőn keresztül:


Beépülő modulok használata a bővített lekéréses generációhoz (RAG)

Az AI-ügynököknek gyakran külső forrásokból kell adatokat lekérniük a megalapozott válaszok létrehozásához. E további kontextus nélkül az AI-ügynökök hallucinálhatnak vagy helytelen információkat adhatnak meg. Ennek megoldásához beépülő modulokkal külső forrásokból is lekérheti az adatokat.

Ha a retrieveal augmented Generation (RAG) beépülő moduljait fontolgatja, két kérdést kell feltennie magának:

  1. Hogyan fogja "megkeresni" a szükséges adatokat (vagy az AI-ügynökét) ? Szüksége van szemantikai keresésre vagy klasszikus keresésre?
  2. Tudja már, hogy az AI-ügynöknek milyen adatokra van szüksége előre (előre lekért adatok), vagy az AI-ügynöknek dinamikusan kell lekérnie az adatokat?
  3. Hogyan őrizheti meg adatai biztonságát, és hogyan akadályozhatja meg a bizalmas adatok túlzott megosztását?

Ha beépülő modulokat fejleszt a Retrieveal Augmented Generation (RAG) szolgáltatáshoz, kétféle keresési típust használhat: szemantikai keresést és klasszikus keresést.

A szemantikai keresés vektoradatbázisokat használ a lekérdezés jelentése és kontextusa alapján történő információk megértéséhez és lekéréséhez, nem csupán a kulcsszavak egyezéséhez. Ez a módszer lehetővé teszi, hogy a keresőmotor megértse a nyelv árnyalatait, például a szinonimákat, a kapcsolódó fogalmakat és a lekérdezés mögötti általános szándékot.

A szemantikus keresés olyan környezetekben működik, ahol a felhasználói lekérdezések összetettek, nyitottak, vagy a tartalom mélyebb megértését igénylik. Például a "legjobb okostelefonok a fényképezéshez" keresés olyan eredményeket eredményezne, amelyek figyelembe veszik az okostelefonok fényképezési funkcióinak kontextusát, és nem csupán a "legjobb", "okostelefonok" és "fényképezés" szavakat egyeztetik.

Ha szemantikai keresési függvényt biztosít egy LLM-nek, általában csak egyetlen keresési lekérdezéssel kell meghatároznia egy függvényt. Az LLM ezt a függvényt fogja használni a szükséges információk lekéréséhez. Az alábbiakban egy szemantikai keresési függvény látható, amely az Azure AI Search használatával keres egy adott lekérdezéshez hasonló dokumentumokat.

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

A klasszikus keresés, más néven attribútumalapú vagy feltételalapú keresés az adathalmazon belüli pontos kifejezések vagy értékek szűrésére és egyeztetésére támaszkodik. Különösen hatékony adatbázis-lekérdezések, leltárkeresések és minden olyan helyzet esetén, amikor adott attribútumok szerinti szűrésre van szükség.

Ha például egy felhasználó egy adott ügyfélazonosító által leadott összes megrendelést meg szeretne keresni, vagy egy adott ártartományban és kategóriában szeretné lekérni a termékeket, a klasszikus keresés pontos és megbízható eredményeket biztosít. A klasszikus keresés azonban korlátozott, mert nem tudja értelmezni a kontextust vagy a nyelvi változatokat.

Tipp.

A legtöbb esetben a meglévő szolgáltatások már támogatják a klasszikus keresést. Szemantikai keresés implementálása előtt gondolja át, hogy a meglévő szolgáltatások képesek-e biztosítani a szükséges környezetet az AI-ügynökök számára.

Vegyük például azt a beépülő modult, amely klasszikus kereséssel kéri le az ügyféladatokat egy CRM-rendszerből. Itt az AI-nek egyszerűen meg kell hívnia a GetCustomerInfoAsync függvényt egy ügyfélazonosítóval a szükséges információk lekéréséhez.

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

Az azonos keresési funkciók szemantikai kereséssel való elérése valószínűleg lehetetlen vagy nem praktikus a szemantikai lekérdezések nem determinisztikus jellege miatt.

Mikor érdemes használni az egyeseket?

A szemantikai és a klasszikus keresés közötti választás a lekérdezés jellegétől függ. Ideális olyan tartalomigényes környezetekhez, mint a tudásbázis és az ügyfélszolgálat, ahol a felhasználók kérdéseket tehetnek fel, vagy természetes nyelvet használó termékeket keresnek. A klasszikus keresést viszont akkor érdemes alkalmazni, ha a pontosság és a pontos egyezések fontosak.

Egyes esetekben előfordulhat, hogy mindkét módszert össze kell kapcsolnia, hogy átfogó keresési képességeket biztosítson. Egy e-kereskedelmi áruház ügyfeleit segítő csevegőrobot például szemantikai kereséssel értelmezheti a felhasználói lekérdezéseket, és a klasszikus kereséssel szűrheti a termékeket bizonyos attribútumok, például az ár, a márka vagy a rendelkezésre állás alapján.

Az alábbiakban egy példa egy beépülő modulra, amely a szemantikai és a klasszikus kereséseket kombinálva kéri le a termékinformációkat egy e-kereskedelmi adatbázisból.

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

Dinamikus és előre beolvasott adatok lekérése

Ha beépülő modulokat fejleszt lekéréses kiterjesztett generációhoz (RAG), azt is figyelembe kell vennie, hogy az adatlekérési folyamat statikus vagy dinamikus-e. Ez lehetővé teszi az AI-ügynökök teljesítményének optimalizálását úgy, hogy csak szükség esetén lekért adatokat.

Dinamikus adatlekérés

A legtöbb esetben a felhasználói lekérdezés határozza meg azokat az adatokat, amelyeket az AI-ügynöknek le kell kérnie. Előfordulhat például, hogy a felhasználó két különböző termék közötti különbséget kéri. Az AI-ügynöknek ezután dinamikusan le kell kérnie a termékinformációkat egy adatbázisból vagy API-ból, hogy függvényhívással hozzon létre választ. Nem lenne célszerű előre lekérni az összes lehetséges termékinformációt, és átadni az AI-ügynöknek.

Az alábbiakban egy példa egy felhasználó és egy AI-ügynök közötti oda-vissza csevegésre, ahol dinamikus adatlekérésre van szükség.

Szerepkör Üzenet
🔵Felhasználó Tudsz mesélni a legjobb matracokról?
🔴Asszisztens (függvényhívás) Products.Search("mattresses")
🟢Eszköz [{"id": 25323, "name": "Cloud Nine"},{"id": 63633, "name": "Best Sleep"}]
🔴Asszisztens Igen! A Cloud Nine és a Best Sleep is rendelkezik
🔵Felhasználó Mi a különbség közöttük?
🔴Asszisztens (függvényhívás) Products.GetDetails(25323) Products.GetDetails(63633)
🟢Eszköz { "id": 25323, "name": "Cloud Nine", "price": 1000, "material": "Memory foam" }
🟢Eszköz { "id": 63633, "name": "Best Sleep", "price": 1200, "material": "Latex" }
🔴Asszisztens A Cloud Nine memóriahabból készült, és 1000 dollárba kerül. A legjobb alvás latexből készült, és 1200 dollárba kerül.

Előre beolvasott adatok lekérése

A statikus adatlekérés magában foglalja az adatok külső forrásokból való lekérését, és mindig az AI-ügynöknek való biztosítását. Ez akkor hasznos, ha az adatok minden kéréshez szükségesek, vagy ha az adatok viszonylag stabilak, és nem változnak gyakran.

Vegyük például azt az ügynököt, amely mindig választ ad a helyi időjárásra vonatkozó kérdésekre. Feltételezve, hogy rendelkezik egy WeatherPluginidőjárási adatokkal, előre lekérheti az időjárási adatokat egy időjárási API-ból, és megadhatja azokat a csevegési előzményekben. Ez lehetővé teszi az ügynök számára, hogy válaszokat generáljon az időjárásról anélkül, hogy időt kér az API-tól az adatok lekérésére.

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

Az adatok biztonságának megőrzése

Külső forrásokból történő adatok lekérésekor fontos biztosítani, hogy az adatok biztonságosak legyenek, és hogy a bizalmas információk ne legyenek közzétéve. A bizalmas információk túlzott megosztásának megakadályozása érdekében az alábbi stratégiákat használhatja:

Stratégia Leírás
A felhasználó hitelesítési jogkivonatának használata Kerülje az AI-ügynök által a felhasználók adatainak lekéréséhez használt szolgáltatásnevek létrehozását. Ez megnehezíti annak ellenőrzését, hogy a felhasználó hozzáfér-e a lekért információkhoz.
A keresési szolgáltatások újrakészítésének elkerülése Mielőtt vektoradatbázissal hoz létre új keresési szolgáltatást, ellenőrizze, hogy létezik-e már olyan szolgáltatás, amely rendelkezik a szükséges adatokkal. A meglévő szolgáltatások újrafelhasználásával elkerülheti a bizalmas tartalmak duplikálását, kihasználhatja a meglévő hozzáférés-vezérléseket, és olyan meglévő szűrési mechanizmusokat használhat, amelyek csak olyan adatokat adnak vissza, amelyekhez a felhasználónak hozzáférése van.
Referenciák tárolása vektoros DB-kben tartalom helyett Ahelyett, hogy a bizalmas tartalmat vektoros DB-kre duplikálná, a tényleges adatokra mutató hivatkozásokat is tárolhat. Ahhoz, hogy egy felhasználó hozzáférhessen ezekhez az információkhoz, a hitelesítési jogkivonatát először a valós adatok lekéréséhez kell használni.

Következő lépések

Most, hogy most már a külső forrásokból származó adatokkal alapozza meg az AI-ügynököket, megtanulhatja, hogyan automatizálhatja az üzleti folyamatokat AI-ügynökökkel. További információ: feladatautomatizálási függvények használata.