首页 > 其他分享 >如何让其他模型也能在SemanticKernel中调用本地函数

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

时间:2024-07-05 18:33:21浏览次数:16  
标签:kernel 调用 模型 函数调用 Qwen 本地 new 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中实现本地函数调用。

image-20240705175357335

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

image-20240705175701905

点进这个问题:

image-20240705175818171

这是对应的翻译:

我们的连接器(OpenAI、Mistral、Gemini)支持函数调用功能,但并非特定 AI 提供商的每个模型都支持它。您需要查看 AI 提供商的官方文档,了解您要使用的具体模型及其功能。看起来 Phi-3 不支持开箱即用的函数调用。虽然,我认为可以对其进行微调以支持这一点。对于电灯开关插件示例,我们建议使用支持开箱即用函数调用的 AI 模型,以便快速上手。下面是 Azure OpenAI 中的可用模型、其功能和可用区域的列表:
https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models

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

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

image-20240705180008794

对应的翻译:

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

我也去尝试使用这个项目:

image-20240705180118266

简介的翻译如下:

一个集成到语义内核中的计划器,可以在所有基于LLMs聊天(Mistral、Bard、Claude、LLama 等)上实现函数调用。

根据这个项目提供的方法我去尝试了一下:

把这个项目中的类,添加到自己的项目中:

image-20240705180340482

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

image-20240705180434072

构建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的输出:

image-20240705180847211

测试的时候是18:09分,18+6 =24,成功执行了本地函数用于获取当前时间与进行加法。

但并不是每个模型使用这个都能成功进行本地函数调用。

image-20240705181242672

根据硅基流动提供的模型,我根据这个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

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

标签:kernel,调用,模型,函数调用,Qwen,本地,new,SemanticKernel
From: https://www.cnblogs.com/mingupupu/p/18286405

相关文章

  • Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载
    Typecho 简介Typecho是一个简单、强大的轻量级开源博客平台,用于建立个人独立博客。它具有高效的性能,支持多种文件格式,并具有对设备的响应式适配功能。Typecho相对于其他CMS还有一些特殊优势:包括可扩展性、不同数据库之间的切换能力、体积小巧以及易于部署上等。Typecho的......
  • C#使用Blazor编译WebAssembly供前端调用(一),关于SkiaSharp相关问题
    目前信创热潮开始掀起,而C#很多行业开发的都是桌面端,迁移到网页端常常会因为很多库不支持或者不友好导致项目一直卡着。最近一直在网上找灵感,偶然发现WebAssembly,一开始我还没不知道这是什么,后面发现目前主流浏览器都支持这一技术。我们看一下这个WebAssembly简介如下而后我......
  • Linux 运行时调用动态链接库的方法
    项目场景:Linux动态链接库调用自定义的动态链接库动态链接库:(1)编写.c和.h文件(2)将.c文件转成.o文件gcc-c*.c-fPIC(3)将.o文件转成动态库文件lib库名.sogcc-shared-olib库......
  • 大模型Linux本地化[离线]部署(以DB-GPT为例)
    DB-GPT本地化[离线]部署由于Python相关依赖包的获取极度依赖pip,而Miniconda支持环境隔离和环境打包,所以离线部署本质就是比在线部署多一步环境打包,环境搬迁。所以本篇文章一样适用于在线部署,以CentOS7为例。资源获取DB-GPT官方说明文档DB-GPT源码下载地址Nvidia驱动......
  • linux 服务器与本地文件传输
    相信有的小伙伴在刚开始接触linux时,不知道如何把文件上传到linux中,本文介绍两种方式供大家使用(推荐使用第二种)一.scp传输scpC:\\[email protected]/root/.....使用上述指令,即可实现将制定文件传输到服务器中,其中C…以及/root/…需要换成你自己的路径。165…........
  • Java 方法中循环调用具有事务的方法
    在Java中,循环调用一个具有事务的方法时,需要特别注意事务的边界和管理。通常,事务的边界是由框架(如Spring)来控制的,确保方法执行时数据的完整性和一致性。然而,在循环中调用事务方法时,每个调用都可以被视为独立的事务,除非特别配置以允许跨多个方法调用共享同一事务。1.Java方法中循......
  • suse本地源配置
    在SUSE系统中配置本地源,通常需要编辑/etc/zypp/repos.d目录下的YaST2源配置文件。以下是一个基本的本地源配置示例:1. 打开终端。2. 创建一个新的源配置文件,例如local_repo.repo:sudonano/etc/zypp/repos.d/local_repo.repo3. 在文件中添加以下内容,假设本地源的路径是/path/to/you......
  • 调用kimi接口(付费)
    1.打开MoonshotAI用户中心,注册并登录,创建一个API密钥,保存下来,后面会用到。https://platform.moonshot.cn/console/limits   打开API文档,复制这段Python代码,用上面的密钥覆盖MOONSHOT_API_KEY2.打开API文档,复制Python代码,用上面的密钥覆盖MOONSHOT_API_KEY   ......
  • Qt调用Matlab(一)
    目录1概述2创建Qt工程2.1增加Matlab支持3调用Matlab3.1widget.h3.2widget.cpp4运行4.1配置4.2运行1概述  MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融......
  • MTK Android 12 环境中编译生成 NVRAM 相关 JAR 文件调用的完整步骤
    在本文中,我将详细介绍如何在MTK方案Android12环境中,从初始配置到生成[email protected]_intermediates/classes.jar文件给应用调用INvramagent=INvram.getService();的完整过程。最开始想解决这个问题的原由,是因为想在AS里调用INvram......