Freigeben über


Verwenden von Redis für die Speicherung von Erinnerungen mit dem Semantic Kernel SDK

In diesem Artikel wird veranschaulicht, wie Sie eine Redis-Datenbank mit dem RediSearch-Modul in das Semantic Kernel SDK integrieren und für Speicherung und Abruf von Erinnerungen verwenden.

Vektorspeicher stellen Textinformationen dar, die zusammen mit einem vorberechneten Einbettungsvektor für den gesamten Text gespeichert wurden. Wenn ein LLM zum Abrufen einer Erinnerung aufgefordert wird, verwendet es diese vorausberechneten Einbettungen, um effizient auszuwerten, ob eine Erinnerung für die Eingabeaufforderung relevant ist. Nachdem das LLM einen übereinstimmende Erinnerung gefunden hat, verwendet es die Textinformationen der Erinnerung als Kontext für die nächsten Schritte im Eingabeaufforderungsabschluss.

Erinnerungsspeicher, der dem Semantic Kernel SDK hinzugefügt wird, bietet einen breiteren Kontext für Ihre Anforderungen. Außerdem können Sie Daten auf die gleiche Weise speichern wie eine herkömmliche Datenbank, sie aber mithilfe natürlicher Sprache abfragen.

Voraussetzungen

Implementieren von Erinnerungsspeicher mithilfe einer Redis-Datenbank

Bevor Sie Ihre Redis-Datenbank in das Semantic Kernel SDK integrieren, stellen Sie sicher, dass das RediSearch-Modul aktiviert ist. Modulinformationen zu Azure Cache for Redis finden Sie unter Verwenden von Redis-Modulen mit Azure Cache for Redis.

  1. Initialisieren Sie eine Verbindung mit Ihrer Redis-Datenbank. Zum Beispiel:

    // Retrieve the Redis connection config.
    IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
    string redisConfig = config["REDIS_CONFIG"]!;
    
    // Initialize a connection to the Redis database.
    ConnectionMultiplexer connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(
        redisConfig
    );
    IDatabase database = connectionMultiplexer.GetDatabase();
    
  2. Erstellen Sie Kernel, indem Sie ITextEmbeddingGenerationService einschließen. Zum Beispiel:

    // Retrieve the Azure OpenAI config and secrets saved during deployment.
    string endpoint = config["AZURE_OPENAI_ENDPOINT"]!;
    string embeddingModel = config["AZURE_OPENAI_EMBEDDING_NAME"]!;
    string completionModel = config["AZURE_OPENAI_GPT_NAME"]!;
    string key = config["AZURE_OPENAI_KEY"]!;
    
    // Build the Kernel; must add an embedding generation service.
    Kernel kernel = Kernel
        .CreateBuilder()
        .AddAzureOpenAITextEmbeddingGeneration(embeddingModel, endpoint, key)
        .AddAzureOpenAIChatCompletion(completionModel, endpoint, key)
        .Build();
    
  3. Umschließen Sie die Redis-Datenbank in einer RedisMemoryStore-Instanz, und initialisieren Sie dann ein SemanticTextMemory-Objekt mithilfe des Diensts für Erinnerungsspeicher und Einbettungsgenerierung. Zum Beispiel:

    // Retrieve the desired vector size for the memory store.
    // If unspecified, the default vector size is 1536.
    int vectorSize = int.Parse(config["REDIS_MEMORY_VECTOR_SIZE"]!);
    
    // Initialize a memory store using the redis database
    IMemoryStore memoryStore = new RedisMemoryStore(database, vectorSize);
    
    // Retrieve the embedding service from the Kernel.
    ITextEmbeddingGenerationService embeddingService =
        kernel.Services.GetRequiredService<ITextEmbeddingGenerationService>();
    
    // Initialize a SemanticTextMemory using the memory store and embedding generation service.
    SemanticTextMemory textMemory = new(memoryStore, embeddingService);
    
  4. Fügen Sie die semantische Texterinnerung mithilfe der TextMemoryPlugin-Klasse zu Kernel hinzu. Zum Beispiel:

    // Initialize a TextMemoryPlugin using the text memory.
    TextMemoryPlugin memoryPlugin = new(textMemory);
    
    // Import the text memory plugin into the Kernel.
    KernelPlugin memory = kernel.ImportPluginFromObject(memoryPlugin);
    
  5. Verwenden Sie Kernel und das Plug-In, um Erinnerungen zu speichern und abzurufen. Zum Beispiel:

    // Retrieve the desired memory collection name.
    string memoryCollectionName = config["REDIS_MEMORY_COLLECTION_NAME"]!;
    
    // Save a memory with the Kernel.
    await kernel.InvokeAsync(
        memory["Save"],
        new()
        {
            [TextMemoryPlugin.InputParam] = "My family is from New York",
            [TextMemoryPlugin.CollectionParam] = memoryCollectionName,
            [TextMemoryPlugin.KeyParam] = "info1",
        }
    );
    
    // Retrieve a memory with the Kernel.
    FunctionResult result = await kernel.InvokeAsync(
        memory["Retrieve"],
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollectionName,
            [TextMemoryPlugin.KeyParam] = "info1",
        }
    );
    
    // Get the memory string from the function result; returns a null value if no memory is found.
    Console.WriteLine(
        $"Retrieved memory: {result.GetValue<string>() ?? "ERROR: memory not found"}"
    );
    
    // Alternatively, recall similar memories with the Kernel.
    // Can configure the memory collection, number of memories to recall, and relevance score.
    result = await kernel.InvokeAsync(
        memory["Recall"],
        new()
        {
            [TextMemoryPlugin.InputParam] = "Ask: where do I live?",
            [TextMemoryPlugin.CollectionParam] = memoryCollectionName,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    
    // If memories are recalled, the function result can be deserialized as a string[].
    string? resultStr = result.GetValue<string>();
    string[]? parsedResult = string.IsNullOrEmpty(resultStr)
        ? null
        : JsonSerializer.Deserialize<string[]>(resultStr);
    Console.WriteLine(
        $"Recalled memories: {(parsedResult?.Length > 0 ? resultStr : "ERROR: memory not found")}"
    );
    
  6. Verwenden Sie den Abruf von Erinnerungen als Teil einer Eingabeaufforderung mithilfe der Eingabeaufforderungsvorlagensyntax {{...}}. Zum Beispiel:

    // Create a prompt that includes memory recall.
    // The {{...}} syntax represents an expression to Semantic Kernel.
    // For more information on this syntax see:
    // https://learn.microsoft.com/semantic-kernel/prompts/prompt-template-syntax
    string memoryRecallPrompt = """ 
        Consider only the facts below when answering questions:
    
        BEGIN FACTS
        About me: {{recall 'where did I grow up?'}}
        END FACTS
    
        Question: What are some fun facts about my home state?
        """;
    
    // Invoke the prompt with the Kernel.
    // Must configure the memory collection, number of memories to recall, and relevance score.
    resultStr = await kernel.InvokePromptAsync<string>(
        memoryRecallPrompt,
        new()
        {
            [TextMemoryPlugin.CollectionParam] = memoryCollectionName,
            [TextMemoryPlugin.LimitParam] = "2",
            [TextMemoryPlugin.RelevanceParam] = "0.79",
        }
    );
    
    // If the memory recall fails, the model will indicate it has missing information in its output.
    // Otherwise the output will incorporate your memory as context.
    Console.WriteLine($"Output: {resultStr}");
    
  • [Verwenden von RAG mit SQL]
  • [Datenerfassung aus SharePoint]
  • [Arbeiten mit Vektordatenbanken]