TOON:一种为大模型设计的JSON压缩型数据结构

TOON:一种为大模型设计的JSON压缩型数据结构

目录

TOON:一种为大模型设计的JSON压缩型数据结构

一、精准定义,什么是 TOON?

1、JSON 数据格式的局限性

2、TOON 的结构与优势

3、TOON 数据结构的主要特征

4、媒体类型与文件拓展名

二、举例:JSON 与 TOON 描述同一组数据分别是什么样

三、结语


        作者:watermelo37

        ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。

        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。



---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

TOON:一种为大模型设计的JSON压缩型数据结构

        TOON 入门到实战三部曲:

        基础入门:TOON:一种为大模型设计的JSON压缩型数据结构

        价值探究:探究TOON的价值边界:比JSON更优的大模型友好数据格式?

        开发实战:面向大模型开发:在项目中使用 TOON 的实践与流式处理

        最近 AI 圈子里出现了一个新概念:TOON

        官方对它的描述是这样的:一种简洁、易读的 JSON 数据模型编码,最大限度地减少令牌数量,使模型易于理解结构。它旨在作为现有 JSON 的可随插、无损表示,用于 LLM 输入。它结合了 YAML 基于缩进的嵌套对象结构与 CSV 风格的表格布局,用于统一数组。TOON 的优势在于对象数组统一(每行多个字段,项目结构相同),实现类似 CSV 的紧凑性,同时增加了显式结构,帮助大型语言模型可靠解析和验证数据。

        当下社区中关于 TOON 的文章质量良莠不齐,有些描述甚至是错误的。本文将结合官方描述与工程视角,对 TOON 做一次尽量简洁、准确的入门性介绍,帮助读者先弄清楚一个问题:

        TOON 到底是什么?它解决的是什么问题?

        截至目前,TOON 在 GitHub 上已经获得了 21.5k+ Star,一种比JSON更优秀的大模型友好数据格式真的诞生了?

一、精准定义,什么是 TOON?

1、JSON 数据格式的局限性

        JSON 在工程世界里几乎无可替代,但在与大模型交互时,它有一个非常现实的问题:结构冗余。尤其是同构对象数组,比如:

{ "hikes": [ { "id": 1, "name": "Blue Lake Trail", "distanceKm": 7.5 }, { "id": 2, "name": "Ridge Overlook", "distanceKm": 9.2 }, { "id": 3, "name": "Wildflower Loop", "distanceKm": 5.1 } ] } 

        每一行都在重复:"id" "name" "distanceKm"。

        在 LLM 输入中,这些重复的结构信息会消耗更多的上下文空间。JSON 的问题在于并非为语言模型的上下文机制设计,完善通用的结构给它带来了更多的信息冗余,但信息冗余是要花钱的。

2、TOON 的结构与优势

        TOON 的核心思想就是:在保持 JSON 语义不变的前提下,把重复结构前移并声明一次 + 提前告知数据条目总长度。

        它融合了三种表达风格:

  • YAML 的缩进结构:表达对象嵌套
  • 表格化声明:表达同构对象数组
  • 显式结构标注:减少歧义,方便模型解析

        其核心就在于 TOON 将键名重复的同构对象数组变成形如“key[n]{a,b,c}:”的声明,后续n行只表示值。

        举个例子,上面的JSON数据转化为 TOON 就是:

hikes[3]{id,name,distanceKm}: 1,Blue Lake Trail,7.5 2,Ridge Overlook,9.2 3,Wildflower Loop,5.1

        是不是简洁了很多?重复的键名、空格、括号都被去除了。

3、TOON 数据结构的主要特征

        官方仓库对于 TOON 的主要特征是这样描述的:

  • 令牌高效且准确:TOON 在混合结构基准测试中,在 4 个模型中,准确率达到 74%(而 JSON 仅为 70%),同时使用约 40% 的令牌。
  • JSON 数据模型:通过确定性、无损的往返编码与 JSON 相同的对象、数组和原语。
  • LLM 友好型护栏: 明确的[N]长度和{fields}头部为模型提供了清晰的模式,提高了解析可靠性。
  • 最小语法: 使用缩进代替大括号,减少引用,赋予类似 YAML 的可读性和 CSV 风格的紧凑性。
  • 表格数组: 均匀的对象数组合并成表,表中声明字段一次,逐行传输取值。
  • 多语言生态系统:TypeScript、Python、Go、Rust、.NET 及其他语言中的规范驱动实现。

4、媒体类型与文件拓展名

        TOON 文件在 HTTP 和内容类型感知的上下文中使用 .toon 扩展名和临时媒体类型 text/toon。TOON 文档始终采用 UTF-8 编码;可以指定 charset=utf-8 参数,但省略时默认为 UTF-8。

二、举例:JSON 与 TOON 描述同一组数据分别是什么样

        TOON 看起来像添加了长度的 csv ?先别急,我们可以通过一个官方的对比案例理解一下 TOON 结构的真实魅力。

        原始 JSON是这样的:

{ "context": { "task": "Our favorite hikes together", "location": "Boulder", "season": "spring_2025" }, "friends": ["ana", "luis", "sam"], "hikes": [ { "id": 1, "name": "Blue Lake Trail", "distanceKm": 7.5, "elevationGain": 320, "companion": "ana", "wasSunny": true }, { "id": 2, "name": "Ridge Overlook", "distanceKm": 9.2, "elevationGain": 540, "companion": "luis", "wasSunny": false }, { "id": 3, "name": "Wildflower Loop", "distanceKm": 5.1, "elevationGain": 180, "companion": "sam", "wasSunny": true } ] }

        其中有各种特殊格式,比如嵌套、对象数组、非对象数组、普通对象等。转化为 TOON 后就变成了这样:

context: task: Our favorite hikes together location: Boulder season: spring_2025 friends[3]: ana,luis,sam hikes[3]{id,name,distanceKm,elevationGain,companion,wasSunny}: 1,Blue Lake Trail,7.5,320,ana,true 2,Ridge Overlook,9.2,540,luis,false 3,Wildflower Loop,5.1,180,sam,true

        在不影响人类可读性的基础上,TOON 去除了所有的普通对象中的大括号、空格甚至双引号,将所有的同构对象数组和普通数组都简化成类似CSV的结构,并将数组的总长度、键名都提前声明,便于大模型获取核心信息。

        这一点除了节省 token 外,官方认为还带来了识别和搜索效率的提升,这一点小瓜将在下一次更新《探究TOON的价值边界:比JSON更优的大模型友好数据格式?》中展开介绍。

三、结语

        到这里为止,我们可以给 TOON 一个非常清晰的定义:TOON 是一种为大模型输入设计的、对 JSON 进行结构压缩的表示方式。它吸纳了 yaml、 csv 的表示特点,对 JSON 数据的表达结构进行了重构,在特定场景下能节约 token 的使用量。

        它通过消除同构对象数组中的结构重复显式声明数组规模与字段模式来降低结构性 token 的消耗。但问题也随之而来,是不是所有 JSON 都适合 TOON?TOON 是否真的更利于模型理解?这些问题,将在下一篇《探究TOON的价值边界:比JSON更优的大模型友好数据格式?》展开。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        Web Worker:让前端飞起来的隐形引擎

        测评:这B班上的值不值?在不同城市过上同等生活水平到底需要多少钱?

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        DeepSeek:全栈开发者视角下的AI革命者

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

        高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

        通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

      【前端实战】如何让用户回到上次阅读的位置?

        前端实战:基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化策略

        深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        JavaScript双问号操作符(??)详解,解决使用 || 时因类型转换带来的问题

        内存泄漏——海量数据背后隐藏的项目生产环境崩溃风险!如何避免内存泄漏

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、DOM操作等

Read more

Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理

Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理

◆ 博主名称: 晓此方-ZEEKLOG博客大家好,欢迎来到晓此方的博客。⭐️C++系列个人专栏: 主题曲:C++程序设计⭐️ 踏破千山志未空,拨开云雾见晴虹。 人生何必叹萧瑟,心在凌霄第一峰 0.1概要&序論 这里是此方,好久不见。 多态是 C++ 中最核心而且是最难理解的机制之一。它不仅是语法层面的特性,更牵涉到 C++ 的对象模型、对象内存布局以及多态机制的底层实现原理。本文将从底层原理出发,系统全面解析多态的真实运作机制。这里是「此方」。让我们现在开始吧! 一,多态的概念 通俗来说,多态就是多种形态。多态分为编译时多态(静态多态) 和 运行时多态(动态多态),这里我们重点讲运行时多态。 1.1编译时多态(静态多态) 编译时多态主要就是我们前面讲的 函数重载和函数模板。 它们通过传递不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。之所以叫编译时多态,是因为实参传递给形参的参数匹配是在编译时完成的,

By Ne0inhk
【STL】stack/queue 底层模拟实现与典型算法场景实践

【STL】stack/queue 底层模拟实现与典型算法场景实践

前言 STL 中 stack 与 queue 本质是容器适配器,基于基础容器封装实现特定操作逻辑。本文先介绍容器适配器及二者核心概念,再手动模拟实现,最后通过几道算法题展示其应用,助力夯实 STL 设计思想与数据结构基础。 目录  ------------容器适配器------------ 1、什么是容器适配器? 2、为啥容器配置器不支持迭代器  ---------------stack--------------- 1、stack介绍 2、stack模拟实现 问题:为啥 stack 不用提供默认成员函数? ---------------queue-------------- 1、queue介绍 2、queue模拟实现 --------------算法题-------------- 1、最小栈 2、栈的压入、弹出序列 3、逆波兰表达式求值 4、用栈实现队列 5、用队列实现栈  ------------容器适配器------------ 1、什么是容器适配器? 适配器可以理解为“

By Ne0inhk
【C++写详细总结①】从for循环到算法初步

【C++写详细总结①】从for循环到算法初步

前言 本文通过小编自身学习的进程从而总结出本文,也希望大家可以好好学习,帮助到自己 这个是萌新考场救场代码,与本文一起食用更佳 for循环计数器 for(定义计数变量;定义结束条件;每次循环所做的动作) 示例 for(int i=1;i<=10;i++) //首先定义“i”变量作为计数数组,赋初值为“1”//然后每次循环判断条件是否成立,不成立则退出//最后每循环执行条件,此示例为每循环“i”增加1 而计数器就是在for循环有了一定执行范围的基础上创建了一个数组,进行++计数 示例 #include<iostream>// 万年不变的框架usingnamespace std;intmain(){int n; cin>>n;//输入数值表示从1~n中有几个数字int

By Ne0inhk
【C++笔记】模板初阶

【C++笔记】模板初阶

前言:         C++模板是C++中实现泛型编程的核心工具,允许程序员编写与类型无关的代码,从而提高代码的复用性和灵活性。模板在编译时进行实例化,根据实际使用的类型生成具体的代码,因此不会带来运行时开销。          一、模板基础          1.1 为什么需要模板?          在编写函数或类时,如果希望它们能处理多种数据类型(如int、double、string),传统方法是使用函数重载,但这样会产生大量重复代码或失去类型信息。 模板允许将类型作为参数,编译器根据调用时传入的具体类型生成对应的代码。          场景:需要编写一个求两个数最大值的函数,支持 int、double 和 string(按字典序)。          ①传统方法:函数重载 #include <iostream> #include <string> using namespace std; // 为 int 重载 int max(int

By Ne0inhk