当前位置: 首页 > news >正文

Semantic Kernel + Natasha:一小时快速生成100个API的奇迹

        大家好,我今天带来了一个让人瞠目结舌的实验:在一小时内快速生成了100个API!

        其实如果手速高,可以更多。要知道,这得益于之前介绍过的Natasha  ——  一个可以动态编译并加载代码的神奇工具。

动态编程神器! 探秘.Net中的AI时代秘密武器——Natasha框架全解析

        而当它与Semantic Kernel结合时,我们可以使用AI来动态生成代码,这可不是闹着玩的!

        首先,让我们先来观摩一下这个令人震惊的效果!

效果视频

        在这个视频中我们可以看见,我通过一句话就能生成出一个API接口。包含加法接口,爬取百度内容的接口,以及求质数,转大写的接口

        接下来,让我们深入了解一下背后的代码实现吧。

        首先,在开始之前,需要确保我们的项目中引入了Semantic Kernel。大家若还不够了解它,请回顾我之前的文章。

        下面是Natasha相关的NuGet包引用,别忘了添加到你的项目中:

<PackageReference Include="DotNetCore.Natasha.CSharp.Compiler" Version="8.0.0" /><PackageReference Include="DotNetCore.Natasha.CSharp.Compiler.Domain" Version="8.0.0" /><PackageReference Include="DotNetCore.Natasha.Domain" Version="8.0.0" />

        Natasha工作前需要做一些准备,我们需要将它注入依赖:

public void ConfigureServices(IServiceCollection services){    // ...省略其他依赖注入...    services.AddSingleton<DynamicChangeTokenProvider>()            .AddSingleton<IActionDescriptorChangeProvider>(provider => provider.GetRequiredService<DynamicChangeTokenProvider>());}

        然后,在Configure方法中,我们进行一些设置使得Natasha可以正常运作:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider){    NatashaController.Builder = (ApplicationBuilder)app;    // ...省略其他配置...    app.UseEndpoints(endpoints =>    {        endpoints.MapControllers();        NatashaController.Endpoints = endpoints.DataSources;    });}

        现在来到了最关键的部分:定义Semantic KernelSemantic Function。我们需要一个能够根据用户需求,动态生成需要的Controller层Action代码的代码生成器,示例如下:

你作为一个代码生成器,需要通过用户需求生成对应Controller层的Action代码,你需要完成以下功能:{{$input}}
---------------------------------------------参考如下代码示例进行生成,并且不要有其他多余文字:```csharp[HttpPost]public async Task<IActionResult> Test(){    //代码路径    var a=0;    return Ok(a.Success());}```

        在准备好上述步骤之后,我创建了一个通用的API:

/// <summary>/// Natasha示例控制器/// </summary>[Route("api/[controller]/[action]")][ApiController]public class NatashaController : ControllerBase{    // ...省略NatashaController部分成员变量和构造器...
    [HttpPost]    public async Task<IActionResult> AICode(CodeDTO model, [FromServices] ApplicationPartManager manager,                                            [FromServices] DynamicChangeTokenProvider tokenProvider)    {        // ...此处省略SK执行Semantic Function代码生成的详细实现...
        // 动态编译生成的代码并加入到项目中进行加载        AssemblyCSharpBuilder builder = new AssemblyCSharpBuilder();        var myAssembly = builder.UseRandomDomain().UseSmartMode().Add(classCode).GetAssembly();        var assembly = new AssemblyPart(myAssembly);        AssemblyCache.Enqueue(assembly);        manager.ApplicationParts.Add(assembly);        tokenProvider.NotifyChanges();                return Ok(code);    }}

        

        然后,每当我们调用这个API时,我们就可以生成一个新的API了!

        在本次测试里我们先按比较简单的方式,让AI来生成接口,并进行动态加载和刷新路由。

        这里由于我们是预编译的c#语言,也可以针对AI生成的代码进行预编译检测,如果有异常,把异常信息重新包装Prompt进行提交 让AI进行修改。这将是一个非常不错的主意,未来我会继续完善,让AI具备写Service以及仓储层的能力!

往期文章回顾:

揭秘AI与RPA结合的强大力量,轻松实现AI自动化网页操作!

语音革命:打造您的个人AI助手,悄悄分享我的开源语音识别全攻略!

Semantic Kernel与Everything相结合:实现本地文件搜索新境界!让你的文件“无所遁形”!

探索Avalonia与SemanticKernel打造全能AI本地助手

如果这些文章帮助到了你,欢迎订阅我的公众号:

相关文章:

Semantic Kernel + Natasha:一小时快速生成100个API的奇迹

大家好&#xff0c;我今天带来了一个让人瞠目结舌的实验&#xff1a;在一小时内快速生成了100个API&#xff01; 其实如果手速高&#xff0c;可以更多。要知道&#xff0c;这得益于之前介绍过的Natasha —— 一个可以动态编译并加载代码的神奇工具。 动态编程神器! 探秘.Net…...

rancher upgrade 【rancher 升级】

文章目录 1. 背景2. 下载3. 安装4. 检查5. 测试5.1 创建项目5.2 创建应用5.3 删除集群5.4 注册集群 1. 背景 rancher v2.8.2 升级 v2.9.1 2. 下载 下载charts helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update helm fetc…...

【Linux】多线程:线程互斥、互斥锁、线程安全

目录 一、多线程访问公共资源时所产生的问题 二、互斥相关背景概念 互斥量mutex&#xff08;锁&#xff09;的引入 三、互斥量 1、初始化互斥量&#xff08;mutex&#xff09; 2、互斥量加锁 3、互斥量解锁 4、 销毁互斥量 四、互斥量的使用 1、使用静态互斥量 2、…...

进程之间的通信方式

前言 每个进程的用户地址空间都是独立的&#xff0c;一般而言是不能互相访问的&#xff0c;但内核空间是每个进程都共享的&#xff0c;所以进程之间要通信必须通过内核。 Linux提供了以下进程通信方式&#xff1a; 一、管道 所谓的管道&#xff0c;就是内核里面的一串缓存。…...

动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]

目录 LeNet模型训练 LeNet 总体来看&#xff0c;LeNet&#xff08;LeNet-5&#xff09;由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成; 全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均…...

log4j 和 java.lang.OutOfMemoryError PermGen space

还是OneCoder在项目中沙箱的问题&#xff0c;用classloader隔离做的沙箱&#xff0c;反复运行用户的任务&#xff0c;出现永生区内存溢出&#xff1a; java.lang.OutOfMemoryError: PermGen space 这个问题在tomcat重复热部署的时候其实比较常见。其道理也和我们沙箱的道理基本…...

2024.9.9营养小题【2】

营养&#xff1a; 1、什么数是丑数&#xff1f; 2、数学数学&#xff0c;丑数的数学意义&#xff0c;哎&#xff0c;数学思维我是忘干净了。 3、可以把while循环换成for循环。由此又想到了一点&#xff0c;三个循环结构各有使用场景。 for(;n%factors[i]0;n/factors[i]){}...

uniapp的barcode组件去掉自动放大功能

autoZoom“false” <barcode id1 class"barcode" autoZoom"false" autostart"false" ref"barcode" background"rgb(0,0,0)" frameColor"#1C86EE"scanbarColor"#1C86EE" :filters"fil" ma…...

H5接入Steam 获取用户数据案例

官方文档地址 1.注册 Steam API Key&#xff1a; 你需要一个 Steam Web API Key&#xff0c;可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 2.使用 OpenID 登录&#xff1a; 实现 Steam OpenID 登录&#xff0c;以便用户通过 Steam 账户登录你的…...

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…...

隔壁老樊2024全国巡回演唱会重磅来袭,首站广州正式官宣!

汹涌人潮将城市填满&#xff0c;斑驳心绪漂浮在时间之隙&#xff0c;当生活的喜悲逐渐演化成歌&#xff0c;天空将自己负载的缄默倾泻&#xff0c;那些或酸涩、或热烈的点滴滑落心海&#xff0c;那层悬挂在「我」与世界分野的无形壁垒&#xff0c;渐也被曙光渗透消融。 提炼生…...

【C++】list(下)

个人主页~ list&#xff08;上&#xff09;~ list 四、模拟实现1、list.h&#xff08;1&#xff09;关于整个list的搭建①节点②迭代器③接口 &#xff08;2&#xff09;自定义类型实例化 2、test.cpp&#xff08;1&#xff09;test1&#xff08;2&#xff09;test2 五、额外小…...

千云物流 -低代码平台MySQL备份数据

windows备份 全量备份 创建备份目录 需要在安装数据库的服务器上创建备份目录,所有如果要做备份至少需要两倍的硬盘空间, mkdir D:\mysql_backup\full_backup准备备份脚本 创建一个windows批处理文件&#xff08;例如 full_backup.bat&#xff09;&#xff0c;用来执行全量…...

MySQL:进阶巩固-视图

目录 一、视图的概述二、视图的基本使用2.1 创建视图2.2 查询视图2.3 修改视图2.4 删除视图 一、视图的概述 视图是一种虚拟存在的表&#xff0c;视图中的数据并不在数据库中实际的存在&#xff0c;行列数据来自于视图中查询的表&#xff0c;并且是在使用视图时动态生成的。 通…...

分布式事务Seata原理及其项目使用

0.Seata官方文档 1.Seata概念及原理 Seata是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata主要由三个重要组…...

JS_分支结构

if结构 这里的if结构几乎和JAVA中的一样,需要注意的是 if()中的非空字符串会被认为是trueif()中的非零数字会被认为是trueif()中的非空对象会被认为是true <script> if(false){// 非空字符串 if判断为true console.log(true) }else{ console.log(false) } if(){// 长度…...

决策树(Decison Tree)—有监督学习方法、概率模型、生成模型、非线性模型、非参数化模型、批量学习

定义 ID3算法 输入:训练数据集(T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\right\} {(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)}),特征集A阀值 ε \varepsilon ε 输出:决策树T (1)若D中所有实例属于同一…...

java 自定义注解校验实体类属性

直接上代码 1.是否启用参数校验注解 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface EnableArgumentsCheck {/*** 是否启用*/boolean enable() default true;} 2.参数校验自定义注解 /*** 参数校验自定义注解* 属性定义&#…...

光伏并网发电系统中电能质量监测与优化技术探讨

0引言 随着清洁能源技术的持续进步与广泛应用&#xff0c;光伏并网发电系统亦逐步崭露头角。作为一种关键的电力供应方式&#xff0c;其受到了广泛的关注。然而&#xff0c;由于天气等外部条件的影响&#xff0c;光伏发电系统面临若干挑战。电能质量问题&#xff0c;诸如电压波…...

网页解析的那些事

Vue 方面 模板语法理解 熟悉 Vue 的模板语法&#xff0c;包括插值表达式&#xff08;如{{ message }}&#xff09;、指令&#xff08;如v-if、v-for、v-bind等&#xff09;。理解这些语法元素如何将数据与 DOM 元素进行绑定和交互。例如&#xff0c;v-for指令用于循环渲染列表数…...

从文字到世界:2024外语阅读大赛报名开启,赛氪网全程护航

中国外文局CATTI项目管理中心与中国外文界联合宣布&#xff0c;将举办2024年外语阅读大赛&#xff0c;旨在激发外语学习兴趣&#xff0c;选拔并培养优秀的语言应用人才&#xff0c;同时向世界展示和传播具有中国特色的优秀文化。此次大赛旨在激发外语学习兴趣&#xff0c;选拔优…...

微信小程序知识点(二)

1.下拉刷新事件 如果页面需要下拉刷新功能&#xff0c;则在页面对应的json配置文件中&#xff0c;将enablePullDownRefresh配置设置为true&#xff0c;如下 {"usingComponents": {},"enablePullDownRefresh": true } 2.上拉触底事件 在很多时候&#x…...

Springcould -第一个Eureka应用 --- day02

标题 Eureka工作原理Spring Cloud框架下的服务发现Eureka包含两个组件&#xff0c;分别是&#xff1a;Eureka Server与Eureka Client。Eureka Server&#xff1a;Eureka Client&#xff1a; 搭建Eureka Server步骤&#xff1a;步骤1&#xff1a;创建项目&#xff0c;引入依赖步…...

RedissonClient 分布式队列工具类

注意&#xff1a;轻量级队列可以使用工具类&#xff0c;重量级数据量 请使用 MQ 本文章基于redis使用redisson客户端实现轻量级队列&#xff0c;以及代码、执行结果演示 一、常见队列了解 普通队列&#xff1a;先进先出&#xff08;FIFO&#xff09;&#xff0c;只能在一端添…...

protobuf使用

我下载的是 protobuf-27.4 以下使用vs2022 根据readme&#xff0c;执行如下命令 "C:\Program Files\CMake\bin\cmake.exe" -G "Visual Studio 17 2022" -DCMAKE_INSTALL_PREFIXC:\Users\x\Downloads\install C:\Users\x\Downloads\protobuf-27.4 -D…...

【微处理器系统原理与应用设计第十二讲】通用定时器设计二之PWM波实现呼吸灯的功能

一、基础知识 1、寄存器的配置 &#xff08;1&#xff09;GPIOX_AFRL&#xff1a;GPIO复用功能低位寄存器 GPIOX_AFRH&#xff1a;GPIO复用功能高位寄存器 &#xff08;2&#xff09;配置PA5 GPIOA->MODER&#xff08;端口模式寄存器&#xff09;&#xff0c;10为复用功…...

2025秋招NLP算法面试真题(十九)-大模型分布式训练题目

目录: 理论篇 1.1 训练大语言模型存在问题? 1.2 什么是点对点通信? 1.3 什么是集体通信? 1.4 什么是数据并行? 1.5 数据并行如何提升效率? 1.6 什么是流水线并行? 1.7 什么是张量并行 (intra-layer)? 1.8 数据并行 vs 张量并行 vs 流水线并行? 1.9 什么是3D并行? 1.1…...

线程池的应用

1.线程的执行机制 线程分为用户线程 和 内核线程 内核线程就是系统级别的线程&#xff0c;与cpu逻辑处理器数量对应的 用户线程就是使用java代码创建的Thread对象 用户线程必须与内核线程关联&#xff08;映射&#xff09;&#xff0c;才能执行任务 当用户线程多于内核线程时…...

OPenCV结构分析与形状描述符(5)查找图像中的连通组件的函数connectedComponents()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 connectedComponents 函数计算布尔图像的连通组件标签图像。 该函数接受一个具有4或8连通性的二值图像&#xff0c;并返回 N&#xff0c;即标签…...

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验

一、实验内容 1.需求/要求&#xff1a; 将两个单臂路由通过两台交换机连接起来&#xff0c;成为双臂路由&#xff0c;并探讨这么做的原因。实现全网通&#xff0c;让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC配置ip地址…...