大家好,我今天带来了一个让人瞠目结舌的实验:在一小时内快速生成了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 Kernel的Semantic 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本地助手
如果这些文章帮助到了你,欢迎订阅我的公众号: