在Semantic Kernel中使用Qdrant向量数据库

2024-03-26 17:04

本文主要是介绍在Semantic Kernel中使用Qdrant向量数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库,并演示如何在Semantic Kernel中进行向量更新和查询操作。

1. 背景

在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中,我们介绍了如何使用 Docker 部署 Qdrant 向量数据库,以及其相关的安全配置,并演示了如何使用 .NET 通过 TLS 安全访问 Qdrant 向量数据库。现在,我们将在Semantic Kernel中使用Qdrant向量数据库,并演示如何进行向量更新和查询操作。

Semantic Kernel是一个开源的语义内核 SDK,它提供了一种高效的方式让用户可以在自己的应用程序中集成大语言模型 (LLM) 的强大功能。Semantic Kernel提供了多种向量数据库的连接器,可以与各种向量数据库集成,从而提供高效的向量查询和更新功能。

2. 在Semantic Kernel中使用Qdrant

在我们的大语言模型 (LLM) 应用程序中,我们通常会需要构建短期和长期记忆的方式,以赋予更智能的应用程序更大的能力。这个时候,我们就需要使用向量数据库来存储和查询向量数据。Qdrant 是一个高性能的向量数据库,它提供了高效的向量查询和更新功能,可以满足我们的需求。

2.1 安装Semantic Kernel SDK

在Semantic Kernel中使用Qdrant向量数据库,我们首先需要安装Semantic Kernel SDK,以及 Semantic Kernel 的 Memory 插件和 Qdrant 连接器:

dotnet add package Microsoft.SemanticKernel --version 1.6.3
dotnet add package Microsoft.SemanticKernel.Plugins.Memory --version 1.6.3-alpha
dotnet add package Microsoft.SemanticKernel.Connectors.Qdrant --version 1.6.3-alpha

通过上面的 alpha 标识,我们可以看到 Semantic Kernel 的 Memory 插件和 Qdrant 连接器还处于预览阶段,后续相关方法可能会有所变化,我们需要注意这一点。

在安装好 Semantic Kernel SDK 和相关插件后,我们就可以在我们的应用程序中使用 Qdrant 向量数据库了。接下来我会进行一个一个简单的代码示例,修改自 Github 的 notebook 《Building Semantic Memory with Embeddings》,这里我们更改了存储方式,将VolatileMemoryStore 改为使用 Qdrant 向量数据库的方式。

2.2 引入 Embedding 服务

完成了基础的类库安装,我们就可以引入相关的命名空间了:

using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Connectors.Qdrant;
using Microsoft.SemanticKernel.Memory;

接下来,我们需要创建一个 MemoryBuilder 对象,这里需要注意的是,因为功能是实验性的,所以我们需要禁用一些警告:

#pragma warning disable SKEXP0001, SKEXP0010, SKEXP0050
var memoryBuilder = new MemoryBuilder();

非常重要的是,这里我们需要选择一个 Embedding 服务,用来将文本转换为向量。这里我们使用的是 Azure AI 的 text-embedding-ada-002 服务,需要在 Azure OpenAI Studio 中完成该模型的部署:

在这里插入图片描述

memoryBuilder.WithAzureOpenAITextEmbeddingGeneration("text-embedding-ada-002", "AZURE_ENDPOINT ", "AZURE_OPENAI_KEY");

2.3 连接 Qdrant 向量数据库

接下来我们使用 Semantic Kernel 提供的连接器,将 MemoryBuilder 与 Qdrant 向量数据库连接起来,这里使用的通讯方式不是我们上一篇文章中官方客户端使用的 GRPC,而是使用的 HTTP:

HttpClient httpClient = new HttpClient(new CustomQdrantHandler("<certificate thumbprint>", "client.pfx", "password"));
#pragma warning disable SKEXP0020
memoryBuilder.WithQdrantMemoryStore(httpClient,  1536 , "https://localhost:6333");
var memory = memoryBuilder.Build();

这里需要注意的是,因为我们从官方样例的 VolatileMemoryStore 改为了 Qdrant 向量数据库,所以这里我们需要使用 WithQdrantMemoryStore 方法,这个方法需要提供所使用的 Embedding 的维度。

另外,因为我们使用的是自签名证书,所以我们需要对 HttpClient 进行一些配置,这里我们使用了一个自定义的 CustomQdrantHandler 类,用来处理证书的验证,并提供客户端证书进行双向认证。

internal class CustomQdrantHandler : HttpClientHandler{private string _knownHash;private X509Certificate2 _clientCertificate;public CustomQdrantHandler(string knownHash, string certPath, string certPassword) : base(){_knownHash = knownHash;_clientCertificate = new X509Certificate2(certPath, certPassword);this.ClientCertificates.Add(_clientCertificate);this.ServerCertificateCustomValidationCallback = CheckServerCertificate;}private bool CheckServerCertificate(HttpRequestMessage httpRequestMessage, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors errors){using var sha256 = SHA256.Create();var hashBytes = sha256.ComputeHash(certificate.GetPublicKey());var hashString = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();return hashString == _knownHash;}
}

2.4 向量更新和查询

在完成了 MemoryBuilder 的构建后,我们就可以使用 Memory 对象进行向量的更新和查询操作了。这里我们使用一个关于“我”的简单介绍的例子,将一些文本转换为向量,并存储到 Qdrant 向量数据库中:

string MemoryCollectionName = "aboutMe";
await memory.SaveInformationAsync(MemoryCollectionName, id: "info1", text: "My name is Andrea");
await memory.SaveInformationAsync(MemoryCollectionName, id: "info2", text: "I currently work as a tourist operator");
await memory.SaveInformationAsync(MemoryCollectionName, id: "info3", text: "I currently live in Seattle and have been living there since 2005");
await memory.SaveInformationAsync(MemoryCollectionName, id: "info4", text: "I visited France and Italy five times since 2015");
await memory.SaveInformationAsync(MemoryCollectionName, id: "info5", text: "My family is from New York");

通过上面的代码,我们将这些文本信息存储到 Qdrant 向量数据库中,SaveInformationAsync 指定了集合名称、文本 ID 和文本内容。

接下来,我们可以定义下面一些问题,然后使用 Memory 对象进行查询操作:

var questions =  new[]
{"what is my name?","where do I live?","where is my family from?","where have I travelled?","what do I do for work?",
};foreach (var q in questions)
{var response = await memory.SearchAsync(MemoryCollectionName, q).FirstOrDefaultAsync();Console.WriteLine("Q: " + q);Console.WriteLine("A: " + response?.Relevance.ToString() + "\t" + response?.Metadata.Text);
}

通过上面的代码,我们搜索并打印了一些问题的答案,这里我们使用的是 SearchAsync 方法,指定了集合名称和问题文本。该方法对问题进行了一些筛选,默认只返回最相关的一个答案,并且要求相关性至少为 0.7。

在这里插入图片描述

在运行后,我们即可在 Qdrant 的 Web 界面上看到相关的向量数据:

在这里插入图片描述

3. 总结

在Semantic Kernel中使用Kernel Memory服务和Qdrant向量数据库可以极大地提高数据的存储和检索效率。通过灵活的数据处理流程和强大的查询功能,可以轻松地在大量的数据中找到最相关的信息。这对于构建高效的AI系统来说,是非常重要的。

这篇关于在Semantic Kernel中使用Qdrant向量数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849225

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,