工具调用(Function Calling)是一种将大模型与外部工具和 API 相连的关键功能,作为自然语言与信息接口之间的“翻译官”,它能够将用户的自然语言请求智能地转化为对特定工具或 API 的调用,从而高效满足用户的特定需求。
简单来说,大模型的知识是固定的,你问他李白有哪些诗它肯定知道,但是你问它现在北京天气怎么样,它就不知道了。但大模型有推理能力,如果你问它北京天气怎么样的同时,还告诉他有哪些API可以使用,它就会选择对应的API。这样我们可以用工程手段调用这些API,然后将API结果再给大模型,由大模型进行总结了。
前置操作
首先我们得开通个大模型,这里我用火山的模型来演示。吐槽一句,我感觉各家的云平台操作起来都听不顺畅的,找个内容得四处翻。
登录:https://www.volcengine.com/
开通模型:我选择开通的是豆包-1.5-pro-32k
查看模型细节:
获取API key和使用demo,大家shell里执行export ARK_API_KEY=”**”就能执行我下面的代码了
代码
看代码前,希望大家能先看一下这两个文档
- Chat接口的入参和出参:https://www.volcengine.com/docs/82379/1494384?redirect=1
- Function Call的调用方式:https://www.volcengine.com/docs/82379/1262342 ,这个文档主要使用的是非流式方式,而且Go的demo很少,强烈建议加个流式的demo
1 | package main |
执行结果如下:
1 | ➜ my go run main.go |
我的问题是:先帮我查看一下北京的天气,然后再查看一下上海的天气。
我同时告诉模型,有获取天气的API-get_current_weather可以调用。
第一次:信息给到模型后,模型认为需要分别获取两地的天气,所以先返回了查询北京的参数,并决定调用get_current_weather进行查询。
{
“location”: “北京”,
“unit”: “摄氏度”
}
我代码里收到是调用工具,开始调用API,并将结果添加到msg中。
第二次:带着上次的信息给模型后,模型推理要查上海的天气了,同理我完成了一次API调用
第三次:带着两个地区的天气信息我给模型,模型认为无需调用工具,正常结束,这次会话就完全完成了。
我们看一下最终的消息体:
1 | [ |
FC在我眼里就像是人的四肢,模型是大脑,只有这样才能发挥更大的作用。如果加上硬件,那就是配备了钛合金盔甲。
疑问
流式调用是为了能够尽快将模型返回内容返回给前端,如果是最终结果肯定没什么问题,但是如果是fc的呢?有办法即使用流式方案,同时只把tool相关的内容返回,content的内容不返回吗?
1 | ➜ my go run main.go |
资料
https://www.volcengine.com/docs/82379/1494384?redirect=1
https://www.volcengine.com/docs/82379/1262342#%E6%B5%81%E5%BC%8F%E8%BE%93%E5%87%BA%E9%80%82%E9%85%8D