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. C语言条件运算符(?:)

    条件运算符(conditional operator)有时候也称为三元运算符(ternary operator,或者trinary operator),因为它是唯一需要 3 个操作数的运算符: 条件 ...

  2. Redis系列之——高级用法

    文章目录 一 慢查询 1.1 生命周期 1.2 两个配置 1.2.1 slowlog-max-len 1.2.2 slowlog-max-len 1.2.3 配置方法 1.3 三个命令 1.4 经验 ...

  3. C#学习笔记--变量类型的转换

    变量类型的转化: 转换原则 同类型的大的可以装小的,小类型的装大的就需要强制转换. 隐式转换: 同种类型的转换: //有符号 long-->int-->short-->sbyte l ...

  4. ECS搭建FTP服务

    实验云账号,创建资源后生成收起 子用户名称: u-7ngohee5@1111971854401817 子用户密码: Jp1Ho5Aj5Ek5Yx1P AK ID: LTAI5tGc6fVMJj44H4 ...

  5. 2020 5 17 codeforces

    cf还没结束,就开始写总结了.cf确实是个好东西,能够直接暴露出弱点和增加刷题量.以后还是要多打打的.这次我发现自己的码力还是不行.一个二分都要调好久.唉T1sb题,就是入门用的.题目看不懂...写了 ...

  6. 深入理解 Netty FastThreadLocal

    作者:vivo 互联网服务器团队- Jiang Zhu 本文以线上诡异问题为切入点,通过对比JDK ThreadLocal和Netty FastThreadLocal实现逻辑以及优缺点,并深入解读源码 ...

  7. ACL 与NAT

    ACL 概述 acl是由一系列permit或deny语句组成.有序规则的列表. ACL是一个匹配工具,能够对报文进行匹配和区分. 应用 匹配流量 在traffic-filter中备调用 在NAT中被调 ...

  8. FreeSWITCH的moh使用笔记

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前写过FreeSWITCH安装的文章,今天整理下moh使用过程中遇到的问题及解决方案,并提供moh音频下载途径.F ...

  9. Java中Synchronized的用法(转)

    原文:http://blog.csdn.net/luoweifu/article/details/46613015 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以 ...

  10. 一个java文件的JVM之旅

    准备 我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(Java Virtual Machine)这个地方旅行. 变身 我高高兴兴的来到JVM,想要开始JVM之旅,它确说:&quo ...