Skip to main content

🪢 Langfuse - 记录 LLM 输入/输出

什么是 Langfuse?

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

使用 LiteLLM 通过多个模型在 Langfuse 中的示例追踪:

通过 LiteLLM 代理(LLM 网关)的使用

👉 点击此链接开始通过 LiteLLM 代理服务器向 langfuse 发送日志

通过 LiteLLM Python SDK 的使用

前提条件

确保你已经运行了 pip install langfuse 以完成此集成

pip install langfuse>=2.0.0 litellm

快速开始

只需两行代码,即可立即使用 Langfuse 记录你在所有提供商中的响应:

Open In Colab

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

litellm.success_callback = ["langfuse"]
litellm.failure_callback = ["langfuse"] # 将错误日志记录到 langfuse
# pip install langfuse 
import litellm
import os

# 从 https://cloud.langfuse.com/
os.environ["LANGFUSE_PUBLIC_KEY"] = ""
os.environ["LANGFUSE_SECRET_KEY"] = ""
# 可选,默认为 https://cloud.langfuse.com
os.environ["LANGFUSE_HOST"] # 可选

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

# 将 langfuse 设置为回调,litellm 将数据发送到 langfuse
litellm.success_callback = ["langfuse"]

# openai 调用
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

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


# OpenAI 和 Cohere 密钥
# 你可以使用 litellm 支持的任何提供商: https://docs.litellm.ai/docs/providers
os.environ['OPENAI_API_KEY']="sk-..."

# 将 langfuse 设置为回调,litellm 将数据发送到 langfuse
litellm.success_callback = ["langfuse"]

# openai 调用
response = completion(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
],
metadata = {
"generation_name": "litellm-ishaan-gen", # 设置 langfuse 生成名称
# 自定义元数据字段
"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-..."

# 设置 langfuse 作为回调,litellm 会将数据发送到 langfuse
litellm.success_callback = ["langfuse"]

# 设置自定义的 langfuse 跟踪参数和生成参数
response = completion(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hi 👋 - i'm openai"}
],
metadata={
"generation_name": "ishaan-test-generation", # 设置 langfuse 生成名称
"generation_id": "gen-id22", # 设置 langfuse 生成 ID
"parent_observation_id": "obs-id9" # 设置 langfuse 父观察 ID
"version": "test-generation-version" # 设置 langfuse 生成版本
"trace_user_id": "user-id2", # 设置 langfuse 跟踪用户 ID
"session_id": "session-1", # 设置 langfuse 会话 ID
"tags": ["tag1", "tag2"], # 设置 langfuse 标签
"trace_name": "new-trace-name" # 设置 langfuse 跟踪名称
"trace_id": "trace-id22", # 设置 langfuse 跟踪 ID
"trace_metadata": {"key": "value"}, # 设置 langfuse 跟踪元数据
"trace_version": "test-trace-version", # 设置 langfuse 跟踪版本(如果未设置,默认为生成版本)
"trace_release": "test-trace-release", # 设置 langfuse 跟踪发布
### 或者 ###
"existing_trace_id": "trace-id22", # 如果生成是过去跟踪的延续。这将防止默认行为,即设置跟踪名称
### 或者强制在跟踪中覆盖某些字段 ###
"existing_trace_id": "trace-id22",
"trace_metadata": {"key": "updated_trace_value"}, # 要用于 langfuse 跟踪元数据的新值
"update_trace_keys": ["input", "output", "trace_metadata"], # 更新跟踪输入和输出为此生成的输入和输出,同时更新跟踪元数据以匹配传入的值
"debug_langfuse": True, # 将记录发送到 litellm 的跟踪/生成的确切元数据,作为 `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提示对象,默认为None

litellm完成的元数据中传递的任何其他键值对,如果不符合上述规范,将作为生成的元数据键值对添加。

禁用日志记录 - 特定调用

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

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

使用LangChain ChatLiteLLM + Langfuse

model_kwargs中传递trace_user_idsession_id

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

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

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

# 设置langfuse为回调,litellm将数据发送到langfuse
litellm.success_callback = ["langfuse"]

chat = ChatLiteLLM(
model="gpt-3.5-turbo"
model_kwargs={
"metadata": {
"trace_user_id": "user-id2", # 设置langfuse跟踪用户ID
"session_id": "session-1" , # 设置langfuse会话ID
"tags": ["tag1", "tag2"]
}
}
)
messages = [
HumanMessage(
content="what model are you"
)
]
chat(messages)

从Langfuse日志中屏蔽消息和响应内容

从所有Langfuse日志中屏蔽消息和响应

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

从特定Langfuse日志中屏蔽消息和响应

在通常传递的文本完成或嵌入调用的元数据中,您可以设置特定键来屏蔽此调用的消息和响应。

设置mask_inputTrue将屏蔽此调用的输入

设置mask_outputTrue将屏蔽此调用的输出。

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

故障排除与错误

数据未记录到Langfuse?

  • 确保你使用的是最新版本的langfuse pip install langfuse -U。最新版本允许litellm将JSON输入/输出记录到langfuse
  • 如果你在langfuse中没有看到任何跟踪,请遵循此检查清单

支持与联系创始人

优云智算