AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


ChatGLM3等大模型的工具调用function calling原理解析
发布日期:2024-04-10 20:46:09 浏览次数: 2588


上一篇文章11.4k star! 部署清华开源的ChatGLM3,用私有化大模型无缝替换openai,我们部署了ChatGLM3模型,其中的function call特性支持调用自定义代码实现定制化功能,由于大模型本身没有互联网的实时数据,今天我们用function call实现一个查询实时天气的功能,并简单分析一下其实现原理,openai的工具调用原理也一样。

1. 实测效果

输入:帮我查询北京的天气怎么样
输出:北京当前的天气情况如下:温度为14℃,体感温度为13℃,湿度为38%,天气状况为晴朗。

2. 运行步骤

chatglm3提供了tools的使用demo,先运行openai_api_demo文件夹下的api_server.py,启动openai格式的API server。
cd openai_api_demonohup python api_server.py &
再进入tools_using_demo文件夹下的openai_api_demo.py
cd tools_using_demopython openai_api_demo.py
运行的时候可能会报错:

openai.UnprocessableEntityError: Error code: 422 - ... 'msg': 'Input should be a valid dictionary'

出现这个错误可能是openai包的版本不正确,用以下命令指定安装1.8.0的openai,再重新运行:

pip install openai==1.8.0python openai_api_demo.py

3. 原理分析

假设有个这样的需求:
实现一个查询系统,前端一个输入框,让用户用自然语言描写自己想查什么,服务端有根据城市查询天气、根据IP查询地理位置两个方法,服务端要根据用户的描述来确定应该调用哪个方法,传递什么参数,比如用户输入"我想查一下北京的天气",服务端就要调用getWeather("北京")。
如果没有大模型,实现起来会比较困难。使用大模型就比较简单了,我们可以把系统中已有的方法名、方法描述、方法参数、参数类型、还有用户的问题一起告诉大模型,让大模型理解用户的意思,并告诉我们应该调用哪个方法,参数应该传什么,然后我们调用就可以了。
交互流程图(重点是2、3、4步):

以上就是function calling的实现原理,理论上如果没有这个特性,通过写prompt也可以实现。

4. 代码解析

简单看一下demo的代码,在tools_using_demo中,tool_register.py定义了两个方法,并通过@register_tool注解获取到方法的描述信息,openai_api_demo.py的run_conversation方法中将用户问题与两个方法的描述信息发给大模型,如果大模型认为需要进行方法调用,那么响应中就会包含function_call字段,其中就有需要调用的方法名和参数,如下:

Function Call Response: {'arguments': '{"city_name": "北京"}', 'name': 'get_weather'}

根据方法名和参数就可以调用自己写的方法,获取到返回值


Tool Call Response: {'current_condition': {'temp_C': '14', 'FeelsLikeC': '13', 'humidity': '38', 'weatherDesc': [{'value': 'Clear'}], 'observation_time': '02:00 PM'}}

为方法的返回值不是自然语言,所以再将方法返回值发给大模型,让大模型总结一下,最后输出方便理解的自然语言。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询