Use o Redis para armazenamento de memória com o SDK do Kernel Semântico
Este artigo demonstra como integrar um banco de dados Redis com o módulo RediSearch no SDK do kernel semântico e usá-lo para armazenamento e recuperação de memória.
Os armazenamentos vetoriais representam informações de texto que foram armazenadas ao lado de um vetor de incorporação pré-calculado para todo o texto. Quando um LLM é solicitado a recuperar uma memória, ele usa essas incorporações pré-computadas para avaliar com eficiência se uma memória é relevante para o prompt. Depois que o LLM encontra uma memória correspondente, ele usa as informações de texto da memória como contexto para as próximas etapas na conclusão do prompt.
O armazenamento de memória adicionado ao SDK do kernel semântico fornece um contexto mais amplo para suas solicitações. Ele também permite que você armazene dados da mesma maneira que armazena um banco de dados tradicional, mas consulte-o usando linguagem natural.
Pré-requisitos
- Uma conta do Azure que tenha uma assinatura ativa. Crie uma conta gratuitamente.
- SDK do .NET
Microsoft.SemanticKernel
Pacote NuGetMicrosoft.SemanticKernel.Connectors.Redis
Pacote NuGetMicrosoft.SemanticKernel.Plugins.Memory
Pacote NuGetStackExchange.Redis
Pacote NuGet- Um banco de dados Redis que tem o módulo RediSearch, implantado e acessível ao seu aplicativo .NET
Implementar armazenamento de memória usando um banco de dados Redis
Antes de integrar seu banco de dados Redis ao SDK do Kernel Semântico, verifique se o módulo RediSearch está ativado. Para obter informações sobre o módulo do Cache do Azure para Redis, consulte Usar módulos Redis com o Cache do Azure para Redis.
Inicialize uma conexão com seu banco de dados Redis. Por exemplo:
// 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();
Construa o
Kernel
incluindoITextEmbeddingGenerationService
. Por exemplo:// 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();
Envolva o banco de dados Redis em uma
RedisMemoryStore
instância e, em seguida, inicialize umSemanticTextMemory
objeto usando o armazenamento de memória e o serviço de geração de incorporação. Por exemplo:// 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);
Adicione a memória de texto semântico
Kernel
ao usando aTextMemoryPlugin
classe. Por exemplo:// Initialize a TextMemoryPlugin using the text memory. TextMemoryPlugin memoryPlugin = new(textMemory); // Import the text memory plugin into the Kernel. KernelPlugin memory = kernel.ImportPluginFromObject(memoryPlugin);
Use o
Kernel
plug-in e para salvar, recuperar e recuperar memórias. Por exemplo:// 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")}" );
Use a recuperação de memória como parte de um prompt usando a sintaxe
{{...}}
do modelo de prompt . Por exemplo:// 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}");
Conteúdos relacionados
- [Usar RAG com SQL]
- [Ingestão de dados do SharePoint]
- [Trabalhando com bancos de dados vetoriais]