自宅创业 - #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重新回答。调整 temperature
和 top_p
参数,减少输出的随机性和多样性,使输出更加稳定、集中和确定。
AI对字段的含义理解可能不对,返回了错误的数据。
解决方案:在TypeScript文本中写注释,描述字段的含义,给AI提供指导,给AI举例子。
微软的TypeChat库提供了很好的思路,但处理各种特殊情况时不够灵活,最好的效果是直接自己拼接提示词。我写了一个 typechat.py 已开源在GitHub Gist上,可以参考使用。
最后
通过「RSS阅读器」或者关注公众号「自宅创业」可以订阅博客更新,也可以在 关于我 页面找到我的联系方式,欢迎交流!