用大模型时,"token不够用、成本太高"是很多开发者的痛点------传统的JSON格式数据传给大模型时,冗余符号多、token消耗大。而TOON格式+Next.js的组合,能轻松解决这个问题,既大幅减少token使用量,又不影响数据传递和解析,新手也能快速上手。
一、先搞懂:为什么需要TOON?
大模型的收费、上下文窗口限制都和"token数量"直接挂钩。我们常用的JSON格式虽然通用,但太"啰嗦"------大括号、引号、逗号一大堆,这些都会占用大量token,比如传递两条用户数据,JSON要写一堆重复结构:
json
{
"users": [
{ "id": 1, "name": "Alice", "role": "admin" },
{ "id": 2, "name": "Bob", "role": "user" }
]
}
而TOON(Token-Oriented Object Notation)是专门为大模型输入设计的紧凑格式,核心就是"删冗余、省token"。它借鉴了YAML的缩进结构和CSV的表格形式,同样的内容,TOON写法更简洁,token直接少一半:
toon
users[2]{id,name,role}:
1,Alice,admin
2,Bob,user
简单说,TOON就像"数据压缩翻译官"------程序里仍用JSON处理数据,传给大模型前转成TOON,既不影响开发,又能省成本。
二、TOON的核心优势:不止省token
- token省得多:比JSON少30%-60%的token,大型数据集(比如电商订单、用户列表)节省效果更明显,直接降低大模型调用成本。
- 大模型好理解:明确标注数组长度(比如[2]代表2条数据)和字段名,大模型能快速识别结构,减少解析错误,甚至检索准确率比JSON还高。
- 用法超简单:不用学复杂语法,去掉了JSON里多余的括号、引号,用缩进和逗号(或制表符)分隔,人类和机器都能看懂。
- 兼容现有工具:能和JSON自由互转,支持命令行(CLI)操作,轻松集成到现有项目里。
三、TOON + Next.js:手把手落地步骤
Next.js是常用的React框架,用来搭建前后端项目很方便。把TOON集成进去,只需3步,就能实现"传数据给大模型时自动省token"。
1. 安装TOON依赖
首先在Next.js项目根目录,用npm、pnpm或yarn安装TOON包:
bash
# npm
npm install @toon-format/toon
# pnpm
pnpm add @toon-format/toon
# yarn
yarn add @toon-format/toon
如果需要用命令行转换JSON和TOON,还可以安装CLI工具(可选):
bash
npx @toon-format/cli --help
2. 在Next.js中编码/解码TOON
核心逻辑很简单:后端处理数据时用JSON,传给大模型前用encode转成TOON;如果大模型返回TOON格式,用decode转回JSON即可。
示例1:API路由中转换数据(常用场景)
在Next.js的app/api/llm-data/route.js(App Router)中,写一个接口,把JSON数据转成TOON传给大模型:
javascript
import { encode } from '@toon-format/toon';
import OpenAI from 'openai'; // 以OpenAI为例,其他大模型同理
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
export async function POST(request) {
// 1. 接收前端传来的JSON数据(比如用户列表)
const { users } = await request.json();
// 2. 把JSON转成TOON(自动省token)
const toonData = encode({ users });
console.log('TOON格式数据:', toonData);
// 输出结果:
// users[2]{id,name,role}:
// 1,Alice,admin
// 2,Bob,user
// 3. 把TOON传给大模型(用代码块包裹,方便模型识别)
const prompt = `分析以下用户数据,返回角色为"user"的信息,格式保持TOON:
\`\`\`toon
${toonData}
\`\`\`
`;
// 4. 调用大模型并获取结果
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: prompt }],
});
// 5. (可选)如果大模型返回TOON,转成JSON给前端
const llmToonOutput = response.choices[0].message.content.match(/```toon([\s\S]+?)```/)[1].trim();
const resultJson = decode(llmToonOutput);
return Response.json({ result: resultJson });
}
示例2:前端直接转换(少用,建议后端处理)
如果需要在前端转换(比如静态数据),也可以直接调用encode:
javascript
// app/page.js
import { encode } from '@toon-format/toon';
export default function Home() {
const userData = {
users: [
{ id: 1, name: 'Alice', role: 'admin' },
{ id: 2, name: 'Bob', role: 'user' }
]
};
// 转成TOON
const toonStr = encode(userData);
return (
<div>
<h1>TOON格式数据</h1>
<pre>{toonStr}</pre>
</div>
);
}
3. 进阶技巧:用CLI批量转换数据
如果有大量JSON文件(比如数据集),可以用TOON的CLI工具批量转成TOON,再导入Next.js项目,节省开发时间:
bash
# 把JSON文件转成TOON,保存到output.toon
npx @toon-format/cli ./data/users.json -o ./data/users.toon
# 查看转换后的token节省情况(关键!)
npx @toon-format/cli ./data/users.json --stats
四、实际效果:到底能省多少?
根据官方基准测试,TOON在常见场景下的表现很能打:
- 电商订单数据:比JSON省35%以上token,比XML省38%以上;
- 日常分析数据:比JSON省58%以上token,比XML省65%以上;
- 大模型检索准确率:平均比JSON高5%左右,比如GPT-5中TOON准确率96.1%,JSON仅86.4%。
简单说:用TOON后,同样的预算能传更多数据给大模型,同样的上下文窗口能塞下更复杂的内容,还不影响结果准确性。
五、注意事项:别用错场景
TOON不是"万能的",要注意适用范围:
- 适合场景:结构统一的数组对象(比如用户列表、订单数据、表格数据),这是它最擅长的;
- 不适合场景:深度嵌套、结构混乱的数据(比如不规则的JSON),这时JSON反而更高效;
- 仅用于大模型输入:TOON是为大模型设计的,不建议用在API接口、数据库存储等场景,这些地方还是用JSON。
六、总结
TOON + Next.js的组合,本质是"用简单的格式转换,解决大模型的token浪费问题"。不用重构现有项目,只需加几步转换代码,就能大幅降低大模型调用成本,还能提升数据解析效率,尤其适合需要频繁给大模型传结构化数据的Next.js项目。