关于chatgpt:搭载ChatGPT之后的表格插件又有哪些新的改变Function-calling增强

6次阅读

共计 3709 个字符,预计需要花费 10 分钟才能阅读完成。

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。

在《大火的 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}'}
  3. 应用 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**](https://www.grapecity.com.cn/blogs/chatgpt-meets-spreadjs)
正文完
 0