Langfuse untuk Observabilitas yang Tidak Bergantung pada Model
Integrasikan Langfuse sebagai alternatif sumber terbuka yang bekerja dengan penyedia LLM apa pun, tangkap rentang khusus untuk pengambilan dan pemanggilan alat, lalu siapkan dasbor pelacakan biaya.
Langfuse untuk Observabilitas yang Tidak Bergantung pada Model adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Langfuse: Observabilitas LLM Sumber Terbuka
Langfuse adalah platform observabilitas sumber terbuka untuk aplikasi LLM yang dapat digunakan dengan penyedia model apa pun: OpenAI, Anthropic, Mistral, model lokal melalui Ollama, atau model yang Anda sesuaikan sendiri. Berbeda dari LangSmith yang mengikat Anda pada LangChain, Langfuse terintegrasi dengan kode Python apa pun melalui SDK sederhana. Anda dapat meng-host Langfuse sendiri secara gratis atau menggunakan cloud terkelola di cloud.langfuse.com.
# pip install langfuse
from langfuse import Langfuse
langfuse = Langfuse(
public_key='pk-lf-...',
secret_key='sk-lf-...',
host='https://cloud.langfuse.com' # or your self-hosted URL
)
print('Langfuse connected:', langfuse.auth_check())Jejak, Rentang, dan Generasi
Langfuse menggunakan model data hierarkis dengan tiga tingkat. Sebuah jejak mewakili satu permintaan pengguna dari awal hingga akhir. Di dalam sebuah jejak, rentang mewakili langkah-langkah pemrosesan individual (pengambilan, prapemrosesan, dan panggilan alat). Generasi adalah jenis rentang khusus untuk panggilan LLM: generasi merekam model, token prompt, token penyelesaian, dan biaya dalam struktur yang memungkinkan pembuatan dasbor biaya serta metrik kualitas.
from langfuse import Langfuse
langfuse = Langfuse()
# Create a trace for one user request
trace = langfuse.trace(
name='rag-query',
user_id='user_123',
session_id='session_abc',
tags=['production', 'rag']
)
# Add a retrieval span
retrieval_span = trace.span(
name='vector-retrieval',
input={'query': 'What is RAG?'}
)
chunks = vector_db.search('What is RAG?')
retrieval_span.end(output={'chunks': [c['text'][:100] for c in chunks]})
# Add an LLM generation
generation = trace.generation(
name='answer-generation',
model='gpt-4o',
model_parameters={'temperature': 0.0},
input=[{'role': 'user', 'content': 'Context: ...\nQuestion: What is RAG?'}]
)
response = openai_client.chat.completions.create(model='gpt-4o', messages=[...])
generation.end(
output=response.choices[0].message.content,
usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens}
)Pola Integrasi Dekorator
Langfuse menyediakan dekorator fungsi yang secara otomatis membungkus fungsi Anda dengan rentang jejak. Dekorator @observe() menangkap masukan dan keluaran, waktu, serta pengecualian apa pun. Ini adalah cara paling bersih untuk menambahkan instrumentasi ke kode yang sudah ada tanpa menyusun ulang kode tersebut.
from langfuse.decorators import observe, langfuse_context
# @observe wraps the function as a span automatically
@observe()
def retrieve_chunks(query: str) -> list[dict]:
return vector_db.search(query, top_k=5)
@observe()
def generate_answer(query: str, context: str) -> str:
response = openai_client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': 'Answer using the context.'},
{'role': 'user', 'content': f'Context: {context}\nQuestion: {query}'}
]
)
# Attach LLM usage data to the current span
langfuse_context.update_current_observation(
usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens},
model='gpt-4o'
)
return response.choices[0].message.content
@observe(name='rag-pipeline') # top-level trace
def rag_pipeline(query: str) -> str:
chunks = retrieve_chunks(query) # becomes a nested span
context = '\n'.join([c['text'] for c in chunks])
return generate_answer(query, context) # becomes another nested spanMengintegrasikan dengan Penyedia LLM Apa Pun
Berbeda dari integrasi mendalam LangSmith dengan LangChain, Langfuse dapat digunakan dengan penyedia LLM apa pun menggunakan pendekatan berbasis dekorator yang sama. Baik Anda memanggil API Anthropic, model Ollama lokal, titik akhir inferensi Hugging Face, maupun model khusus yang Anda sesuaikan sendiri, Langfuse melacak panggilan tersebut dengan cara yang sama. Netralitas terhadap penyedia ini sangat penting ketika Anda menjalankan beberapa model dalam aplikasi yang sama.
from langfuse.decorators import observe, langfuse_context
import anthropic
from openai import OpenAI
anthropic_client = anthropic.Anthropic()
openai_client = OpenAI()
@observe()
def call_claude(prompt: str) -> str:
response = anthropic_client.messages.create(
model='claude-3-5-sonnet-20241022',
max_tokens=1024,
messages=[{'role': 'user', 'content': prompt}]
)
langfuse_context.update_current_observation(
model='claude-3-5-sonnet-20241022',
usage={'input': response.usage.input_tokens, 'output': response.usage.output_tokens}
)
return response.content[0].text
@observe()
def call_gpt4(prompt: str) -> str:
response = openai_client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}]
)
langfuse_context.update_current_observation(model='gpt-4o',
usage={'input': response.usage.prompt_tokens, 'output': response.usage.completion_tokens})
return response.choices[0].message.contentDasbor Pelacakan Biaya
Langfuse secara otomatis menghitung biaya dari nama model dan jumlah token menggunakan tabel harga bawaan yang mencakup OpenAI, Anthropic, Mistral, serta lusinan penyedia lainnya. Dasbor biaya menampilkan: total pengeluaran berdasarkan periode waktu, biaya berdasarkan model, biaya berdasarkan fitur atau pengguna (menggunakan tag dan metadata), serta tren pengeluaran harian/mingguan. Visibilitas ini mencegah kejutan tagihan dan membantu mengidentifikasi permintaan tidak biasa yang mahal.
# Cost data is automatically computed - no manual config
# Langfuse knows: gpt-4o input = $0.005/1K tokens, output = $0.015/1K tokens
# Add metadata to enable cost breakdown by feature
@observe(name='rag-query')
def handle_rag_query(query: str, feature: str, user_id: str) -> str:
langfuse_context.update_current_trace(
user_id=user_id,
tags=[feature, 'rag'],
metadata={'feature': feature, 'query_length': len(query)}
)
return rag_pipeline(query)
# In Langfuse dashboard you can now filter costs by:
# - feature: 'document_qa', 'chat', 'summarization'
# - user_id: to see which users are your most expensive
# - model: to compare gpt-4o vs gpt-4o-mini costs
# - date range: to see daily/weekly/monthly trendsMenambahkan Skor Masukan Pengguna
Langfuse memungkinkan Anda melampirkan masukan pengguna ke jejak setelah kejadian. Ketika pengguna mengeklik ikon jempol ke atas/bawah pada suatu respons, Anda dapat mencatatnya sebagai skor pada jejak yang sesuai. Hal ini menghubungkan sinyal kepuasan pengguna nyata dengan konteks jejak secara keseluruhan, sehingga Anda dapat menganalisis perbedaan antara respons yang mendapat penilaian tinggi dan respons yang mendapat penilaian rendah.
from langfuse.decorators import observe, langfuse_context
@observe()
def generate_response(query: str) -> dict:
answer = rag_pipeline(query)
# Get the current trace ID to link feedback later
trace_id = langfuse_context.get_current_trace_id()
return {'answer': answer, 'trace_id': trace_id}
# Later, when user submits feedback:
def record_user_feedback(trace_id: str, score: int, comment: str):
langfuse.score(
trace_id=trace_id,
name='user_satisfaction', # score name
value=score, # 1 (thumbs up) or 0 (thumbs down)
comment=comment,
data_type='BOOLEAN'
)
# Now in Langfuse: filter traces where user_satisfaction = 0
# to find the exact prompts and contexts that users rated negativelySkor Otomatis dengan LLM sebagai Penilai
Selain masukan pengguna, Langfuse mendukung pemberian skor otomatis menggunakan evaluator LLM sebagai penilai. Anda dapat menentukan evaluator yang berjalan secara asinkron terhadap jejak sampel dan menilainya berdasarkan kriteria seperti relevansi, kesetiaan, toksisitas, atau ketepatan format. Skor otomatis ini mengisi dasbor skor yang sama dengan masukan manusia, sehingga Anda memperoleh pemantauan kualitas berkelanjutan tanpa anotasi manusia dalam skala besar.
from langfuse import Langfuse
langfuse = Langfuse()
def auto_score_traces():
# Get recent unscored traces
traces = langfuse.fetch_traces(tags=['production'], limit=50)
for trace in traces.data:
question = trace.input.get('query', '')
answer = trace.output.get('answer', '') if trace.output else ''
if not question or not answer:
continue
# LLM-as-judge scoring
score = evaluate_relevance(question, answer) # returns 0.0-1.0
langfuse.score(
trace_id=trace.id,
name='auto_relevance',
value=score,
data_type='NUMERIC',
comment='Automated relevance score from LLM judge'
)
# Run this as a scheduled job every hourManajemen Prompt di Langfuse
Langfuse menyertakan fitur manajemen prompt yang menyimpan prompt Anda di cloud Langfuse dan memungkinkan Anda mengambilnya saat runtime. Hal ini memisahkan versi prompt dari penerapan kode — Anda dapat memperbarui prompt di antarmuka Langfuse dan perubahan tersebut langsung berlaku tanpa menerapkan kode baru. Langfuse juga melacak versi prompt yang digunakan setiap jejak, sehingga Anda dapat membandingkan kinerja di antara berbagai versi prompt.
from langfuse import Langfuse
langfuse = Langfuse()
# Fetch the current production prompt by name
# The prompt lives in Langfuse UI, not in your code
prompt = langfuse.get_prompt('rag-system-prompt', version='production')
# Use it in your pipeline
messages = [
{'role': 'system', 'content': prompt.compile(context_limit=4000)},
{'role': 'user', 'content': query}
]
response = openai_client.chat.completions.create(model='gpt-4o', messages=messages)
# The trace is automatically linked to the prompt version
# In Langfuse you can filter: show me traces using prompt v3 vs v4
# and compare their quality scoresMeng-host Langfuse Sendiri
Langfuse dapat di-host sendiri dengan satu perintah Docker Compose, menggunakan PostgreSQL untuk penyimpanan. Meng-host sendiri berarti data jejak Anda tidak pernah meninggalkan infrastruktur Anda — hal ini penting untuk aplikasi yang menangani PII, data medis, atau konten hak milik. Versi yang di-host sendiri memiliki fitur yang sama dengan cloud terkelola, tetapi Anda harus mengelola infrastrukturnya (pencadangan, penskalaan, dan pemutakhiran).
# Self-host Langfuse with Docker Compose
# docker-compose.yml (simplified)
# version: '3'
# services:
# langfuse:
# image: langfuse/langfuse:2
# ports:
# - '3000:3000'
# environment:
# - DATABASE_URL=postgresql://langfuse:password@postgres/langfuse
# - NEXTAUTH_SECRET=your-random-secret
# - SALT=your-random-salt
# postgres:
# image: postgres:15
# environment:
# - POSTGRES_DB=langfuse
# - POSTGRES_PASSWORD=password
# After docker-compose up, point your SDK to:
langfuse = Langfuse(
public_key='pk-lf-your-key',
secret_key='sk-lf-your-key',
host='http://localhost:3000' # your self-hosted instance
)Langfuse vs LangSmith: Kapan Memilih Masing-Masing
Pilih LangSmith ketika Anda banyak menggunakan LangChain dan menginginkan pelacakan otomatis tanpa konfigurasi, integrasi mendalam dengan evaluasi LangChain, serta merasa nyaman dengan ketergantungan pada vendor. Pilih Langfuse ketika Anda menggunakan beberapa penyedia LLM, perlu meng-host sendiri untuk memenuhi kepatuhan privasi data, menginginkan transparansi sumber terbuka, atau membangun dengan kerangka kerja selain LangChain. Keduanya siap digunakan di lingkungan produksi dan menawarkan tingkat gratis yang cukup besar.
Integrasi OpenTelemetry untuk LLM
Untuk tim yang sudah menggunakan OpenTelemetry untuk pelacakan terdistribusi, Langfuse mendukung penyerapan OTLP (OpenTelemetry Protocol). Anda dapat mengirim data jejak LLM dari eksportir OTel yang sudah ada langsung ke Langfuse tanpa mengubah instrumentasi. Hal ini memungkinkan tumpukan observabilitas terpadu, tempat jejak LLM, rentang kueri basis data, dan jejak permintaan HTTP berada dalam sistem yang sama dengan ID korelasi yang konsisten.
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Configure OTel to send to Langfuse OTLP endpoint
exporter = OTLPSpanExporter(
endpoint='https://cloud.langfuse.com/api/public/otel/v1/traces',
headers={
'Authorization': 'Basic ' + base64.b64encode(b'pk-lf-xxx:sk-lf-xxx').decode()
}
)
provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)
# Now create spans as usual - they appear in Langfuse automatically
tracer = trace.get_tracer('my-llm-app')
with tracer.start_as_current_span('rag-query') as span:
span.set_attribute('llm.model', 'gpt-4o')
span.set_attribute('llm.prompt_tokens', 500)
result = rag_pipeline(query)Pemeriksaan Singkat
Uji pemahaman Anda tentang observabilitas yang tidak bergantung pada model dengan Langfuse dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa Langfuse menyediakan observabilitas LLM sumber terbuka yang tidak bergantung pada model, menggunakan model data hierarkis berupa jejak-rentang-generasi; dekorator @observe() menambahkan instrumentasi ke kode yang sudah ada dengan perubahan minimal; serta pelacakan biaya, skor masukan pengguna, dan pemberian skor otomatis oleh LLM sebagai penilai menjadikan Langfuse platform pemantauan kualitas yang lengkap. Selanjutnya, kita akan menyiapkan peringatan untuk latensi, biaya, dan penurunan kualitas.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Langfuse untuk Observabilitas yang Tidak Bergantung pada Model” gratis?
Ya — teks lengkap “Langfuse untuk Observabilitas yang Tidak Bergantung pada Model” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Langfuse untuk Observabilitas yang Tidak Bergantung pada Model”?
Integrasikan Langfuse sebagai alternatif sumber terbuka yang bekerja dengan penyedia LLM apa pun, tangkap rentang khusus untuk pengambilan dan pemanggilan alat, lalu siapkan dasbor pelacakan biaya. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Langfuse untuk Observabilitas yang Tidak Bergantung pada Model” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Aplikasi LLM Sulit Di-debug
- Pelacakan dengan LangSmith
- Langfuse untuk Observabilitas yang Tidak Bergantung pada Model
- Peringatan untuk Latensi, Biaya, dan Penurunan Kualitas