|
上一篇文章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。cdopenai_api_demonohuppythonapi_server.py& 再进入tools_using_demo文件夹下的openai_api_demo.pycdtools_using_demopythonopenai_api_demo.py
openai.UnprocessableEntityError:Errorcode:422-...'msg':'Inputshouldbeavaliddictionary' 出现这个错误可能是openai包的版本不正确,用以下命令指定安装1.8.0的openai,再重新运行: pipinstallopenai==1.8.0pythonopenai_api_demo.py 3. 原理分析实现一个查询系统,前端一个输入框,让用户用自然语言描写自己想查什么,服务端有根据城市查询天气、根据IP查询地理位置两个方法,服务端要根据用户的描述来确定应该调用哪个方法,传递什么参数,比如用户输入"我想查一下北京的天气",服务端就要调用getWeather("北京")。 如果没有大模型,实现起来会比较困难。使用大模型就比较简单了,我们可以把系统中已有的方法名、方法描述、方法参数、参数类型、还有用户的问题一起告诉大模型,让大模型理解用户的意思,并告诉我们应该调用哪个方法,参数应该传什么,然后我们调用就可以了。以上就是function calling的实现原理,理论上如果没有这个特性,通过写prompt也可以实现。 4. 代码解析 简单看一下demo的代码,在tools_using_demo中,tool_register.py定义了两个方法,并通过@register_tool注解获取到方法的描述信息,openai_api_demo.py的run_conversation方法中将用户问题与两个方法的描述信息发给大模型,如果大模型认为需要进行方法调用,那么响应中就会包含function_call字段,其中就有需要调用的方法名和参数,如下:
FunctionCallResponse:{'arguments':'{"city_name":"北京"}','name':'get_weather'}根据方法名和参数就可以调用自己写的方法,获取到返回值
ToolCallResponse:{'current_condition':{'temp_C':'14','FeelsLikeC':'13','humidity':'38','weatherDesc':[{'value':'Clear'}],'observation_time':'02:00PM'}}因为方法的返回值不是自然语言,所以再将方法返回值发给大模型,让大模型总结一下,最后输出方便理解的自然语言。 |