【LLM大模型】LLM生成Json结构化数据的几种方案

在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结构化数据虽然方便解析,但也存在几个严重的问题:

  1. 占用空间大,消耗Token多

    一个合法的Json包含大量的引号、逗号、引号,但是这些符号只是起分割作用,对AI并没有什么用,耗费了大量的Token。

  2. 无法支持流式解析

    试想一下一个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%免费】🆓

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值