JSON ↔ TOON转换器 - LLM Token优化格式

JSON 输入
TOON 输出

常见问题

什么是TOON(面向Token的对象表示法)?

TOON(Token-Oriented Object Notation,面向Token的对象表示法)是一种紧凑、人类可读的数据序列化格式,专门为大语言模型(LLM)应用设计。它的创建是为了解决使用ChatGPT、Claude、Gemini等AI模型时日益增长的Token消耗成本问题。TOON提供了一种模式感知的JSON替代方案,可以减少30-50%甚至更多的Token使用量。与传统JSON为数组中的每个对象重复属性名不同,TOON使用表格格式,其中标题只定义一次,数据行以紧凑的逗号分隔格式跟随。这种方法对于具有重复模式的结构化数据特别有效,如API响应、数据库记录或任何具有一致属性的对象集合。该格式在显著减少表示相同数据所需Token数量的同时保持人类可读性,使其成为成本敏感的LLM应用和上下文窗口限制场景的理想选择。

为什么在LLM提示中使用TOON而不是JSON?

在使用大语言模型时,有几个令人信服的理由选择TOON而不是JSON。首先是成本降低——像OpenAI的GPT-4、Anthropic的Claude和Google的Gemini这样的LLM API按Token使用量收费,TOON可以为结构化数据减少30-50%的Token消耗,直接降低您的API成本。其次,TOON帮助您在上下文窗口限制内容纳更多数据。每个LLM都有最大上下文长度,使用更紧凑的格式,您可以在提示中包含更多相关数据而不会触及这些限制。第三,TOON通过允许您在相同Token预算内提供更多上下文和示例来提高响应质量。第四,该格式是自文档化的——标题行清楚地定义了模式,使人类和LLM都更容易理解数据结构。第五,TOON对于需要处理多条记录的批量操作特别有效,因为Token节省会随着每增加一行而累积。最后,TOON保持完整的数据保真度——您可以无损地转换回JSON,使其成为无损优化技术。

TOON格式是如何工作的?

TOON通过将重复的JSON结构转换为更高效的表格表示来工作。关键洞察是,当您有一个具有相同属性的对象数组时,JSON会为每个对象重复所有属性名。TOON通过在标题行中声明一次模式来消除这种冗余,然后将每个对象表示为简单的逗号分隔值行。该格式使用特定语法:标题行包含数组名称、计数和花括号中的字段名,后跟冒号。每个后续行包含一个对象的值,用逗号分隔。对于嵌套对象和数组,TOON使用缩进和相同原则的递归应用。特殊值如null、true、false和包含特殊字符的字符串按照TOON规范处理。该格式还支持混合类型数组、嵌套结构和可选字段,使其足够灵活以表示任何JSON数据,同时保持其紧凑特性。

// JSON (89 characters)
[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]

// TOON (42 characters, 53% smaller)
[2](id,name):
  1,Alice
  2,Bob

TOON和JSON之间的主要区别是什么?

虽然TOON和JSON都是数据序列化格式,但它们在方法和用例上有根本区别。JSON使用冗长的键值对语法,其中每个对象都明确命名其所有属性,这使得对于相似对象的数组高度冗余。TOON使用模式优先的方法,属性名在标题中声明一次,后续行只包含值。JSON在所有编程语言和平台上都得到普遍支持,具有内置解析器。TOON较新,需要特定库进行编码和解码,尽管TypeScript、Python、Go、Rust和许多其他语言都有实现。JSON适用于配置文件、单个对象和人类频繁编辑的场景。TOON擅长表示结构化数据集合、API响应以及相同模式重复多次的任何场景。JSON大量使用花括号和方括号,消耗更多Token。TOON使用最少的语法,包括冒号、逗号和缩进,从而显著节省Token。两种格式可以完全保真地表示相同的数据——您可以在它们之间转换而不丢失任何信息。

使用TOON可以期望节省多少Token?

使用TOON的Token节省因数据结构而异,但对于具有重复模式的结构化数据,典型节省范围为30%到60%。当您有许多共享相同属性的对象数组时,节省最为显著。例如,一个包含100个用户对象的JSON数组,具有id、name、email和role等属性,会重复这四个属性名100次。在TOON中,这些名称只在标题中出现一次,立即节省了396次属性名重复。真实世界的基准测试显示了令人印象深刻的结果:GitHub仓库数据集(100项)显示47%的Token减少;用户配置文件数据集显示52%的减少;API响应数据通常显示35-55%的减少。节省随着数据增长而累积——数组中的对象越多,节省的百分比越大。对于单个对象或没有重复模式的高度嵌套数据,节省较为温和(10-20%),但当您按Token付费时仍然有意义。值得注意的是,节省不仅适用于您的输入Token,还适用于LLM需要在其响应中输出或引用此数据时。

TOON格式的基本语法是什么?

TOON语法设计为最小化但富有表现力。基本构建块是: 1)简单的键值对写成'key: value'在单独的行上,类似于YAML。 2)对象数组使用标题表示法:'arrayName[count](field1,field2,field3):'后跟数据行,每行包含与标题字段对应的逗号分隔值。 3)嵌套对象用缩进表示,子属性缩进在其父级下方。 4)包含逗号、换行符或特殊字符的字符串值需要加引号。 5)Null值表示为空(只有逗号没有值)。 6)布尔值写成'true'或'false'不加引号。 7)数字直接写不加引号。 8)原始类型数组使用方括号表示法。 该格式支持制表符和逗号分隔符,制表符在某些分词器中提供更好的Token效率。注释不是官方规范的一部分,但某些实现支持它们。

// Array with schema header
products[3](id,name,price):
  1,Widget,9.99
  2,Gadget,19.99
  3,Gizmo,29.99

// Nested object
user:
  name: John Doe
  age: 30
  address:{city: New York, zip: 10001}

TOON支持哪些数据类型?

TOON支持与JSON相同的所有数据类型,确保转换期间的完整数据保真度。字符串表示为文本,仅当字符串包含特殊字符(如逗号、换行符或前导/尾随空格)时才需要引号。数字包括整数和浮点值,以标准十进制表示法表示。布尔值写成字面量'true'或'false'不加引号。Null值在表格格式中表示为空(逗号之间的空位置)或在键值上下文中表示为字面量'null'。对象可以嵌套到任意深度,子属性缩进在其父级下方。数组可以包含任何类型,包括混合类型、原始类型或嵌套对象。TOON还处理特殊数值并保持大数的精度。该格式在往返转换期间保留原始JSON类型,这意味着您可以将JSON转换为TOON再转回JSON而不会丢失任何数据或类型更改。

如何在ChatGPT、Claude和其他LLM中使用TOON格式?

在LLM中使用TOON非常简单,遵循'展示而非告诉'的方法。最有效的方法是使用'toon'语言标识符将TOON数据包装在代码块中。这有助于LLM识别格式并正确解析。当要求LLM以TOON格式输出数据时,在提示中提供预期结构的示例。LLM是模式匹配系统,会自然地遵循您演示的格式。 为获得最佳结果: 1)包含一个简短的标题,解释数据是TOON格式以提高Token效率。 2)使用代码块清楚地界定TOON内容。 3)当期望TOON输出时,显示您希望LLM使用的标题模板。 4)对于复杂的嵌套结构,考虑首先提供一个小示例。 5)您可以要求LLM验证TOON语法或在格式之间转换。 大多数现代LLM,包括GPT-4、Claude 3和Gemini,在看到示例后都能理解和生成TOON格式,即使没有对该格式进行明确训练。

// LLM Prompt Example:
Here is user data in TOON format:

users[3](id,name,email):
  1,Alice,[email protected]
  2,Bob,[email protected]
  3,Charlie,[email protected]

Please analyze this data and respond in the same TOON format.

哪些编程语言支持TOON?

TOON在许多编程语言中都有越来越多的支持,有官方和社区实现可用。官方TypeScript/JavaScript实现(npm上的toon-format/toon)是参考实现,提供编码、解码和流式API。Python开发者可以使用PyPI上的toon_format包。Rust有用于高性能应用的toon_format crate。Go开发者有用于后端服务的toon-go。Java有用于企业应用的JToon。Swift有用于iOS/macOS开发的toon-swift。.NET开发者可以使用用于C#应用的toon_format。社区实现将支持扩展到更多语言,包括PHP(toon-php)、Ruby(toon-ruby)、Kotlin(ktoon)、Scala(toon4s)、Elixir(toon_ex)、Clojure、Crystal、OCaml、Perl、R,甚至用于Salesforce开发的Apex。大多数实现遵循官方TOON规范以确保兼容性。编辑器支持包括VS Code扩展用于语法高亮和验证、Tree-sitter语法用于Neovim和其他编辑器,以及用于实验的在线playground。

什么时候应该使用TOON,什么时候应该坚持使用JSON?

TOON适用于特定场景,而JSON在其他场景中仍然更好。 在以下情况使用TOON: 1)您正在向LLM发送结构化数据并希望减少Token成本。 2)您有具有一致模式的对象数组(数据库记录、API响应、日志条目)。 3)您正在接近上下文窗口限制并需要容纳更多数据。 4)您正在使用LLM进行批处理,Token节省会累积。 5)您正在构建AI应用程序,其中API成本是重要考虑因素。 6)您需要在提示中包含大型数据集同时保持可读性。 在以下情况坚持使用JSON: 1)您正在处理人类频繁编辑的配置文件。 2)您有单个对象或高度不规则的嵌套结构。 3)您需要与现有工具和系统的最大兼容性。 4)您不使用LLM或Token成本不是问题。 5)您的数据几乎没有重复模式,TOON的好处很小。 6)您需要使用JSON Schema验证或其他JSON特定工具。 好消息是格式之间的转换是无损的,因此您可以在内部使用JSON,仅在发送到LLM时转换为TOON。

TOON格式有哪些限制?

虽然TOON提供显著的好处,但了解其限制很重要。首先,TOON针对具有一致模式的对象数组进行了优化——对于单个对象或高度不规则的结构,Token节省很小。其次,TOON需要编码和解码步骤,与原生JSON解析相比增加了轻微的处理开销。第三,该格式较新,支持不如JSON广泛,这意味着您需要特定的库,并且可能面临与某些工具的兼容性挑战。第四,调试可能稍微困难,因为大多数开发者工具期望JSON格式。第五,官方规范不支持注释,尽管某些实现添加了此功能。第六,对于非常小的数据集(少于3-4个对象),标题开销实际上可能导致比JSON更多的Token。第七,流式处理大型TOON文件需要特殊处理以维护模式上下文。第八,并非所有LLM在解析TOON方面都同样熟练,尽管GPT-4和Claude等主要模型处理得很好。尽管有这些限制,TOON仍然是其预期用例的绝佳选择:在向LLM发送结构化数据时减少Token消耗。

在LLM中使用TOON的最佳实践是什么?

为了在使用LLM时最大化TOON的好处,请遵循以下最佳实践: 1)在转换为TOON之前始终验证您的JSON以避免编码错误。 2)使用带有'toon'语言标识符的代码块帮助LLM识别格式。 3)对于复杂模式,在系统提示中提供一个小示例来引导模型。 4)当期望TOON输出时,包含您希望LLM遵循的标题模板。 5)考虑使用制表符分隔符而不是逗号,以在某些分词器中获得更好的Token效率。 6)使用JSON和TOON测试您的提示,以测量特定用例的实际Token节省。 7)手边保留TOON规范以处理特殊字符和嵌套结构等边缘情况。 8)对大型数据集使用流式API以有效管理内存。 9)尽可能缓存转换后的TOON数据以避免重复编码。 10)监控采用TOON前后的Token使用情况以量化节省。 11)考虑混合方法,对数据密集型部分使用TOON,对较小、更复杂的结构使用JSON。 12)随着TOON规范随社区反馈不断发展,保持更新。