Udostępnij za pośrednictwem


Używanie usługi Redis do magazynowania pamięci za pomocą zestawu SDK jądra semantycznego

W tym artykule pokazano, jak zintegrować bazę danych Redis z modułem RediSearch z zestawem SDK jądra semantycznego i używać jej do przechowywania i pobierania pamięci.

Magazyny wektorów reprezentują informacje tekstowe przechowywane wraz ze wstępnie skompilowanym wektorem osadzania dla całego tekstu. Gdy zostanie wyświetlony monit o wycofanie pamięci przez moduł LLM, użyje tych wstępnie skompilowanych osadzeń, aby efektywnie ocenić, czy pamięć jest odpowiednia dla monitu. Po znalezieniu zgodnej pamięci program LLM używa informacji tekstowych pamięci jako kontekstu do następnych kroków po zakończeniu monitu.

Magazyn pamięci dodany do zestawu SDK jądra semantycznego zapewnia szerszy kontekst dla żądań. Umożliwia również przechowywanie danych w taki sam sposób, jak w przypadku przechowywania tradycyjnej bazy danych, ale wykonywanie zapytań za pomocą języka naturalnego.

Wymagania wstępne

Implementowanie magazynu pamięci przy użyciu bazy danych Redis

Przed zintegrowanie bazy danych Redis z zestawem SDK jądra semantycznego upewnij się, że moduł RediSearch jest włączony. Aby uzyskać informacje o module dla usługi Azure Cache for Redis, zobacz Use Redis modules with Azure Cache for Redis (Używanie modułów Redis z usługą Azure Cache for Redis).

  1. Zainicjuj połączenie z bazą danych Redis. Na przykład:

    // 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. Skompiluj element, dołączając ITextEmbeddingGenerationServiceelement Kernel . Na przykład:

    // 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. Opakuj bazę danych Redis w wystąpieniu RedisMemoryStore , a następnie zainicjuj SemanticTextMemory obiekt przy użyciu magazynu pamięci i osadzania usługi generowania. Na przykład:

    // 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. Dodaj pamięć tekstu semantycznego do Kernel klasy przy użyciu TextMemoryPlugin klasy . Na przykład:

    // 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. Kernel Użyj wtyczki i, aby zapisać, pobrać i odwołać wspomnienia. Na przykład:

    // 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. Użyj odwołania pamięci w ramach monitu przy użyciu składni {{...}}szablonu monitu . Na przykład:

    // 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}");
    
  • [Korzystanie z narzędzia RAG z bazą danych SQL]
  • [Pozyskiwanie danych z programu SharePoint]
  • [Praca z wektorowymi bazami danych]