چیت‌شیت

هزینه، کش‌کردن و Batch APIهای LLM

LLM Cost, Caching and Batch APIs

قیمت‌گذاری هر فراخوانی، کش پیشوندها و معانی، دسته‌ای کردن کارهای آفلاین و محدودسازی سقف هزینه. پایتون و راست از درس‌ها.

  • ۱۳ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. وظایف
  2. کش کردن پیشوند ثابت
  3. اعدادی که اهمیت دارند
  4. محافظ‌های بودجه به ترتیب اجرا
  5. دو لایه کش
  6. کش کردن پرامپت در ارائه‌دهندگان مختلف
  7. مقادیر پیش‌فرض در کد
  8. ارسال یک دسته (batch)
  9. عیب‌یابی
  10. اجرای کد
  11. دفاتر کل پروژه
  12. پرسش و پاسخ
  13. نکات کاربردی

وظایف

کار و کد
وظیفهکد
محاسبه هزینه یک فراخوانیcalculate_cost(model, input_tokens, output_tokens, cached_input_tokens=0)
علامت‌گذاری یک بلوک قابل‌کش"cache_control": {"type": "ephemeral"}
نگه‌داشتن بلوک برای یک ساعت"cache_control": {"type": "ephemeral", "ttl": "1h"}
خواندن اصابت‌های کش Anthropicresponse.usage.cache_read_input_tokens
خواندن اصابت‌های کش OpenAIresp.usage.prompt_tokens_details.cached_tokens
ساخت یک کش Geminiclient.caches.create(model=<model>, config=...)
استفاده از کش Geminiconfig=types.GenerateContentConfig(cached_content=cache.name)
مسیریابی یک کوئری به ارزان‌ترین مدلroute_model(query, tier="pro")

کش کردن پیشوند ثابت

کد
python
SYSTEM = [{
    "type": "text",
    "text": RUBRIC,                                # متن ثابت در ابتدا
    "cache_control": {"type": "ephemeral"},        # مدت اعتبار 5 دقیقه (TTL)
}]
response = client.messages.create(
    model="<model>", max_tokens=1024,
    system=SYSTEM,
    messages=[{"role": "user", "content": code}],  # متن متغیر در انتها
)
response.usage.cache_creation_input_tokens         # هزینه با ضریب 1.25 برابر
response.usage.cache_read_input_tokens             # هزینه با ضریب 0.1 برابر

اعدادی که اهمیت دارند

مفهوم‌ها
نوشتن در کش
1.25 برابر قیمت پایه برای TTL پنج‌دقیقه‌ای؛ 2 برابر پایه برای TTL یک‌ساعته.
خواندن از کش
0.30 دلار به ازای هر میلیون در برابر 3.00 دلار به ازای هر میلیون حالت تازه؛ 10 برابر ارزان‌تر.
نقطه سر‌به‌سر
1 بار نوشتن و 1 بار خواندن برابر 0.675 برابر؛ 1 بار نوشتن و 10 بار خواندن برابر 0.205 برابر.
قاعده بازاستفاده
بلوکی را کش کنید که در طول TTL حداقل 3 بار خوانده می‌شود.
پردازش دسته‌ای (Batch)
50٪ تخفیف ورودی و خروجی؛ تضمین 24 ساعته، معمولاً 2 تا 6 ساعته.
دسته به‌همراه کش
حدود 10٪ از صورت‌حساب حالت همگام و بدون کش.
مسیریابی مدل
40 تا 70٪ صرفه‌جویی در هزینه مدل.
ترکیب تمام اهرم‌ها
حدود 5 تا 10٪ خط مبنای اولیه و خام.

محافظ‌های بودجه به ترتیب اجرا

گام‌به‌گام
  1. محدودیت نرخ درخواستبه ازای هر مستأجر در 2 تا 3 برابر اوج مورد انتظار؛ بازگرداندن 429 همراه با Retry-After.
  2. سقف هزینه روزانه1.5 تا 3 برابر سقف قرارداد؛ محدودتر کردن نرخ درخواست و ارسال هشدار.
  3. سوییچ قطع اضطراریامتیاز z-score هزینه بالای 4 نسبت به خط مبنای مستأجر؛ توقف خودکار و ارسال پیام به نوبت پاسخگویی (آنکال).
  4. 70٪ بودجهCostTracker یک هشدار اخطار ثبت می‌کند.
  5. 85٪ بودجهاعمال محدودیت (throttle)؛ مسیریابی صرفاً به مدل‌های ارزان‌تر.
  6. 95٪ بودجهتوقف کامل؛ ارائه پاسخ‌ها صرفاً از روی کش.

دو لایه کش

معماری
امبدینگاصابت (hit)عدم اصابت (miss)پیشوندمصرف (usage)کوئری کاربرکش معنایی لایه 1 (L1)امبدینگ، شباهت کسینوسی بالای 0.95کش پیشوند لایه 2 (L2)بازاستفاده از حافظه KV ارائه‌دهندهمدلهزینه کامل در صورت عدم اصابتپاسخ کش‌شدهبدون نیاز به فراخوانی LLMردیاب هزینه (Cost tracker)توکن‌ها، هزینه، user_id

کش کردن پرامپت در ارائه‌دهندگان مختلف

مقایسه
فاکتورAnthropicOpenAIGemini
سبک APIنشانگرهای cache_controlپیشوند خودکارAPI مربوط به CachedContent
قیمت اصابت90٪ تخفیف روی ورودی50٪ تخفیف روی ورودیحدود 25٪ حالت عادی
هزینه نوشتن25٪ هزینه اضافیرایگانهزینه ذخیره‌سازی به ازای هر توکن-ساعت
TTL پیش‌فرض5 دقیقه، با گزینه 1 ساعتهتا 1 ساعتتعریف‌شده توسط کاربر، 1 ساعت
حداقل طول پیشوند1,024 توکن، 2,048 توکن برای Haiku1,024 توکن4,096 توکن برای Flash، 32,768 توکن برای Pro
زمان استفادهپرامپت پایدار بالای 10 هزار، نوبت‌های گفت‌وگوی متعددمحیط Serverless، بدون زیرساخت سفارشیبازاستفاده چندروزه از یک پیکره متنی

مقادیر پیش‌فرض در کد

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیحات
similarity_threshold0.85SemanticCache. نسخه دمو از 0.75 استفاده می‌کند
ttl_seconds3600کش‌های دقیق و معنایی
max_size1000ExactCache. قدیمی‌ترین ورودی را حذف می‌کند
temperature0.0بالاتر از 0 کش دقیق نادیده گرفته می‌شود
monthly_budget1000.0مبنای هشدار CostTracker
spend_cap_multiplier2.0سقف برابر حاصل‌ضرب قرارداد در این مقدار است
kill_z_score4.0مستأجر فراتر از این مقدار متوقف می‌شود
Anthropic TTL5 min"ttl": "1h" برای یک ساعت

ارسال یک دسته (batch)

کد
python
requests.append({
    "custom_id": f"request-{i}",  # تطبیق نتایج با ورودی‌ها
    "method": "POST", "url": "/v1/chat/completions",
    "body": {"model": "<model>", "messages": [{"role": "user", "content": query}]},
})
batch_file = client.files.create(file=open("batch_input.jsonl", "rb"), purpose="batch")
batch = client.batches.create(
    input_file_id=batch_file.id,
    endpoint="/v1/chat/completions",
    completion_window="24h",      # 50٪ تخفیف، نتایج طی 24 ساعت
)

عیب‌یابی

عیب‌یابی
  • نرخ اصابت نزدیک به 7٪

    علت
    زمان یا شناسه درخواست در پیشوند آمده است
    راه‌حل
    متن پویا را بعد از مرز کش قرار دهید
  • فراخوانی‌های موازی: N بار نوشتن

    علت
    فراخوانی‌ها پیش از اولین نوشتن اجرا می‌شوند
    راه‌حل
    درخواست 1 را تنها بفرستید، سپس بقیه را ارسال کنید
  • cache_read_input_tokens صفر می‌ماند

    علت
    دریفت در کلیدهای کش رخ می‌دهد
    راه‌حل
    هر دو فیلد مصرف را در CI بررسی کنید
  • بلوک کش نمی‌شود

    علت
    کمتر از 1,024 توکن (2,048 برای Haiku)
    راه‌حل
    اندازه بلوک کش‌شده را بزرگ‌تر کنید
  • اصابت‌های OpenAI پس از استقرار متوقف می‌شوند

    علت
    تغییر ترتیب ابزارها یا فیلد جدید user
    راه‌حل
    ابزارها را با یک ترتیب پایدار سریال‌سازی کنید
  • cached exceeds input

    علت
    توکن‌های کش‌شده جداگانه و اضافه شمرده شده‌اند
    راه‌حل
    توکن‌های کش‌شده زیرمجموعه‌ای از ورودی هستند

اجرای کد

دستورها
دستورعملکرد
python main.pyاجرای شبیه‌ساز درس در code/
python3 scripts/project_test.py <project> --stage 1 --path <workspace>ارزیابی یک مرحله
python3 scripts/project_test.py <project> --all --solution --strictارزیابی راه‌حل مرجع
python3 <workspace>/usage.py <usage-file> --out usage-ledger.jsonبازپخش مصرف ثبت‌شده در یک دفتر کل
python3 cli.py samples/input.json --mode execute --output budget.jsonاجرای وظایف برنامه‌ریز بودجه

دفاتر کل پروژه

مفهوم‌ها
نرخ‌ها
نانودلار صحیح به ازای هر توکن؛ ورودی‌های مجموعه‌داده‌ی نمونه، نه قیمت‌های ارائه‌دهنده.
تخمین (estimate)
حاصل text.chars().count() تقسیم بر chars_per_token، گردشده به بالا؛ نسبت 0 خطاست.
هزینه (cost)
حاصل usage.input - usage.cached با نرخ ورودی، به‌علاوه مقادیر کش و خروجی؛ هرکدام با checked_mul.
رزرو (reserve)
اگر spent + sum(holds) + amount > limit باشد خطای budget exceeded می‌دهد.
تسویه (settle)
هزینه واقعی بیشتر از مقدار رزرو خطای actual cost exceeds reservation می‌دهد.
وضعیت‌ها
completed، rejected، needs_reconciliation.
اجرای نمونه
190 واحد در برابر محدودیت 100 واحدی؛ دو کار قبول می‌شوند؛ 95 واحد تسویه می‌شود.

پرسش و پاسخ

پرسش و پاسخ
کش پرامپت یا کش معنایی؟
کش پرامپت: توکن‌های یکسان؛ کش معنایی: مفهوم و معنای یکسان.
کدام آستانه معنایی؟
0.92 تا 0.95؛ در 0.85 پاسخ‌های نادرست دیده می‌شوند.
کدام متریک واحد؟
هزینه به ازای هر کوئری حل‌شده، نه دلار به ازای میلیون توکن.

نکات کاربردی

نکته‌ها
  • مقادیر user_id، task_id، route و tenant_id را روی تمام فراخوانی‌ها ثبت کنید.
  • تفکیک توکن‌ها: پرامپت، ابزار، حافظه، پاسخ.
  • استقرار را منوط به سهم خواندن از کش بالای 80٪ کنید.