本文将和大家简单介绍一下如何在控制台里面使用 Microsoft.KernelMemory 调用 TextEmbedding 对一些文本知识库内容生成向量化信息,以及进行向量化查询
本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航 或 博客园的合集
根据 new bing 对 Microsoft.KernelMemory 的如下介绍,可以知道 KernelMemory 的基础功能
Microsoft.KernelMemory 是一个开源的服务和插件,专门用于通过自定义的连续数据混合管道对数据集进行高效的索引。它的目标是模拟人类大脑如何存储和检索关于世界的知识。其中,嵌入(Embeddings) 是一项关键功能,用于创建语义映射,将概念或实体表示为高维空间中的向量。
嵌入是一种强大的工具,用于帮助软件开发人员处理人工智能和自然语言处理。它们通过将单词表示为高维向量而不是简单的字符字符串,以更复杂的方式帮助计算机理解单词的含义。嵌入通常以数值向量的形式存在,例如由数百个浮点数组成的列表。这些向量通过将每个已知的标记(token)映射到高维空间中的一个点来工作。设计这个空间和标记词汇表的目的是使具有相似含义的单词位于彼此附近。这使得算法能够在不需要显式规则或人工监督的情况下识别单词之间的关系,例如同义词或反义词。
在开始之前,期望大家已经有了 Azure 的 AI 账号权限,如果现在还没有权限,请填写 https://aka.ms/oai/access 进行申请。网上有很多申请攻略,如果大家不知道如何填写的话,还请自行参考网上大佬们写的攻略
先进入到 https://ai.azure.com/ 进行部署项目,如果大家现在没有权限但只是想测试一下,可以找我要借账号给你自己测试一下
由于 AzureAI 的界面更新比较快,本文以下截图都是在 2024.06 截图的,如果你阅读本文的时间距离本文编写时间过长,那可能界面很多都会不一样,但相信大家看界面还是会创建模型的
先点击创建部署
按钮,如下图
接着在选择模型这里选择 TextEmbedding 模型,本文这里选择的是 text-embedding-ada-002 模型,这是当前总体表现都很好的模型
创建模型时需要给模型命名,这个命名将在后续咱的代码里面调用。我这里的部署名称使用的是 Embedding
名称,完成部署之后的界面内容大概如下
完成以上准备工作之后,接下来可以开始新建控制台编写代码了。先新建一个 .NET 8 框架的控制台,当然了,这个时间点你要是激进一些也可以创建 .NET 9 框架的
先按照 .NET 的惯例安装 Microsoft.KernelMemory.Core 这个库,安装之后的 csproj 项目文件的代码大概如下
先引用命名空间
接着初始化进行一些配置,配置代码如下
以上代码里面的 endpoint 和 apiKey 和 Deployment 分别换成你的地址和你的密钥以及你的部署名称
本文只是演示如何调用文本嵌入向量化,不涉及到文本生成,于是加上了 WithoutTextGenerator
配置,加上了此配置之后,后续的 Ask 系列方法将不能调用。本文这里为了方便起见,将知识库向量化之后存放到本地文件夹里面,即通过 .WithSimpleFileStorage("Folder")
配置存放到相对工作路径的 Folder 文件夹。大家可以尝试运行项目之后看看你的这个文件夹里面的内容
拿到了 IKernelMemory 类型的 kernel 对象之后,接下来就可以导入知识库的知识了。如以下我导入了一些我的博客内容作为知识
以上的导入逻辑将会调用上文部署的 text-embedding-ada-002 模型,将文本内容进行向量化,将向量化之后的结果存放到本地的文件里面,使用本地文件系统作为知识数据库。后续的查询逻辑即可读取本地文件的向量进行向量距离对比,支持语义化查询
传统的查询大部分都是关键词进行字符串比较,而通过 text-embedding-ada-002 等 TextEmbedding 模型,即可进行语义化查询。核心原理是计算出查询字符串的向量值,与知识数据库里面存放的知识的向量进行比较,从而获取到向量距离较近的知识,向量距离越近表示约有相关性。通过此方法可以更好的进行查询知识,特别是处理海量知识库信息查询的时候
建立知识库步骤只需要做一次调用 TextEmbedding 模型,不需要每次查询数据都重新对整个知识库进行调用 TextEmbedding 模型。因为调用一次之后,就获取到 TextEmbedding 模型返回的向量化信息。之后只需要对查询的信息的内容调用 TextEmbedding 模型获取查询信息的向量化信息,再将查询信息的向量化信息与知识库里面的各个知识的向量化信息进行比较即可,即可找到查询信息与各个知识的相关性
如以下代码尝试进行一条查询
以上查询可以拿到查询结果,一般来说查询结果需要关注其相关性,即 Relevance 属性的值。大部分情况下的业务只取第一条,即最相关的内容
运行以上代码的输出如下
使用 TextEmbedding 查询的好处在于其支持语义化,即换个说法查询也是可以的,比如我换成如下代码进行查询
此时依然能够输出如下内容
在 Microsoft.KernelMemory 里面还添加了 AskAsync 方法,这个 AskAsync 方法里面包含两个步骤的内容。第一步就是执行 SearchAsync 的核心功能,查询到相关的知识。第二步就是调用 TextGenerator 的功能,根据查询到相关的知识让 AI 如 GPT 生成人类更加友好的回答内容
由于本文开始配置里面设置了 WithoutTextGenerator 因此调用以下代码将会抛出异常
如果大家想要测试此功能,还请执行配置
本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 SemanticKernelSamples/NekawlaicaYegemwheechijahafea 文件夹,即可获取到源代码
欢迎加入 SemanticKernel 群交流:623349574
原文链接: http://blog.lindexi.com/post/dotnet-%E7%AE%80%E5%8D%95%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8-KernelMemory-%E5%90%91%E9%87%8F%E5%8C%96%E6%96%87%E6%9C%AC%E5%B5%8C%E5%85%A5%E7%94%9F%E6%88%90%E5%92%8C%E6%9F%A5%E8%AF%A2
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。