最近研究Function Call,总结了一篇文章,分享给大家

一、GPT-4中实现函数调用功能

定义函数:首先,开发一个函数。例如,一个获取天气信息的函数可能如下:

def get_current_weather(location, unit='Celsius'):
# 此处实现获取天气信息的逻辑
return {"location": location, "temperature": "22", "unit": unit, "description": "晴朗"}

描述函数:为GPT-4提供函数的描述,包括函数名称、功能描述以及参数信息。这有助于模型理解函数的用途和如何调用它。

function_descriptions = [
{
"name": "get_current_weather",
"description": "获取指定地点的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "地点名称"
},
"unit": {
"type": "string",
"enum": ["Celsius", "Fahrenheit"],
"description": "温度单位,默认为摄氏度"
}
},
"required": ["location"]
}
}
]

与GPT-4交互:将用户输入、函数描述以及模型名称传递给GPT-4。模型将根据用户输入和函数描述,决定是否需要调用函数,并返回相应的响应。

import openai
import json openai.api_key = 'YOUR_OPENAI_API_KEY' def chat_with_gpt(messages, functions):
response = openai.ChatCompletion.create(
model="gpt-4-0613",
messages=messages,
functions=functions,
function_call="auto" # 模型将根据需要决定是否调用函数
)
return response # 用户输入
user_message = {"role": "user", "content": "请告诉我北京的当前天气。"} # 与模型交互
response = chat_with_gpt([user_message], function_descriptions)

处理模型响应:检查模型的响应,确定是否需要调用函数。如果模型返回了函数调用信息,则提取函数名称和参数,并调用相应的函数。

response_message = response["choices"][0]["message"]

if "function_call" in response_message:
# 提取函数名称和参数
function_name = response_message["function_call"]["name"]
function_args = json.loads(response_message["function_call"]["arguments"]) # 调用相应的函数
if function_name == "get_current_weather":
function_response = get_current_weather(
location=function_args.get("location"),
unit=function_args.get("unit", "Celsius")
) # 将函数响应传递回模型,获取最终的回答
messages = [
user_message,
response_message, # 包含函数调用信息
{
"role": "function",
"name": function_name,
"content": json.dumps(function_response)
}
]
final_response = chat_with_gpt(messages, function_descriptions)
answer = final_response["choices"][0]["message"]["content"]
print(answer)
else:
# 模型直接提供了回答
answer = response_message["content"]
print(answer)

GPT-4并不会直接执行函数调用,而是根据提供的函数描述,生成包含函数名称和参数的JSON对象。然后,我们需要在应用程序中解析该对象,并实际调用相应的函数。

根据函数返回的结果,放到Prompt中,调用大模型API,生成新的内容返回给用户。

二、使用Semantic Kernel框架和C#.NET 实现Function Calling

Semantic Kernel 框架中,大模型可以通过 Function Calling(函数调用)来执行插件(Plugins)中的功能。以下示例,展示如何在 Semantic Kernel 中让大模型调用一个 插件函数(Function Call)

设计一个计算插件,包含一个 add_numbers 方法,让大模型可以调用它来执行加法运算。

首先安装Semantic Kernel Nuget包

dotnet add package Microsoft.SemanticKernel

在 Semantic Kernel 中,插件就是一个包含方法的 C# 类,并使用 [KernelFunction] 进行标注。

using Microsoft.SemanticKernel;
using System.Threading.Tasks; public class CalculatorPlugin
{
[KernelFunction("add_numbers")]
public int AddNumbers(int a, int b)
{
return a + b;
}
}

Program.csMain 方法中,初始化 Semantic Kernel 并注册这个插件。

using System;
using System.Threading.Tasks;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI; class Program
{
static async Task Main(string[] args)
{
// 1. 创建 Kernel 实例
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
"gpt-4-turbo", // OpenAI 模型名称
"your-openai-api-key") // 替换为你的 API Key
.Build(); // 2. 加载插件(CalculatorPlugin)
var plugin = kernel.ImportPluginFromObject(new CalculatorPlugin(), "Calculator"); // 3. 让大模型调用 `add_numbers`
var result = await kernel.InvokeAsync("Calculator", "add_numbers", new()
{
{ "a", 5 },
{ "b", 10 }
}); Console.WriteLine($"Function Call Result: {result}");
}
}

执行 dotnet run,输出结果:Function Call Result: 15

代码执行原理说明

  • Semantic Kernel 提供了 插件(Plugins) 机制,让大模型可以调用 .NET 代码中的方法。
  • [KernelFunction("add_numbers")] 让大模型知道这个函数可以被调用。
  • kernel.ImportPluginFromObject(new CalculatorPlugin(), "Calculator")CalculatorPlugin 作为插件加载到 Semantic Kernel 里。
  • kernel.InvokeAsync("Calculator", "add_numbers", new() { { "a", 5 }, { "b", 10 } }) 让大模型调用 add_numbers 并传入参数。

周国庆

2025/3/18

使用Semantic Kernel框架和C#.NET 实现大模型Function Calling的更多相关文章

  1. Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能

    理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...

  2. Semantic Kernel 知多少 | 开启面向AI编程新篇章

    引言 在ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻.当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐的开展基于ChatGPT ...

  3. Semantic Kernel 入门系列:🛸LLM降临的时代

    不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...

  4. Semantic Kernel 入门系列:🪄LLM的魔法

    ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握. 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不 ...

  5. Semantic Kernel 入门系列:💬Semantic Function

    如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...

  6. Semantic Kernel 入门系列:💾Native Function

    语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...

  7. Semantic Kernel 入门系列:🥑突破提示词的限制

    无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...

  8. Semantic Kernel 入门系列:🥑Memory内存

    了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...

  9. Semantic Kernel 入门系列:🍋Connector连接器

    当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...

  10. Semantic Kernel 入门系列:📅 Planner 计划管理

    Semantic Kernel 的一个核心能力就是实现"目标导向"的AI应用. 目标导向 "目标导向"听起来是一个比较高大的词,但是却是实际生活中我们处理问题的 ...

随机推荐

  1. Qt编写地图综合应用32-区域地图

    一.前言 echart本身是没有提供省市区域轮廓图的,需要引入外部的js文件才能绘制,为了拿到全国各省市的对应轮廓图js文件,特意去网上搜索了很多的相关文章并理解,下载到了对应的省市区域的json数据 ...

  2. IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!

    本文由公众号"水滴与银弹"号主Kaito原创分享,原题"搞懂异地多活,看这篇就够了",为使文章更好理解,有修订. 1.引言 前几天技术群里有群友问我手上有没有I ...

  3. 使用 httputils + sbe (Simple Binary Encoding) 实现金融级 java rpc

    1.认识 Simple Binary Encoding (sbe) 高性能Java库 Agrona 的主要目标是减少性能瓶颈,通过提供线程安全的直接和原子缓冲区.无装箱操作的原始类型列表.开散列映射和 ...

  4. PaperAssistant:使用Microsoft.Extensions.AI实现

    前言 上篇文章介绍了使用Semantic Kernel Chat Completion Agent实现的版本. 使用C#构建一个论文总结AI Agent 今天来介绍一下使用Microsoft.Exte ...

  5. 认识Token和Cookie

    认识Token和Cookie 1.token和cookie有什么区别? ​ 1.1 存储位置及方式:Cookie是浏览器用来存储本地信息的文件,有一定的存储限制,而Token是由服务器按一定算法生成的 ...

  6. Solution -「NOI Simu.」记忆

    \(\mathscr{Description}\)   长度为 \(n\) 的序列 \(A\) 初始全 \(0\), \(C=0\). 第 \(i\ge0\) 个时刻对 \(A\) 进行如下变换: \ ...

  7. 一篇解决编译原理大作业,基于Flex、Bison设计编译器(含语法分析树和符号表)

    1.工具简单介绍 Flex 和 Bison 是编译器开发中常用的两个工具,分别用于生成词法分析器和语法分析器.它们通常一起使用,共同完成源代码的词法分析和语法分析工作. Flex: Flex通过读取一 ...

  8. cookie和session的详解与区别-copy

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  9. 第三章 dubbo源码解析目录

    7.6 服务远程暴露 - 注册服务到zookeeper 为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为expor ...

  10. Quartz调度框架详解、运用场景、与集群部署实践

    以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...