حواجز تكلفة لـ آليّات الـ AI
مكتبة محاسبة صغيرة بترجع تكلفتها بثلاث أسابيع. Tokens، retries، وإنذار الـ budget.
جاري تحميل المقال…
مكتبة محاسبة صغيرة بترجع تكلفتها بثلاث أسابيع. Tokens، retries، وإنذار الـ budget.
جاري تحميل المقال…
نداء النموذج يكلّف سنتات. حلقة إعادة محاولة سيّئة تكلّف مئات الدولارات في عصر يوم واحد. أوّل فاتورة AI فاجأتنا تتبّعت إلى ميزة واحدة حيث، على مسار خطأ معيّن، أعاد الكود المحاولة حتّى ثلاثين مرّة قبل الاستسلام. الدالّة «عملت». الفاتورة لم.
هذا المقال عن مكتبة المحاسبة الصغيرة التي كتبناها استجابة، والتي دفعت ثمن نفسها أضعافاً.
غلاف حول كلّ نداء نموذج:
حوالي ٢٠٠ سطر كود إجمالاً. الشيء كلّه طبقة رقيقة بين «كودي» و «SDK النموذج». تبدو هكذا:
type Caller = { tenantId: string; feature: string };
interface ModelCall {
prompt: string;
model: 'cheap' | 'medium' | 'expensive';
maxOutputTokens: number;
}
class GuardedClient {
async call(caller: Caller, req: ModelCall): Promise<string> {
const inputTokens = await this.countTokens(req.prompt, req.model);
const projectedCost = this.priceOf(req.model, inputTokens, req.maxOutputTokens);
if (!await this.budget.canAfford(caller, projectedCost)) {
throw new BudgetExceeded(caller, projectedCost);
}
const start = Date.now();
const result = await this.upstream.complete(req);
const elapsed = Date.now() - start;
await this.budget.charge(caller, {
inputTokens,
outputTokens: result.usage.output_tokens,
cost: this.priceOf(req.model, inputTokens, result.usage.output_tokens),
elapsed,
feature: caller.feature,
});
return result.text;
}
}خمسة أشياء حاملة للثقل في تلك الأسطر القليلة.
كلفة النداء تقريباً input_tokens × input_price + output_tokens × output_price. يمكننا معرفة input_tokens بدقّة قبل الإرسال؛
علينا تخمين output_tokens، ولهذا maxOutputTokens معامل مطلوب.
الإسقاط هو «الإدخال + أقصى إخراج»؛ الرسم الفعليّ هو «الإدخال +
الإخراج الفعليّ».
canAfford يعيد false إن كان إنفاق المستأجر اليوميّ مع الكلفة
المُسقطة سيتجاوز السقف. نرمي، لا نُحذِّر. التحذيرات الليّنة تُتجاهل.
كلّ رسم مُسنَد لكليهما. هذا يدعنا نُجيب عن سؤالَين مختلفَين:
الكلفة-لكلّ-ميزة هي الأكثر إثارة للاهتمام. بعد ثلاثة أشهر اكتشفنا أنّ ميزة بالكاد مستخدمة كانت مسؤولة عن ٤٠٪ من الإنفاق، لأنّها شغّلت نموذجاً مسهباً على prompt من ٥٠ KB والمستخدم العاديّ نقر عليها مرّتين في الجلسة. أعدنا كتابتها بـ prompt أصغر ونموذج أرخص؛ انخفضت الكلفة-لكلّ-نداء ١٢×.
نسجّل الزمن المنقضي بجانب الكلفة. النداءات البطيئة ليست دائماً باهظة، لكنّ ميزة تستغرق دائماً ٩ ثوانٍ مشكلة UX حتّى لو لم تكلّف شيئاً.
الميزانيّة على المستأجر (الشركة)، لا المستخدم الفرديّ. هذا يطابق كيف تُدفَع الكلف. يتجنّب أيضاً الـ bug حيث مستخدم admin بصلاحيّات يحرق ميزانيّة-مستخدم زميل لم يوافق.
ثلاث فئات ميزانيّة، مُعلَنة لكلّ خطّة مستأجر:
| الخطّة | يوميّاً $ | شهريّاً $ | الإجراء عند التجاوز |
|---|---|---|---|
| مجّاني | ٠٫١٠ | ١٫٠٠ | احجب، اقترح ترقية |
| Pro | ٥٫٠٠ | ١٠٠ | احجب، نبّه admin المستأجر |
| Enterprise | حسب العقد | حسب العقد | سقف ليّن، نبّه الدعم |
اختياران غير بديهيَّين:
اعتبرنا «الفئة المجّانيّة لا تحصل على شيء». معادٍ. ميزانيّة الـ ١٠ سنتات اليوميّة تغطّي حوالي ٣٠ نداء نموذج رخيص، وهو كافٍ ليُقيّم المستخدم الميزة بدون أن نُموّل آلاف النداءات لكلّ مستخدم مجّانيّ.
السقف الصلب على Pro هو الافتراضيّ الصحيح؛ لـ Enterprise، حجب سير عملهم لأنّ admin لديهم نسي تحديث السقف عند تجديد العقد عمل سيّئ. سقف ليّن، تنبيه، محادثة.
لوحة معلومات صغيرة بخمس لوحات:
ثلاثة أشهر من التشغيل علّمتنا أنّ #٤ هي الأكثر فائدة. خطّ «زيادة كلفة لكلّ نداء ١٥٪» على ميزة هو مؤشّر سابق على أنّ شخصاً عدّل prompt أو رقّى نموذجاً دون قصد.
أشياء حقيقيّة من إنتاج حقيقيّ:
أنفقنا حوالي أسبوعاً على المكتبة. منعت على الأقلّ أربع حوادث كانت ستكلّف أكثر من ذلك الوقت الهندسيّ. سمحت لنا أيضاً بالبناء بثقة مع نداءات نموذج بطرق ما كنّا لنفعل بدونها. التأثير النفسيّ «نعرف ماذا يكلّف هذا» قيّم على الأقلّ بقدر التوفير بالدولار.
الجزء التالي من هذه السلسلة يلفّ مسار الـ AI. أو اقفز إلى مسار الأداء إن أردت شكلاً مختلفاً من المقال.