C# AIModelRouter:使用不同的AI模型完成不同的任务
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 Contains
private 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);
}
}
使用多个模型:

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

开启一个聊天循环:
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 input
KernelArguments 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 history
history.AddMessage(AuthorRole.Assistant, result.ToString());
history1 += $"Assistant:{result}\n";
} while (!isComplete);
}
}
来看看现在这个简单的路由规则:

当你的提问中包含一个ServiceId的时候,就会选择那个服务ID对应的模型进行回复,如果不包含就选择第一个服务ID对应的模型进行回复。
实际上这样使用,很容易让AI迷惑,因为我们总是要带上一个ServiceId,如果让AI根据用户的提问,自己决定用哪个模型是更好的。
进阶使用,用AI自己来决定

使用一个靠谱的AI模型来做这个事情比较好。
我们输入你好,那么Prompt就会变成这样:

AI返回的结果如下:


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

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

这时候或许修改Prompt可以奏效。
修改后的Prompt如下:
string skPrompt = """
根据用户的输入,返回最佳服务ID。
如果用户需要获取当前时间与写邮件,则选择工具调用相关的服务ID。
用户输入:
{{$input}}
服务ID列表:
{{$serviceIds}}
无需返回任何其他内容,只需返回服务ID。
""";
效果如下所示:

以上就是本次分享的全部内容,希望对你有所帮助。
C# AIModelRouter:使用不同的AI模型完成不同的任务的更多相关文章
- Microsoft宣布为Power BI提供AI模型构建器,关键驱动程序分析和Azure机器学习集成
微软的Power BI现在是一种正在大量结合人工智能(AI)的商业分析服务,它使用户无需编码经验或深厚的技术专长就能够创建报告,仪表板等.近日西雅图公司宣布推出几款新的AI功能,包括图像识别和文本分析 ...
- 炸金花游戏(3)--基于EV(期望收益)的简单AI模型
前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...
- 让你的AI模型尽可能的靠近数据源
来源:Redislabs作者:Pieter Cailliau.LucaAntiga翻译:Kevin (公众号:中间件小哥) 简介 今天我们发布了一个 RedisAI 的预览版本,预集成了[tensor ...
- 最强云硬盘来了,让AI模型迭代从1周缩短到1天
摘要:华为云擎天架构+ Flash-Native存储引擎+低时延CurreNET,数据存储和处理还有啥担心的? 虽然我们已经进入大数据时代,但多数企业数据利用率只有10%,数据的价值没有得到充分释放. ...
- 如何借助 JuiceFS 为 AI 模型训练提速 7 倍
背景 海量且优质的数据集是一个好的 AI 模型的基石之一,如何存储.管理这些数据集,以及在模型训练时提升 I/O 效率一直都是 AI 平台工程师和算法科学家特别关注的事情.不论是单机训练还是分布式训练 ...
- CANN5.0黑科技解密 | 别眨眼!缩小隧道,让你的AI模型“身轻如燕”!
摘要:CANN作为释放昇腾硬件算力的关键平台,通过深耕先进的模型压缩技术,聚力打造AMCT模型压缩工具,在保证模型精度前提下,不遗余力地降低模型的存储空间和计算量. 随着深度学习的发展,推理模型巨大的 ...
- AI模型运维——NVIDIA驱动、cuda、cudnn、nccl安装
目前大部分使用GPU的AI模型,都使用的英伟达这套. 需要注意的是,驱动.cuda.cudnn版本需要一一对应,高低版本互不兼容. 驱动和cuda对应关系:https://docs.nvidia.co ...
- 二手车价格预测 | 构建AI模型并部署Web应用 ⛵
作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 机器学习实战系列:https://www.showmeai.tech/t ...
- AI 音辨世界:艺术小白的我,靠这个AI模型,速识音乐流派选择音乐 ⛵
作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 机器学习实战系列:https://www.showmeai.tech/t ...
- Meta AI 开源万物可分割 AI 模型(SAM)
开始 4 月 6 日,根据 Meta AI 官方博客,Meta AI 宣布推出了一个 AI 模型 Segment Anything Model(SAM,分割一切模型).据介绍,该模型能够根据文本指令等 ...
随机推荐
- cv算法工程师成长路线
前言 一,计算机系统 1.1,计算机系统书籍 1.2,设计模式教程 二,编程语言 2.1,C++ 学习资料 2.2,Python 学习资料 三,数据结构与算法 3.1,数据结构与算法课程 3.2,算法 ...
- CMake 生成器表达式---条件表达式和逻辑运算符
[写在前面] CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在目标属性和生成器表达式上下文中.这些表达式允许你根据不同的平台.配置或编译器来定制构建过程. 本文引用的 ...
- python bytecode解析
python bytecode解析 前言 我们的电脑是怎么运行的呢?计算机内部的 CPU 处理器是个硅片,上面雕刻着精心布置的电路,输入特定的电流,就能得到另一种模式的电流,而且模式可以预测,给这些模 ...
- DFS序求LCA
DFS序求LCA 介绍 欧拉序求LCA 的数组总是会忘记开两倍,并且预处理的常数较大.用 DFS序求LCA 可以解决这些问题. 欧拉序:进节点和出节点会重复记录节点. DFS序:深度优先搜索的顺序,不 ...
- C# 串口读取并转换字符串
public string ReadString() { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] readBuffer = new byte ...
- 鸿蒙NEXT开发案例:血型遗传计算
[引言] 血型遗传计算器是一个帮助用户根据父母的血型预测子女可能的血型的应用.通过选择父母的血型,应用程序能够快速计算出孩子可能拥有的血型以及不可能拥有的血型.这个过程不仅涉及到了简单的数据处理逻辑, ...
- 23、表空间及段区块_1(段区块管理、pctfree、数据块结构、行迁移、高水位)
oracle数据库的物理存储结构 1.spfile:参数文件 2.controlfile:控制文件 3.datafile:数据文件 4.redo log 5.arch:归档日志 oracle数据库的d ...
- Cmocka 单元测试配置与使用
0. 前言 在 Windows 环境下配置 Cmocka 单元测试,并使用该框架进行单元测试. 1. Cmocka介绍 Cmocka 是一个 C 单元测试框架,支持 mock objects(打桩). ...
- C#-公众号H5页面授权获取用户code、openid、unionid
一:配置信息 公众号设置: 1:设置 IP白名单(所在的服务器ip).记录公众号APPID和APPsecret; 2:设置 网页授权域名; 二:页面授权----[html中获取code] 1:页面引入 ...
- JAVA MemCache 史无前例的详细讲解!看完包精通MEMCACHE!
Memcach什么是Memcache Memcache集群环境下缓存解决方案 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式 ...