前面是通过 提示词 的形式,将工具箱带过去。
🙋这种方式有什么问题?
- 繁琐:大段大段的提示词,仅仅是为了约束大模型的输出
- 不标准:每个开发者的提示词的描述千差万别
- 约束力不高:即便使用了语气最重的提示词,大模型的底层原理决定了它总会有不按照要求回复的情况
为了解决这个问题,OpenAI 出手了,在 2023 年 6 月推出了 Function Calling,通过 JSON Schema 格式来进行标准化,主要标准两个部分:
-
工具箱的提供
// 工具箱const tools = [{type: 'function',name: 'get_weather',description:'Get current temperature for provided coordinates in celsius.',parameters: {type: 'object',properties: {latitude: { type: 'number' },longitude: { type: 'number' },},required: ['latitude', 'longitude'],additionalProperties: false,},strict: true,},] -
返回的调用工具请求
;[{type: 'function_call',id: 'fc_12345xyz',call_id: 'call_12345xyz',name: 'get_weather',arguments: '{"latitude":48.8566,"longitude":2.3522}',},]
可以在 OpenAI 官方文档 看到这个过程,也可以在 Playground 这里体验整个过程。
🤔 为什么采用 Function Calling 能约束大模型,让它要一定按照要求输出一个 JSON ?
其实就是大模型微调的效果。
也正因为如此,并非所有的模型都支持 Function Calling,可以在 Hugging Face 上面查询某一模型是否支持 Function Calling 特性。
NOTE
Hugging Face 是目前最主流的开源 AI 模型托管与使用平台,相当于 AI 界的 Github.
注意不同的模型,Function Calling的格式不一致。
deepseek
tools = [ { type: 'function', function: { name: 'get_weather', description: 'Get weather of an location', parameters: { type: 'object', properties: { location: { type: 'string', description: 'The city and state, e.g. San Francisco, CA', }, }, required: ['location'], }, }, },]GPT
const tools = [ { type: 'function', name: 'get_weather', description: 'Get current temperature for provided coordinates in celsius.', parameters: { type: 'object', properties: { latitude: { type: 'number' }, longitude: { type: 'number' }, }, required: ['latitude', 'longitude'], additionalProperties: false, }, strict: true, },]claude
"tools": [{ "name": "get_weather", "description": "Get the current weather in a given location", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA" } }, "required": ["location"] }}],我们使用 deepseek 模型:https://api-docs.deepseek.com/guides/function_calling
-EOF-