返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

ChatGLM3等大模型的工具调用function calling原理解析

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 21:19 |阅读模式 打印 上一主题 下一主题

上一篇文章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.py
cdtools_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("北京")。
如果没有大模型,实现起来会比较困难。使用大模型就比较简单了,我们可以把系统中已有的方法名、方法描述、方法参数、参数类型、还有用户的问题一起告诉大模型,让大模型理解用户的意思,并告诉我们应该调用哪个方法,参数应该传什么,然后我们调用就可以了。
交互流程图(重点是2、3、4步):

以上就是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'}}

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ