如何让其他模型也能在SemanticKernel中调用本地函数

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 简介的翻译如下:一个集成到语义内核中的计划器,可以在所有基于LLMs聊天(Mistral、Bard、Claude、LLama 等)上实现函数调用。根据这个项目提供的方法我去尝试了一下:把这个项目中的类,添加到自己的项目中:

在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/infodebtweCeach

我将关闭此问题,因为它与电灯开关插件无关。如果您看到任何其他问题,请随时打开一个新的。谢谢!

有一位老哥推荐了一个项目能够实现这个目的:

对应的翻译:

看看这个项目 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

可供遇到这个问题的人参考。

相关文章
|
6月前
|
存储 人工智能 搜索推荐
不懂向量数据库?别怕!一文讲清8大主流工具,手把手教你做选择
向量数据库是AI应用的“超级记忆中枢”,能将文本、图像等转化为数学指纹并快速检索相似内容。本文通俗解析8大主流向量数据库,涵盖托管型、开源型与嵌入式三类,助你根据场景选型,轻松构建智能搜索、推荐系统与RAG应用。
5218 6
|
9月前
|
人工智能 API 数据库
Semantic Kernel .NET 架构学习指南
本指南系统解析微软Semantic Kernel .NET架构,涵盖核心组件、设计模式与源码结构,结合实战路径与调试技巧,助你从入门到贡献开源,掌握AI编排开发全栈技能。
1059 2
|
人工智能 JSON 自然语言处理
多快好省,Qwen3混合部署模式引爆MCP
本文介绍了MCP(Model Context Protocol)与Qwen3模型的结合应用。MCP通过统一协议让AI模型连接各种工具和数据源,类似AI世界的“USB-C”接口。文中详细解析了MCP架构,包括Host、Client和Server三个核心组件,并说明了模型如何智能选择工具及工具执行反馈机制。Qwen3作为新一代通义千问模型,采用混合专家架构,具备235B参数但仅需激活22B,支持快速与深度思考模式,多语言处理能力覆盖119种语言。文章还展示了Qwen3的本地部署流程,以及开发和调试MCP Server与Client的具体步骤。
3651 36
多快好省,Qwen3混合部署模式引爆MCP
|
11月前
|
Ubuntu 关系型数据库 MySQL
Ubuntu上搭建网站全流程:从零起步到网站上线
搭建好网站后,您需要定期维护和更新以保持其正常运行和安全性。这包括监控服务器状态、备份网站数据、更新软件和插件等。Ubuntu提供了丰富的工具和资源来帮助您进行这些操作。 通过以上七个步骤,您可以在Ubuntu上成功搭建一个功能完善、安全可靠的网站。无论是个人项目还是商业应用,Ubuntu都能为您提供强大的支持和灵活性。
|
监控 安全 Ubuntu
Linux下如何安装配置Fail2ban防护工具
通过以上步骤,可以在Linux系统中成功安装和配置Fail2ban,从而有效保护服务器免受暴力破解等攻击。Fail2ban通过实时监控日志文件,自动更新防火墙规则,为系统安全提供了一层重要的保护。
3142 36
|
C# 开发工具 C++
code runner 运行C#项目
本文介绍了如何修改Code Runner设置使 Visual Studio Code (VS Code) 能直接运行完整的 C# 项目。传统方式依赖 cscript 工具,仅支持 .csx 文件,功能受限且已停止维护。新配置使用 `dotnet run` 命令,结合一系列炫酷的cmd指令,将指令定位到具体的csproj文件上进行运行。
1398 38
|
消息中间件 SQL Kubernetes
DotNet.CAP,或是.NET唯一靠谱的开源分布式框架
DotNet.CAP,或是.NET唯一靠谱的开源分布式框架
1049 0
DotNet.CAP,或是.NET唯一靠谱的开源分布式框架
|
安全 API 网络架构
Refit使用入门
本文介绍了如何使用Refit库在.NET Core项目中实现RESTful API的调用。通过创建`IGitHubApi`接口定义API方法,并在`Program.cs`中配置Refit客户端,最后在`WeatherForecastController`中演示了两种调用API的方式,展示了Refit的便捷性和类型安全性。
415 1
|
缓存 Linux 开发者
Avalonia开源控件库强力推荐-Semi.Avalonia
【11月更文挑战第3天】Semi.Avalonia 是一个基于 Avalonia 的开源控件库,提供了丰富的自定义控件和扩展功能。它支持多种样式按钮、高级输入控件和灵活的布局容器,简化了属性设置,并提供了详细的文档支持。Semi.Avalonia 还支持多种内置主题和自定义主题,具备高效的渲染机制和合理的资源管理,适用于跨平台桌面应用程序开发。
1219 2
|
Shell
SqlServer旁门左道之启动报错(cannot find one or more components.Please reinstall the application。)终极解决方案
SqlServer旁门左道之启动报错(cannot find one or more components.Please reinstall the application。)终极解决方案
1130 0