تصور کنید یک پاسخ از مدل شما وضعیت «۲۰۰ OK» برمیگرداند، اما محتوای آن کاملاً اشتباه است یا هزینهای ۱۰ برابری دارد. این نقطه کورِ وضعیتهای استاندارد HTTP است که خطرناکترین شکستهای هوش مصنوعی در محیط عملیاتی را پنهان میکند. متریکهای سنتی بکاند نمیتوانند ظرافتهای رفتار مدلهای زبانی بزرگ (LLM) را ثبت کنند؛ خواه این رفتار به شکل یک تکمیل سریع اما توهمی (Hallucinated) باشد، یا پاسخی از یک مدل پیشرو (Frontier Model) که به دلیل دو بار تلاش مجدد، ۲ دلار هزینه داشته باشد.
به گزارش راهنمای فنی منتشر شده در ۶ جولای ۲۰۲۶ در پلتفرم dev.to، برای حل این مشکل باید یک پشتهٔ نظارتی (Observability Stack) مقاوم با استفاده از یک درگاه هوش مصنوعی (AI Gateway) ساخته شود. این سیستم بر پایه زبان Rust، فریمورک Axum و ابزار Prometheus بنا شده است تا دیدی جامع از جریان دادهها فراهم کند.
زمینه: شکاف نظارتی (The Observability Gap)
در دنیای خدمات سنتی، ما به چکلیستی از لاگها، متریکها، ردیابیها (Traces) و هشدارها اکتفا میکنیم. اپلیکیشنهای مبتنی بر مدل زبانی بزرگ (LLM) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب میدهد — به تمامی این موارد نیاز دارند، اما ابعادی را معرفی میکنند که در دنیای استاندارد «درخواست/پاسخ» وجود ندارد. بهطور مشخص، مهندسان باید مصرف توکن، جفتهای پرامپت/پاسخ و افت کیفیت (Quality Drift) را ردیابی کنند؛ مواردی که هیچکدام توسط کدهای وضعیت HTTP ثبت نمیشوند.
بسیاری از توسعهدهندگان با فراخوانیهای LLM به عنوان تک-درخواستها برخورد میکنند، اما در محیط عملیاتی، این فراخوانیها در واقع «زنجیرههایی» هستند. همانطور که در تحلیل قبلی ما دربارهی سادهسازی استقرار مدلهای محلی با PolyUI از طریق Tauri و Rust اشاره کردیم، این معماری تأکید میکند که واحد کار در اینجا یک توالی است: ساخت پرامپت، فراخوانهای ارائهدهنده، تلاشهای مجدد (Retries) و فراخوانی ابزارها (Tool Invocations). بدون دید granular (دانهریز) نسبت به این مراحل، تیمها تا لحظهای که سیستم بهطور کامل کرش کند، نسبت به افت کیفیت یا کندی ارائهدهنده بیخبر میمانند.
رکن اول: ردیابی دانهریز (Granular Tracing)
ردیابیهای استاندارد APM فقط تأخیر و کدهای وضعیت را میبینند. اما برای یک فراخوانی LLM، این تنها نیمی از تصویر است. یک پاسخ «۲۰۰ OK» میتواند نشاندهنده یک تکمیل ارزان ۴۰۰ توکنی از یک مدل سریع باشد، یا یک پاسخ ۲ دلاری از یک مدل پیشرو پس از دو بار تلاش مجدد، و یا حتی پاسخی که از نظر فنی موفق اما از نظر محتوایی توهمی است. هیچکدام از این تمایزها در یک هیستوگرام مدتزمان (Duration Histogram) ظاهر نمیشوند.
برای عیبیابی اپلیکیشنهای LLM در محیط عملیاتی، ردیابیها باید ویژگیهایی نظیر نام ارائهدهنده (مانند Anthropic، OpenAI یا Ollama)، تعداد توکنها و تاریخچهٔ تلاش مجدد را حمل کنند. یک ساختار حداقلی برای هر بازه (Span) باید شامل موارد زیر باشد:
- شناسههای
trace_idوspan_idوparent_span_idبرای حفظ سلسلهمراتب. - نام
providerوmodelبرای شناسایی منبع تولید پاسخ. prompt_tokensوcompletion_tokensبرای سنجش حجم مصرفی.latency_msوstatus(به عنوان مثال: Success, Retried, Failed, RateLimited).retry_countوfallback_from(که نشان میدهد سیستم از کدام ارائهدهنده به ارائهدهنده فعلی سوئیچ کرده است).
ادغام این دادهها در OpenTelemetry به مهندسان اجازه میدهد جریان درخواست را در ابزارهایی مثل Jaeger یا Tempo تجسم کنند. توسعهدهندگان میتوانند با استفاده از opentelemetry::trace::{Tracer, Span} ویژگیهای مربوط به ارائهدهندگان، مدلها و تعداد توکنها را تنظیم کنند. دو میدان retry_count و fallback_from برای پایداری عملیاتی حیاتی هستند؛ زیرا بدون آنها، یک ردیابی «موفق» این حقیقت را میپوشاند که ارائهدهنده اصلی در حال شکست است و منطق جایگزین (Fallback) در سکوت در حال جذب ضربه است.
رکن دوم: ردیابی هزینه در لحظه ثبت
تعداد توکنها برای تیمهای مالی بیمعنا است. مؤثرترین الگو این است که توکنها در همان لحظه ثبت (Write-time)، به دلار (USD) تبدیل شوند و بهعنوان یک متریک درجهیک در Prometheus نمایش داده شوند. این رویکرد در راستای مهار هزینههای پنهان در استنتاج مدلها است که نیازمند پایش دقیق در سطح توکن است. این کار مانع از آن میشود که بعداً بخواهیم با ضرب تعداد توکنها در جدول قیمتهای قدیمی که شاید یک بار دیده شده و فراموش شده باشد، هزینهها را بازسازی کنیم.
بهجای بازسازی هزینهها از یک جدول قیمت منسوخ، این سیستم از یک شمارنده (Counter) با نام LLM_COST_USD استفاده میکند که دارای برچسبهایی (Labels) برای ارائهدهنده، مدل و مسیر (Route) است. پیادهسازی آن با استفاده از prometheus::{register_counter_vec, CounterVec} برای ردیابی هزینههای تجمعی صورت میگیرد. بسیار مهم است که منطق pricing_for در یک فایل پیکربندی باشد و نه بهصورت سختافزاری (Hardcoded) در کد؛ زیرا قیمتهای ارائهدهندگان بهطور مکرر تغییر میکنند و نرخهای قدیمی، داشبوردهای مالی را به گمراهی میکشانند.
این ساختار اجازه میدهد یک پرسوجوی ساده در PromQL — مانند sum by (route) ( rate(llm_cost_usd_total[1h]) ) — دقیقاً مشخص کند کدام قابلیت (Feature) در هر ساعت چقدر بودجه میسوزاند. برای جلوگیری از هزینههای سرسامآور، راهنما استفاده از هشدارهای بودجهمحور را توصیه میکند. برای مثال، اگر نرخ هزینه برای ۱۰ دقیقه بهطور مستمر بالای ۵ دلار در ساعت برود (sum(rate(llm_cost_usd_total[15m])) * 3600 > 5)، سیستم باید فوراً سیگنالی از مصرف غیرعادی یا وجود یک حلقهٔ بینهایت (Infinite Loop) ارسال کند.
رکن سوم: حلقههای ارزیابی مستمر
متریکهای سنتی نمیتوانند تشخیص دهند که آیا یک پاسخ «غلط» است یا خیر؛ آنها فقط میفهمند که پاسخ سریع و ارزان بوده است. حلقههای ارزیابی (Eval Loops) این شکاف را با پیادهسازی بررسیهای مستمر روی ترافیک زنده تولید پر میکنند، بهجای آنکه صرفاً به بنچمارکهای آفلاین تکیه کنند.
این حلقهها از سه لایه اعتبارسنجی مشخص استفاده میکنند:
- رگرسیون مجموعه طلایی (Golden set regression): مجموعهای کوچک، نسخهبندی شده و استاندارد از جفتهای «پرامپت/پاسخ مورد انتظار» که قبل از هر تغییر در مدل یا ارائهدهنده، اجرا میشوند تا از پسرفت کیفیت اطمینان حاصل شود.
- امتیازدهی نمونهای تولید (Sampled production scoring): استفاده دورهای از یک مدل ارزانتر در نقش «داور» (Judge Model) برای امتیازدهی مجدد به ۱ تا ۲ درصد از پاسخهای واقعی و ردیابی این امتیاز به عنوان یک متریک در طول زمان.
- بررسیهای ساختاری (Structural checks): تستهای قطعی (Deterministic) و کمهزینه برای تأیید اینکه JSON بهدرستی پارس شده است، پاسخ خالی نیست و طول متن در محدوده مورد انتظار است (مثلاً تضمین اینکه پاسخ بین ۲۰ تا ۴۰۰۰ کاراکتر باشد).
این بررسیها از طریق یک ساختار (Struct) به نام EvalResult ردیابی میشوند که شامل trace_id، check_name (مانند json_valid یا length_bounds) و یک مقدار Boolean برای passed است. ارسال نرخ موفقیت این تستها به یک GaugeVec در Prometheus (با برچسب llm_eval_pass_rate) باعث میشود هرگونه تغییر در قالب پرامپت یا بهروزرسانیهای خاموش در سمت ارائهدهنده، بهجای تبدیل شدن به تیکت پشتیبانی پس از سه روز، فوراً بهعنوان یک افت (Dip) در داشبورد دیده شود.
تجمیع در داشبورد
برای تیمهایی که این سیستمها را مدیریت میکنند، یک داشبورد ایدهآل باید از سه ردیف تشکیل شده باشد:
- ردیف ردیابی (Tracing row): تأخیر (p50 و p95) به تفکیک ارائهدهنده، نرخ تلاش مجدد (Retry rate) و نرخ جایگزینی (Fallback rate).
- ردیف هزینه (Cost row): هزینه به تفکیک مسیر/مدل، نرخ سوخت بودجه ساعتی و وضعیت هشدارهای بودجه.
- ردیف کیفیت (Quality row): نرخ موفقیت بررسیهای ساختاری و روند تغییرات امتیاز مدل داور.
این تغییر رویکرد در نظارت، عملیات را از «عیبیابی واکنشی» به «پایش پیشدستانه» (Proactive Monitoring) تبدیل میکند. وقتی کیفیت را بهجای یک «حس» (Vibe)، به عنوان یک متریک ریاضی میبینیم، توسعهدهندگان میتوانند مدلها را جابهجا کرده یا پرامپتها را با اطمینان ریاضی از نتیجه، اصلاح کنند.
گام بعدی شما
- بررسی وضعیت
fallbackسیستمهای خود؛ آیا میدانید وقتی مدل اصلی شکست میخورد، سیستم شما بهطور خودکار به کدام مدل سوئیچ میکند و هزینه آن چقدر است؟ - پیادهسازی یک «مدل داور» ارزانقیمت برای امتیازدهی به نمونههای تصادفی از خروجیهای کاربر در محیط تولید جهت شناسایی افت کیفیت.
- انتقال جدول قیمت توکنها از Hard-code در کد به فایلهای پیکربندی (Config) برای بهروزرسانی سریع بدون نیاز به بازنشر (Redeploy) اپلیکیشن.
اما برای کنترل بیشتر تأخیر و هزینه، گام بعدی مهندسان باید بررسی استراتژیهای بهینهسازی استنتاج (Inference Optimization)، بهویژه استراتژیهای KV Cache و توازنهای کوانتش (Quantization Trade-offs) در لایه سرویسدهی مدل باشد؛ موضوعاتی که برای تیمهایی که زیرساختهای مقیاس هایپر-اسکیلر ندارند، حیاتی است.




گفتگو