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. vue2实现数据聚合【scatter-clustering】组件封装

    实现如下效果: 效果展示:https://code.juejin.cn/pen/7228568245148581943 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...

  2. Stable Diffusion

     Stable Diffusion  ...using diffusers Stable Diffusion is a text-to-image latent diffusion model cre ...

  3. gson如何序列化子类

    需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...

  4. idea中常用的快捷键

    IntelliJ IDEA 常用快捷键 一.Ctrl 快捷键 Ctrl + F 在当前文件进行文本查找 (必备) Ctrl + R 在当前文件进行文本替换 (必备) Ctrl + Z 撤销 (必备) ...

  5. LVS负载均衡概念+三种模式

    1.LVS负载均衡概念剖解: 1)LVS技术全称:Linux virtual Server ,Linux虚拟机服务器集群,1998由章文嵩博士设计.并且开源的,是中国最早的开源软件项目之一.   2) ...

  6. 详述Java内存屏障,透彻理解volatile

    一般来说内存屏障分为两层:编译器屏障和CPU屏障,前者只在编译期生效,目的是防止编译器生成乱序的内存访问指令:后者通过插入或修改特定的CPU指令,在运行时防止内存访问指令乱序执行. 下面简单说一下这两 ...

  7. ceph的应用

    创建 CephFS 文件系统 MDS 接口 -------------------- 创建 CephFS 文件系统 MDS 接口 -------------------- //服务端操作 1)在管理节 ...

  8. 21. 从零用Rust编写正反向代理,tokio竟然这样对待socket!

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  9. Vue源码学习(十五):diff算法(二)交叉比对(双指针)

    好家伙, 本节来解决我们上一章留下来的问题, 新旧节点同时有儿子的情况本章继续解决 1.要做什么? 本章将解决, 1.在相同tag下子元素的替换问题 2.使用双指针进行元素替换, 实现效果如下:   ...

  10. 拓展欧几里得 edgcd 模板+简易推论

    LL exgcd(LL a,LL b, LL &x, LL &y) { if(b == 0) { x=1,y=0; return a; } LL d = exgcd(b, a%b, x ...