摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。
在《大火的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);
- 给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)