搭载ChatGPT之后的表格插件又有哪些新的改变——Function calling增强
摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
在《大火的ChatGPT与SpreadJS结合会有哪些意想不到的效果》一文中提到ChatGPT插件的一个明显的问题,那就是“返回的结果格式可能插件也无法进行分析使用,从而是使得后续的操作无法继续执行”。造成这个问题原因与ChatGPT的技术原理有一定的关系。
模型预言的限制:ChatGPT是基于语言模型的,其性能受模型训练和数据集的限制。对于复杂的问题可能并不能准确返回结果,同时返回的结果格式可能插件也无法分析使用。
但随着6月13日发布Chat Completions API 的function calling能力,这个问题得到了很好的解决。此次更新带来了新的模型,更大的内容,更低的价格,而Function calling更是带来了革命性的互动方式。
通过Function calling,OpenAI model可以根据你对系统中functions的描述来生成外部系统可以直接使用的结构化的JSON参数,这样GPT就可以更好的和外部系统结合。
以前文中“建议的数据透视表”为例,对于提供的表格数据,text-davinci-003 model会返回建议的文本内容:
"text": "\n\n行:销售人员\n列:品牌\n值:销售额\n\n通过这样设置可以分析出每个销售人员销售的不同品牌的总销售额。"
虽然有换行等符号可以解析所需要的行列值,但是稳定性十分不确定,程序很难直接使用。
通过使用Function calling,数据透视表的建立就会变得非常简单。还是以OpenAI官方提供的nodejs支持为例。
在对话中加入functions描述
1. let messages = [
2. {"role": "user", "content": "最后的JSON数据第一行是数据字段,创建有分析意义的数据透视表\\n" + JSON.stringify(data)}
3. ]
4. let functions = [{
5. "name": "pivot_talbe_analyze",
6. "description": "对数据创建数据透视表,返回数据透视表结果",
7. "parameters": {
8. "type": "object",
9. "properties": {
10. "rowFieldName": {
11. "type": "string",
12. "description": "行字段名称"
13. },
14. "columnFieldName": {
15. "type": "string",
16. "description": "列段名称"
17. },
18. "dataFieldName": {
19. "type": "string",
20. "description": "值字段名称"
21. },
22. },
23. },
24. "required": ["rowFieldName", "dataFieldName"]
25. }]
26.
27. var response = openai.createChatCompletion({
28. "model": "gpt-3.5-turbo-0613",
29. "messages": messages,
30. "functions": functions,
31. "functions_call": {"name": "pivot_talbe_analyze"}
32. });
一次对话可以有多个function描述,每个function描述包含名称,描述,方法参数(描述规则是JSON Schema),以及那些parameter是必选的。
对于选择区域创建数据透视表,需要提供行、列、值三个维度的字段名称,因此需要rowFieldName、columnFieldName和dataFieldName三个paramenter。
另外,可以通过function_call设置选择function的模式,当functions字段不为空时默认为“auto”,示例中指定了function pivot_talbe_analyze。
完成调用直接返回了function name 和parameters中的三个参数:
{name: 'pivot_talbe_analyze', arguments: '{\\n "rowFieldName": "销售人员",\\n "columnFieldName": "品牌",\\n "dataFieldName": "销售额"\\n}'}
- 使用GPT返回结果并创建透视表
通过返回的function name 和parameters可以直接调用系统中的对应方法创建的透视表了。
let args = JSON.parse(completion.data.choices[0].message.function_call.arguments)
let pivotTable = sheet.pivotTables.add("PivotTable", "Table1", 2, 7, GC.Spread.Pivot.PivotTableLayoutType.outline, GC.Spread.Pivot.PivotTableThemes.medium2);
pivotTable.add(args.rowFieldName, args.rowFieldName, GC.Spread.Pivot.PivotTableFieldType.rowField);
if(args.columnFieldName)
pivotTable.add(args.columnFieldName, args.columnFieldName, GC.Spread.Pivot.PivotTableFieldType.columnField);
pivotTable.add(args.dataFieldName, "求和项:" + args.dataFieldName, GC.Spread.Pivot.PivotTableFieldType.valueField, GC.Pivot.SubtotalType.sum);
获取SpreadJS透视表结果如下:
let ptRange = pivotTable.getRange().content;
let ptData = sheet.getArray(ptRange.row, ptRange.col, ptRange.rowCount, ptRange.colCount);
1. 给GPT反馈公式调用结果
messages.push(completion.data.choices[0].message)
messages.push({"role": "function", "name": "pivot_talbe_analyze", "content": JSON.stringify({pivotTable: ptData})})
response = openai.createChatCompletion({
"model": "gpt-3.5-turbo-0613",
"messages": messages,
"functions": functions,
function_call: "none"
});
response.then(function(completion){
let desc = completion.data.choices[0].message.content;
GC.Spread.Sheets.Designer.showMessageBox(desc, "分析结果", GC.Spread.Sheets.Designer.MessageBoxIcon.info)
});
将历史和获取到的透视表信息添加到messages中,这里message rule多了function类型,content就是调用function的返回结果。
调用时function_call设置none,不要使用function calling, GPT根据上下文返回了如下信息:
{role: 'assistant', content: '以下是创建的数据透视表:\n\n\`\`\`\n[\n ["求和项:销售额", "品牌", null, null…\n]\n\`\`\`\n\n该数据透视表按照销售人员和品牌对销售额进行了汇总,可以更方便地进行数据分析和比较。'}
接下来可以发送新的请求让GPT对数据做进一步的分析处理,当然对于一些系统操作,我们做到步骤2就可以了。
总结一下,通过Function calling,自身系统和openai model互动更加简便,耦合的更加紧密,系统通过互动的方式向ChatGPT model发起请求,model可以智能选择需要调用的系统function,进一步提升了系统的创造性。
不过还是需要提醒,对于调用系统数据更新删除的方法,还是要做好确认再去执行。
扩展链接:
POI打开Excel文件遇到out of memory的解决实践
搭载ChatGPT之后的表格插件又有哪些新的改变——Function calling增强的更多相关文章
- JQuery表格插件DataTables 当前页合计功能
公司项目表格插件使用的是DataTables,最近添加表合计功能,发现百度统一都是如图类型的代码,不知道是配置问题还是怎么了,在我的页面下根本不能用 var addd=0; $(document).r ...
- [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. jqGrid和AJAX 5. GridSettings 6. ...
- Dynatable – 基于 HTML5 & jQuery 的交互表格插件
Dynatable 一款有趣的,语义化,交互式的表格插件,使用 jQuery,HTML5 和 JSON 实现.Dynatable 的目的是提供一种简单的.可扩展的 API,能够轻松的浏览和操作大规模的 ...
- datatables 前端表格插件 增删改查功能
官方网站:http://datatables.club/example/<!-- DataTables CSS -->css引入的<link rel="stylesheet ...
- 25款顶级的jQuery表格插件
jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...
- 自己写的表格插件autotable
自己写的表格插件autotable 作者:田想兵,个人网址:http://www.lovewebgames.com 这个表格插件所完成的功能是:ajax请求数据,然后动态绑定到指定表格下,格式化,分页 ...
- 15 个最佳的 jQuery 表格插件
现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 fluid(流)和自适应性特点. 大多数网站设计要靠margins, guides, rows ...
- 推荐几款jQuery表格插件
平时项目中,会碰到很多表格元素,这里推荐几款jQuery表格插件. Stackable.js 通常在小屏幕上,表格的表形形式不大好,因为用户会缩放平移,或者就是表格太小,导致数据不可见.Stackab ...
- 好用的自适应表格插件-bootstrap table (支持固定表头)
最近工作中找到了一款十分好用的表格插件,不但支持分页,样式,搜索,事件等等表格插件常有的功能外,最主要的就是他自带的冻结表头功能,让开发制作表格十分容易,不过网上大多都是英文文档,第一次使用会比较麻烦 ...
- jQuery 表格插件25
jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...
随机推荐
- pysimplegui之窗口大小,位子,主题等属性修改
重点 1finalize()或Window参数finalize=True 调用以强制窗口通过初始化的最后阶段.这将导致 tkinter 资源被分配,以便它们可以被修改.这也会导致您的窗口出现.如果您不 ...
- 简单的cs修改器
目录 各个函数解析 main() GetPid() 无限子弹 无限血 无限金币 Patch() 无僵直 稳定射击 Depatch1 手枪连发 Depatch 源代码部分 各个函数解析 这是我根据b站上 ...
- memcache 安装及操作
memcache安装文件下载 http://pan.baidu.com/s/1hqRdW1Y 一 安装篇 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:/memcach ...
- python运维工程师-cmdb项目-day2
1.捕获异常信息 import tracebackdef disk(): int('saaa')def run(): try: disk() except Exception: ret=traceba ...
- 前端js几种加密/解密方法
https://www.jianshu.com/p/4c236d83ea04 https://blog.csdn.net/guxingsheng/article/details/84451573 vu ...
- .net 6 使用 NEST 查询,时间字段传值踩坑
0x01业务描述 说明: 同事搭建的业务系统,最开始使用 log4net 记录到本地日志. 然后多个项目为了日志统一,全部记录在 Elasticsearch ,使用 log4net.Elastic ...
- CentOS 8 部署 ELK 8.7真的是方便呀
之前装过一次 ELK 7.7,相比之下装 8.7可方便太多了~ CentOS版本 CentOS-8.5.2111-x86_64-dvd1 JAVA ELK会自己使用内置版本的JDK ElasticSe ...
- Prism Sample 16-RegionContext
终于发现一个有趣的新知识了. 本例的核心是RegionContext,意思是一个区域的上下文.但与DataContext似乎并不相同. 先看一下整体思路. 在主窗体上只有一个Region: <G ...
- C# 实现窗体启动时隐藏
在某些时候需要实现一个界面的后台程序,程序自动运行,但起初不显示窗体,在满足触发条件时显示,此时需要在运行程序时先自动隐藏窗体. 修改窗体对应的Program.cs: using System; us ...
- 2020-09-24:jvm监控系统是通过jmx做的么?
福哥答案2020-09-24:#福大大架构师每日一题# [此答案来自知乎:](https://www.zhihu.com/question/422632973) 一般都是,但是要是记录比较详细的性能定 ...