大家好!我是新人唱跳 rap 打篮球,是一个立志 2025 年开始每周都能水一篇文章的人


OpenAI Function Calling

Function calling 是2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增的一个功能。

开发人员通过 api 调用的方式向 GPT 描述函数(对模型有限制,需要是 3.5 或者 4),让模型智能地选择输出一个包含参数的 JSON 对象来调用开发人员定义的这些函数。是一种将 GPT 的推理功能与外部工具及 API 连接起来的方法。

简单的说就是可以通过一个 json 定义你的函数及参数,然后通过语言对话的方式,让 GPT 模型输出你想调用的函数,并可以通过你的描述去构建函数的入参

OpenAI 官方例子就是获取天气:

from openai import OpenAI

client = OpenAI()

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get current temperature for a given location.",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "City and country e.g. Bogotá, Colombia"
                }
            },
            "required": [
                "location"
            ],
            "additionalProperties": False
        },
        "strict": True
    }
}]

这里定义了一个列表,里面只有一个字典对象,它就是我们定义的一个 function,它是一个获取天气的函数。

我们可以在列表中添加很多的 function,通过语言描述,让大模型去判断我们想要调用哪个函数,我们的入参是什么。

这里只讲关键的两个字段,name 和 parameters,它分别定义了我们给大模型的函数名 get_weather 和参数定义,

参数定义是一个 json 对象,里面有需要传入 location 字段,类型要求是一个字符。

接着我们就可以调用 openai 的 api 来通过自然语言获取到我们想要调用的函数及参数了:

completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "What is the weather like in Paris today?"}],
    tools=tools
)

print(completion.choices[0].message.tool_calls)

这里我们使用自然语言问 GPT 模型,巴黎今天的天气怎么样?

这时候 GPT 就会返回它推理的我们要调用的函数和参数:

[{
    "id": "call_12345xyz",
    "type": "function",
    "function": {
        "name": "get_weather",
        "arguments": "{\"location\":\"Paris, France\"}"
    }
}]

可以看到,这里返回的函数的 name 和 arguments 就是我们之前通过 json 发送给 GPT 大模型的函数名和入参。

这里为啥是 “Paris,France” 是因为我们在 description 字段有要求大模型这样返回。

我们可以通过解析这个返回去实际的调用这个函数。

这是一个很简单的例子,但为我们提供了一些初步的思路,我们可以通过自然语言去描述我们要测试的一些接口

不考虑实现细节,我们可以通过这种文本描述的方式写单接口的测试案例,

我要测试一下购买商品的接口,参数默认,但我想把name参数设置为None,num参数设置为数字-1
...
...

这样不会代码的人,也能比较容易的写接口测试案例了

当然这个函数定义和描述估计也有工作量,当然可以通过其他方式实现,比如让 GPT 帮你转成 GPT Function 的格式😂

(当然这也完全可以做出 chatTest,通过自然语言对话后,后台会去自动调用对应的接口进行测试并返回接口响应)


等一下,这个好像和 Function Calling 没有什么关系吧,GPT 并没有实际去调用我们定义的函数啊。

确实,不过 GPT 模型的作用是它的推理能力,将自然语言转化成了我们想要调用函数及参数信息

值得一提的是 client.chat.completions.create 确实有个参数 function_all,可以通过将 function_call 参数设置为{"name": ""}来强制 API 使用指定函数。

同时,也支持通过将 function_call 参数设置为"none"来强制 API 不使用任何函数。

更多信息可以自行搜索官网:https://platform.openai.com/docs/guides/function-calling


DeepSeek Function Calling

水了大半天,终于轮到我们的主角 DeepSeek 了,没办法,最近大火的 DeepSeek 让人没法不蹭热度。

有请:国产 AI 之光、大模型掀桌人、春节热点制造者、国粹大师小嘴抹了蜜选手、抖音技术人流量密码,DeepSeek 登场

这段时间被 DeepSeek 刷屏了,群里有的服务器公司已经推出了他们的服务器 +DeepSeek R1 手把手模型部署产品,只要 8 个 W!(有意者请联系,让我中间商转个差价)

我们有救了是 DeepSeek!

1.5B 的最低配置要求,感觉都可以自己部署玩玩

图片来自:https://blog.csdn.net/2401_85343303/article/details/145452011

当然这个模型推理能力肯定差很多啦。

好消息是 DeepSeek 是完全兼容 openai 的 sdk 的,只需要更改 deepseek 的 api_key 和 base_url 就可以无缝切换,调用 deepseek 和其他云服务商提供的服务

阿里云、腾讯云、青云都陆续推出他们的 deepseek r1 的 api 服务。。。还得是中国

# 例如deepseek官方文档
client = OpenAI(
    api_key="<your api key>",
    base_url="https://api.deepseek.com",
)

更多信息可以自行搜索 deepseek 官网:https://api-docs.deepseek.com/zh-cn/guides/function_calling

不得不说,还是自己家的东西用着踏实,可以本地部署,还是开源,别说了,这东西就算炸了我都说他响

关键是它的能力不比 OpenAI 的模型差,成本还小得多,虽然我不懂,但是你给我用,还让我自己部署,我只能说好人一生平安


写到最后,感谢您看完我水的文章,作为本人的第一篇技术分享,写得杂乱无章,写到那里算哪里,格式也是随心所欲,但以后我会继续保持😂 ,争取能水更多的文章

我是新人唱跳 rap 打篮球,是一个立志 2025 年开始每周都能水一篇文章的人


↙↙↙阅读原文可查看相关链接,并与作者交流