跳到主要内容

🪢 Langfuse - 记录 LLM 输入/输出

什么是 Langfuse?

Langfuse (GitHub) 是一个开源的 LLM 工程平台,用于模型跟踪Prompt 管理和应用评估。Langfuse 帮助团队协作调试、分析和迭代他们的 LLM 应用。

使用 LiteLLM 通过多种模型在 Langfuse 中进行跟踪示例

与 LiteLLM 代理 (LLM 网关) 一起使用

👉 请点击此链接,开始使用 LiteLLM 代理服务器向 langfuse 发送日志

与 LiteLLM Python SDK 一起使用

先决条件

请确保您已运行 pip install langfuse 以进行此集成

pip install langfuse>=2.0.0 litellm

快速入门

仅需 2 行代码,即可使用 Langfuse 即时记录您的响应,支持所有提供商

Open In Colab

https://cloud.langfuse.com/ 获取您的 Langfuse API 密钥

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"}
]
)

高级设置

设置自定义生成名称,传递元数据

metadata 中传递 generation_name

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.com.cn/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)

设置自定义跟踪 ID、跟踪用户 ID、跟踪元数据、跟踪版本、跟踪发布版本和标签

metadata 中传递 trace_idtrace_user_idtrace_metadatatrace_versiontrace_releasetags

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)

您还可以将 metadata 作为请求头的一部分传递,并带有 langfuse_* 前缀

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_id - 跟踪标识符,如果是现有跟踪,必须使用 existing_trace_id 而不是 trace_id,默认为自动生成
  • trace_name - 跟踪名称,默认为自动生成
  • session_id - 跟踪会话标识符,默认为 None
  • trace_version - 跟踪版本,默认为 version 的值
  • trace_release - 跟踪发布版本,默认为 None
  • trace_metadata - 跟踪元数据,默认为 None
  • trace_user_id - 跟踪用户标识符,默认为完成参数 user 的值
  • tags - 跟踪标签,默认为 None
延续跟踪中可更新的参数

通过在完成的元数据中将以下值传递到 update_trace_keys 中,可以在跟踪的延续中更新以下参数。

  • input - 将跟踪输入设置为此最新生成的输入
  • output - 将跟踪输出设置为此生成的输出
  • trace_version - 将跟踪版本设置为提供的值(若要使用最新生成的版本,请改用 version
  • trace_release - 将跟踪发布版本设置为提供的值
  • trace_metadata - 将跟踪元数据设置为提供的值
  • trace_user_id - 将跟踪用户 ID 设置为提供的值

生成特定参数

  • generation_id - 生成标识符,默认为自动生成
  • generation_name - 生成名称,默认为自动生成
  • parent_observation_id - 父级观测标识符,默认为 None
  • prompt - 用于生成的 Langfuse Prompt 对象,默认为 None

传递到元数据中且未在上述 litellm 完成规范中列出的任何其他键值对都将作为生成的元数据键值对添加。

禁用日志记录 - 特定调用

要禁用特定调用的日志记录,请使用 no-log 标志。

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

使用 LangChain ChatLiteLLM + Langfuse

在 model_kwargs 中传递 trace_user_id, session_id

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)

从 Langfuse 日志中去除消息、响应内容

从所有 Langfuse 日志中去除消息和响应

设置 litellm.turn_off_message_logging=True 这将阻止消息和响应被记录到 langfuse,但请求元数据仍会被记录。

从特定的 Langfuse 日志中去除消息和响应

在通常为文本补全或嵌入调用传递的元数据中,您可以设置特定的键来掩盖此调用的消息和响应。

mask_input 设置为 True 将掩盖此调用的输入日志

mask_output 设置为 True 将掩盖此调用的输出日志。

请注意,如果您正在延续一个现有跟踪,并将 update_trace_keys 设置为包含 inputoutput,并且设置了相应的 mask_inputmask_output,那么该跟踪的现有输入和/或输出将被替换为被去除的消息。

故障排除与错误

数据没有记录到 Langfuse?

  • 请确保您使用的是最新版本的 langfuse pip install langfuse -U。最新版本支持 litellm 将 JSON 输入/输出记录到 langfuse。
  • 如果您在 langfuse 中看不到任何跟踪,请遵循此清单

支持与联系创始人