.NET 6+Semantic Kernel快速接入OpenAI接口

net,semantic,kernel,openai · 浏览次数 : 0

小编点评

```csharp using Microsoft.Extensions.Configuration; using Microsoft.SemanticKernel; using SemanticKernelDemo.Configurations; using SemanticKernelDemo.Handlers; // Step1. Load your custom configuration var configuration = new ConfigurationBuilder().AddJsonFile($\"appsettings.json\"); var config = configuration.Build();var openAiConfiguration = new OpenAiConfiguration(config.GetSection("LLM_API_MODEL").Value, config.GetSection("LLM_API_BASE_URL").Value, config.GetSection("LLM_API_KEY").Value); // Step2. Create a kernel from Your LLM API var openAiClient = new HttpClient(new CustomOpenAiHandler(openAiConfiguration.EndPoint)); var builder = Kernel.CreateBuilder();builder.AddOpenAIChatCompletion(openAiConfiguration.ModelId, openAiConfiguration.ApiKey, httpClient: openAiClient);var kernel = builder.Build(); // Step3. Create a chat between you and kernel var promptTemplate = @"\<message role=\"\"user\"\">{0}</message>\";Console.Write("You: \");var userMessage = string.Empty;while (!string.IsNullOrEmpty(userMessage = Console.ReadLine())){ var prompt = string.Format(promptTemplate, userMessage); var summarize = kernel.CreateFunctionFromPrompt(prompt); var response = kernel.InvokeStreamingAsync(summarize);Console.Write("AI: \"); await foreach (var item in response) Console.Write(item.ToString()); Console.WriteLine(Environment.NewLine + "---------------------------------------------------------------------\nYou: \");} //运行一下,结果如下图所示: //--- // You: // AI: // Hello world! // --------------------------------------------------------------------- // You: // ```

正文

大家好,我是Edison。

今天我们快速地使用Semantic Kernel来集成OpenAI,使用20来行代码快速实现一个简单的AIGC应用。

这里,我就不多介绍Semantic Kernel了,包括它的一些主要特性如Planners, Functions, Plugins等,这些都留到以后写系列文章再来详细介绍吧。

现阶段你只需要了解,Semantic Kernel 与 LangChain 类似,但 Semantic Kernel 是为应用开发开发人员创建的SDK项目,它支持.NET, Python 以及 Java,但是对.NET支持最成熟(微软自家孩子嘛),可以让你的应用很轻易的集成AI大语言模型。

.NET6应用集成OpenAI

这里,我们快速通过一个.NET 6 控制台应用程序来使用Semantic Kernel集成OpenAI创建一个AIGC应用。

第一步:创建一个.NET6控制台应用程序;

第二步:新建一个appsettings.json,填入以下配置:

{
  "LLM_API_MODEL": "mistral-7b-instruct",
  "LLM_API_BASE_URL": "https://api.your-company.com/llm",
  "LLM_API_KEY": "your-llm-api-key" // Replace this value with your llm api key
}

这里我使用的是我司内部提供的大语言模型API,它是OpenAI兼容的。

第三步:通过NuGet管理器安装以下组件包:

  • Microsoft.SemanticKernel,1.11.0

  • Microsoft.SemanticKernel.Connectors.OpenAI,1.11.0

  • Microsoft.Extensions.Http,8.0.0

  • Microsoft.Extensions.Configuration, 6.0.0

  • Microsoft.Extensions.Configuration.Json, 6.0.0

第四步:创建一个OpenAiConfiguration类用于接收appsettings的配置:

public class OpenAiConfiguration
{
    public string ModelId { get; set; }
    public string EndPoint { get; set; }
    public string ApiKey { get; set; }

    public OpenAiConfiguration(string modelId, string endPoint, string apiKey)
    {
        ModelId = modelId;
        EndPoint = endPoint;
        ApiKey = apiKey;
    }
}

第五步:创建一个用于转发OpenAI请求的HttpClientHandler,它会将API请求转发你的大语言模型API地址,当然,你的大语言模型API必须是OpenAI兼容的才行。

public class CustomOpenAiHandler : HttpClientHandler
{
    private readonly string _openAiBaseAddress;

    public CustomOpenAiHandler(string openAiBaseAddress)
    {
        _openAiBaseAddress = openAiBaseAddress;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.RequestUri = new Uri($"{_openAiBaseAddress}{request.RequestUri.PathAndQuery}");
        return await base.SendAsync(request, cancellationToken);
    }
}

第六步:在Program.cs中添加以下核心步骤的代码,加上注释,合计29行,快速实现一个AIGC应用。

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using SemanticKernelDemo.Configurations;
using SemanticKernelDemo.Handlers;

// Step1. Load your custom configuration
var configuration = new ConfigurationBuilder().AddJsonFile($"appsettings.json");
var config = configuration.Build();
var openAiConfiguration = new OpenAiConfiguration(config.GetSection("LLM_API_MODEL").Value, config.GetSection("LLM_API_BASE_URL").Value, config.GetSection("LLM_API_KEY").Value);
// Step2. Create a kernel from Your LLM API
var openAiClient = new HttpClient(new CustomOpenAiHandler(openAiConfiguration.EndPoint));
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(openAiConfiguration.ModelId, openAiConfiguration.ApiKey, httpClient: openAiClient);
var kernel = builder.Build();
// Step3. Create a chat between you and kernel
var promptTemplate = @"<message role=""user"">{0}</message>";
Console.Write("You: ");
var userMessage = string.Empty;
while (!string.IsNullOrEmpty(userMessage = Console.ReadLine()))
{
    var prompt = string.Format(promptTemplate, userMessage);
    var summarize = kernel.CreateFunctionFromPrompt(prompt);
    var response = kernel.InvokeStreamingAsync(summarize);
    Console.Write("AI: ");
    await foreach (var item in response)
        Console.Write(item.ToString());
    Console.WriteLine(Environment.NewLine + "---------------------------------------------------------------------");
    Console.Write("You: ");
}

运行一下,结果如下图所示:

小结

本文介绍了如何在.NET 6环境下使用Semantic Kernel快速接入OpenAI大预言模型API来实现一个AIGC应用,20来行代码就可以实现,是不是很方便?

如果你对Semantic Kernel感兴趣,后续我也可以考虑整理一个系列文章,逐步深入了解和应用Semantic Kernel。

 

与.NET 6+Semantic Kernel快速接入OpenAI接口相似的内容:

.NET 6+Semantic Kernel快速接入OpenAI接口

Semantic Kernel 与 LangChain 类似,但 Semantic Kernel 是为应用开发开发人员创建的SDK项目,它支持.NET, Python 以及 Java,但是对.NET支持最成熟(微软自家孩子嘛),可以让你的应用很轻易的集成AI大语言模型。今天我们快速地使用Semant...

C# .NET 6 使用WorkFlow Core 创建工作审批流

1,背景 工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更加高效。 通俗点

.NET Core使用SkiaSharp快速生成二维码( 真正跨平台方案)

前言 在.NET 6之前我们一直是使用QRCoder来生成二维码(QRCoder是一个非常强大的生成二维码的组件,用到了System.Drawing.Common 包),然后从.NET 6开始,当为非 Windows 操作系统编译引用代码时,平台分析器会发出编译时警告。异常如下: System.Ty

ASP.NET 6启动时自动创建MongoDB索引

最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着干脆通过代码的方式在ASP.NET 6应用启动时自动创建,如果是重复创建则直接跳过。

关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!

在.Net Framework时代,我们生成验证码大多都是用System.Drawing。 在.Net 6中使用也是没有问题的。 但是,System.Drawing却依赖于Windows GDI+。 为了实现跨平台,我陷入了沉思!! 微软推荐使用SkiaSharp 进行替代,所以就开始了,踩坑之旅

瑞亚时间管理大师,基于 .NET 6 和 Angular 构建的在线任务管理协作平台

瑞亚时间管理大师 瑞亚时间管理大师, 是一个在线的任务管理、项目管理、 团队协作平台。瑞亚 拥有现代化的页面风格,高效、简便,同时适合个人和团队使用。 瑞亚对个人免费,提供了无限制的任务,列表,和空间。 功能预览 瑞亚时间管理大师是以任务管理为核心,还包括了看板,文档,思维导图,白板,和 OKR 目

【Dotnet 工具箱】基于 .NET 6 和 Angular 构建项目任务管理平台

1.Reha 时间管理大师 Rhea 是一个基于 C# 和 .NET 6 开发的在线任务管理平台,类似于 禅道、Jira、Redmine, 滴答清单等。 支持多视图多维度统一管理任务。多级结构,工作区,空间,文件夹,列表,可以更灵活的进行任务管理。 应用支持多主题和主题色切换,灵活搭配,随心所欲。

基于Admin.NET框架的前端的一些改进和代码生成处理(1)

Admin.NET 是一套基于Furion/.NET 6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理、字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离。后端基于基于Furion/.NET 6实现,底层集成SqlSugar;前端则是采用Vue-Next-Admin的前端框架,整体是一套非常不错的框架。本人比较喜欢研究一些技术框架,最近对该框架进行了一些研究分析,结合我自

.NET微服务系统迁移至.NET6.0的故事

本次迁移涉及的是公司内部一个业务子系统,该系统是一个多样化的应用,支撑着公司的多个业务方向。目前,该系统由40多个基于.NET的微服务应用构成,使用数千个CPU核心和数TB内存,在数百个Linux容器中运行。每天,该系统需要处理数十亿次请求。 该系统其中大部分服务是在2018-2019年左右由老旧.

ASP.NET Core设置URLs的几种方法,完美解决.NET 6项目局域网IP地址远程无法访问的问题

近期在dotnet项目中遇到这样的问题:.net6 运行以后无法通过局域网IP地址远程访问。后查阅官方文档。整理出解决问题的五种方式方法,通过新建一个新的WebApi项目演示如下: 说明 操作系统:Ubuntu 22.04.2 运行时:.NET 6 开发工具:Visual Studio 2202 新