如何让其他模型也能在SemanticKernel中调用本地函数
在SemanticKernel的入门例子中:
// Import packages
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// Create a kernel with Azure OpenAI chat completion
var builder = Kernel.CreateBuilder().AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
// Add enterprise components
builder.Services.AddLogging(services => services.AddConsole().SetMinimumLevel(LogLevel.Trace));
// Build the kernel
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// Add a plugin (the LightsPlugin class is defined below)
kernel.Plugins.AddFromType<LightsPlugin>("Lights");
// Enable planning
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Create a history store the conversation
var history = new ChatHistory();
// Initiate a back-and-forth chat
string? userInput;
do {
// Collect user input
Console.Write("User > ");
userInput = Console.ReadLine();
// Add user input
history.AddUserMessage(userInput);
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
} while (userInput is not null)
只要使用:
// Enable planning
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
就可以实现本地函数的调用了,这很酷,也是最吸引我的地方。
但我在实践的过程中,发现直接这样子,只有OpenAI的模型与Moonshot AI可以用,而其他模型的本地函数调用都无效。
如何能使用一个开源的模型实现本地函数调用,那就非常酷。
在SemanticKernel的讨论区,我也发现世界各地的人也都有这种需求,不想只用OpenAI,也要使用其他的模型,在SemanticKernel中实现本地函数调用。

在这个讨论区,官方最初将这个转化为一个问题:

点进这个问题:

这是对应的翻译:
我们的连接器(OpenAI、Mistral、Gemini)支持函数调用功能,但并非特定 AI 提供商的每个模型都支持它。您需要查看 AI 提供商的官方文档,了解您要使用的具体模型及其功能。看起来 Phi-3 不支持开箱即用的函数调用。虽然,我认为可以对其进行微调以支持这一点。对于电灯开关插件示例,我们建议使用支持开箱即用函数调用的 AI 模型,以便快速上手。下面是 Azure OpenAI 中的可用模型、其功能和可用区域的列表:
https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models
我将关闭此问题,因为它与电灯开关插件无关。如果您看到任何其他问题,请随时打开一个新的。谢谢!
有一位老哥推荐了一个项目能够实现这个目的:

对应的翻译:
看看这个项目 https://github.com/Jenscaasen/UniversalLLMFunctionCaller。通过提示模板,它尝试模仿本机函数调用。我尝试了 ollama 和 phi3 mini、llama3,效果很好。
我也去尝试使用这个项目:

简介的翻译如下:
一个集成到语义内核中的计划器,可以在所有基于LLMs聊天(Mistral、Bard、Claude、LLama 等)上实现函数调用。
根据这个项目提供的方法我去尝试了一下:
把这个项目中的类,添加到自己的项目中:

添加这两个插件到自己的项目中,用于测试:

构建kernel:
var handler = new OpenAIHttpClientHandler();
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "",
apiKey: "",
httpClient: new HttpClient(handler));
_kernel = builder.Build();
_kernel.ImportPluginFromType<TimePlugin>("Time");
_kernel.ImportPluginFromType<MathPlugin>("Math");
测试代码:
UniversalLLMFunctionCaller planner = new(_kernel);
string ask = "What is the current hour number, plus 6?";
Debug.WriteLine(ask);
string result = await planner.RunAsync("What is the current hour number, plus 6?");
Debug.WriteLine(result);
Qwen/Qwen2-7B-Instruct的输出:

测试的时候是18:09分,18+6 =24,成功执行了本地函数用于获取当前时间与进行加法。
但并不是每个模型使用这个都能成功进行本地函数调用。

根据硅基流动提供的模型,我根据这个demo进行测试,可行的结果如下:
Qwen/Qwen2-72B-Instruct
Qwen/Qwen2-7B-Instruct
Qwen/Qwen1.5-110B-Chat
Qwen/Qwen1.5-32B-Chat
Qwen/Qwen1.5-7B-Chat
deepseek-ai/DeepSeek-V2-Chat
01-ai/Yi-1.5-34B-Chat-16K
可供遇到这个问题的人参考。
如何让其他模型也能在SemanticKernel中调用本地函数的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数
10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...
- laravel模型中非静态方法也能静态调用的原理
刚开始用laravel模型时,为了方便一直写静态方法,进行数据库操作. <?php namespace App\Models; use Illuminate\Database\Eloquent\ ...
- 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用
模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理.分类及应用 lqfarmer 深度学习研究员.欢迎扫描头像二维码,获取更多精彩内容. 946 人赞同了该文章 Atte ...
- Tensorflow 保存模型 & 在java中调用
本节涉及: 保存TensorFlow 的模型供其他语言使用 java中调用模型并进行预测计算 一.保存TensorFlow 的模型供其他语言使用 如果用户选择“y” ,则执行下面的步骤: 判断程序执行 ...
- Keras学习笔记二:保存本地模型和调用本地模型
使用深度学习模型时当然希望可以保存下训练好的模型,需要的时候直接调用,不再重新训练 一.保存模型到本地 以mnist数据集下的AutoEncoder 去噪为例.添加: file_path=" ...
- 理解 React Hooks 心智模型:必须按顺序、不能在条件语句中调用的规则
前言 自从 React 推出 hooks 的 API 后,相信大家对新 API 都很喜欢,但是它对你如何使用它会有一些奇怪的限制.比如,React 官网介绍了 Hooks 的这样一个限制: 不要在循环 ...
- IOS网络第二天 - 03-JSON显示数据,调用本地视频播放,数据转模型
********HMVideosViewController.m #import "HMVideosViewController.h" #import "MBProgre ...
- Java基础之在窗口中绘图——使用模型/视图体系结构在视图中绘图(Sketcher 1 drawing a 3D rectangle)
控制台程序. 在模型中表示数据视图的类用来显示草图并处理用户的交互操作,所以这种类把显示方法和草图控制器合并在一起.不专用于某个视图的通用GUI创建和操作在SketcherFrame类中处理. 模型对 ...
- phpcms 在后台增加了一个模型的话,在数据库中就会相应的增加数据库表
在phpcms后台管理系统中,我们如果增加一个新的模型的话,例如名为:测试模型,英文名:test 在添加完成后,我们在数据库中发现增加了两个数据表:v9_test,v9_test_data;
- (01)odoo模型中调用窗体动作
*模型代码 addons/stock/stock.py ---------------- #移库单执行移库动作(弹出详细框) @api.cr_uid_ids_context def ...
随机推荐
- su与sudo用法详解
su与sudo用法详解 目录 su与sudo用法详解 1. su和sudo详解:切换用户身份 1.1 shell登录类型和环境配置文件 1.2 su进行身份切换 1.3 sudo命令详解 1.3.1 ...
- SpringBoot3集成WebSocket
标签:WebSocket,Session,Postman. 一.简介 WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工.双向的通信通道,使得客户端和服务器之间的数据交换变得更加简 ...
- layui表格内可编辑下拉框
表格内可编辑下拉框扩展自别人的表格内下拉框 一.列模板,这是列配置的templet字段需要使用的. 1.inputdiv,输入框覆盖在下拉框上面左半部.这个样式用来调整输入框和下拉框不会超出单元格. ...
- 京东二面:Sychronized的锁升级过程是怎样的
引言 Java作为主流的面向对象编程语言,提供了丰富的并发工具来帮助开发者解决多线程环境下的数据一致性问题.其中,内置的关键字"Synchronized"扮演了至关重要的角色,它能 ...
- 一个免费、时尚、强大的 Windows GitHub 客户端
前言 今天大姚给大家分享一个.NET开源(MIT License).免费.时尚.功能强大的 Windows GitHub 客户端:FluentHub. 工具功能 多任务标签页. 上下文菜单扩展. 对问 ...
- go encoding/json 替代者
https://github.com/json-iterator/go 可以替代官方包encoding/json 提升json编码和解码效率
- 原型工具--canva可画
Canva 是一个功能强大的在线设计平台,提供了丰富的设计工具和素材,包括原型设计.尽管 Canva 在原型设计方面并不像专门的原型设计工具(如Sketch.Figma.Adobe XD等)那样功能全 ...
- RabbitMQ 进阶使用之延迟队列 → 订单在30分钟之内未支付则自动取消
开心一刻 晚上,媳妇和儿子躺在沙发上 儿子疑惑的问道:妈妈,你为什么不去上班 媳妇:妈妈的人生目标是前20年靠父母养,后40年靠你爸爸养,再往后20年就靠你和妹妹养 儿子:我可养不起 媳妇:为什么 儿 ...
- webpack js兼容处理
webpack在不需要引入任何loader可以对于js进行打包处理,但是它不会对于js兼容性进行任务的处理,而我们编写的项目是需要在不同的浏览器中运行的,此时就需要对于js的兼容性在打包过程中进行对应 ...
- CF1626E
problem 我们可以考虑什么情况下这个点一定可以到黑点. \(c_i = 1\). \(c_{son} = 1\). 儿子可以,并且儿子子树内有两个黑点 请两个不必多说,看最后一个. 假如说考虑他 ...