의미 체계 커널 SDK를 통해 메모리 스토리지를 위해 Redis를 사용합니다.
이 문서에서는 RediSearch 모듈이 포함된 Redis 데이터베이스를 의미 체계 커널 SDK에 통합하고 이를 메모리 스토리지 및 검색에 사용하는 방법을 보여 줍니다.
벡터 저장소는 전체 텍스트에 대해 미리 계산된 임베딩 벡터와 함께 저장된 텍스트 정보를 나타냅니다. LLM이 메모리를 불러오라는 메시지가 표시되면 미리 계산된 포함을 사용하여 메모리가 메시지와 관련이 있는지 효율적으로 평가합니다. LLM은 일치하는 메모리를 찾은 후 메모리의 텍스트 정보를 프롬프트 완료의 다음 단계에 대한 컨텍스트로 사용합니다.
의미 체계 커널 SDK에 추가된 메모리 스토리지는 요청에 대한 더 광범위한 컨텍스트를 제공합니다. 또한 기존 데이터베이스를 저장하는 것과 동일한 방식으로 데이터를 저장할 수 있지만 자연어를 사용하여 쿼리할 수 있습니다.
필수 조건
- 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
- .NET SDK
Microsoft.SemanticKernel
NuGet 패키지Microsoft.SemanticKernel.Connectors.Redis
NuGet 패키지Microsoft.SemanticKernel.Plugins.Memory
NuGet 패키지StackExchange.Redis
NuGet 패키지- RediSearch 모듈이 있고 .NET 애플리케이션에 배포되어 액세스할 수 있는 Redis 데이터베이스
Redis 데이터베이스를 사용하여 메모리 스토리지 구현
Redis 데이터베이스를 의미 체계 커널 SDK에 통합하기 전에 RediSearch 모듈이 사용하도록 설정되어 있는지 확인합니다. Azure Cache for Redis에 대한 모듈 정보는 Azure Cache for Redis와 함께 Redis 모듈 사용을 참조하세요.
Redis 데이터베이스에 대한 연결을 초기화합니다. 예시:
// 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();
ITextEmbeddingGenerationService
를 포함하여Kernel
을 빌드합니다. 예시:// 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();
Redis 데이터베이스를
RedisMemoryStore
인스턴스로 래핑한 다음 메모리 저장소 및 포함 생성 서비스를 사용하여SemanticTextMemory
개체를 초기화합니다. 예시:// 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);
TextMemoryPlugin
클래스를 사용하여 의미 체계 텍스트 메모리를Kernel
에 추가합니다. 예시:// 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
및 플러그 인을 사용하여 추억을 저장, 검색 및 불러올 수 있습니다. 예시:// 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")}" );
프롬프트 템플릿 구문
{{...}}
을 사용하여 프롬프트의 일부로 메모리 재현율을 사용합니다. 예시:// 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}");
관련 콘텐츠
- [SQL과 함께 RAG 사용]
- [SharePoint에서 데이터 수집]
- [벡터 데이터베이스 작업]
.NET