首页 > 其他分享 >深入探讨Function Calling:在Semantic Kernel中的应用实践

深入探讨Function Calling:在Semantic Kernel中的应用实践

时间:2024-05-30 10:22:50浏览次数:32  
标签:Function Kernel Semantic kernel function calling chatHistory result ToolCallBeha

引言

上一章我们熟悉了 OpenAIfunction calling 的执行原理,这一章节我们讲解一下 function callingSemantic Kernel 的应用。

OpenAIPromptExecutionSettings跟 LLM 交互过程中,ToolCallBehavior的属性之前我们的章节有介绍过

  • ToolCallBehavior:属性用于获取或设置如何处理工具调用的行为。

          // Enable auto function calling
        OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
        {
            ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
        };
    

    1.EnableKernelFunctions:会向模型提供内核的插件函数信息,但不会自动处理函数调用请求。模型需要显式发起函数调用请求,并系统会传播这些请求给适当的处理程序来执行。

     OpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
     var chatHistory = new ChatHistory();
     ChatMessageContent result = await chat.GetChatMessageContentAsync(chatHistory, settings, kernel);
     //手动调用
     IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
    

    EnableKernelFunctions:需要通过 FunctionCallContent 手动调用

    2.AutoInvokeKernelFunctions:除了向模型提供内核的插件函数信息外,还会尝试自动处理任何函数调用请求。模型发起函数调用请求后,系统会自动执行相应的操作,并将结果返回给模型,而无需模型显式处理函数调用的过程。

模型推荐

建议使用 OpenAI 的最新模型(如 gpt-3.5-turbo-1106gpt-4-1106-preview)以获得最佳的工具调用体验。OpenAI 的最新模型通常具有更好的性能和更高的准确性,因此使用这些模型可以提高工具调用的效果。

我这里是公司提供的 Azure OpenAI 的服务,我自己通过 yarp 代理了一层做了相关服务的认证

{
  "InternalAzureOpenAI": {
    "Endpoint": "https://localhost:7079",
    "ModelId": "gpt-35-turbo-1106",
    "ApiKey": "***"
  }
}

实战

接下来我们会问一下大模型当前北京的天气情况

定义 Prompts

  var template = "我想知道现在北京的天气状况?";

定义 kernel

var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
    .Build();

注册 kernel function 到 plugins

定义方法

static string GetWeatherForCity(string cityName)
{
    return $"{cityName} 25°,天气晴朗。";
}

为 Kernel 提供插件

 kernel.ImportPluginFromFunctions("WeatherPlugin", new[]
 {
     kernel.CreateFunctionFromMethod(GetWeatherForCity, "GetWeatherForCity", "获取指定城市的天气")
 });

手动调用 function calling

根据上面的描述 手动处理function calling的关键实际上是ToolCallBehavior.EnableKernelFunctions参数。

  OpenAIPromptExecutionSettings settings = new OpenAIPromptExecutionSettings()
  {
      Temperature = 0,
      ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions
  };

需要用到Semantic KernelIChatCompletionService的会话服务

    var chatHistory = new ChatHistory();
    chatHistory.AddSystemMessage("You are a useful assistant.");
    chatHistory.AddUserMessage(template);
    Console.WriteLine($"User: {template}");
    var chat = kernel.GetRequiredService<IChatCompletionService>();
    while (true)
    {
        ChatMessageContent result = await chat.GetChatMessageContentAsync(chatHistory, settings, kernel);
        if (result.Content is not null)
        {
            Console.Write(result.Content);
        }

        IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
        if (!functionCalls.Any())
        {
            break;
        }

        chatHistory.Add(result); // Adding LLM response containing function calls(requests) to chat history as it's required by LLMs.

        foreach (var functionCall in functionCalls)
        {
            try
            {
                FunctionResultContent resultContent = await functionCall.InvokeAsync(kernel); // Executing each function.

                chatHistory.Add(resultContent.ToChatMessage());
            }
            catch (Exception ex)
            {
                chatHistory.Add(new FunctionResultContent(functionCall, ex).ToChatMessage());
            }
        }

        Console.WriteLine();
    }

输出

=====>手动function calling
User: 我想知道现在北京的天气状况?

Assistant:现在北京的天气是晴朗,气温为25°C。

自动调用 function calling

和手动的区别就是上面描述的OpenAIPromptExecutionSettings配置的ToolCallBehavior属性值不同

  OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new OpenAIPromptExecutionSettings()
  {
      Temperature = 0,
      ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
  };

自动function calling从本质上来讲是隐藏了跟大模型多次交互的逻辑,有Semantic Kernel框架自动帮我们调用

核心代码

    var chatHistory = new ChatHistory();
    chatHistory.AddSystemMessage("You are a useful assistant.");
    chatHistory.AddUserMessage(template);
    Console.WriteLine($"User: {template}");
    var chatService = kernel.GetRequiredService<IChatCompletionService>();
    var result = await chatService.GetChatMessageContentAsync(chatHistory, openAIPromptExecutionSettings, kernel);
    Console.Write("Assistant:" + result.ToString());

输出

=====>自动function calling
User: 我想知道现在北京的天气状况?
Assistant:北京现在的天气状况是晴朗,气温为25°C。

最后

在本章中,我们探讨了在 OpenAIfunction callingSemantic Kernel 中的应用。通过对 ToolCallBehavior 属性的设置,我们可以灵活地控制工具调用的行为,从手动调用到自动调用,为用户提供了更加便捷和高效的体验。

建议在实践中使用 OpenAI 的最新模型(如 gpt-3.5-turbo-1106gpt-4-1106-preview)以获得最佳的工具调用效果。同时,通过合理配置 OpenAIPromptExecutionSettings 中的参数,可以更好地适配不同的场景和需求。
希望本章内容能够帮助您更深入地理解 function callingSemantic Kernel 中的运用,为您的项目和应用带来更多可能性和创新。

示例代码
本文源代码

标签:Function,Kernel,Semantic,kernel,function,calling,chatHistory,result,ToolCallBeha
From: https://www.cnblogs.com/ruipeng/p/18221666

相关文章

  • C++ std::function和std::bind的六种用法总结
    一,使用funciton和bind的六种方法1,使用function接收普通函数2,使用function接收lambda函数3,使用function函数来接收函数对象4,使用bind函数绑定类中的一般函数5,使用bind函数绑定类中的多态函数6,使用function来实现回调。二,代码实现直接看代码和注释:#include<iostream>#......
  • 安装centos开机出现Kernel panic - not syncing: Attempted to kill init无法启动解决
    一、安装centos开机出现Kernelpanic-notsyncing:Attemptedtokillinit无法启动的解决方法  装系统总会遇到各种新鲜问题,不过不要紧,只问题才能提升解决问题的能力,今天重新装了个CENTOS6.5的64位版,可能是进行了分区(boot单独挂载到了一个分区),开机时centos报错:Kernelp......
  • Linux内核Kernel启动过程
    在上一篇计算机启动过程文章中介绍了计算机启动的基本流程,本篇文章主要介绍Linux内核Kernel的启动过程。一、内核启动的基本流程sequenceDiagramparticipantBootloaderparticipantKernelparticipantInitProcessBootloader->>Kernel:加载内核映像Kernel->>Kernel:内......
  • 深入探讨Function Calling:实现外部函数调用的工作原理
    引言FunctionCalling是一个允许大型语言模型(如GPT)在生成文本的过程中调用外部函数或服务的功能。FunctionCalling允许我们以JSON格式向LLM模型描述函数,并使用模型的固有推理能力来决定在生成响应之前是否调用该函数。模型本身不执行函数,而是生成包含函数名称和执行函数......
  • python closure, first-class function, decorator
    闭包:closurefunctionhtml_tag(tag){ functionwrap_text(msg){  console.log('<'+tag+'>'+msg+'</'+tag+'>') } returnwrap_text}print_h1=html_tag('h1')print_h1('TestHea......
  • E117: Unknown function: acp#enable
    问题Errordetectedwhileprocessing/usr/share/vim/vim80/plugin/acp.vim:line164:E117:Unknownfunction:acp#enablePressENTERortypecommandtocontinue解释我是下载了最新版:https://www.vim.org/scripts/script.php?script_id=1879下载了的版本是2.14.1看......
  • error: use of deleted function ‘YYSTYPE::YYSTYPE()’[解决]
    /home/zhywyt/Cmpelier/compiler2024/build/y.tab.cpp:1036:9:error:useofdeletedfunction‘YYSTYPE::YYSTYPE()’1036|YYSTYPEyylval;报错信息如下:bison文件中的union如下,发现错误为name的类型为带析构函数的类,导致出现问题。具体原因不明。修改为string*后编译......
  • Semantic Kernel入门系列:利用Handlebars创建Prompts functions
    引言本章我们将学习通过HandlebarsPromptsTemplate来创建Promptsfunctions。什么是Handlebars?Handlebars是一个流行的JavaScript模板引擎,它允许你通过在HTML中使用简单的占位符来创建动态的HTML。它使用模板和输入对象来生成HTML或其他文本格式。Handlebars模板看......
  • 2022-05-18-空间静态kernel核密度、空间动态kernel核密度工具更新
    在前版本基础上,针对有用户反映当数据有极端大的异常值时,画出的图不美观,具体表现在等高线集中在某一小块区域的问题,对此做出改进如下:增加坐标轴范围的选项,该选项的范围为1-100,代表将数据从小到大排列后,取前百分之多少的量,以剔除极端大值。当数据中没有极端大值时,该项填100,当极端大......
  • 2022-05-07-无条件、空间静态、空间动态kernel核密度工具
    今天要介绍的是一个目前论文中常用到的方法:无条件kernel核密度、空间静态kernel核密度和空间动态kernel核密度。Kernel核密度估计属于非参数估计方法,不过分依赖模型,可以用来研究各地区的不平衡分布问题。假设f(x)是随机变量X的的密度函数,Xi为独立同分布的观测值,x为均值,h为带宽。......