Beolvasási bővített generáció (RAG) hozzáadása szemantikus kernelügynökökhöz

Figyelmeztetés

A Szemantic Kernel Agent RAG funkciója kísérleti jellegű, változhat, és csak visszajelzés és értékelés alapján lesz véglegesítve.

A TextSearchProvider használata a RAG-hoz

Ez Microsoft.SemanticKernel.Data.TextSearchProvider lehetővé teszi az ügynökök számára, hogy a felhasználói bemenetek alapján lekérjék a releváns dokumentumokat, és beszúrják őket az ügynök környezetébe a megalapozottabb válaszok érdekében. Integrál egy példányt Microsoft.SemanticKernel.Data.ITextSearch Szemantikus Kernel-ügynökökkel. Több ITextSearch implementáció létezik, amelyek támogatják a vektortárolók hasonlósági kereséseit és a keresőmotorok integrációját. További információt itt talál.

Emellett biztosítunk egy Microsoft.SemanticKernel.Data.TextSearchStore, a szöveges adatok egyszerű, véleményezett vektoros tárolását is a kibővített lekéréses generálás érdekében. TextSearchStore beépített sémával rendelkezik a szöveges adatok vektortárolóban való tárolásához és lekéréséhez. Ha saját sémát szeretne használni a tároláshoz, tekintse meg a VectorStoreTextSearch webhelyet.

A TextSearchProvider beállítása

A TextSearchProvider, VectorStore, és TextSearchStore használható szöveges dokumentumok tárolására és keresésére.

Az alábbi példa bemutatja, hogyan állíthat be és használhatja az ügynök az TextSearchProvider, TextSearchStore és InMemoryVectorStore egyszerű RAG-végrehajtáshoz szövegen keresztül.

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

Speciális funkciók: Idézetek és szűrés

Olyan TextSearchStore speciális funkciókat támogat, mint például az eredmények névtér szerinti szűrése, valamint a válaszokban szereplő idézetek is.

Idézeteket beleértve

A TextSearchStore dokumentumok tartalmazhatnak metaadatokat, például forrásneveket és hivatkozásokat, amelyek lehetővé teszik az idézetek létrehozását az ügynökválaszokban.

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

Amikor a TextSearchProvider dokumentum lekéri a dokumentumot, alapértelmezés szerint a forrás nevét és a hivatkozást fogja tartalmazni a válaszában.

Szűrés névtér szerint

Dokumentumok létrehozásakor igény szerint megadhat egy vagy több névteret az egyes dokumentumokhoz. A névterek lehetnek olyan sztringek, amelyek meghatározzák a dokumentum hatókörét. Ezután konfigurálhatja úgy, hogy a TextSearchStore keresési eredményeket csak a kért névtérnek megfelelő rekordokra korlátozza.

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

Automatikus vagy igény szerinti RAG

A TextSearchProvider felhasználók automatikusan végezhetnek keresést az egyes ügynökök meghívása során, vagy engedélyezhetik az igény szerinti keresést eszközhívásokon keresztül, amikor az ügynöknek további információra van szüksége.

Az alapértelmezett beállítás az BeforeAIInvoke, ami azt jelenti, hogy a keresések az ügynöknek átadott üzenet használatával minden ügynök meghívása előtt lesznek végrehajtva. Ez módosítható úgy, hogy OnDemandFunctionCalling, az ügynök eszközhívást kezdeményezhet az általa választott keresési sztring használatával történő kereséshez.

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

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

Figyelmeztetés

A TextSearchProvider és a OnDemandFunctionCalling együttes használatakor az UseImmutableKernel beállítását az ügynöknél true-ra kell állítani, mivel a funkció megköveteli a kernel klónozását, amikor az ügynök meghívja a OnDemandFunctionCalling. Vegye figyelembe, hogy a UseImmutableKernel értékének true-re történő beállítása azt jelenti, hogy az ügynök meghívása során, például beépülő modulok által végrehajtott kerneladat-módosítások, a meghívás befejeződése után nem lesznek megtartva.

TextSearchProvider-beállítások

A TextSearchProvider különböző beállításokkal konfigurálható a viselkedés testreszabásához. A beállításokat az TextSearchProviderOptions osztály használatával adták meg a TextSearchProvider konstruktornak.

Felső

A hasonlósági keresésből visszaadandó találatok maximális számát adja meg.

  • Alapértelmezett: 3

Keresési Idő

Szabályozza a szövegkeresést. A lehetőségek a következők:

  • BeforeAIInvoke: A rendszer minden alkalommal keresést hajt végre, amikor a modell/ügynök meghívása történik, nem sokkal a meghívás előtt, és az eredményeket a rendszer a meghívási környezeten keresztül látja el a modell/ügynök számára.
  • OnDemandFunctionCalling: A modell/ügynök igény szerint, függvényhívással végezhet keresést.

PluginFunctionName

Megadja annak a beépülő modulnak a nevét, amely elérhetővé válik kereséshez, ha SearchTimeOnDemandFunctionCalling értékre van állítva.

  • Alapértelmezett: "Keresés"

Plugin funkció leírása

A beépülő modul metódusának leírását adja meg, amely akkor lesz elérhető a kereséshez, ha SearchTime be van állítva OnDemandFunctionCalling.

  • Alapértelmezett: "Lehetővé teszi további információk keresését a felhasználói kérdés megválaszolásához."

ContextPrompt

Amikor meghíváskor megadja a szöveges adattömböket az AI-modellnek, a rendszer kérni fogja, hogy jelezze az AI-modellnek, hogy mire szolgálnak a szöveges adattömbök, és hogyan kell használni őket. Ez a beállítás lehetővé teszi az alapértelmezett, a TextSearchProvider-be beépített üzenetküldés felülírását.

Kérjük, hogy a forrásokat is feltüntesse.

Amikor a szöveges adattömböket az AI-modellnek adjuk meg futás közben, egy utasítás szükséges, amely meghatározza, hogy kell-e idézeteket készíteni, és ha igen, hogyan. Ez a beállítás lehetővé teszi az alapértelmezett, a TextSearchProvider-be beépített üzenetküldés felülírását.

ContextFormatter

Ezzel az opcionális visszahívással teljesen testre szabható a szöveg, amelyet a TextSearchProviderrendszer állít elő. Alapértelmezés szerint a TextSearchProvider program olyan szöveget állít elő, amely tartalmazza a

  1. Egy üzenet, amely közli az AI-modellel, hogy mire valók a szöveges adattömbök.
  2. A forráshivatkozásokat és neveket tartalmazó szövegtömbök listája.
  3. Az AI-modellnek az idézetek beleillesztésével kapcsolatos kérése.

A callback implementálásával és megadásával megírhatja a saját kimenetét.

Megjegyzés: Ha ez a meghatalmazott meg van adva, a rendszer nem használja a ContextPromptIncludeCitationsPrompt beállításokat.

A RAG és más szolgáltatók kombinálása

A TextSearchProvider kombinálható más szolgáltatókkal, például mem0 vagy WhiteboardProvider, hogy memóriával és lekérési képességekkel rendelkező ügynököket hozzon létre.

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

A funkciók kombinálásával az ügynökök személyre szabottabb és környezettudatosabb élményt nyújtanak.

Következő lépések

Hamarosan elérhető

Hamarosan további információk is érkeznek.

Hamarosan elérhető

Hamarosan további információk is érkeznek.