在本地完成 Phi-3 模型的部署之后,即可在本地拥有一个小语言模型。本文将告诉大家如何将本地的 Phi-3 模型与 SemanticKernel 进行对接,让 SemanticKernel 使用本地小语言模型提供的能力
在我大部分的博客里面,都是使用 AzureAI 和 SemanticKernel 对接,所有的数据都需要发送到远端处理。这在离线的情况下比较不友好,在上一篇博客和大家介绍了如何基于 DirectML 控制台运行 Phi-3 模型。本文将在上一篇博客的基础上,告诉大家如何将本地的 Phi-3 模型与 SemanticKernel 进行对接
依然是和上一篇博客一样准备好 Phi-3 模型的文件夹,本文这里我放在 C:\lindexi\Phi3\directml-int4-awq-block-128
路径下。如果大家下载时拉取不下来 https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx/tree/main?clone=true 仓库,可以发送邮件向我要,我将通过网盘分享给大家
准备好模型的下载工作之后,接下来咱将新建一个控制台项目用于演示
编辑控制台的 csproj 项目文件,修改为以下代码用于安装所需的 NuGet 包
这里的 feiyun0112.SemanticKernel.Connectors.OnnxRuntimeGenAI.DirectML
是可选的,因为最后咱将会自己编写所有对接代码,不需要使用大佬写好的现有组件
先给大家演示使用 feiyun0112.SemanticKernel.Connectors.OnnxRuntimeGenAI.DirectML
提供的简单版本。此版本代码大量从 https://github.com/microsoft/Phi-3CookBook/blob/0a167c4b8045c1b9abb84fc63ca483ae614a88a5/md/07.Labs/Csharp/src/LabsPhi302/Program.cs 抄的,感谢 Bruno Capuano 大佬
定义或获取本地模型所在的文件夹
创建 SemanticKernel 构建器时调用 feiyun0112.SemanticKernel.Connectors.OnnxRuntimeGenAI.DirectML
库提供的 AddOnnxRuntimeGenAIChatCompletion 扩展方法,如以下代码
如此即可完成连接逻辑,将本地 Phi-3 模型和 SemanticKernel 进行连接就此完成。接下来的代码就是和原来使用 SemanticKernel 的一样。这一点也可以看到 SemanticKernel 的设计还是很好的,非常方便进行模型的切换
尝试使用 SemanticKernel 做一个简单的问答机
尝试运行代码,和自己本地 Phi-3 模型聊聊天
以上为使用 feiyun0112.SemanticKernel.Connectors.OnnxRuntimeGenAI.DirectML
提供的连接,接下来尝试自己来实现与 SemanticKernel 的对接代码
在 SemanticKernel 里面定义了 IChatCompletionService 接口,以上代码的 GetStreamingChatMessageContentsAsync
方法功能核心就是调用 IChatCompletionService 接口提供的 GetStreamingChatMessageContentsAsync 方法
熟悉依赖注入的伙伴也许一下就看出来了,只需要注入 IChatCompletionService 接口的实现即可。在注入之前,还需要咱自己定义一个继承 IChatCompletionService 的类型,才能创建此类型进行注入
如以下代码,定义继承 IChatCompletionService 的 Phi3ChatCompletionService 类型
接着实现接口要求的方法,本文这里只用到 GetStreamingChatMessageContentsAsync 方法,于是就先只实现此方法
根据上一篇博客可以了解到 Phi-3 的初始化方法,先放在 Phi3ChatCompletionService 的构造函数进行初始化,代码如下
定义 GetStreamingChatMessageContentsAsync 方法代码如下
这里传入的是 ChatHistory 类型,咱需要进行一些提示词的转换才能让 Phi-3 更开森,转换代码如下
完成之后,即可构建输入,以及调用 ComputeLogits 等方法,代码如下
如此即可完成对接的核心代码实现,接下来只需要将 Phi3ChatCompletionService 注入即可,代码如下
这就是完全自己实现将本地 Phi-3 模型与 SemanticKernel 进行对接的方法了,尝试运行一下项目,或者使用以下方法拉取我的代码更改掉模型文件夹,试试运行效果
本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 SemanticKernelSamples/BemjawhufawJairkihawyawkerene 文件夹,即可获取到源代码
原文链接: http://blog.lindexi.com/post/dotnet-%E5%B0%86%E6%9C%AC%E5%9C%B0%E7%9A%84-Phi-3-%E6%A8%A1%E5%9E%8B%E4%B8%8E-SemanticKernel-%E8%BF%9B%E8%A1%8C%E5%AF%B9%E6%8E%A5
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。