入门Semantic Kernel:OneApi集成与HelloWorld
导言
从这一章节开端正式进入咱们的 Semantic Kernel
的学习之旅了。
什么是Semantic Kernel
?
Semantic Kernel
是一个轻量级的开源结构,经过 Semantic Kernel
可以快速运用不同编程言语(C#/Python/Java
)结合 LLMs(OpenAI、Azure OpenAI、Hugging Face 等模型)
构建智能运用,简化将人工智能(AI
)集成到现有处理方案中的进程。
Semantic Kernel
的特色
-
模块化插件架构:
Semantic Kernel
供给了一个模块化的插件架构,答应开发者经过结合自界说和预界说的智能插件来处理杂乱的事务问题。这种架构使得传统代码可以与智能插件无缝协作,然后简化了传统运用程序向智能化转型的进程。 -
多模型集成才能:
Semantic Kernel
支撑多种AI
模型,包含但不限于Azure OpenAI Service
、OpenAI
,以及Hugging Face
供给的离线模型。经过Semantic Kernel
的链接器功用,开发者可以快速地将这些AI“大脑”
集成到自己的智能运用中,大幅提高运用的智能化水平。 -
多样化的链接器生态体系:除了衔接
AI
模型,Semantic Kernel
的链接器还支撑衔接向量数据库、商业软件、事务中间件等多种服务。这种多样化的链接才能,使得Semantic Kernel
可以习惯更多的事务场景,推进事务流程的智能化转型。 -
全面的言语兼容性:
Semantic Kernel
支撑干流的编程言语,包含C#
、Python
和Java
。这种全面的言语支撑,使得不同布景的开发者都可以轻松地运用Semantic Kernel
来发掘AI
的潜力,并将其运用到自己的项目中。 -
低门槛的开发体会:
Semantic Kernel
规划重视用户体会,供给了简略易用的接口和文档。即使是AI
范畴的新手,也可以快速上手,完结零本钱入门,然后降低了开发智能运用的门槛。
中心概念
Semantic Kernel
根本组成
在 Semantic Kernel
中,中心概念包含:
内核(Kernel):
假如说 Semantic Kernel
是 Copilot Agent
的中心 AI
编列层,那 Kernel
方针便是 AI
编列层的中心方针。
从上图咱们可以看出Kernel
的中心包含:
-
装备: 包含
AI
模型、插件、链接器等的装备信息。 -
上下文办理:它保护运用程序的上下文信息,保证在履行使命时,可以拜访到正确的数据和状况。
-
服务和谐:
Kernel
方针和谐不同的AI
服务和插件,保证它们可以协同作业,完结杂乱的使命。 -
履行引擎:它作为履行引擎,依据规划器生成的方案,调度和履行相应的操作。
插件(Plugins)
插件是 AI
处理方案的构建块,它们是一组可以露出给 AI
运用程序和 AI
服务的函数,答应它们拜访完结特定使命所需的数据。
Semantic Kernel
中的函数
Semantic Function 是用自然言语编写的提示(Prompt
)模板,发送给 AI
服务;而 Native Function是用 C#
或 Python
编写的传统函数,可以经过规划器和函数调用被 AI
服务调用。
回忆(Memories
)
Memories
是用于存储数据的专用插件,它们在履行进程中为你的内核供给必要的上下文,以便你的 AI
服务可以正常运转。
规划器(Planners
)
规划器
可以接纳用户的方针,并协助咱们动态生成一个包含完结该特定方针的履行过程的方案。规划器运用 AI
模型依据中心中指定的函数和服务生成方案。
经过整合这些概念和组件,Semantic Kernel
可以完结智能的语义了解、使命规划和智能决议计划,然后为用户供给愈加智能、灵敏和个性化的交互体会。它可以运用于各种范畴,如虚拟帮手、智能客服、自然言语交互体系等,为用户和企业供给愈加智能和高效的处理方案。
从下面这张图可以更好的了解各中心组件之间的联络
Sematic Kernel 对接 OneApi
经过咱们上一篇文章的,咱们了解到了 OneApi
,是以OpenAI
的格局,所以在SK
中可以运用OpenAI
的Connector
来操作、在Semantic Kernel
类库中现已默许集成。
运用 UseSecrets 存储秘要信息
- 在咱们的启动项右键秘要信息办理
装备项 Json 文件
"OneApiSpark": {
"Endpoint": "http://localhost:3000",
"ModelId": "SparkDesk-v3.5",
"ApiKey": "sk-LAYzQaWssCYYEVHP1d6a3fFa111745249e94F0364a0cF37c"
}
从 OpenAI 到本地服务的恳求转化
自界说 HttpClientHandler
用 OpenAI
或许 Azure OpenAI
的扩展,恳求会发送到"api.openai.com"
或许"openai.azure.com"
,这时候就需求咱们经过自定的HttpClientHandler
重定向的模型根底 URL
转发到咱们的http://localhost:3000
OneApi
的服务地址。
- 中心代码
public class OpenAICustomHandler : HttpClientHandler
{
/// <summary>
/// 用于OpenAI或Azure OpenAI恳求时重定向的模型根底URL。
/// </summary>
private readonly string modelUrl;
private static readonly string[] sourceArray = ["api.openai.com", "openai.azure.com"];
/// <summary>
/// 运用指定的模型URL初始化<see cref="OpenAICustomHandler"/>类的新实例。
/// </summary>
/// <param name="modelUrl">用于OpenAI或Azure OpenAI恳求的根底URL。</param>
public OpenAICustomHandler(string modelUrl)
{
// 保证modelUrl不是null或空
if (string.IsNullOrWhiteSpace(modelUrl))
throw new ArgumentException("模型URL不能为空或空白。", nameof(modelUrl));
this.modelUrl = modelUrl;
}
/// <summary>
/// 异步发送HTTP恳求,关于OpenAI或Azure OpenAI服务的恳求,将URL重定向到指定的模型URL。
/// </summary>
/// <param name="request">要发送的HTTP恳求音讯。</param>
/// <param name="cancellationToken">可以用来撤销操作的撤销令牌。</param>
/// <returns>表明异步操作的使命方针。</returns>
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 查看恳求是否针对OpenAI或Azure OpenAI服务
if (request.RequestUri != null &&
(sourceArray.Contains(request.RequestUri.Host)))
{
// 修正恳求URI,以包含模型URL
request.RequestUri = new Uri(modelUrl + request.RequestUri.PathAndQuery);
}
// 调用基类办法实践发送HTTP恳求
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
Semantic Kernel HelloWorld
咱们先经过一个简略的示例学习一下 Kernel 方针的创立运用
- VS 创立控制台项目
SK_CreateKernel
Nuget
装置Semantic Kernel
的依靠
PM> NuGet\Install-Package Microsoft.SemanticKernel -Version 1.10.0
- 下面咱们示例将凭借
Prompt
提示词用的Semantic function
来推理一下用户的目的
Steps
简略的流程可以总结为:
Build Kernel ➟ Prompt Template ➟ Create Semantic function ➟ Kernel Invoke Semantic function
var config = ConfigExtensions.FromConfig<OpenAIConfig>("OneApiSpark");
//自界说HttpClientHandler
var openAICustomHandler = new OpenAICustomHandler(config.Endpoint);
using HttpClient client = new(openAICustomHandler);
//Create Kernel
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: config.ModelId,
apiKey: config.ApiKey,
httpClient: client)
.Build();
// 接纳用户入参
string request = Console.ReadLine()!;
// create prompt to the chat service
string prompt = "这个恳求的目的是什么? {{$request}}";
// Create a kernel arguments object and add the request
var kernelArguments = new KernelArguments
{
{ "request", request }
};
var streamingKernelContentsAsync = kernel.InvokePromptStreamingAsync(prompt, kernelArguments);
await foreach (var content in streamingKernelContentsAsync)
{
Console.WriteLine(content);
}
Console.ReadKey();
上面的代码咱们经过Kernel
方针用prompt
创立了一个Semantic function
,内容是推测用户输入的文本目的,凭借大模型的推理才能很简略的就可以做到这个功用。
Run
一下
- 输入
I want to send an email to the marketing team celebrating their recent milestone
- 输出
这个
恳求的目的
是发送一封
电子邮件给商场团队
,庆祝他们最近达到
的一个重要成果。
在编程或自动化的上下文中,完结这个目的或许触及以下几个过程:
1. 确认商场团队的联络信息,包含电子邮件地址。
2. 编写邮件内容,保证包含对最近里程碑的庆祝和必定。
3.
运用恰当的邮件发送协议(如SMTP)或邮件服务API(如SendGrid, Mailgun等)来发送邮件。
4. 保证邮件格局正确,包含主题行、正文、签名等。
5. 测验邮件发送功用以保证邮件可以成功送达。
假如你需求详细的代码示例或进一步的协助来完结这个功用,请供给更多的上下文或技能要求。
最终
本章介绍了 Semantic Kernel
的特色、中心概念以及与 OneApi
的对接方法,算是咱们SK
学习的 HelloWorld
,展现了怎么运用 Semantic Kernel
构建智能运用并与在线大模型进行集成。
参考文献
- Semantic Kernel Cookbook
- Prompting AI models with Semantic Kernel
- What is Semantic Kernel
本文示例源代码
本文源代码
😄欢迎重视笔者大众号一同学习沟通,获取更多有用的常识~