C# AIModelRouter:使用不同的AI模型完成不同的任务

news/2025/1/7 17:42:54/文章来源:https://www.cnblogs.com/chinasoft/p/18655023

https://www.cnblogs.com/mingupupu/p/18654982

AIModelRouter

AI模型路由,模型的能力有大小之分,有些简单任务,能力小一点的模型也能很好地完成,而有些比较难的或者希望模型做得更好的,则可以选择能力强的模型。为什么要这样做呢?可以降低AI模型的使用成本,毕竟能力强的模型会更贵一点,省着用挺好的。

Semantic Kernel中可以很简便地使用一个AIModelRouter。

实践

先来一个简单的例子

来自https://github.com/microsoft/semantic-kernel/tree/main/dotnet/samples/Demos/AIModelRouter

新建一个CustomRouter类,如下所示:

internal sealed class CustomRouter()
{internal string GetService(string lookupPrompt, List<string> serviceIds){// The order matters, if the keyword is not found, the first one is used.foreach (var serviceId in serviceIds){if (Contains(lookupPrompt, serviceId)){return serviceId;}}return serviceIds[0];}// Ensure compatibility with both netstandard2.0 and net8.0 by using IndexOf instead of Containsprivate static bool Contains(string prompt, string pattern)=> prompt.IndexOf(pattern, StringComparison.CurrentCultureIgnoreCase) >= 0;
}

新建一个SelectedServiceFilter类用于打印一些信息:

 internal sealed class SelectedServiceFilter : IPromptRenderFilter{/// <inheritdoc/>public Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next){Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine($"Selected service id: '{context.Arguments.ExecutionSettings?.FirstOrDefault().Key}'");Console.ForegroundColor = ConsoleColor.White;Console.Write("Assistant > ");return next(context);}}

使用多个模型:

image-20250106101815911

为捕获路由器选择的服务 ID 添加自定义过滤器:

image-20250106101942229

开启一个聊天循环:

        Console.ForegroundColor = ConsoleColor.White;ChatHistory history = [];string history1 = string.Empty;bool isComplete = false;do{Console.WriteLine();Console.Write("> ");string? input = Console.ReadLine();if (string.IsNullOrWhiteSpace(input)){continue;}if (input.Trim().Equals("EXIT", StringComparison.OrdinalIgnoreCase)){isComplete = true;break;}if (input.Trim().Equals("Clear", StringComparison.OrdinalIgnoreCase)){history.Clear();history1 = " ";Console.WriteLine("已清除聊天记录");continue;}history.Add(new ChatMessageContent(AuthorRole.User, input));history1 += $"User:{input}\n";Console.WriteLine();// Find the best service to use based on the user's inputKernelArguments arguments = new(new PromptExecutionSettings(){ServiceId = router.GetService(input, serviceIds).Result,FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()});// Invoke the prompt and print the response//await foreach (var chatChunk in kernel.InvokePromptStreamingAsync(userMessage, arguments).ConfigureAwait(false))//{//    Console.Write(chatChunk);//}var result = await kernel.InvokePromptAsync(history1, arguments).ConfigureAwait(false);Console.ForegroundColor = ConsoleColor.White;Console.WriteLine(result);Console.WriteLine();// Add the message from the agent to the chat historyhistory.AddMessage(AuthorRole.Assistant, result.ToString());history1 += $"Assistant:{result}\n";} while (!isComplete);}
}

来看看现在这个简单的路由规则:

image-20250106102824888

当你的提问中包含一个ServiceId的时候,就会选择那个服务ID对应的模型进行回复,如果不包含就选择第一个服务ID对应的模型进行回复。

实际上这样使用,很容易让AI迷惑,因为我们总是要带上一个ServiceId,如果让AI根据用户的提问,自己决定用哪个模型是更好的。

进阶使用,用AI自己来决定

image-20250106103343454

使用一个靠谱的AI模型来做这个事情比较好。

我们输入你好,那么Prompt就会变成这样:

image-20250106103624167

AI返回的结果如下:

image-20250106103713305

image-20250106103742224

再试试其他几个怎么触发:

image-20250106103848889

而工具调用与其他比较容易混淆,因为就算是我们自己,也很难分辨有什么区别:

image-20250106104310185

这时候或许修改Prompt可以奏效。

修改后的Prompt如下:

 string skPrompt = """根据用户的输入,返回最佳服务ID。如果用户需要获取当前时间与写邮件,则选择工具调用相关的服务ID。用户输入:{{$input}}服务ID列表:{{$serviceIds}}无需返回任何其他内容,只需返回服务ID。              """;

效果如下所示:

image-20250106113558077

以上就是本次分享的全部内容,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864899.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Windows批处理命令批量上传jar到Nexus(maven私服)中

这里就不介绍nexus的搭建了;网上很多都是.sh脚本,linux比较合适,当然用git也可以运行;但是.bat文件肯定是所有windows系统都是可以执行的;所以这里介绍一下用windows的批处理命令来编写; 首先,你得先确定的仓库状态是处于Allow redeploy状态;新建一个文件mavenimport.b…

第七届封神台CTF

没事,学习了一下第七届封神台CTF Web welcome_to_zkaqctf ​​ 源码: const {promises: fs} = require(fs); const fastify = require(fastify);const flag = process.env.FLAG || zkaq{do_you_believe_this_is_flag?};const app = fastify(); app.get(/, async (_, res) =&…

Activiti 手工新增历史环节20250116

手工新增(历史任务表)act_hi_taskinst,其实这个表记录加一条就可以 注:字段2值为空,字段值10为空,字段11、12 值都要加-----act_hi_taskinst.PROC_DEF_ID myProcess:34:400000000000736-----act_hi_taskinst.PROC_INST_ID_ 400000000000496SELECT * FROM "act_hi_…

SQL语言做加减运算时将某项的null值转换为0

在SQL语言中,很多时候,在表项中会遇到null值,null值有三大特点:1)NULL值不参加统计;2)NULL值不进入计算表达式;3)不能与其它值进行比较。 因此,在运算中要将null值有时候转换成其他值,这里提供一种加减运算中转换为0的方法。 如:在算工资的时候,总工资=基础工资+奖…

中电金信携手华为发布“全链路实时营销解决方案”,重塑金融营销数智新生态

在数智化转型成为驱动经济社会高质量发展的新引擎背景下,“数智方案”栏目聚焦金融等国计民生重点行业场景,依托中电金信“源启筑基+咨询引领+应用重构”的产品及服务体系,输出市场洞察和行业解决方案、应用案例,旨在全面推动行业IT架构升级、数智化转型。数智驱动是金融机…

实时协作:如何通过协作文档提升团队生产力

在当今快节奏的工作环境中,团队协作的效率直接决定了项目的成败。然而,文档管理作为协作的核心环节,却常常成为效率的“隐形杀手”。无论是版本混乱、信息丢失,还是沟通不畅,这些问题都在无形中消耗着团队的时间和精力。而协作文档工具的出现,正是为了解决这些痛点,彻底…

win10重装如何跳过微软账号直接设置本地帐户.221111

​在添加你的帐户界面,选择脱机帐户2. 第二个页面,选择有限的体验3. 第三个页面,设置自己本地的用户名4. 第四个页面,设置自己本地的密码.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; paddin…

看板软件在利益相关者期望管理中的应用与探索

制定一个有效的利益相关者期望管理计划需要全面识别利益相关者、深入分析他们的期望、制定期望管理策略、制定详细的期望管理计划、实施与调整期望管理计划以及建立绩效评估机制。通过这些步骤,你可以确保项目目标与利益相关者的期望保持一致,提高项目的成功率和满意度。制定…

centos7安装docker.240103

​1. installDocker.sh ,然后自行安装 安装所需资源包 sudo yum install -y yum-utils 设置docker下载地址 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo安装docker sudo yum install docker-ce -y docker-ce-cli conta…

MySQL8设置root用户远程访问.240103

查询当前root状态,默认root的host是localhost use mysql; select user,host from user;update root的host为% update user set host = % where user =root;检查客户端windows 的防火墙,关闭防火墙try。.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimg…

云计算真的很便宜吗?.240103

​37Signals的首席技术官David Heinemeier Hansson表示,2022年一共在AWS(亚马逊云)花了3,201,564美元,即每月266,797美元。其中759,983美元都花费在AWS的EC2和EKS服务服务计算上面。 Heinemeier指出,即使是这个账单,也是团队共同努力保持cost down的结果。“这已经是一个…

Kettle用查出来的数据自动创建表.240105

​Kettle在表输入的时候,写好很复杂的SQL,有种场景,就是想把这个很复杂的查出来的数据,自动创建一个表。 其实,操作步骤不复杂。 跟着我来做就是了。1,新建表输出,Shift按住,从表输入拖动箭头到表输出,打开表输出属性,指定数据库,输入需要创建的目标表名。2,点击右…