Použití Redisu pro úložiště paměti se sadou SDK sémantického jádra
Tento článek ukazuje, jak integrovat databázi Redis s modulem RediSearch do semantické sady SDK jádra a použít ji k ukládání a načítání paměti.
Vektorová úložiště představují textové informace, které byly uloženy společně s předem vypočítaným vloženým vektorem pro celý text. Když se zobrazí výzva k odvolání paměti, použije tyto předpočítané vkládání k efektivnímu vyhodnocení toho, jestli je paměť pro tuto výzvu relevantní. Jakmile LLM najde odpovídající paměť, použije textové informace o paměti jako kontext pro další kroky v dokončení výzvy.
Úložiště paměti přidané do semantické sady SDK jádra poskytuje širší kontext vašich požadavků. Umožňuje také ukládat data stejným způsobem jako v tradiční databázi, ale dotazovat se na ni pomocí přirozeného jazyka.
Požadavky
- Účet Azure, který má aktivní předplatné. Vytvoření účtu zdarma
- .NET SDK
Microsoft.SemanticKernel
Balíček NuGetMicrosoft.SemanticKernel.Connectors.Redis
Balíček NuGetMicrosoft.SemanticKernel.Plugins.Memory
Balíček NuGetStackExchange.Redis
Balíček NuGet- Databáze Redis, která má modul RediSearch, nasazený a přístupný pro vaši aplikaci .NET
Implementace úložiště paměti pomocí databáze Redis
Před integrací databáze Redis do semantické sady SDK jádra se ujistěte, že máte povolený modul RediSearch. Informace o modulu pro Azure Cache for Redis najdete v tématu Použití modulů Redis se službou Azure Cache for Redis.
Inicializuje připojení k databázi Redis. Příklad:
// 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();
Sestaví se zahrnutím
Kernel
ITextEmbeddingGenerationService
. Příklad:// 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();
Zabalte databázi Redis do
RedisMemoryStore
instance a pak inicializujeteSemanticTextMemory
objekt pomocí úložiště paměti a služby generování vkládání. Příklad:// 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);
Přidejte sémantickou textovou paměť do
Kernel
TextMemoryPlugin
třídy. Příklad:// 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
Pomocí modulu plug-in můžete ukládat, načítat a odvolat vzpomínky. Příklad:// 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")}" );
Použití odvolání paměti jako součást výzvy pomocí syntaxe šablony výzvy
{{...}}
. Příklad:// 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}");
Související obsah
- [Použití RAG s SQL]
- [Příjem dat ze SharePointu]
- [Práce s vektorovými databázemi]