انتخاب مدل، هزینه و تاخیر
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Compare model capability, context capacity, token pricing, latency, and tool support.
- Estimate per-request cost from input and output token counts.
- Select model tiers for routing, retrieval, generation, and evaluation tasks.
چرا انتخاب مدل مهم است؟
**هدف:** برای هر فراخوانی، بهترین توازن بین کیفیت، هزینه و سرعت را پیدا کنیم.
- Builds on ← **Language Model Inputs and Outputs:** هر درخواست، توکن ورودی و خروجی دارد.
- Builds on ← **Invoking Chat Models with LangChain:** مدل در زمان اجرای زنجیره قابل انتخاب است.
- معیارها: **capability**، **context capacity**، **token pricing**، **latency**، **tool support**
- **Where this leads → Context Window Management:** رشد تاریخچه را با توکن میسنجیم و بهموقع پیامها را کوتاه میکنیم.
**مثال تصمیم:** برای دستهبندی کوتاه با 300 توکن ورودی و 20 توکن خروجی، یک مدل اقتصادی میتواند کافی باشد؛ برای تولید پاسخ چندمرحلهای با 3000 توکن ورودی و 1000 توکن خروجی، مدل قویتر ممکن است ارزش هزینه بیشتر را داشته باشد.
```mermaid
flowchart LR
A["وظیفه"] --> B{"محدودیتها"}
B --> C["بودجه"]
B --> D["کیفیت"]
B --> E["سرعت"]
C --> F["انتخاب مدل"]
D --> F
E --> F
F --> G["فراخوانی در زمان اجرا"]
```
معیارهای مقایسه مدلها
**پنج معیار اصلی**
- **Capability:** دقت، استدلال، پیروی از دستور و تولید ساختاریافته
- **Context capacity:** بیشترین حجم ورودی قابل پردازش؛ ظرفیت بیشتر یعنی فضای بیشتر برای تاریخچه و اسناد
- **Token pricing:** هزینه جداگانه برای input و output
- **Latency:** زمان رسیدن پاسخ؛ معمولاً با میانگین یا صدک نودونهم اندازهگیری میشود
- **Tool support:** پشتیبانی از function calling، خروجی ساختاریافته و ابزارها
**اندازهگیری latency**
\[
t_{latency}=t_{end}-t_{start}
\]
**مثال کامل:** سه اجرای یک درخواست بهترتیب 0.8، 1.1 و 0.9 ثانیه طول کشیدهاند.
\[
\bar{t}=\frac{0.8+1.1+0.9}{3}
=\frac{2.8}{3}
=0.933\ldots\text{ s}\approx0.933\text{ s}
\]
**چرا؟** میانگین رفتار معمول را نشان میدهد؛ صدک نودونهم، کندی اجرای تقریباً بدترینِ معمول را آشکار میکند.
```mermaid
flowchart TD
S["شروع درخواست"] --> I["ارسال input"]
I --> W["انتظار پاسخ مدل"]
W --> O["دریافت کامل output"]
S -. "بازه اندازهگیری" .-> O
```
هزینه هر درخواست
**فرمول هزینه**
\[
C=T_{in}P_{in}+T_{out}P_{out}
\]
اگر قیمت بهازای یک میلیون توکن اعلام شود:
\[
C=\frac{T_{in}P_{in}+T_{out}P_{out}}{1{,}000{,}000}
\]
**مثال کامل** — قیمتها: \(P_{in}=\$2\)، \(P_{out}=\$8\) بهازای یک میلیون توکن
\[
T_{in}=12{,}000,\qquad T_{out}=1{,}500
\]
\[
C_{in}=\frac{12{,}000\times2}{1{,}000{,}000}
=\frac{24{,}000}{1{,}000{,}000}=\$0.024
\]
\[
C_{out}=\frac{1{,}500\times8}{1{,}000{,}000}
=\frac{12{,}000}{1{,}000{,}000}=\$0.012
\]
\[
C=\$0.024+\$0.012=\boxed{\$0.036}
\]
**بینش:** اگر تاریخچه، اسناد یا پاسخ را طولانیتر کنیم، همان بخشِ مربوط به توکنها افزایش مییابد؛ پس ورودی و خروجی را جداگانه حساب کن.
سه سناریوی محاسبه هزینه
**فرض:** قیمتها برحسب دلار بهازای یک میلیون توکن هستند.
**سناریو ۱ — routing ساده**
\[
T_{in}=800,\quad T_{out}=200,\quad P_{in}=0.50,\quad P_{out}=1.50
\]
\[
T_{in}P_{in}=800\times0.50=400
\]
\[
T_{out}P_{out}=200\times1.50=300
\]
\[
C=\frac{400+300}{1{,}000{,}000}
=\frac{700}{1{,}000{,}000}=\boxed{\$0.0007}
\]
**سناریو ۲ — retrieval با متن ورودی بزرگ**
\[
T_{in}=10{,}000,\quad T_{out}=500,\quad P_{in}=2,\quad P_{out}=8
\]
\[
T_{in}P_{in}=10{,}000\times2=20{,}000
\]
\[
T_{out}P_{out}=500\times8=4{,}000
\]
\[
C=\frac{20{,}000+4{,}000}{1{,}000{,}000}
=\frac{24{,}000}{1{,}000{,}000}=\boxed{\$0.024}
\]
**سناریو ۳ — grading دقیق**
\[
T_{in}=3{,}000,\quad T_{out}=700,\quad P_{in}=5,\quad P_{out}=15
\]
\[
T_{in}P_{in}=3{,}000\times5=15{,}000
\]
\[
T_{out}P_{out}=700\times15=10{,}500
\]
\[
C=\frac{15{,}000+10{,}500}{1{,}000{,}000}
=\frac{25{,}500}{1{,}000{,}000}=\boxed{\$0.0255}
\]
**مقایسه:** retrieval بهدلیل ورودی بزرگ هزینه بیشتری دارد؛ grading با وجود ورودی کوچکتر، بهدلیل قیمت بالاتر output گران است.
تطبیق مدل با وظیفه
**اصل تصمیم:** مدل قویتر همیشه مدل بهینه نیست.
```mermaid
flowchart TD
A["وظیفه"] --> B{"ریسک خطا و پیچیدگی"}
B -->|"کم"| C["budget_model"]
B -->|"متوسط"| D["standard_model"]
B -->|"زیاد"| E["premium_model"]
C --> F["هزینه و latency کمتر"]
D --> G["توازن"]
E --> H["capability بیشتر"]
```
| وظیفه | انتخاب معمول | دلیل |
|---|---|---|
| routing / دستهبندی ساده | budget | تصمیم کوتاه و کمریسک |
| retrieval و استخراج | standard یا budget | تمرکز بر تطبیق و استخراج |
| answer generation | standard؛ premium برای مسئله دشوار | کیفیت پاسخ و استدلال |
| grading / evaluation | premium یا standard قوی | قضاوت دقیق و سازگار |
**مثال runtime**
\[
\text{Context}(cost\_tier, environment)\rightarrow\text{model}\rightarrow\text{handler}
\]
اگر \(cost\_tier=\text{budget}\)، مسیر به \(budget\_model\) میرود؛ اگر \(cost\_tier=\text{premium}\)، به \(premium\_model\)؛ در غیر این صورت، \(standard\_model\) انتخاب میشود.
تصمیم نهایی و مسیر بعدی
**چکلیست انتخاب**
1. وظیفه و ریسک خطا را مشخص کن.
2. حداقل capability لازم را تعیین کن.
3. context capacity را با اندازه تاریخچه و اسناد مقایسه کن.
4. هزینه input و output را جدا حساب کن.
5. latency را با چند اجرای واقعی اندازه بگیر.
6. tool support و خروجی ساختاریافته را بررسی کن.
**یک تصمیم نمونه**
- routing: **budget_model**؛ ورودی کوتاه و خطای کمریسک
- retrieval: **standard_model**؛ تعادل هزینه و استخراج
- grading: **premium_model**؛ قضاوت دقیقتر ارزش هزینه را دارد
**Where this leads → Context Window Management**
اگر تاریخچه از 4,000 به 10,000 توکن برسد و خروجی ثابت بماند:
\[
\Delta T_{in}=10{,}000-4{,}000=6{,}000
\]
با قیمت ورودی \(P_{in}=\$2\) بهازای یک میلیون توکن:
\[
\Delta C=\frac{6{,}000\times2}{1{,}000{,}000}
=\frac{12{,}000}{1{,}000{,}000}=\boxed{\$0.012}
\]
پس تاریخچه بیشتر یعنی معمولاً هزینه و latency بیشتر؛ راهحل، اندازهگیری توکن و trimming با حفظ ترتیب پیامهای لازم است.
**نتیجه:** انتخاب خوب یعنی «کافی برای وظیفه»، نه «بیشترین capability».
بازگشت به دوره