【OpenAI&SK】:百行行代码实现GPT的chat
SemanticKernel其中一个功能是实现像https://chat.openai.com那样的问答聊天功能,给过SK封装,就变得简单灵活了,下面是不到百地代码实现的一个简单聊天功能。
32行(后端)+51行(前端)=83行
后端:
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.AI.ChatCompletion; using Microsoft.SemanticKernel.Connectors.AI.OpenAI.ChatCompletion; using System.Text; var key = File.ReadAllText(@"C:\\GPT\key.txt"); var builder = WebApplication.CreateBuilder(args); var kernel = Kernel.Builder .WithOpenAIChatCompletionService("gpt-4", key, serviceId: "gsw_chat") .Build(); var chatGPT = kernel.GetService<IChatCompletion>(); builder.Services.AddSingleton(chatGPT); builder.Services.AddSingleton((OpenAIChatHistory)chatGPT.CreateNewChat()); var app = builder.Build(); app.UseStaticFiles(); app.MapGet("/chat", AskAsync); app.Run(); async IAsyncEnumerable<string> AskAsync(IChatCompletion chat, OpenAIChatHistory history, string ask) { history.AddUserMessage(ask); var reply = chat.GenerateMessageStreamAsync(history, new ChatRequestSettings() { MaxTokens = 2048 }); var answer = new StringBuilder(); await foreach (var item in reply) { if(item==null) { continue; } answer.Append(item); yield return item; } history.AddAssistantMessage(answer.ToString()); }
首先构建一个KernelBuilder,把OpenAI的ChatCompletion服务添加到Builder中,然后把Chat服务注入到asp.net core的服务容器中,同时也把History列表注入到服务容器中,当前api有访问的时候,通过chat结合history来获取OpenAI返回的聊天信息,以流的形式输出到前端。
前端:
<!DOCTYPE html> <html> <head> <title>小助手</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <h3 class="display-4">小助手</h3> </div> <div class="row"> <div class="input-group mb-3"> <input type="text" id="ask" class="form-control" placeholder="请输入问题" aria-label="请输入问题" aria-describedby="chat"> <button class="btn btn-outline-secondary" type="button" id="chat">开始</button> </div> </div> <div id="messagesdiv" class="row"></div> </div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script> <script> $(function () { $("#chat").click(function () { var askDiv = $("<div class='alert alert-primary'>"); askDiv.text("【您】" + $("#ask").val()); var answerDiv = $("<textarea class='alert alert-warning' style='min-height:150px'>"); $("#messagesdiv").append(askDiv); $("#messagesdiv").append(answerDiv); var xhr = new $.ajaxSettings.xhr(); xhr.onreadystatechange = function () { if (xhr.readyState == 3) { var content = ""; var list = JSON.parse(xhr.responseText.replace(']', '') + ']'); $(list).each(function (index, item) { content += item }) answerDiv.text(content) } else if (xhr.readyState == 4) { answerDiv.removeClass("alert-warning") answerDiv.addClass("alert-success") $("#ask").val("") } } xhr.open('GET', '/chat?ask=' + $("#ask").val()) xhr.send() }) }); </script> </body> </html>
前端代码用ajax的形式接收流显示在页面上,再通过jquery控制一些样式即可。
运行效果如下:
细心的朋友可能会发现,这个上下文是所有用户共享的。那么怎样才能做到像ChatGPT那样独享呢?这个话题留给你吧!
文章来源微信公众号
想要更快更方便的了解相关知识,可以关注微信公众号
****欢迎关注我的asp.net core系统课程****
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!