摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

《大火的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支持为例。

  1. 在对话中加入functions描述

  2. 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}'}
  1. 使用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,进一步提升了系统的创造性。

不过还是需要提醒,对于调用系统数据更新删除的方法,还是要做好确认再去执行。

扩展链接:

随笔-当ChatGPT遇见SpreadJS

POI打开Excel文件遇到out of memory的解决实践

搭载ChatGPT之后的表格插件又有哪些新的改变——Function calling增强的更多相关文章

  1. JQuery表格插件DataTables 当前页合计功能

    公司项目表格插件使用的是DataTables,最近添加表合计功能,发现百度统一都是如图类型的代码,不知道是配置问题还是怎么了,在我的页面下根本不能用 var addd=0; $(document).r ...

  2. [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.         jqGrid和AJAX 5.         GridSettings 6.  ...

  3. Dynatable – 基于 HTML5 & jQuery 的交互表格插件

    Dynatable 一款有趣的,语义化,交互式的表格插件,使用 jQuery,HTML5 和 JSON 实现.Dynatable 的目的是提供一种简单的.可扩展的 API,能够轻松的浏览和操作大规模的 ...

  4. datatables 前端表格插件 增删改查功能

    官方网站:http://datatables.club/example/<!-- DataTables CSS -->css引入的<link rel="stylesheet ...

  5. 25款顶级的jQuery表格插件

    jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...

  6. 自己写的表格插件autotable

    自己写的表格插件autotable 作者:田想兵,个人网址:http://www.lovewebgames.com 这个表格插件所完成的功能是:ajax请求数据,然后动态绑定到指定表格下,格式化,分页 ...

  7. 15 个最佳的 jQuery 表格插件

    现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 fluid(流)和自适应性特点. 大多数网站设计要靠margins, guides, rows ...

  8. 推荐几款jQuery表格插件

    平时项目中,会碰到很多表格元素,这里推荐几款jQuery表格插件. Stackable.js 通常在小屏幕上,表格的表形形式不大好,因为用户会缩放平移,或者就是表格太小,导致数据不可见.Stackab ...

  9. 好用的自适应表格插件-bootstrap table (支持固定表头)

    最近工作中找到了一款十分好用的表格插件,不但支持分页,样式,搜索,事件等等表格插件常有的功能外,最主要的就是他自带的冻结表头功能,让开发制作表格十分容易,不过网上大多都是英文文档,第一次使用会比较麻烦 ...

  10. jQuery 表格插件25

    jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...

随机推荐

  1. 从k8s 的声明式API 到 GPT的 提示语

    命令式 命令式有时也称为指令式,命令式的场景下,计算机只会机械的完成指定的命令操作,执行的结果就取决于执行的命令是否正确.GPT 之前的人工智能就是这种典型的命令式,通过不断的炼丹,告诉计算机要怎么做 ...

  2. flex:1的情况下,overflow:auto没有生效的问题

    flex:1的元素的父元素必须保证高度或者宽度有具体的数值:如果父元素的高度或者宽度也是flex:1自适应的,最好在父元素上也设置overflow:auto,这样子元素的overflow:auto生效 ...

  3. 性能_1 Jmeter脚本编写

    一.万能法 先把项目启动 打开项目接口文档,接口文档: 一般是开发 特别注意事项:当你的接口请求参数为json格式时,一定要写请求头,请求头中一定要有 Content-Type: applicatio ...

  4. C++ Primer 5th 阅读笔记:前言

    机器效率和编程效率 Its focus, and that of its programming community, has widened from looking mostly at machi ...

  5. 学习Golang时遇到的似懂非懂的概念

    背景 这是我学习golang的第三天,大致已经掌握了golang的语法,但是着手开发的时候,却遇到了许多问题,例如golang导包机制.golang的项目管理规范.go mod生成project怎么管 ...

  6. 联想win8改win7

    知识点分析:目前联想出厂预装Windows 8的台式和一体机使用都是UEFI+GPT硬盘的组合,并且开启了安全启动,但是目前除Window 8以外的其他Windows系统均不支持这种模式,因此如果需要 ...

  7. docker安装rabbitmq:management

    1.拉取镜像 docker pull rabbitmq:management 2.安装 docker run -dit --name rabitmq -e RABBITMQ_DEFAULT_USER= ...

  8. mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

    json 非数组 建表语句ddl CREATE TABLE tb_json_test ( id INT NOT NULL AUTO_INCREMENT, user_no VARCHAR(100), u ...

  9. 新出的Alist云盘视频助手,真的香还是假的香?

    作为某云盘的重度使用者和长期受虐者,前段时间无意中看到一款新出的网盘工具,叫Alist云盘视频助手,不同于一般的网盘工具,它不是面向网盘数据下载的,它面向的是网盘视频文件隐私保护,大白话就是:加密网盘 ...

  10. Selenium - 元素定位(1) - 八种元素定位

    Selenium - 元素定位 八种元素定位 我们在做WEB自动化时,最根本的就是操作页面上的各种元素,而操作的基础便是元素的定位,只有准确地定位到唯一元素才能进行后续的自动化控制,下面将对各种元素定 ...