自宅创业 - #29 经验分享: 让AI输出结构化JSON数据

最近一个多月我比较忙碌,开始投入工作和创业中,在此分享一下进展和我在AI方面的一点经验。

本月进展

蚁阅RSS 收到用户赞助,新增发布订阅功能。发布订阅功能用于公开你的订阅,让网友可以在你的网站上阅读你的订阅内容。详见蚁阅1.9.0更新日志

接单给一个AI小程序增加Markdown和Latex数学公式渲染功能,已完成交付上线。

接单给一个企业接入AI实现业务需求,正在开发中。

调研AI市场用户需求,计划开发新功能「AI写作」。

重构了自己AI产品的前端代码,修复一些遗留问题。

如何让AI输出结构化JSON数据

AI(LLM)的输入和输出都是基于自然语言的,然而编程语言只能理解结构化的数据,将AI集成到业务中时经常需要用到结构化的数据,这时可以借助TypeChat让AI生成结构化的JSON数据。

因为AI的训练数据包含了大量编程知识,其中包括TypeScript和JSON,所以可以借助TypeScript描述数据结构,让AI用JSON格式输出数据。通过实践验证AI也确实能够遵循指令输出JSON数据。

示例提问:

You are a service that translates user requests into JSON object according to the following TypeScript definitions of type `Result`.
你是一个用户请求翻译器,根据用户请求和以下TypeScript定义准确翻译成符合 `Result` 类型的JSON对象。TypeScript定义如下:
```
// 判断用户需要什么样的咖啡
type Result {
    size: string,    // 大小:中杯、大杯、超大杯
    sugar: string,   // 糖分: 无糖、半糖、9分糖
}
```
Please translate the user request into a JSON object directly, with 2 spaces of indentation, use `null` to represent values that cannot be translated. Please make sure response JSON text directly.
请将用户请求直接翻译成JSON数据,用2个空格缩进,无法翻译的值用null表示。请确保直接输出JSON数据,不要回复其他内容。

Please translate the following user request into JSON object(请翻译以下用户请求成JSON数据):
我想要一杯咖啡,不要加糖,大杯,加牛奶

AI的回答:

```json
{
  "size": "大杯",
  "sugar": "无糖",
  "milk": true
}
```

但是使用过程中发现存在一些缺陷:

AI可能不会直接输出JSON文本,而是用Markdown语法输出,也可能会输出多余的文字。

解决方案:使用正则表达式提取代码块里面的JSON文本。有些模型支持 JSON mode ,可以确保输出JSON格式数据。

AI可能输出的JSON语法不对,多余的逗号,添加了注释,将 null 写成了 undefined

解决方案:使用 https://github.com/PiotrDabkowski/Js2Py 这个库将JSON文本当作JavaScript解析,提取返回的对象。

AI输出的JSON数据结构可能不对,会缺失字段或者多余字段。

解决方案:对数据问题做容错处理,校验数据,校验失败时让AI重新回答。调整 temperaturetop_p 参数,减少输出的随机性和多样性,使输出更加稳定、集中和确定。

AI对字段的含义理解可能不对,返回了错误的数据。

解决方案:在TypeScript文本中写注释,描述字段的含义,给AI提供指导,给AI举例子。

微软的TypeChat库提供了很好的思路,但处理各种特殊情况时不够灵活,最好的效果是直接自己拼接提示词。我写了一个 typechat.py 已开源在GitHub Gist上,可以参考使用。

最后

通过「RSS阅读器」或者关注公众号「自宅创业」可以订阅博客更新,也可以在 关于我 页面找到我的联系方式,欢迎交流!

返回

留言 - GitHub Issues | 订阅 - RSS源 |联系 - 关于我