在AI功能开发中,我们通常希望AI生成的数据是结构化的,不仅仅是简单的一层字段,也可以包含嵌套关系。
由于AI的注意力机制,AI可以在一次生成中根据上下文补全层级关系。比如我们想让AI生成一个虚拟人物,并附加一些相关属性,如下:
{
"name": "John",
"age": 30,
"city": "New York",
"pets": [
{
"name": "Buddy",
"species": "dog"
},
{
"name": "Simba",
"species": "cat"
}
]
}
本文将探讨使用AI生成这种结构化数据的几种方案,以及每种方案的优缺点。
早期版本
OpenAI早期并未提供Json结构化输出的选项,并且现在还有很多大模型不支持Json输出,我们只能通过Prompt来让大模型输出Json,例如:
Prompt:生成一个虚拟人物,返回为Json数据,包含name, age, city, pets,其中pets数组包含name和species
ChatGPT:好的,我将为您生成一个虚拟人物的JSON数据。请注意,由于这是一个虚拟人物,所以所有的信息都是随机生成的。
{ "name": "Emma Smith", "age": 28, "city": "New York", "pets": [ { "name": "Charlie", "species": "Dog" }, { "name": "Luna", "species": "Cat" } ] }
这是一个名为Emma Smith的28岁的虚拟人物,居住在纽约。她有两只宠物,一只名叫Charlie的狗和一只名叫Luna的猫。她还有三个朋友,他们分别是James Johnson(30岁)、Olivia Davis(26岁)和William Thompson(29岁)。请注意,这只是一个虚拟人物示例,所有的信息都是随机生成的,并不代表真实的人物。
生成的结果还可以,但是提取出Json字符串还是比较麻烦的,甚至有些时候Json会包含一些错误的引号、逗号、括号,这种方式稳定性很差,非常不推荐。
Json Mode
[Json Mode]可以让AI只返回合法的Json字符串,并节省了输出Token。
目前OpenAI等大模型都已经支持Json Mode,只需要在请求中加上response_format": {"type": "json_object"}
,然后在提示词中说明要生成的JSON结构,例如:
Prompt:生成一个虚拟人物,返回为Json数据,包含name, age, city, pets,其中pets数组包含name和species
ChatGPT:
{ "name": "Emma Smith", "age": 28, "city": "New York", "pets": [ { "name": "Charlie", "species": "Dog" }, { "name": "Luna", "species": "Cat" } ] }
这种模式保证了JSON结果百分百可用,但是会比普通生成要慢一些。
指定Json结构
如果我们想让pets.species
只能是猫/狗
,我们就得在Prompt中描述这个限制。如果想创建更复杂的嵌套结构,自然语言描述起来会越来越费劲,大模型理解和生成的效果也会下降。
OpenAI的文档也说:JSON 模式不保证输出匹配任何特定模式,仅保证其有效且解析无错误。
那么如何指定复杂的Json结构并让大模型严格遵守呢?
Json Schema
Json Schema不仅能约定Json的结构,还能约定数据类型、文本规则等,也是大模型支持比较好的方式。
Prompt:生成一个虚拟人物,返回为Json数据,并严格遵循这个Json Schema:
json { "type": "object", "properties": { "name": { "type": "string", "description": "三个字的名字" }, "age": { "type": "number", "default": "", "minimum": 18, "maximum": 30 }, "city": { "type": "string", "description": "必须是中国城市" }, "pets": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "species": { "type": "string", "enum": [ "猫", "狗" ] } } } } } }
这种方式的优点在于,不仅可以通过枚举、范围、正则来约定输出的结果,还可以通过description
来加强AI的理解。
缺点主要有两个,一是Json Schema体积大,放在Prompt中很容易超过输入Token;二是Json Schema对非开发人员不太友好,这里推荐一个[Json Schema 在线编辑器],可以很方便的设计Json Schema。
TypeScript(推荐)
在创新比赛中,我们发现可以使用TypeScript语法来约束DSL,AI的理解能力和生成效果都非常稳定。
改为TypeScript后的Prompt就变得非常精简:
Prompt:生成一个虚拟人物,返回为Json数据,并严格遵循这个interface:
export interface Person { name: string; // "三个字的名字" age: number; // 18-30 city?: string; // "必须是中国城市" pets: { name: string; species: '猫' | '狗'; }[]; }
目前为止,生成Json对象最推荐的方式就是TypeScript约束Prompt + Json Mode
生成,Prompt占用空间小且易读,输出稳定,方便调优Prompt。
Json结构的问题
Json结构化数据虽然方便解析,但也存在几个严重的问题:
-
占用空间大,消耗Token多
一个合法的Json包含大量的引号、逗号、引号,但是这些符号只是起分割作用,对AI并没有什么用,耗费了大量的Token。
-
无法支持流式解析
试想一下一个Json字符串逐字打印出来,在打印完毕之前这个Json都是不合法的,这就无法动态解析,从而无法动态渲染前端组件,用户必须等待长时间的Loading才能看到最终的效果。
使用Yaml结构(推荐)
在我们的实验中,目前最好的解决方案是输出为Yaml结构,不仅拥有更小的体积,同时支持流式解析。
只需要关闭Json模式,并让AI返回Yaml即可,如下:
Prompt:生成一个虚拟人物,返回为Yaml数据,并严格遵循这个interface:
export interface Person { name: string; // "三个字的名字" age: number; // 18-30 city?: string; // "必须是中国城市" pets: { name: string; species: '猫' | '狗'; }[]; }
ChatGPT:以下是一个符合接口要求的虚拟人物的YAML数据:
name: "赵雷" age: 25 city: "北京" pets: - name: "旺财" species: "狗" - name: "咪咪" species: "猫"
在这个例子中,Yaml输出比Json输出少了64个字符,体积减少了40%,在复杂结构中,可以省下更多的Token;并且支持流式解析,转换为增量可用的Json,以支持前端逐步渲染出每一部分的信息。
这种模式效果很好,只需要付出一些微小的代价 —— 生成结果中会包含代码外的部分,需要开发者提取出Yaml文本并转换为Json对象。
总结
如果你要求Json结果100%可用,推荐使用TypeScript约束Prompt + Json Mode
。
如果你需要流式输出,推荐使用TypeScript约束Prompt + Yaml格式输出
,适用于90%的结构化输出场景。
希望这篇文章能给大家带来帮助,也欢迎一起讨论探索更好的方式。
大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
1.学习路线图
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓