.NET 6+Semantic Kernel快速接入OpenAI接口
大家好,我是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接口的更多相关文章
- Semantic Kernel 入门系列:🛸LLM降临的时代
不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...
- Semantic Kernel 入门系列:🥑Memory内存
了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...
- Semantic Kernel 知多少 | 开启面向AI编程新篇章
引言 在ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻.当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐的开展基于ChatGPT ...
- Semantic Kernel 入门系列:🪄LLM的魔法
ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握. 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不 ...
- Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能
理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...
- Semantic Kernel 入门系列:💬Semantic Function
如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...
- Semantic Kernel 入门系列:🍋Connector连接器
当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...
- 微信小程序之快速接入七牛云
小程序为什么要接入云? 目前,开发者在开发小程序过程中,主要遇到以下几个问题: 小程序发布大小超限 微信官方限制小程序的发布代码不能超过 1MB,而在实际开发过程中,一般的小程序难免会有图片等富媒体文 ...
- 如何让微信小程序快速接入七牛云
如果你确定用七牛运行小程序的话,给大家分享一个九折优惠码:61d1fd4d1 月 9 日 微信小程序正式发布,小程序终于揭开了它神秘的面纱,开发者对小程序的追捧更是热度不减.从小程序的热门应用场景来看 ...
- 如何接入银联“快速接入”产品API
引言:使用银联开放平台的用户或多或少都接触过产品API吧,那么大家对于“快速接入”产品API是否还会存在一些疑问呢?因为我之前对“快速接入”模糊不清,所以整理的一份详细的资料,里面梳理了“快速接入”产 ...
随机推荐
- 重新整理数据结构与算法(c#)—— 堆排序[二十一]
前言 将下面按照从小到大排序: int[] arr = { 4, 6, 8, 5, 9 }; 这时候可以通过冒泡排序,计数排序等. 但是一但数据arr很大,那么会产生排序过于缓慢,堆排序就是一个很好的 ...
- Windows代理配合Burp抓取客户端+小程序数据包
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 在渗透测 ...
- 力扣602(MySQL)-好友申请Ⅱ:谁有最多的好友(中等)
题目: 在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请. RequestAccepted 表: (requester_id, accepte ...
- Flutter+FaaS一体化任务编排的思考与设计
作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业务闭环.在新的研发模式落地与实践的过程中,一直在思考如 ...
- Spring Boot Admin 集成诊断利器 Arthas 实践
简介: Arthas 是 Alibaba 开源的 Java 诊断工具,具有实时查看系统的运行状况:查看函数调用参数.返回值和异常:在线热更新代码:秒解决类冲突问题:定位类加载路径:生成热点:通过网页诊 ...
- 网易数帆Curve加入PolarDB开源数据库社区
简介:Curve社区签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. Curve社区签署阿里 ...
- 基于 ASK + EB 构建容器事件驱动服务
简介:本篇文章以"在线文件解压场景"为例为大家展示经典 EDA 事件驱动与容器如何搭配使用. 作者:冬岛.肯梦 导读 EDA 事件驱动架构( Event-Driven Archit ...
- OpenKruise v0.10.0 新特性 WorkloadSpread 解读
简介: 针对需求,OpenKruise 在 v0.10.0 版本中新增了 WorkloadSpread 特性.目前它支持配合 Deployment.ReplicaSet.CloneSet 这些 wo ...
- dotnet 警惕 C# 的 is var 写法
本文将和大家介绍 C# 语言设计里面,我认为比较坑的一个语法.通过 is var 的写法,会让开发者误以为 null 是不被包含的,然而事实是在这里的 var 是被赋予含义的,将被允许 null 通过 ...
- WPF 已知问题 InputEventArgs 的 Timestamp 属性是静态的导致事件之间相互影响
本文记录一个 WPF 已知的设计问题,当前此问题已经被大佬修复,这个设计问题刚好属于比较边缘的模块,我写了这么多年的代码还没有踩到这个坑一次,也没有听到有谁提到这个坑 远古时候,不知道大佬是故意还是失 ...