让大模型不仅能聊天,还能做事的Function Calling

让大模型不仅能聊天,还能做事的Function Calling

记得大模型刚出来,绝对是惊艳到我了,这简直就是我摸鱼偷懒的神器呀,但过了几天,感觉他还是无法满足贪婪的我。别光跟我聊天呀,你也给我干点活呀,和我一起做牛马

但问题是,大模型人家本身是个语言模型呀,肯定不能像我们一样,执行函数呀~~~~

笑话,如此智慧的大模型都让我搞出来了,让他执行函数,这不简单吗,程序监听大模型的输出,当检测到大模型说【调用函数A】,我后台就执行相应的函数就好了,原理就这么简单。

像极了我说麦芽糖三个字,你就要照我说的去做~~~

image-20251114152530598 image-20251114152549666

简单体验

  1. 让他执行函数,肯定要现有函数,设置一个脑残计算器,让他计算1+1=3

int ErrorMechineAdd(int a ,int b) => a+b+1;

  1. 要让大模型认识这个函数,要给这个函数加一些解释的,我们后面详细说明要有哪些解释,这里用Microsoft.Extensions.AI封号好的接口,一键就可以实现

AIFunction tool = AIFunctionFactory.Create(ErrorMechineAdd);

  1. 跟之前文章说的一样,获得一个IChatClient,跟普通聊天不一样的是,加上.UseFunctionInvocation()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
OpenAIClientOptions clientOptions = new OpenAIClientOptions();
clientOptions.Endpoint = new Uri("https:....");
OpenAIClient aiClient = new OpenAIClient(new System.ClientModel.ApiKeyCredential("...."),clientOptions);
IChatClient chatService = chatClient.AsIChatClient();
//关键是下面这一个
IChatClient funcClient = chatService
.AsBuilder()
.UseFunctionInvocation() //加上自动执行函数的设置
.Build();

//当然也可以这样玩,跟上面一样,只不过是不用.AsBuilder()了
IChatClient client = new ChatClientBuilder(chatClient)
.UseFunctionInvocation()
.Build();
  1. 聊天就可以了,聊到计算他就会自动调用了
1
2
3
4
5
6
7
8
9
10
11
12
var messages = new List<ChatMessage>
{
new ChatMessage(ChatRole.System, "你是数学家"),
new ChatMessage(ChatRole.User, "用我给你的函数,给我计算1+1等于多少")
};
ChatOptions opt = new ChatOptions(){
ToolMode = ChatToolMode.Auto,//自动执行,还有RequireAny,至少要调用其中的一个工具,None:禁用工具调用
//RequireSpecific(string functionName)`:必须调用指定名称的工具。
Tools = [tool]
};
var caculateRes = await funcClient.GetResponseAsync(messages,opt);
caculateRes.Dump();

不出所料,它计算出1+1=3,肯定是调用了我的函数。

image-20251114155417752

原理解析

直接上流程图,可以看出,几个步骤:

image-20251114155835228

  1. 你把提示词和函数列表给大模型
  2. 大模型理解后反给你的程序一些内容
  3. 你的程序来解析返回的内容,可定有要执行的函数等等,让后你的程序负责执行
  4. 你执行完成后,把执行结果,以及上面你和大模型的聊天历史,一并再给大模型
  5. 大模型在分析所有的上下文后,给出最终的答案

数据详览

下面看一看,每一步,到底都发送了哪些属性,

步骤1

可以看到有个tools列表,里面有对函数的解释,包括参数的解释

image-20251114161145719

步骤2

大模型返回的一些数据,我们重点看tool_calls节点下的内容,里面有它 用到的函数名、以及参数等

image-20251114161427277

步骤3

这一步骤不需要给大模型传递啥东西,主要是你的程序运行

步骤4

没啥稀奇的,基本和步骤1的数据一样,就是多了点东西,一个assistant,一个tool

image-20251114162711830image-20251114162650881

步骤5

得到最终的答案,直接上图

image-20251114163048553

下节详细讲一下Microsoft.Extensions.AI,中Function Calling的详细使用

未完待续…

让大模型不仅能聊天,还能做事的Function Calling

https://bubuweiying.site/让大模型不仅能聊天还能做事的FunctionCalling/

作者

步步为营

发布于

2025-11-14

更新于

2025-11-14

许可协议