TypeChat 用一句话概括,就是用了它你可以让大语言模型(比如 ChatGPT)将自然语言转换成特定类型的 JSON 数据。

我们在使用 ChatGPT 的时候,大致流程如下:

假如我们需要 ChatGPT 按照我们输入的 prompt,输出指定格式的 JSON 数据,我们在 prompt 里将我们的要求描述清楚就行,比如

好像没什么问题,很听话。

我们再看一个例子

{
"filters": [
{
"component": "select",
"key": "店铺名称",
"label": "店铺名称",
"placeholder": "请输入"
},
{
"component": "select",
"key": "店铺编码",
"label": "店铺编码",
"placeholder": "请输入"
},
{
"component": "select",
"key": "店铺门头编码",
"label": "店铺门头编码",
"placeholder": "请输入"
},
{
"component": "select",
"key": "所在区域",
"label": "所在区域",
"placeholder": "全部"
}
],
"columns": [
{
"slot": false,
"title": "店铺编码",
"dataIndex": "店铺编码",
"key": "店铺编码"
},
{
"slot": false,
"title": "店铺名称",
"dataIndex": "店铺名称",
"key": "店铺名称"
},
{
"slot": false,
"title": "店铺业务范围",
"dataIndex": "店铺业务范围",
"key": "店铺业务范围"
},
{
"slot": false,
"title": "店铺类型",
"dataIndex": "店铺类型",
"key": "店铺类型"
},
{
"slot": false,
"title": "所在区域",
"dataIndex": "所在区域",
"key": "所在区域"
},
{
"slot": false,
"title": "详细地址",
"dataIndex": "详细地址",
"key": "详细地址"
}
],
"pagination": {
"show": true,
"page": "page",
"size": "size",
"total": "result.total"
},
"includeModifyModal": false,
"fetchName": "fetchTableList",
"result": "[\"result\"][\"records\"]",
"serviceName": "getTableList"
}

我们需要 ChatGPT 把上面 JSON 数据中 filters 字段中的 key 字段的值翻译为英文,使用驼峰语法。columns 字段中的 key、dataIndex 字段的值翻译为英文,使用驼峰语法。

我们的 prompt 可以这么写:

{
"filters": [
{
"component": "select",
"key": "店铺名称",
"label": "店铺名称",
"placeholder": "请输入"
},
{
"component": "select",
"key": "店铺编码",
"label": "店铺编码",
"placeholder": "请输入"
},
{
"component": "select",
"key": "店铺门头编码",
"label": "店铺门头编码",
"placeholder": "请输入"
},
{
"component": "select",
"key": "所在区域",
"label": "所在区域",
"placeholder": "全部"
}
],
"columns": [
{
"slot": false,
"title": "店铺编码",
"dataIndex": "店铺编码",
"key": "店铺编码"
},
{
"slot": false,
"title": "店铺名称",
"dataIndex": "店铺名称",
"key": "店铺名称"
},
{
"slot": false,
"title": "店铺业务范围",
"dataIndex": "店铺业务范围",
"key": "店铺业务范围"
},
{
"slot": false,
"title": "店铺类型",
"dataIndex": "店铺类型",
"key": "店铺类型"
},
{
"slot": false,
"title": "所在区域",
"dataIndex": "所在区域",
"key": "所在区域"
},
{
"slot": false,
"title": "详细地址",
"dataIndex": "详细地址",
"key": "详细地址"
}
],
"pagination": {
"show": true,
"page": "page",
"size": "size",
"total": "result.total"
},
"includeModifyModal": false,
"fetchName": "fetchTableList",
"result": "[\"result\"][\"records\"]",
"serviceName": "getTableList"
}
将这段 json 中,filters 字段中的 key 字段的值翻译为英文,使用驼峰语法,label、placeholder 字段的值保留中文。
columns 字段中的 key、dataIndex 字段的值翻译为英文,使用驼峰语法,title 字段的值保留中文。
返回翻译后的 markdown 语法的代码块

最后面的那段话已经经过了几次修改,我们看下 ChatGPT 返回的内容:

{
"filters": [
{
"component": "select",
"storeName": "店铺名称",
"label": "店铺名称",
"placeholder": "请输入"
},
{
"component": "select",
"storeCode": "店铺编码",
"label": "店铺编码",
"placeholder": "请输入"
},
{
"component": "select",
"storeDoorCode": "店铺门头编码",
"label": "店铺门头编码",
"placeholder": "请输入"
},
{
"component": "select",
"area": "所在区域",
"label": "所在区域",
"placeholder": "全部"
}
],
"columns": [
{
"slot": false,
"title": "店铺编码",
"storeCode": "店铺编码",
"key": "storeCode"
},
{
"slot": false,
"title": "店铺名称",
"storeName": "店铺名称",
"key": "storeName"
},
{
"slot": false,
"title": "店铺业务范围",
"storeBusinessScope": "店铺业务范围",
"key": "storeBusinessScope"
},
{
"slot": false,
"title": "店铺类型",
"storeType": "店铺类型",
"key": "storeType"
},
{
"slot": false,
"title": "所在区域",
"area": "所在区域",
"key": "area"
},
{
"slot": false,
"title": "详细地址",
"detailedAddress": "详细地址",
"key": "detailedAddress"
}
],
"pagination": {
"show": true,
"page": "page",
"size": "size",
"total": "result.total"
},
"includeModifyModal": false,
"fetchName": "fetchTableList",
"result": "[\"result\"][\"records\"]",
"serviceName": "getTableList"
}

filters 里的 key 字段哪去了?columns 里 dataIndex 字段哪去了?

这只是我遇到的各种情况里的一种,当然也有成功的,反正就是很玄学,可能是我半年 prompt 练习生的水平不够吧。

如果我们用 TypeChat 会怎么样呢?

直接看效果 :

完美。

TypeChat 的大致原理如下:

其实就是在 prompt 拼上了一个 TS 类型,要求 ChatGPT 按照 TS 类型声明输出 JSON。背后还会构建一个 TS 程序去进行校验,如果校验失败就把错误信息也加到 prompt 里,让 ChatGPT 再处理一次。

上面生成的 prompt 跟 TypeChat 生成的有些区别,我并没有直接使用 TypeChat,为了方便在我的项目里使用就抄了一份进行修改,在生成 prompt 的里加上了 “按照字段的注释进行处理” 这一要求。修改后的代码: https://github.com/lowcode-scaffold/lowcode-materials/blob/master/share/TypeChatSlim/index.ts

在 TS 类型的字段注释里还可以加入更离谱的东西来要求 ChatGPT 去处理,比如之前弄的一个根据聊天记录生成日程安排的小 demo,在字段注释里加上当前时间,让 ChatGPT 根据会话内容推算出具体的日期。TS 类型定义如下:

const res = await translate({
schema: `export type SchedulType = {
/**
* 时间,格式:YYYY-MM-DD HH:mm:ss,当前时间为 ${new Date().toLocaleString()},请推算出正确的时间
*/
time: string;
/**
* 活动主题
*/
todo: string;
/**
* 地点
*/
addr: string;
/**
* 活动的全体参与人
*/
participant: string[];
};`,
typeName: 'SchedulType',
request: `根据下面的聊天记录,生成日程安排:${message.data}`,
createChatCompletion: createChatCompletionForScript,
showWebview: true,
});

聊天记录中只说到了周六下午两点,ChatGPT 根据字段注释里的当前时间正确推算出了日程的具体日期。

受到 TypeChat 的启发,借助 JSON Schema 实现了一个 JSONSchemaChat,原理差不多,效果如下:

TypeChat、JSONSchemaChat实战 - 让ChatGPT更听你的话的更多相关文章

  1. [Java聊天室server]实战之二 监听类

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  2. MindSpore模型精度调优实战:如何更快定位精度问题

    摘要:为大家梳理了针对常见精度问题的调试调优指南,将以"MindSpore模型精度调优实战"系列文章的形式分享出来,帮助大家轻松定位精度问题,快速优化模型精度. 本文分享自华为云社 ...

  3. spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

  4. Selenium 2自动化测试实战36(更易读的测试报告)

    一.更易读的测试报告 1.知识点:python的注释. 1.一种叫comment,为普通的注释2.另一种叫doc string,用于函数,类和方法的描述.在类或方法的下方,通过三引号("&q ...

  5. [Java聊天室server]实战之五 读写循环(服务端)

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  6. [Java聊天室server]实战之三 接收循环

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识.但学习之前,更 ...

  7. Android编程之Listener侦听的N种写法及实现原理

    写下这个题目时突然想起鲁迅笔下的孔乙已,茴香豆的几种写法,颇有些咬文嚼字的味道.虽然从事手机编程多年,但一直使用的是C和C++编程,由于安卓早期只支持JAVA开发,所以对于时下如火如荼的安卓系统,我一 ...

  8. 谁能真正替代你?AI辅助编码工具深度对比(chatGPT/Copilot/Cursor/New Bing)

    写在开头 这几个月AI相关新闻的火爆程度大家都已经看见了,作为一个被裹挟在AI时代浪潮中的程序员,在这几个月里我也是异常兴奋和焦虑.甚至都兴奋的不想拖更了.不仅仅兴奋于AI对于我们生产力的全面提升,也 ...

  9. 如何优雅的申请一个属于自己的ChatGPT账号

    前言 GPT-4是一种语言模型,是基于GPT-3推出的下一代自然语言处理模型.与之前的GPT模型一样,GPT-4是一种基于深度学习技术的神经网络模型,可以自动地生成人类水平的文本.回答问题.完成翻译任 ...

  10. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...

随机推荐

  1. Go语言精进之路目录

    目录 一.介绍 01.Go 语言的前生今世 二.开发环境搭建 01.Go 语言开发环境搭建 三.初识GO语言 01.Go 多版本管理工具 02.第一个 Go 程序"hello,world&q ...

  2. vim vimtutor

    =============================================================================== =      歡     迎     閱 ...

  3. 高效数据传输:Java通过绑定快速将数据导出至Excel

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 把数据导出至 Excel 是很常见的需求,而数据的持久化 ...

  4. [自制工具]简便易用的ADDM报告生成工具

    ■■ Oracle ADDM简介 ADDM全称是Automatic Database Diagnostic Monitor,是Oracle实现性能自我诊断的最佳利器.它依赖于AWR,我们知道AWR会自 ...

  5. DevOps|研发效能解决的是企业效率问题

    研发效能并不能解决企业效益问题 它不是利润中心,不能给你带来直接收入(研发效能相关工具厂商做咨询.出方案.卖工具除外).想要解决企业效益问题,依赖于企业战略.业务/产品.组织.运营.创新等其他方面. ...

  6. salesforce零基础学习(一百三十三)ListView的button思考

    本篇参考: salesforce零基础学习(九十五)lightning out salesforce零基础学习(一百一十)list button实现的一些有趣事情 https://help.sales ...

  7. JUC并发编程学习(十三)ForkJoin

    ForkJoin 什么是ForkJoin ForkJoin在JDK1.7,并发执行任务!大数据量时提高效率. 大数据:Map Reduce(把大任务拆分成小任务) ForkJoin特点:工作窃取 为什 ...

  8. Spring系列:基于XML的方式构建IOC

    目录 一.搭建模块spring6-ioc-xml 二.获取bean的三种方式 三.基于setter注入 四.基于构造器注入 五.特殊值处理 六.为对象类型属性赋值 七.引入外部属性文件 八.基于XML ...

  9. Kubernetes: kube-apiserver 之认证

    kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...

  10. PZthon

    一道新式题目,python.exe的分析 这个时候没有思路不要紧,直接wp 先用特别的软件执行.exe程序,就是对.exe进行反编译 然后在反编译脚本的目录写就有了一个打包文件夹 在里面找到文件的.p ...