العودة إلى المدونة

تحسين التكلفةدليل

عُدّ الرموز قبل إرسال الطلب: tiktoken في Python

قدّر عدد رموز الـ prompt دون اتصال باستخدام tiktoken، وتحقق منه مقابل نافذة السياق، وسعّره، وقارنه بحقل usage من الـ API.

بواسطة CheapTokens Teamنُشر في 4 دقيقة قراءة

طرفية تعرض pip install tiktoken وعدّ الرموز في سطر واحد
في هذه الصفحة
  1. خمسة أسطر لعدّ الرموز
  2. هل يتسع الـ prompt لنافذة السياق؟
  3. كم ستكلف؟
  4. قارن التقدير بالاستخدام

يمكنك عدّ رموز (tokens) أي prompt على جهازك قبل إرساله: ثبّت tiktoken، ورمّز النص، ثم خذ len() من النتيجة. إن tiktoken هو مُرمِّز OpenAI، لذا فإن الرقم بالنسبة لنماذج DeepSeek وGLM وMiniMax هو تقدير. يأتي الرقم الحقيقي في usage.prompt_tokens بعد أول استدعاء، ومقارنة الرقمين لا تحتاج إلا سطرًا إضافيًا واحدًا.

لماذا نتكبد العناء؟ لأن الفاتورة والأخطاء كلتيهما تبدأ من حجم المدخلات. ألصق عقدًا طويلًا في سكربت، ولن تكتشف أنه أكبر من اللازم إلا حين يردّ الـ API بخطأ 400. شغّل دفعة من خمسة آلاف بريد إلكتروني، ولن تعرف كم كلّفتك إلا حين ينخفض الرصيد. العدّ أولًا يحوّل هذين المفاجأتين إلى رقم يمكنك قراءته مسبقًا.

خمسة أسطر لعدّ الرموز#

يعرض tiktoken README (تم التحقق منه في 1 نوفمبر 2026) الفكرة كاملة: اختر ترميزًا، ورمّز النص، وطول القائمة هو عدد الرموز.

bash
pip install tiktoken
python
import tiktoken

enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens))  # how many tokens the text is
الأسطر الخمسة في ملف باسم estimate.py
العدّاد كاملًا: get_encoding، ثم encode، ثم len.

يعيد enc.decode(tokens) النص الأصلي، وهو فحص سريع مفيد للتأكد من أنك تنظر إلى النص نفسه الذي سيراه النموذج. يذكر الـ README أيضًا tiktoken.encoding_for_model('gpt-4o')، الذي يختار المُرمِّز لنموذج OpenAI محدد. وهنا التفصيل الجدير بالتذكر: المُرمِّزات تنتمي إلى عائلات النماذج. القاعدة التقريبية في الـ README هي نحو أربعة بايتات من النص لكل رمز، وهي تصف مُرمِّزات OpenAI فقط.

إذن ماذا تفعل مع نموذج DeepSeek؟ استخدم العدد نفسه كتقدير عملي، وعايره كما هو موضح أدناه.

خمّن الرقم

كم يبلغ عدد رموز نص إنجليزي من 2,000 حرف تقريبًا؟

إظهار الإجابة

الإجابة: 500

نحو 500. وفق القاعدة التقريبية في الـ README وهي أربعة بايتات لكل رمز، والنص الإنجليزي العادي نحو بايت واحد لكل حرف، فإن 2,000 ÷ 4 = 500. اللغات الأخرى والرموز التعبيرية (emoji) تستهلك بايتات أكثر لكل حرف، لذا تعني الأحرف الـ 2,000 نفسها عادةً رموزًا أكثر وفق هذه القاعدة.

هل يتسع الـ prompt لنافذة السياق؟#

لكل نموذج نافذة سياق، ويجب أن تتسع لها مدخلاتك مع الإجابة التي تسمح بها. نوافذ النماذج التي نقدمها: DeepSeek-V4-Flash بسعة 380K، وGLM-5.3-Flash بسعة 390K، وMiniMax-M2.7 بسعة 180K رمز. أطول إجابة هي 32,768 رمزًا لـ DeepSeek-V4-Flash و8,192 للآخرين (قائمة نماذج CheapTokens، 1 نوفمبر 2026).

فحص وقائي قبل الاستدعاء يتكون من أربعة أسطر:

python
CONTEXT = {
    'deepseek-ai/DeepSeek-V4-Flash-0731': 380_000,
    'zai-org/GLM-5.3-Flash': 390_000,
    'MiniMaxAI/MiniMax-M2.7': 180_000,
}

def fits(prompt_tokens, max_tokens, model):
    return prompt_tokens + max_tokens <= CONTEXT[model]

لنفترض أن لديك مستندًا من 250,000 رمز. إن fits(250_000, 8_192, 'MiniMaxAI/MiniMax-M2.7') تساوي False، لذا توجّه تلك المهمة إلى نموذج بنافذة أكبر أو تقسّم المستند، ولن يحدث خطأ 400 أبدًا. إن fits(250_000, 8_192, 'deepseek-ai/DeepSeek-V4-Flash-0731') تساوي True. وإذا أردت القصة الكاملة لشكل الخطأ، فإن request too long: 400 vs 413, context window and max_tokens يستعرضها بالتفصيل.

كم ستكلف؟#

الآن الميزانية. خذ عنصرًا نموذجيًا واحدًا، وعُدّه، ثم اضرب. لنفترض أنك تصنّف 5,000 بريد طلب. تعدّ بريدًا واحدًا ممثلًا فتحصل على نحو 800 رمز إدخال، وتحدّد التصنيف وسببًا قصيرًا بحد أقصى 200 رمز إخراج. الإجماليات: 5,000 × 800 = 4,000,000 رمز إدخال و5,000 × 200 = 1,000,000 رمز إخراج.

يسعّر الجدول أدناه هذا الحمل بالضبط بالأسعار الحية، مع احتساب الإدخال والإخراج معًا:

النموذج لكل طلب 5,000 طلبات OpenRouter، 5,000 طلبات
GLM-5.3-Flash $0.000024 $0.12 $0.217
DeepSeek-V4-Flash $0.000032 $0.16 $0.42
MiniMax-M2.7 $0.00007 $0.35 $4.20

800 رمز إدخال و200 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.

في الإجمالي، مع احتساب الإدخال والإخراج معًا، يكون عمود CheapTokens أرخص من OpenRouter لهذه النماذج. غيّر الأرقام الثلاثة إلى أعدادك الخاصة وستحصل على ميزانية قبل أول طلب. للفرق بين جانبي الفاتورة، راجع input vs output tokens: what an AI API bills you for، وللأمثلة المقاسة الفعلية راجع how many tokens an API request uses. الأسعار الحالية دائمًا على صفحة الأسعار.

مسار التقدير من النص إلى عدد الاستخدام الفعلي
قدّر محليًا، واحمِ النافذة، وأرسل، ثم قارن مع الاستخدام.

قارن التقدير بالاستخدام#

التقدير تخمين حول مُرمِّز شخص آخر، لذا تحقق منه مرة واحدة مقابل مفتاح الإجابة. كل استجابة تحمل حقل usage، وusage.prompt_tokens هو ما عدّه الـ API لمدخلاتك. ضع الرقمين جنبًا إلى جنب واقسم.

خطوة بخطوة

شغّل المقارنة

الإعداد

ثبّت الحزم وضع المفتاح في متغير بيئة. لا تلصقه في السكربت أبدًا.

bash
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'

شغّل السكربت

احفظ هذا باسم compare.py. يعدّ محليًا، ويرسل الطلب إلى https://api.cheaptokens.dev/v1، ويطبع الرقمين. معرّف النموذج هو المعرّف الكامل من قائمة نماذج CheapTokens، إذ لا تُقبل الأسماء المختصرة.

python
import os
import tiktoken
from openai import OpenAI

MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
enc = tiktoken.get_encoding('o200k_base')
messages = [{'role': 'user',
             'content': 'Classify this email as order, refund or other: Hi, my parcel from last Tuesday has not arrived yet.'}]

estimate = sum(len(enc.encode(m['content'])) for m in messages)

client = OpenAI(base_url='https://api.cheaptokens.dev/v1',
                api_key=os.environ['CHEAPTOKENS_API_KEY'])
r = client.chat.completions.create(model=MODEL, messages=messages, max_tokens=200)

real = r.usage.prompt_tokens
print(f'estimate {estimate}, usage.prompt_tokens {real}, ratio {real / estimate:.2f}')

اقرأ الفجوة

يطبع السطر الأخير ثلاثة أرقام. لنفترض أنه يعرض estimate 24, usage.prompt_tokens 31, ratio 1.29. عندئذٍ اضرب تقديراتك المستقبلية في النسبة قبل وضع الميزانية. يُغلَّف الـ prompt الحقيقي أيضًا بتنسيق المحادثة، لذا قد يخرج العدد الحقيقي أعلى قليلًا من تقدير النص العادي. شغّله على عدة prompts نموذجية، لا على واحد فقط، واستخدم متوسط النسبة.

منذ ذلك الحين يصبح الروتين: قدّر محليًا، واحمِ النافذة، وطبّق نسبتك على الميزانية، ودع usage في كل استجابة يبقيك على صواب. وإذا أردت أيضًا الإجمالي التراكمي على مهمة كاملة، فإن track AI agent token cost in Python يبني ذلك على الحقل نفسه. جديد على الاتصال نفسه؟ Your first API request with CheapTokens يغطيه، والتوثيق فيه الباقي.

طابق الأزواج

طابق كل اسم بما يخبرك به

  • len(enc.encode(text))تقديرك المحلي لحجم الإدخال
  • usage.prompt_tokensحجم الإدخال كما عدّه الـ API
  • usage.completion_tokensحجم الإجابة، مسعّر على جانب الإخراج
  • max_tokensالحد الأقصى لطول الإجابة الذي تحجزه في فحص النافذة

العدّ رخيص ومحلي ويستغرق ثوانٍ. افعله قبل الاستدعاء الذي يكلف مالًا.