Büyük Dil Modelleri (LLM'ler) modern uygulamaların merkezine otururken, güvenilirlik, maliyet etkinliği ve performanslarının sağlanması kritik hale gelir. Geleneksel izleme araçları, karmaşık ve belirsiz üretici AI iş akışlarını izlerken genellikle yetersiz kalır. İşte tam da burada OpenTelemetry (OTel) parlar; telemetri verileri için birleştirilmiş, satıcıdan bağımsız bir standart sağlar.
LLM Enstrümantasyonunun Zorluğu
LLM'leri enstrümante etmek, standart API izlemekten önemli ölçüde farklıdır. Sadece gecikme süresini ve durum kodlarını değil, istem şablonlarını, token sayılarını, model sürümlerini ve yanıt meta verilerini de yakalamanız gerekir. Standartlaştırılmış bir yaklaşım olmadan, belirli bir satıcının SDK'sına kilitlenme riski taşırsınız; bu da sağlayıcıları değiştirmeyi veya birden fazla AI hizmeti arasında veri toplamayı zorlaştırır.
OpenTelemetry LLM Kütüphaneleri ile Başlangıç
OpenTelemetry LLM Enstrümantasyon Kütüphaneleri (özellikle Python ve Node.js için), farklı model sağlayıcıları için izleme oluşturmanın karmaşıklığını soyutlar. İster OpenAI, ister Anthropic kullanın, isterse yerel bir Ollama örneği, istemler, tamamlamalar ve gömme işlemleri için otomatik olarak span'lar oluşturarak tutarlılığı sağlarlar.
Python'da Pratik Uygulama
Python SDK kullanarak pratik bir örneğe bakalım. İlk olarak, gerekli paketleri yüklemeniz gerekir:
pip install opentelemetry-api opentelemetry-sdk \
opentelemetry-exporter-otlp \
opentelemetry-instrumentation-llm
Ardından, izleyiciyi yapılandırın ve LLM istemcinizi enstrümante edin. Aşağıdaki kod, dışa aktarıcıyı kurmak ve enstrümantasyonu uygulamak için nasıl bir yol izleneceğini göstermektedir:
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
# İzleyici sağlayıcısını kurun
trace.set_tracer_provider(TracerProvider())
# Verileri arka ucunuza göndermek için OTLP dışa aktarıcısını yapılandırın
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(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider().add_span_processor(
trace.get_tracer_provider().get_tracer(__name__).get_tracer_provider