Använda Redis för minneslagring med Semantic Kernel SDK
Den här artikeln visar hur du integrerar en Redis-databas med RediSearch-modulen i Semantic Kernel SDK och använder den för minneslagring och hämtning.
Vektorlager representerar textinformation som har lagrats tillsammans med en fördefinierad inbäddningsvektor för hela texten. När en LLM uppmanas att återkalla ett minne använder den dessa förberäknade inbäddningar för att effektivt utvärdera om ett minne är relevant för prompten. När LLM hittar ett matchande minne använder den minnets textinformation som kontext för nästa steg i promptens slutförande.
Minneslagring som läggs till i Semantic Kernel SDK ger en bredare kontext för dina begäranden. Du kan också lagra data på samma sätt som du lagrar en traditionell databas, men köra frågor mot dem med hjälp av naturligt språk.
Förutsättningar
- Ett Azure-konto som har en aktiv prenumeration. Skapa ett konto utan kostnad.
- .NET SDK
Microsoft.SemanticKernel
NuGet-paketMicrosoft.SemanticKernel.Connectors.Redis
NuGet-paketMicrosoft.SemanticKernel.Plugins.Memory
NuGet-paketStackExchange.Redis
NuGet-paket- En Redis-databas som har RediSearch-modulen, distribuerad och tillgänglig för ditt .NET-program
Implementera minneslagring med hjälp av en Redis-databas
Innan du integrerar Redis-databasen med Semantic Kernel SDK kontrollerar du att RediSearch-modulen är aktiverad. Modulinformation för Azure Cache for Redis finns i Använda Redis-moduler med Azure Cache for Redis.
Initiera en anslutning till Redis-databasen. Till exempel:
// 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();
Skapa genom att
Kernel
inkluderaITextEmbeddingGenerationService
. Till exempel:// 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();
Omslut Redis-databasen i en
RedisMemoryStore
instans och initiera sedan ettSemanticTextMemory
objekt med hjälp av minnesarkivet och inbäddningsgenereringstjänsten. Till exempel:// 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);
Lägg till det semantiska textminnet
Kernel
i med hjälpTextMemoryPlugin
av klassen . Till exempel:// Initialize a TextMemoryPlugin using the text memory. TextMemoryPlugin memoryPlugin = new(textMemory); // Import the text memory plugin into the Kernel. KernelPlugin memory = kernel.ImportPluginFromObject(memoryPlugin);
Kernel
Använd plugin-programmet och för att spara, hämta och återkalla minnen. Till exempel:// 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")}" );
Använd minnesåterkallelse som en del av en uppmaning med hjälp av syntaxen för promptmallen
{{...}}
. Till exempel:// 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}");
Relaterat innehåll
- [Använd RAG med SQL]
- [Datainmatning från SharePoint]
- [Arbeta med vektordatabaser]