🪢 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 记录你在所有提供商中的响应:
从 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_id、trace_user_id、trace_metadata、trace_version、trace_release、tags
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- 跟踪的会话标识符,默认为Nonetrace_version- 跟踪的版本,默认为version的值trace_release- 跟踪的发布版本,默认为Nonetrace_metadata- 跟踪的元数据,默认为Nonetrace_user_id- 跟踪的用户标识符,默认为完成参数usertags- 跟踪的标签,默认为None
可更新的参数(在继续跟踪时)
以下参数可以通过在完成的元数据中传递以下值到update_trace_keys来更新跟踪的继续。
input- 将跟踪的输入设置为最新生成的输入output- 将跟踪的输出设置为此生成的输出trace_version- 将跟踪的版本设置为提供的值(要使用最新生成的版本,请使用version)trace_release- 将跟踪的发布版本设置为提供的值trace_metadata- 将跟踪的元数据设置为提供的值trace_user_id- 将跟踪的用户ID设置为提供的值
生成特定参数
generation_id- 生成的标识符,默认自动生成generation_name- 生成的标识符,默认自动生成parent_observation_id- 父观察的标识符,默认为Noneprompt- 用于生成的Langfuse提示对象,默认为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
# 来自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_input为True将屏蔽此调用的输入
设置mask_output为True将屏蔽此调用的输出。
请注意,如果您正在继续现有跟踪,并且设置了update_trace_keys以包含input或output,并且设置了相应的mask_input或mask_output,那么该跟踪的现有输入和/或输出将被替换为屏蔽消息。
故障排除与错误
数据未记录到Langfuse?
- 确保你使用的是最新版本的langfuse
pip install langfuse -U。最新版本允许litellm将JSON输入/输出记录到langfuse - 如果你在langfuse中没有看到任何跟踪,请遵循此检查清单。
支持与联系创始人
- 预约演示 👋
- 社区Discord 💭
- 我们的联系电话 📞 +1 (770) 8783-106 / +1 (412) 618-6238
- 我们的电子邮件 ✉️ ishaan@berri.ai / krrish@berri.ai