开始体会经过 Semantic Kernel 与自己布置的通义千问开源大模型进行对话
新年之前被 Semantic Kernel 所招引,开端了解它,学习它。
在写这篇博文之前读了一些英文博文,趁便在这儿共享一下:
- Intro to Semantic Kernel – Part One
- Intro to Semantic Kernel – Part Two
- Build a custom Copilot experience with your private data using and Kernel Memory
- Semantic Kernel: The New Way to Create Artificial Intelligence Applications
- Semantic Kernel: A bridge between large language models and your code
为了便利学习与体会以及写代码实践 Semantic Kernel,计划自己布置一个对中文友爱的开源大模型,所以挑选了通义千问
依据通义千问开源库房中的 README,经过一番折腾,总算布置成功,详见博文 以容器办法布置通义千问 Qwen
紧接着便是测验经过 Semantic Kernel 与自己布置的通义千问进行对话,在昨天晚上睡觉前开始测验成功,经过这篇博文记载一下。
首要面对的问题是 Semantic Kernel 与通义千问之间互不支撑(内置支撑),Semantic Kernel 现在只内置支撑 OpenAI 与 Azure OpenAI。走运的是,通义千问完成了一个四两拔千斤的奇妙才能——供给了兼容 OpenAI api 的 api,所以这个大问题方便的处理为一个小问题——怎么诈骗 Semantic Kernel 让它在恳求 OpenAI api 时改道恳求自己布置的通义千问模型服务?
在 Semantic Kernel github issue 的一个谈论中发现了一个偷梁换柱的奇妙办法——经过 DelegatingHandler
修正 HttpClient 恳求的 url。
对应到这儿的场景便是修正所恳求的 OpenAI api url 中的 scheme
与 host
,也便是将 https://api.openai.com
替换为 http://localhost:8901
,完成代码如下
class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
return base.SendAsync(request, cancellationToken);
}
}
偷梁换柱之后本认为开始体会小功乐成,却遇到一个小波折,在用下面的代码发送 prompt 时报错
var prompt = @"博客园是什么网站";
var result = await kernel.InvokePromptAsync(prompt);
Console.WriteLine(result);
过错来自通义千问的呼应
{"detail":"Invalid request: Expecting at least one user message."}
后来参阅大众号文章运用阿里通义千问和Semantic Kernel,10分钟建立常识助手中的代码处理了
var prompt = @"<message role=""user"">博客园是什么网站</message>";
var summarize = kernel.CreateFunctionFromPrompt(prompt);
var result = kernel.InvokeStreamingAsync(summarize);
await foreach (var item in result)
{
Console.Write(item.ToString());
}
处理这个问题后,控制台就能看到来自通义千问慢悠悠的吐字答复:
博客园(CNG.cn)是我国最大的IT社区,也是一个专业的程序员学习沟通的渠道。它供给了一个能够让程序员沟通思想、共享经历的环境,并且有多重功用支撑用户创立个人博客和参加评论。
注:这儿运用的通义千问模型版本是 Qwen-7B-Chat
到此,开始体会 Semantic Kernel 就小功乐成了,下面是完好代码。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-3.5-turbo", "***");
builder.Services.ConfigureHttpClientDefaults(b =>
b.ConfigurePrimaryHttpMessageHandler(() => new QwenRedirectingHandler()));
var kernel = builder.Build();
var prompt = @"<message role=""user"">博客园是什么网站</message>";
var summarize = kernel.CreateFunctionFromPrompt(prompt);
var result = kernel.InvokeStreamingAsync(summarize);
await foreach (var item in result)
{
Console.Write(item.ToString());
}
class QwenRedirectingHandler() : DelegatingHandler(new HttpClientHandler())
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
request.RequestUri = new UriBuilder(request.RequestUri!) { Scheme = "http", Host = "localhost", Port = 8901 }.Uri;
return base.SendAsync(request, cancellationToken);
}
}