在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系统来说,是非常重要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python私有属性和私有方法

私有属性和私有方法 在实际开发中&#xff0c;对象的某些属性或者方法只希望在对象内部被使用&#xff0c;而不希望在外界被访问。 私有属性&#xff1a;对象不希望公开的属性 私有方法&#xff1a;对象不希望公开的方法 定义方式&#xff1a;在属性名或者方法名前添加两个下划…

代理重加密+GO开源代码

目录 一、场景说明 二、代理重加密流程 三、具体原理 本地密钥生成​编辑 加密数据​编辑 生成代理重加密密钥​编辑 密钥代理重加密​编辑 重解密密钥​编辑S X_A 解密数据​编辑 四、开源代码 一、场景说明 一个数据方想要将数据发布到云服务器上进行数据共享&am…

VITIS更新硬件平台

VITIS硬件平台更新以后如何重新导入 在之前建立的硬件平台上右击&#xff0c;选择Update Hardware Specification&#xff0c;选择最新导出的硬件平台文件&#xff1b; 重建板级支持包 选择复位重建BSP源文件&#xff0c;然后Clean&#xff0c;再然后Build 参考连接

前端实例:页面布局2--Tab标签页切换(后端数据实现)

效果 index.php(数据库连接部分不写) <!DOCTYPE html> <html><head><style>.tab_pos {display: flex;justify-content: center;align-items: center;background-color: #fff;}/* 设置标签页外层容器样式 */.tab-container {width: 90%;background-col…

PyQt5:Python中最强大的GUI开发工具

目录 PyQt5简介 关键特性 优势 如何开始使用PyQt5 结论 在Python生态系统中&#xff0c;GUI&#xff08;图形用户界面&#xff09;应用程序的开发一直是一个热门话题。有许多工具和框架可供选择&#xff0c;但PyQt5被认为是Python中最强大的GUI开发工具之一。PyQt5是一个P…

ROS机器人虚拟仿真挑战赛学习笔记

仿真效果 146s录屏&#xff1a; ROS机器人虚拟仿真挑战赛rviz跟随base 103s录屏&#xff1a; ROS机器人虚拟仿真挑战赛rviz和gazebo 98s录屏&#xff1a; ROS机器人虚拟仿真挑战赛时间98秒总分65分 F1TENTH线上仿真赛&#xff0c;乃无人车竞速之盛事&#xff0c;以ROS机器人操…

力扣236、235、701、450

一、236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 1.1题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff…

C++ 3.25作业

1、定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream>using namespace std;namesp…

MySQL--Buffer Pool

虽然说 MySQL 的数据是存储在磁盘里的&#xff0c;但是也不能每次都从磁盘里面读取数据&#xff0c;这样性能是极差的。为此&#xff0c;Innodb 存储引擎设计了一个缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;来提高数据库的读写性能。 有了缓冲池后&#xff1a; …

Go微服务实战——metrics指标监控(Prometheus框架与Grafana可视化)

安装Prometheus 参考官网 安装完后访问http://IP:9090如下所示&#xff1a; 这是Prometheus自带的UI。 该地址是数据监控地址http://localhost:9090/metrics所有输出的监控项。 可以正常浏览上述信息是表示安装完成。 Promethus简介 promethus中文网 Prometheus中文文档 …

分享5款能让电脑更高效的软件

​ 你想让你的电脑更好用吗&#xff1f;这里有五款电脑软件可以帮你&#xff0c;它们可以让你的电脑更高效、美观、安全&#xff0c;快来看看吧&#xff01; 1.远程协助——TeamViewer ​ TeamViewer是一款功能强大的远程桌面连接软件&#xff0c;支持跨平台操作&#xff0c;…

基于SSM+Jsp+Mysql的毕业生就业信息管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

牛客网BC-33 统计成绩(数组排序思想)

题目如下 --------------------------------------------------------------------------------------------------------------------------------- 思路&#xff1a;以数组形式输入&#xff0c;并将数组顺序&#xff08;或者逆序&#xff09;排序&#xff0c;最后输出最大值最…

静态代理与动态代理

静态代理与动态代理 静态代理 某个对象提供一个代理&#xff0c;代理角色固定&#xff0c;以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口&#xff0c;这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类…

在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步&#xff1a;1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志&#xff08;relay log&#xff09;3). slave重做中继日志中的事件&#xff0c;将数据变更反映它自…

基于GA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

JetBrains GoLand 2023---高效Go语言开发环境的首选工具【Mac/Windows】

JetBrains GoLand 2023是一款专为Go语言开发者设计的强大集成开发环境&#xff08;IDE&#xff09;。它提供了智能代码提示、自动补全和强大的调试工具&#xff0c;帮助开发者快速编写和调试Go语言代码。JetBrains GoLand 2023的功能特色主要表现在以下几个方面&#xff1a; 强…

万象奥科携手RT-Thread,线下体验RK3568混合部署!

3月21日&#xff0c;万象奥科联合RT-Thread在上海张江举办RK3568OpenAMP混合部署线下workshop&#xff0c;体验在一个SOC上的同时运行RT-Thread和Linux&#xff0c;为电力、医疗、工业控制、机器人、新能源等行业应用提供新思路。 万象奥科为伙伴们提供RK3568全功能开发板&…

flutter使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令&#xff0c;就需要知道对应的平台是windows还是linux&#xff0c;如果是windows就需要调用cmd命令&#xff0c;如果是linux平台&#xff0c;就需要调用sh命令&#xff0c;所以可以通过cfg!实现不同平台的判断&#xff0c;然后调用不同…

私人健身与教练预约管理系统设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…