M
点击蓝字 / 微软开发者MSDN
关注我们
作者:Catherine Wang
排版:Alan Wang
Redis 是一种流行的内存数据存储,可用于解决构建和扩展智能应用程序的关键挑战。在本文中,你将了解如何使用 Redis 的 Azure 缓存来提高使用 Azure OpenAI 的应用程序的效率。
Redis 的 Azure 缓存不受最近的 Redis 许可证更新的影响:
“我们将持续的合作以确保 Azure 客户能够无缝地利用 Azure Cache for Redis 的所有层级。Azure Cache for Redis、Azure Cache for Redis Enterprise 和 Enterprise Flash 服务不会中断,客户将收到及时的更新和错误修复,以保持最佳性能。” – Julia Liuson,开发部总裁
本博客包括两个示例应用程序:
第一个是基于 .NET 揭秘检索增强生成的演示聊天 Semantic Kernel应用程序。我添加了使用 Redis 保存额外知识并启用聊天历史记录的功能。完整示例位于 Chat App with Redis。
第二个是一个演示应用程序,它在 .NET 8 中使用 Redis OM dotnet进行 Redis 输出缓存,以提高生成式 AI 的一致性和弹性。完整示例位于 OpenAI 的输出缓存中。
Redis 许可证更新
https://azure.microsoft.com/en-us/blog/redis-license-update-what-you-need-to-know/
基于 .NET 揭秘检索增强生成
https://devblogs.microsoft.com/dotnet/demystifying-retrieval-augmented-generation-with-dotnet/
Semantic Kernel
https://learn.microsoft.com/en-us/semantic-kernel/overview/
Chat App with Redis
https://github.com/CawaMS/chatappredis
Redis OM dotnet
https://github.com/redis/redis-om-dotnet
Redis 输出缓存
https://learn.microsoft.com/en-us/aspnet/core/performance/caching/output?view=aspnetcore-8.0#redis-cache
OpenAI 的输出缓存
https://github.com/CawaMS/OutputCacheOpenAI/tree/main
Redis 为 OpenAI 模型提供了额外的知识
像 GPT 这样的 OpenAI 模型在大多数情况下都经过训练且知识渊博,但它们无法了解您公司的内部文档或最近的博客文章。这就是为什么您需要 Redis 作为附加知识的语义内存存储。
语义内存存储有两个基本要求:
Redis Enterprise 提供了 RediSearch模块来满足这些需求。您可以使用内置的 FLAT 和 HNSW 索引算法、余弦等距离算法以及 KNN 搜索查询在 Redis 中保存向量嵌入。
Semantic Kernel为 Redis 语义内存存储提供了一个连接器。在语义内核中使用 Redis 作为语义内存存储的代码可能如下所示(来自 ChatAppRedis):
//创建和使用 Redis 语义内存存储RedisMemoryStore memoryStore = newRedisMemoryStore(database, vectorSize: 1536);varmemory = newSemanticTextMemory(memoryStore,newAzureOpenAITextEmbeddingGenerationService(aoaiEmbeddingModel, aoaiEndpoint, aoaiApiKey));
//将文本字符串保存到 Redis 语义存储中的代码awaitmemory.SaveInformationAsync(collectionName, $"{your_text_blob}", $"{an_arbitrary_key}");
RediSearch
https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/
Semantic Kernel
https://learn.microsoft.com/en-us/semantic-kernel/memories/
连接器
https://github.com/microsoft/semantic-kernel/blob/main/dotnet/src/Connectors/Connectors.Memory.Redis/README.md
ChatAppRedis
https://github.com/CawaMS/chatappredis/blob/main/Program.cs
Redis 保留聊天记录以启用 AI 记忆
像 GPT 这样的 OpenAI 模型不会记住聊天记录。Semantic Kernel 提供聊天记录,以回答基于先前上下文的问题。例如,您可以要求聊天应用程序讲一个笑话。然后问为什么这个笑话好笑。第二个问题的答案将与第一个问题相关,这就是聊天记录所启用的功能。
Chat History 对象存储在内存中。客户要求将其保存到外部存储,以获得以下好处:
Redis 是保存聊天记录的理想选择,因为:
下面是一个对话示例。如果没有在 Redis 中保留聊天记录,我就无法根据之前的上下文提出问题。
借助 Redis 中的聊天记录,我可以在开始新会话时继续之前的对话。
从 Redis 获取用户消息并转到 ChatHistory 对象的代码可能如下所示:
if(userMsgList.Any) {foreach(varuserMsg inuserMsgList) {chat.AddUserMessage(userMsg.ToString);}}
将用户消息保存到 Redis 的代码可能如下所示:
await_redisConnection.BasicRetryAsync(async(_db) => _db.HashSetAsync($"{_userName}:{userMessageSet}", [newHashEntry(newRedisValue(Utility.GetTimestamp), question)]));
Redis Hash 用于每个用户的用户消息和辅助消息。Redis Insight提供 UI 来查看和管理保存的聊天记录数据。
我们可以进一步利用这种聊天记录体验,将其转换为向量嵌入,以提高回答类似问题的一致性和相关性。好处是:
把带有 Redis 的聊天应用程序作为参考,将以前的聊天记录保存在 Redis 语义内存存储中的代码可能如下所示:
awaitforeach(varresult inmemory.SearchAsync(_userName+"_chathistory", question, limit: 1))stbuilder.Append(result.Metadata.Text);
我收到了关于类似问题的一致答复。即“法国首都在哪里?” 和“哪里是法国首都?”
我的实验代码有局限性:
这就是我们在语义内核中添加对此体验的官方支持的原因,请参阅 microsoft/semantic-kernel #5436。请分享您对此问题的反馈,以帮助我们设计出色的体验。
Redis Insight
https://redis.com/redis-enterprise/redis-insight/
带有 Redis 的聊天应用程序
https://github.com/CawaMS/chatappredis
microsoft/semantic-kernel #5436
https://github.com/microsoft/semantic-kernel/issues/5434
Redis 提高 Web 应用程序性能
.NET 提供了多种缓存抽象来提高 Web 应用程序性能。这些仍然适用于您的整体智能应用。此外,缓存抽象与语义缓存相辅相成,以提供高性能且一致的 Web 响应。
网页输出缓存
使用相同参数的重复 Web 请求会引入不必要的服务器利用率和依赖项调用。在 .NET 8 中,我们引入了 Redis 输出缓存来改进以下领域的 Web 应用程序:
下面是前面提到的示例应用程序,它使用 Redis 输出缓存来提高调用 DALL-E 以根据提示生成图像的性能。使用 OpenAI 图像生成进行输出缓存。使用输出缓存所需最少的编码。
使用 .NET 8 Redis 输出缓存的代码片段可能如下所示:
Redis 输出缓存
https://learn.microsoft.com/en-us/aspnet/core/performance/caching/output?view=aspnetcore-8.0#redis-cache
OpenAI 图像生成进行输出缓存
https://github.com/CawaMS/OutputCacheOpenAI
添加语义缓存以确保类似的提示收到一致的响应
Redis OM for dotnet刚刚发布了语义缓存功能。它支持使用 Azure OpenAI 嵌入来生成向量。以下代码片段显示了示例用法。完整的代码示例可以在 OutputCacheOpenAI 存储库中的 GenerateImageSC.cs中找到。
使用 Redis 作为语义缓存的代码片段可能如下所示:
if(cache.GetSimilar(_prompt).Length > 0) {imageURL = cache.GetSimilar(_prompt)[0];awaitcontext.Response.WriteAsync(" "+$"{imageURL}\" alt=\"AI Generated Picture {_prompt}\" width=\"460\" height=\"345\">"+
这样,我就可以确保来自不同用户的类似提示会产生相同的图像,从而提高一致性并减少 API 调用,从而减少对 DALL-E 的调用并提高性能。下面的屏幕截图演示了类似提示重复使用的相同图片。
这是从提示“a french garden in monet style””返回的图像。
这是从提示“a monet style french garden”返回的图像。它与上面相同,因为先前的条目已被语义缓存:
这是 Redis 语义缓存中的条目:
Redis 语义缓存是 Redis 输出缓存的补充,因为:
总之,Redis 可以成为高性能、一致且低成本的智能 Web 应用程序解决方案和设计的关键部分。
Redis OM for dotnet
https://github.com/redis/redis-om-dotnet/tree/main
OutputCacheOpenAI 存储库中的 GenerateImageSC.cs
https://github.com/CawaMS/OutputCacheOpenAI/blob/main/OutputCacheDallESample/GenerateImageSC.cs
下一步计划
最近发布的 Enterprise E5 SKU 对于试验 RediSearch模块来说具有成本效益。请查看用于 Redis 的 Azure 缓存。
今天就可以在您的智能应用程序中试用 Redis!通过在博文中发表评论,分享您对这些场景的想法和反馈 - 我们很乐意听取您的意见!
RediSearch
https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/
用于 Redis 的 Azure 缓存
https://azure.microsoft.com/en-us/products/cache/
微信公众号|微软开发者MSDN
新浪微博|微软中国MSDN
·END·