经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » XML相关 » Schema » 查看文章
TypeChat、JSONSchemaChat实战 - 让ChatGPT更听你的话
来源:cnblogs  作者:若邪  时间:2024/1/10 8:58:03  对本文有异议

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

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

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

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

我们再看一个例子

  1. {
  2. "filters": [
  3. {
  4. "component": "select",
  5. "key": "店铺名称",
  6. "label": "店铺名称",
  7. "placeholder": "请输入"
  8. },
  9. {
  10. "component": "select",
  11. "key": "店铺编码",
  12. "label": "店铺编码",
  13. "placeholder": "请输入"
  14. },
  15. {
  16. "component": "select",
  17. "key": "店铺门头编码",
  18. "label": "店铺门头编码",
  19. "placeholder": "请输入"
  20. },
  21. {
  22. "component": "select",
  23. "key": "所在区域",
  24. "label": "所在区域",
  25. "placeholder": "全部"
  26. }
  27. ],
  28. "columns": [
  29. {
  30. "slot": false,
  31. "title": "店铺编码",
  32. "dataIndex": "店铺编码",
  33. "key": "店铺编码"
  34. },
  35. {
  36. "slot": false,
  37. "title": "店铺名称",
  38. "dataIndex": "店铺名称",
  39. "key": "店铺名称"
  40. },
  41. {
  42. "slot": false,
  43. "title": "店铺业务范围",
  44. "dataIndex": "店铺业务范围",
  45. "key": "店铺业务范围"
  46. },
  47. {
  48. "slot": false,
  49. "title": "店铺类型",
  50. "dataIndex": "店铺类型",
  51. "key": "店铺类型"
  52. },
  53. {
  54. "slot": false,
  55. "title": "所在区域",
  56. "dataIndex": "所在区域",
  57. "key": "所在区域"
  58. },
  59. {
  60. "slot": false,
  61. "title": "详细地址",
  62. "dataIndex": "详细地址",
  63. "key": "详细地址"
  64. }
  65. ],
  66. "pagination": {
  67. "show": true,
  68. "page": "page",
  69. "size": "size",
  70. "total": "result.total"
  71. },
  72. "includeModifyModal": false,
  73. "fetchName": "fetchTableList",
  74. "result": "[\"result\"][\"records\"]",
  75. "serviceName": "getTableList"
  76. }

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

我们的 prompt 可以这么写:

  1. {
  2. "filters": [
  3. {
  4. "component": "select",
  5. "key": "店铺名称",
  6. "label": "店铺名称",
  7. "placeholder": "请输入"
  8. },
  9. {
  10. "component": "select",
  11. "key": "店铺编码",
  12. "label": "店铺编码",
  13. "placeholder": "请输入"
  14. },
  15. {
  16. "component": "select",
  17. "key": "店铺门头编码",
  18. "label": "店铺门头编码",
  19. "placeholder": "请输入"
  20. },
  21. {
  22. "component": "select",
  23. "key": "所在区域",
  24. "label": "所在区域",
  25. "placeholder": "全部"
  26. }
  27. ],
  28. "columns": [
  29. {
  30. "slot": false,
  31. "title": "店铺编码",
  32. "dataIndex": "店铺编码",
  33. "key": "店铺编码"
  34. },
  35. {
  36. "slot": false,
  37. "title": "店铺名称",
  38. "dataIndex": "店铺名称",
  39. "key": "店铺名称"
  40. },
  41. {
  42. "slot": false,
  43. "title": "店铺业务范围",
  44. "dataIndex": "店铺业务范围",
  45. "key": "店铺业务范围"
  46. },
  47. {
  48. "slot": false,
  49. "title": "店铺类型",
  50. "dataIndex": "店铺类型",
  51. "key": "店铺类型"
  52. },
  53. {
  54. "slot": false,
  55. "title": "所在区域",
  56. "dataIndex": "所在区域",
  57. "key": "所在区域"
  58. },
  59. {
  60. "slot": false,
  61. "title": "详细地址",
  62. "dataIndex": "详细地址",
  63. "key": "详细地址"
  64. }
  65. ],
  66. "pagination": {
  67. "show": true,
  68. "page": "page",
  69. "size": "size",
  70. "total": "result.total"
  71. },
  72. "includeModifyModal": false,
  73. "fetchName": "fetchTableList",
  74. "result": "[\"result\"][\"records\"]",
  75. "serviceName": "getTableList"
  76. }
  77. 将这段 json 中,filters 字段中的 key 字段的值翻译为英文,使用驼峰语法,labelplaceholder 字段的值保留中文。
  78. columns 字段中的 keydataIndex 字段的值翻译为英文,使用驼峰语法,title 字段的值保留中文。
  79. 返回翻译后的 markdown 语法的代码块

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

  1. {
  2. "filters": [
  3. {
  4. "component": "select",
  5. "storeName": "店铺名称",
  6. "label": "店铺名称",
  7. "placeholder": "请输入"
  8. },
  9. {
  10. "component": "select",
  11. "storeCode": "店铺编码",
  12. "label": "店铺编码",
  13. "placeholder": "请输入"
  14. },
  15. {
  16. "component": "select",
  17. "storeDoorCode": "店铺门头编码",
  18. "label": "店铺门头编码",
  19. "placeholder": "请输入"
  20. },
  21. {
  22. "component": "select",
  23. "area": "所在区域",
  24. "label": "所在区域",
  25. "placeholder": "全部"
  26. }
  27. ],
  28. "columns": [
  29. {
  30. "slot": false,
  31. "title": "店铺编码",
  32. "storeCode": "店铺编码",
  33. "key": "storeCode"
  34. },
  35. {
  36. "slot": false,
  37. "title": "店铺名称",
  38. "storeName": "店铺名称",
  39. "key": "storeName"
  40. },
  41. {
  42. "slot": false,
  43. "title": "店铺业务范围",
  44. "storeBusinessScope": "店铺业务范围",
  45. "key": "storeBusinessScope"
  46. },
  47. {
  48. "slot": false,
  49. "title": "店铺类型",
  50. "storeType": "店铺类型",
  51. "key": "storeType"
  52. },
  53. {
  54. "slot": false,
  55. "title": "所在区域",
  56. "area": "所在区域",
  57. "key": "area"
  58. },
  59. {
  60. "slot": false,
  61. "title": "详细地址",
  62. "detailedAddress": "详细地址",
  63. "key": "detailedAddress"
  64. }
  65. ],
  66. "pagination": {
  67. "show": true,
  68. "page": "page",
  69. "size": "size",
  70. "total": "result.total"
  71. },
  72. "includeModifyModal": false,
  73. "fetchName": "fetchTableList",
  74. "result": "[\"result\"][\"records\"]",
  75. "serviceName": "getTableList"
  76. }

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

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

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

直接看效果 :

typechat.gif

完美。

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 类型定义如下:

  1. const res = await translate({
  2. schema: `export type SchedulType = {
  3. /**
  4. * 时间,格式:YYYY-MM-DD HH:mm:ss,当前时间为 ${new Date().toLocaleString()},请推算出正确的时间
  5. */
  6. time: string;
  7. /**
  8. * 活动主题
  9. */
  10. todo: string;
  11. /**
  12. * 地点
  13. */
  14. addr: string;
  15. /**
  16. * 活动的全体参与人
  17. */
  18. participant: string[];
  19. };`,
  20. typeName: 'SchedulType',
  21. request: `根据下面的聊天记录,生成日程安排:${message.data}`,
  22. createChatCompletion: createChatCompletionForScript,
  23. showWebview: true,
  24. });

a9cf046b-05ce-405c-9ebc-f7b8f4c373f0.png

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

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

原文链接:https://www.cnblogs.com/jaycewu/p/17954356

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号