来都来了『不关注一下么』!
3月14日收到GPT4发布通知后,就再也没有写过公众号。原因很简单:除了录课之外,我把所有时间都用在了ChatGPT上面,一个个模型、一个个更新,一次次感受新的震撼。
这不,几天前GPT又双叒叕更新了!
这一次更新里,Function Calling(“本地函数调用”)最让我触动。因为我突然感到,自己当年的梦想之一 —— 让应用程序甩掉丑陋的按钮和菜单 —— 似乎可以轻松实现了!
闲话少说,先看效果。下面就是杨老师试做的一个小程序 —— 完全用自然语言控制的图书馆借阅系统。为了突出效果,我使用了搜狗输入法的语音输入,“抄小道”进化到“完全语音控制”!所以请大家尽可能带上耳机收看。(视频大小4M,请点击播放)
不知大家看完视频后作何感想?相信只要开发过管理信息系统(MIS)的朋友都会知道,想要实现这种完全自然语言控制是多么困难的一件事情。就比如“借书”这个指令,使用自然语言随便就可以找出几十种不同的说法 —— “请借我这本书”、“请把这本书借我”、“我,秦始皇,借(fen)书” …… 更不用说在上面视频末尾处,杨老师演示的中英文混杂处理了。
学过《全民一起VBA提高篇》或《全民一起玩Python 基础篇》的同学都知道,在传统的GUI应用程序中,一切用户输入都是通过按钮、菜单、滚动条等“控件”来完成。而之所以需要使用这些输入控件,本质原因就在于:计算机难以听懂灵活多变的自然语言,所以只允许用户通过这些控件输入指令,变着法地让用户“闭嘴”。因此按照传统的MIS系统开发模式,这个图书馆系统做出来应该是下面的样子:
但是ChatGPT以及各类大语言模型的出现,直接推翻了“计算机难以听懂自然语言”这个假设!因此为了解决这个问题而产生的各种输入控件,显然也就失去了存在的根基。
又一次感到,时代真的变了 ……
那么具体到代码上,GPT到底是怎样插入到我们这个图书管理系统中的呢?这就要用到openai一周前发布的“Function Calling”(本地函数调用)。
无论是结构化程序设计还是面向对象程序设计,我们都会把应用程序中的每个主要功能单独写成一个函数或方法。比如这个简单的图书借阅系统中,借书(borrow_book)和还书(return_book)就是下面两个函数:
然后在GUI程序里,我们再把 borrow_book 和 return_book这两个函数“挂载”到对应的功能按钮上。
这样当我们按下某个按钮时,程序就会自动执行 borrow_book 或 return_book 函数,完成借书还书操作。
。
而在新的“完全自然语言控制”版本中,我们还是跟以前一样,正常写好这两个函数,不需要做任何修改。不过这一次为了能够直接输入书名,我们给 borrow_book 和 return_book 添加了“book_name” 参数,大体代码如下:
这一次我们不再使用任何按钮,只用一个文本框组件获取用户输入,然后把用户输入的字符串,通过互联网转发给GPT,由GPT来判断到底应该调用 borrow_book 还是 return_book 函数。判断出来后,GPT会通过互联网返回给我们一个json包,里面注明这一次应该运行的函数名以及参数;于是我们的程序按照这个json包的指示去调用相关函数即可。这就是所谓的Function Calling 机制。
具体来说,我们需要在原来的程序中增加一下几块代码:
(1) 添加一个列表,里面按照GPT规定的标准写法,注明borrow_book和return_book的用途与用法:
这里请大家特别注意GPT的神奇之处:我只需要在上面的注解中特别说明“如果书名不是中文,请事先翻译为中文书名”,这个程序就可以自动处理英文、法文等等各种语言输入了!因为GPT在收到用户输入的英文字符串后,会自动根据“请事先翻译为中文书名”这个要求,把“Red and Black”翻译为“红与黑”,再作为函数参数告知我们。
这一刻,全球一家 ……
(2) 给文本框添加一个回车事件(详见《全民一起玩Python基础篇》)。这样当用户在文本框中输入请求(通过键盘或语音输入法)并按下回车时,就可以把文本框中的用户请求字符串,以及步骤(1)中写好的函数说明 function_desc,一并提交给chatgpt,等待它返回结果。调用GPT api的具体代码是:
(3) 收到上面函数从GPT返回的 response 后,解析出里面的“应调用函数名”和“参数”,然后使用python的动态函数调用机制自动运行该函数。
这就是Function Calling的完整流程。可以看到,如果采用GPT这种模式,我们整个系统界面中,所有的指令输入操作,完全可以只用一个文本框实现;甚至在语音模式下,连文本框都可以舍弃。
而从开发者角度看,只要写好业务逻辑上的各个api,再配以适当的输出画面,一个用户友好的系统就已经大功告成!
回想与自己打了近30年交道的按钮、菜单,我实在没有更多词语可以形容此刻的心情,只能还是那句话 ……