🪢 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 即时记录您的响应,支持所有提供商
从 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_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-..."
# 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
设置为包含 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