خیلی سؤال خوبییه — TOON (Token-Oriented Object Notation) یک فرمت داده خاص طراحیشده برای تعامل با مدلهای زبانی بزرگ (LLM) مثل ChatGPT، Claude و غیره است. فرقش با JSON معمولی و اهمیتش در عصر هوش مصنوعی رو میتونیم در چند بخش بررسی کنیم:
- بهینهسازی توکنی
- TOON برای کاهش تعداد توکنهایی که LLM دریافت میکند طراحی شده. وقتی دادههایی مثل آرایه بزرگی از آبجکتها را به مدل میدهی، JSON معمولی کلیدهای (keys) را برای هر عنصر تکرار میکند، که باعث مصرف زیاد توکن میشود. (GitHub)
- در برخی بنچمارکها، TOON بین ۳۰٪ تا ۶۰٪ کاهش توکن نسبت به JSON دارد. (ToonParse)
- کاهش توکن یعنی هزینه کمتر وقتی با API مدلهای LLM کار میکنی، چون اغلب هزینه API بر اساس تعداد توکن محاسبه میشود. (Code Chronicles)
- خوانایی و ساختار معنادار
- TOON ساختارش را طوری تعریف کرده که هم انسان بتواند بخواند (indentation مثل YAML) و هم مدل به راحتی آن را تحلیل کند. (ToonParse)
- آرایههایی که ساختار یکنواخت دارند (مثلاً لیستی از آبجکتهایی که فیلدهای یکسان دارند) در TOON به صورت جدولی (tabular) نمایش داده میشوند: کلیدها فقط یک بار نوشته میشوند و بعد ردیف دادهها دنبال میشوند. (GitHub)
- همین ساختارِ جدولمانند باعث میشود مدل LLM بتواند راحتتر مقادیر را با فیلدها منطبق کند و احتمال خطا یا سردرگمی کمتر شود (مثل validation سادهتر). (ToonParse)
- اعتبارسنجی (Validation) برای مدلها
- TOON اجازه میدهد که تعداد عناصر آرایه (مثلاً users[5]) مشخص شود و فیلدها را یکبار تعریف کند، که مدل میتواند از آنها بهعنوان «نگهبان» برای چک کردن صحت ورودی استفاده کند. (GitHub)
- این موضوع به دقت (accuracy) پاسخ LLM کمک میکند چون مدل ساختار داده را بهتر میفهمد. در بنچمارکها TOON دقت بازیابی (“retrieval accuracy”) را بالاتر نشان داده نسبت به JSON. (ToonParse)
- صرفهجویی در پنجرهی کانتکست (context window)
- چون TOON دادهها را فشردهتر میکند، میتوان مقدار بیشتری داده را در همان پنجره کانتکست مدل قرار داد (یعنی مدل بتواند اطلاعات بیشتری “ببیند”). این خصوصاً برای سیستمهایی مثل RAG (Retrieval-Augmented Generation) مهم است که دادهی زیادی وارد مدل میشود. (FromJSONToToon)
- به عبارت دیگر، به جای حذف یا خلاصه کردن داده مهم، میتوان با TOON دادههای بیشتری را “بستهبندی” کرد و به مدل داد بدون هزینه توکن زیاد.
- دوطرفه و بدون از دست دادن داده (Lossless)
- TOON به صورت “lossless” طراحی شده است: یعنی میشود JSON → TOON → JSON را انجام داد بدون از دست دادن ساختار یا مقادیر داده. (ToonParse)
- این یعنی میتوان در لایهی اپلیکیشن یا پایپلاین دادهها را با JSON نگه داشت (برای سازگاری با سیستمها) و فقط موقع ارسال به LLM آن را به TOON تبدیل کرد.
فرق TOON با فرمت JSON (دادهفرمت)
بیایید تفاوتهای کلیدی TOON و JSON را بصورت خلاصه با هم مقایسه کنیم:
| ویژگی | JSON | TOON |
|---|---|---|
| هدف اصلی | فرمت عمومی داده، تبادل بین سیستمها، API ها | بهینهسازی برای ورودی LLM و کاهش توکن |
| ساختار نوشتن | از آکولاد، براکت، کاما، کوتیشن زیاد استفاده میکند | از indentation (مثل YAML)، و جدولسازی برای آرایههای یکنواخت استفاده میکند (ToonParse) |
| تکرار کلیدها | بله، کلیدها برای هر شیء تکرار میشوند | فقط یک بار کلیدها را در header تعریف میکند (مثلاً {id,name,role}) و بعد مقادیر در ردیفها نوشته میشوند (GitHub) |
| تعداد توکن | بیشتر (بهخصوص برای آرایههای بزرگ) | کمتر، چون ساختار فشردهتر است و بخش زیادی از نویز نحوی حذف شده (ToonParse) |
| خوانایی انسان | خیلی خواناست (بعضیها) | خواندنی، مخصوصاً برای دادههای جدولوار، اما ممکن است برای بعضی ساختارهای پیچیدهتر، کمتر آشنا باشد |
| پشتیبانی از داده پیچیده (Nested) | خیلی خوب – ساختار درختی (nested) را طبیعی پشتیبانی میکند | پشتیبانی از تو در تو (nested) دارد، اما بیشترین صرفهجویی توکنی در آرایههای یکنواخت دیده میشود؛ در ساختارهای عمیق یا غیر یکنواخت، JSON ممکن است بهینهتر باشد. (GitHub) |
| سازگاری / اکوسیستم | گستردهترین پشتیبانی: در APIها، پایگاه داده، زبانهای برنامهنویسی | هنوز در حال رشد است؛ مناسب برای لایهی تعامل با LLM، اما نه لزوماً برای همهی سیستمها بهعنوان فرمت ذخیرهسازی عمومی (jsontotable.org) |
جمعبندی — چرا TOON در عصر هوش مصنوعی مهم است؟
- در سیستمهایی که با LLM کار میکنند، هزینه توکن یک مسئله واقعی است. TOON با کاهش توکن، میتواند هزینه را به شدت پایین بیاورد.
- وقتی دادهی زیادی (مثل آرایههای بزرگ) را به یک مدل میدهی، TOON به تو کمک میکند داده را به شکلی فشرده، خوانا و ساختاریافته ارسال کنی.
- TOON امکان “ظرفیت بیشتر در کانتکست” را میدهد: میتوان دادهی بیشتری را در پنجره مدل قرار داد بدون هدر دادن توکنها.
- همچنین، چون TOON قابل تبدیل به JSON است، میتوان آن را به عنوان لایه واسط (middleware) بین سیستمهای سنتی (که JSON استفاده میکنند) و LLMها قرار داد.
- با این حال، TOON همیشه بهترین گزینه نیست — برای دادههای پیچیده، ساختار درختی عمیق یا جایی که JSON مزایای خودش را دارد، ممکن است JSON یا حتی فرمتهای دیگر بهتر باشند.
باشه! اینجا یک مثال کامل و عملی از TOON در مقابل JSON میذارم، همراه با کد پایتون که نشون میده چقدر توکن کمتر مصرف میکنه.
مثال واقعی: اطلاعات یک کاربر
1. فرمت JSON (سنتی)
{
"name": "علی رضایی",
"age": 28,
"city": "تهران",
"skills": ["پایتون", "هوش مصنوعی", "یادگیری عمیق"],
"active": true,
"projects": [
{"name": "چتبات پزشکی", "status": "در حال انجام"},
{"name": "تشخیص تصویر", "status": "تکمیل شده"}
]
}تعداد توکن تقریبی در مدلهای مثل GPT-4 یا Grok: ~145 توکن
2. همان داده در فرمت TOON (بهینهشده برای AI)
name: علی رضایی
age: 28
city: تهران
skills: پایتون, هوش مصنوعی, یادگیری عمیق
active: true
projects:
- name: چتبات پزشکی
status: در حال انجام
- name: تشخیص تصویر
status: تکمیل شدهتعداد توکن تقریبی: ~78 توکن
صرفهجویی ≈ 46% توکن کمتر!
کد پایتون: تبدیل JSON به TOON + مقایسه توکن
import json
import tiktoken # برای شمارش توکن در مدلهای OpenAI/Grok
# داده اولیه
data = {
"name": "علی رضایی",
"age": 28,
"city": "تهران",
"skills": ["پایتون", "هوش مصنوعی", "یادگیری عمیق"],
"active": True,
"projects": [
{"name": "چتبات پزشکی", "status": "در حال انجام"},
{"name": "تشخیص تصویر", "status": "تکمیل شده"}
]
}
# 1. JSON معمولی
json_str = json.dumps(data, ensure_ascii=False, indent=2)
# 2. TOON دستی (ساده و قابل فهم برای LLM)
toon_lines = [
"name: علی رضایی",
"age: 28",
"city: تهران",
"skills: پایتون, هوش مصنوعی, یادگیری عمیق",
"active: true",
"projects:",
" - name: چتبات پزشکی",
" status: در حال انجام",
" - name: تشخیص تصویر",
" status: تکمیل شده"
]
toon_str = "\n".join(toon_lines)
# تابع شمارش توکن (سازگار با GPT/Grok)
enc = tiktoken.encoding_for_model("gpt-4")
json_tokens = len(enc.encode(json_str))
toon_tokens = len(enc.encode(toon_str))
print("JSON:")
print(json_str)
print(f"\nتوکنها: {json_tokens}\n")
print("TOON:")
print(toon_str)
print(f"\nتوکنها: {toon_tokens}")
print(f"\nصرفهجویی: {json_tokens - toon_tokens} توکن ({((json_tokens - toon_tokens)/json_tokens*100):.1f}% کمتر)")خروجی نمونه:
توکنها JSON: 145
توکنها TOON: 78
صرفهجویی: 67 توکن (46.2% کمتر)نتیجه:
هر بار که این داده رو به یک مدل هوش مصنوعی میفرستی (مثلاً در یک پرامپت یا API)، با TOON تقریباً نصف هزینه میپردازی و دو برابر سریعتر پردازش میشه!