Zum Hauptinhalt springen

🪢 Langfuse - Protokollierung von LLM Ein-/Ausgaben

Was ist Langfuse?

Langfuse (GitHub) ist eine Open-Source-Plattform für LLM-Engineering für Tracing von Modellen, Prompt-Management und Anwendungs-Bewertung. Langfuse hilft Teams, ihre LLM-Anwendungen kollaborativ zu debuggen, zu analysieren und zu iterieren.

Beispiel-Trace in Langfuse mit mehreren Modellen über LiteLLM

Verwendung mit LiteLLM Proxy (LLM Gateway)

👉 Folgen Sie diesem Link, um mit dem LiteLLM Proxy-Server Protokolle an Langfuse zu senden

Verwendung mit dem LiteLLM Python SDK

Voraussetzungen

Stellen Sie sicher, dass Sie pip install langfuse für diese Integration ausgeführt haben

pip install langfuse>=2.0.0 litellm

Schnellstart

Verwenden Sie nur 2 Zeilen Code, um Ihre Antworten sofort **über alle Anbieter hinweg** mit Langfuse zu protokollieren

Open In Colab

Holen Sie sich Ihre Langfuse API-Schlüssel von https://cloud.langfuse.com/

litellm.success_callback = ["langfuse"]
litellm.failure_callback = ["langfuse"] # logs errors to langfuse
# pip install langfuse 
import litellm
import os

# from https://cloud.langfuse.com/
os.environ["LANGFUSE_PUBLIC_KEY"] = ""
os.environ["LANGFUSE_SECRET_KEY"] = ""
# Optional, defaults to https://cloud.langfuse.com
os.environ["LANGFUSE_HOST"] # optional

# LLM API Keys
os.environ['OPENAI_API_KEY']=""

# set langfuse as a callback, litellm will send the data to langfuse
litellm.success_callback = ["langfuse"]

# openai call
response = litellm.completion(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
]
)

Erweitert

Benutzerdefinierte Generierungsnamen festlegen, Metadaten übergeben

Übergeben Sie generation_name in metadata

import litellm
from litellm import completion
import os

# from https://cloud.langfuse.com/
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-..."
os.environ["LANGFUSE_SECRET_KEY"] = "sk-..."


# OpenAI and Cohere keys
# You can use any of the litellm supported providers: https://docs.litellm.de/docs/providers
os.environ['OPENAI_API_KEY']="sk-..."

# set langfuse as a callback, litellm will send the data to langfuse
litellm.success_callback = ["langfuse"]

# openai call
response = completion(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
],
metadata = {
"generation_name": "litellm-ishaan-gen", # set langfuse generation name
# custom metadata fields
"project": "litellm-proxy"
}
)

print(response)

Benutzerdefinierte Trace-ID, Trace-Benutzer-ID, Trace-Metadaten, Trace-Version, Trace-Release und Tags festlegen

Übergeben Sie trace_id, trace_user_id, trace_metadata, trace_version, trace_release, tags in metadata

import litellm
from litellm import completion
import os

# from https://cloud.langfuse.com/
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-..."
os.environ["LANGFUSE_SECRET_KEY"] = "sk-..."

os.environ['OPENAI_API_KEY']="sk-..."

# set langfuse as a callback, litellm will send the data to langfuse
litellm.success_callback = ["langfuse"]

# set custom langfuse trace params and generation params
response = completion(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
],
metadata={
"generation_name": "ishaan-test-generation", # set langfuse Generation Name
"generation_id": "gen-id22", # set langfuse Generation ID
"parent_observation_id": "obs-id9" # set langfuse Parent Observation ID
"version": "test-generation-version" # set langfuse Generation Version
"trace_user_id": "user-id2", # set langfuse Trace User ID
"session_id": "session-1", # set langfuse Session ID
"tags": ["tag1", "tag2"], # set langfuse Tags
"trace_name": "new-trace-name" # set langfuse Trace Name
"trace_id": "trace-id22", # set langfuse Trace ID
"trace_metadata": {"key": "value"}, # set langfuse Trace Metadata
"trace_version": "test-trace-version", # set langfuse Trace Version (if not set, defaults to Generation Version)
"trace_release": "test-trace-release", # set langfuse Trace Release
### OR ###
"existing_trace_id": "trace-id22", # if generation is continuation of past trace. This prevents default behaviour of setting a trace name
### OR enforce that certain fields are trace overwritten in the trace during the continuation ###
"existing_trace_id": "trace-id22",
"trace_metadata": {"key": "updated_trace_value"}, # The new value to use for the langfuse Trace Metadata
"update_trace_keys": ["input", "output", "trace_metadata"], # Updates the trace input & output to be this generations input & output also updates the Trace Metadata to match the passed in value
"debug_langfuse": True, # Will log the exact metadata sent to litellm for the trace/generation as `metadata_passed_to_litellm`
},
)

print(response)

Sie können metadata auch als Teil des Anforderungsheaders mit einem Präfix langfuse_* übergeben

curl --location --request POST 'http://0.0.0.0:4000/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sk-1234' \
--header 'langfuse_trace_id: trace-id2' \
--header 'langfuse_trace_user_id: user-id2' \
--header 'langfuse_trace_metadata: {"key":"value"}' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "what llm are you"
}
]
}'

Trace- & Generierungsparameter

Trace-spezifische Parameter
  • trace_id - Identifikator für den Trace, muss existing_trace_id anstelle von trace_id verwenden, wenn dies ein bestehender Trace ist, standardmäßig automatisch generiert
  • trace_name - Name des Traces, standardmäßig automatisch generiert
  • session_id - Sitzungsidentifikator für den Trace, standardmäßig None
  • trace_version - Version für den Trace, standardmäßig der Wert für version
  • trace_release - Release für den Trace, standardmäßig None
  • trace_metadata - Metadaten für den Trace, standardmäßig None
  • trace_user_id - Benutzeridentifikator für den Trace, standardmäßig das Abschlussargument user
  • tags - Tags für den Trace, standardmäßig None
Aktualisierbare Parameter bei Fortsetzung

Die folgenden Parameter können bei einer Fortsetzung eines Traces aktualisiert werden, indem die folgenden Werte in update_trace_keys in den Metadaten des Abschlusses übergeben werden.

  • input - Setzt die Eingabe des Traces auf die Eingabe der letzten Generierung
  • output - Setzt die Ausgabe des Traces auf die Ausgabe dieser Generierung
  • trace_version - Setzt die Trace-Version auf den angegebenen Wert (Um die Version der neuesten Generierung zu verwenden, verwenden Sie stattdessen version)
  • trace_release - Setzt das Trace-Release auf den angegebenen Wert
  • trace_metadata - Setzt die Trace-Metadaten auf den angegebenen Wert
  • trace_user_id - Setzt die Trace-Benutzer-ID auf den angegebenen Wert

Generierungsspezifische Parameter

  • generation_id - Identifikator für die Generierung, standardmäßig automatisch generiert
  • generation_name - Identifikator für die Generierung, standardmäßig automatisch generiert
  • parent_observation_id - Identifikator für die übergeordnete Beobachtung, standardmäßig None
  • prompt - Langfuse-Prompt-Objekt, das für die Generierung verwendet wird, standardmäßig None

Alle anderen Schlüssel-Wert-Paare, die in den Metadaten für einen litellm Abschluss übergeben werden und nicht in der obigen Spezifikation aufgeführt sind, werden als Schlüssel-Wert-Paar in den Metadaten für die Generierung hinzugefügt.

Protokollierung deaktivieren - Spezifische Aufrufe

Um die Protokollierung für bestimmte Aufrufe zu deaktivieren, verwenden Sie das Flag no-log.

completion(messages = ..., model = ..., **{"no-log": True})

LangChain ChatLiteLLM + Langfuse verwenden

Übergeben Sie trace_user_id, session_id in model_kwargs

import os
from langchain.chat_models import ChatLiteLLM
from langchain.schema import HumanMessage
import litellm

# from https://cloud.langfuse.com/
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-..."
os.environ["LANGFUSE_SECRET_KEY"] = "sk-..."

os.environ['OPENAI_API_KEY']="sk-..."

# set langfuse as a callback, litellm will send the data to langfuse
litellm.success_callback = ["langfuse"]

chat = ChatLiteLLM(
model="gpt-3.5-turbo"
model_kwargs={
"metadata": {
"trace_user_id": "user-id2", # set langfuse Trace User ID
"session_id": "session-1" , # set langfuse Session ID
"tags": ["tag1", "tag2"]
}
}
)
messages = [
HumanMessage(
content="what model are you"
)
]
chat(messages)

Nachrichten und Antwortinhalte aus der Langfuse-Protokollierung redigieren

Nachrichten und Antworten aus der gesamten Langfuse-Protokollierung redigieren

Setzen Sie litellm.turn_off_message_logging=True. Dies verhindert, dass Nachrichten und Antworten an Langfuse protokolliert werden, aber Metadaten zu Anfragen werden weiterhin protokolliert.

Nachrichten und Antworten aus der spezifischen Langfuse-Protokollierung redigieren

In den Metadaten, die normalerweise für Textabschluss- oder Einbettungsaufrufe übergeben werden, können Sie bestimmte Schlüssel festlegen, um die Nachrichten und Antworten für diesen Aufruf zu maskieren.

Wenn Sie mask_input auf True setzen, wird die Eingabe für diesen Aufruf nicht protokolliert

Wenn Sie mask_output auf True setzen, wird die Ausgabe für diesen Aufruf nicht protokolliert.

Beachten Sie, dass, wenn Sie einen bestehenden Trace fortsetzen und update_trace_keys so einstellen, dass entweder input oder output enthalten ist, und Sie das entsprechende mask_input oder mask_output setzen, dieser Trace seine bestehende Eingabe und/oder Ausgabe durch eine redigierte Nachricht ersetzt.

Fehlerbehebung & Fehler

Daten werden nicht an Langfuse protokolliert?

  • Stellen Sie sicher, dass Sie die neueste Version von Langfuse verwenden pip install langfuse -U. Die neueste Version ermöglicht es LiteLLM, JSON-Ein- und Ausgaben an Langfuse zu protokollieren.
  • Folgen Sie dieser Checkliste, wenn Sie keine Traces in Langfuse sehen.

Support & Sprechen Sie mit den Gründern