با تمرکز مدلهای زبانی بزرگ (LLMs) در برنامههای مدرن، اطمینان از قابلیت اطمینان، کارایی هزینه و عملکرد آنها حیاتی است. ابزارهای نظارتی سنتی اغلب در ردیابی جریانهای کاری پیچیده و غیرقطعی هوش مصنوعی مولد ناتواناند. اینجاست که OpenTelemetry (OTel) درخشش میکند و یک استاندارد یکپارچه و مستقل از فروشنده برای دادههای تلهمتری ارائه میدهد.
چالش ابزارکنویسی LLM
ابزارکنویسی LLMها تفاوت قابل توجهی با نظارت استاندارد API دارد. شما باید نه تنها تأخیر و کدهای وضعیت، بلکه قالبهای پرامپت، تعداد توکنها، نسخههای مدل و متادیتای پاسخ را ثبت کنید. بدون یک رویکرد استاندارد، شما خود را در قید SDK یک فروشنده خاص گرفتار میکنید و تغییر ارائهدهندگان یا تجمیع دادهها در چندین سرویس هوش مصنوعی را دشوار میسازید.
شروع با کتابخانههای LLM OpenTelemetry
کتابخانههای ابزارکنویسی LLM OpenTelemetry (بهطور خاص برای Python و Node.js) پیچیدگی ایجاد ردیابی برای ارائهدهندگان مختلف مدل را انتزاع میکنند. آنها بهطور خودکار اسپنهایی برای پرامپتها، تکمیلها و جاسازیها ایجاد میکنند و اطمینان حاصل میکنند که سازگاری حفظ شود، صرفنظر از اینکه از OpenAI، Anthropic یا یک نمونه محلی Ollama استفاده میکنید.
پیادهسازی عملی در Python
بیایید یک مثال عملی با استفاده از SDK پایتون بررسی کنیم. ابتدا، باید بستههای ضروری را نصب کنید:
pip install opentelemetry-api opentelemetry-sdk \
opentelemetry-exporter-otlp \
opentelemetry-instrumentation-llm
سپس، تریسر (Tracer) را پیکربندی کنید و مشتری LLM خود را ابزارکنویسی نمایید. کد زیر نحوه تنظیم اکسپورتر و اعمال ابزارکنویسی را نشان میدهد:
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.llm import OpenTelemetryLLMInstrumentor
# Set up the tracer provider
trace.set_tracer_provider(TracerProvider())
# Configure the OTLP exporter to send data to your backend
exporter = OTLPSpanExporter(endpoint="localhost:4317")
trace.get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(