在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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(