简介

        Langfuse 是一个开源 LLMOps 工程平台,专注于帮助团队协作完成 AI 应用的全生命周期管理,包括开发、监控、评估及调试。其核心优势在于轻量化部署(可在几分钟内完成自托管)和实战可靠性,已在大量实际场景中得到验证。

  • 平台涵盖的主要领域:
    • 可观测性(Observability):查看 LLM 运行时发生的情况。追踪成本、发现错误并了解用户如何与您的应用交互。无需再猜测故障原因或 OpenAI 上个月向您收取了多少费用。
    • 提示管理(Prompt Management):将所有提示集中存储并进行版本控制,而不是分散在代码库各处。您的团队无需修改生产代码即可测试不同版本。
    • 评估(Evaluations):衡量您的学习领导力模型 (LLM) 的性能。设置自动化测试,检查回复是否合理、是否切题或是否符合质量标准。

Observability 简介

      Langfuse 的可观测性与可追踪性,核心是为 LLM 应用提供全链路、可视化的运行状态监控方案,解决传统日志无法覆盖的 LLM 专属需求,适配复杂场景的调试与优化。

  • 弥补传统日志短板:传统日志仅能记录函数是否运行,无法捕捉 LLM 应用的关键细节(如文档检索是否准确、提示词格式是否合规、哪个中间步骤耗时)。
  • 适配复杂架构:针对生产级 RAG 等多步骤场景(文档加载、分块、多检索器、重排、生成),实现全链路无遗漏追踪。

可追踪性的核心价值

  • 高效调试:快速定位错误根源(如检索错误、提示词格式问题),替代 “猜测式排查”。
  • 性能优化:精准识别 latency 瓶颈(嵌入查询、向量搜索、LLM 调用等环节)。
  • 成本管控:实时追踪单个模型调用的具体成本,便于预算管理。
  • 评估支撑:为 LLM 应用效果评估提供数据基础。
  • 客服提效:通过会话快速还原用户问题场景,节省排查时间。

三大维度

        Langfuse 的可观测性能力包含三个层级的追踪体系,实现了从单轮执行到多轮对话再到用户全局行为的全维度覆盖:

  1. Trace(单轮执行追踪):聚焦单条 LLM 请求的完整执行链路,记录从输入、中间步骤到输出的全量数据,包括层级化执行树、耗时分布、Token 与成本消耗等细节,为单轮问题的根因分析提供颗粒度最细的依据。
  2. Session(多轮对话追踪):将同一上下文的关联请求(如用户的多轮连续问答)聚合为会话,还原完整对话逻辑,解决 “单轮 Trace 孤立无关联” 的问题,便于复盘用户多轮交互中的行为模式与问题。
  3. User(用户维度追踪):基于用户唯一 ID 聚合其所有 Session 和 Trace,实现 “用户 - 对话 - 单轮执行” 的三层关联,支持从用户视角全局分析行为特征、问题分布,是面向真实业务场景(如用户留存、个性化优化)的顶层观测维度。

数据类型

        Langfuse 的 Observation Types(观测类型) 是对追踪数据的分类标签,核心作用是为 Span(追踪跨度)补充上下文、明确操作属性,同时支持高效筛选,覆盖 AI 应用全链路关键环节。

event(事件) 追踪链路中 “离散的独立事件”,是最基础的观测单元 记录单次、无持续时长的瞬时操作
span(跨度) 追踪 “有持续时长的工作单元”,是链路追踪的核心载体 体现操作耗时,串联上下游关联步骤
generation(生成记录) 记录 AI 模型的生成过程 包含提示词(prompts)、令牌用量(token usage)、成本(costs)等核心信息
agent(代理) 负责决策应用流程的组件 可在 LLM 指导下调用工具,主导复杂任务的执行逻辑
tool(工具调用) 记录外部工具 / API 的调用行为 例如调用天气 API、数据库查询工具等
chain(链) 串联应用的不同步骤 负责传递上下文(如将检索器结果传递给 LLM 调用),衔接各环节
retriever(检索器) 记录数据检索操作 例如调用向量数据库、普通数据库的检索步骤,包含查询语句和返回文档
evaluator(评估器) 评估 LLM 输出的质量 聚焦相关性(relevance)、正确性(correctness)、实用性(helpfulness)等维度
embedding(嵌入生成) 记录调用 LLM 生成嵌入向量的操作 包含模型信息、令牌用量、成本等数据
guardrail(安全护栏) 防护恶意内容或 “越狱” 攻击的组件 保障 AI 应用的输出安全与合规

备注:

  • event 是最外层,每一个trace 数据都是一个 event

  • span 是基础类型

  • 其他的是特殊场景下的类型

核心参数

Trace上报

name Optional[str] Trace 的名称(标识链路用途)
user_id Optional[str] 链路关联的用户 ID(用于用户维度分析)
session_id Optional[str] 会话 ID(用于分组关联的多个 Trace)
version Optional[str] 应用 / 服务版本(用于版本维度对比)
input Optional[Any] 整个 Trace 的全局输入数据
output Optional[Any] 整个 Trace 的全局输出数据
metadata Optional[Any] Trace 的额外元数据(JSON 可序列化)
tags Optional[List[str]] 用于分类 Trace 的标签列表(如 ["payment", "critical"]
public Optional[bool] Trace 是否公开可访问(需平台配置支持)

Trace更新

input Optional[Any] 操作的输入数据 Span、Generation 均适用
output Optional[Any] 操作的输出数据 Span、Generation 均适用
metadata Optional[Any] 额外元数据(需支持 JSON 序列化) Span、Generation 均适用
version Optional[str] 代码 / 组件的版本标识 Span、Generation 均适用
level Optional[SpanLevel] 严重级别,可选值:"DEBUG"、"DEFAULT"、"WARNING"、"ERROR" Span、Generation 均适用
status_message Optional[str] 状态描述信息,尤其适用于错误场景 Span、Generation 均适用
completion_start_time Optional[datetime] LLM 开始生成响应的时间戳(流式输出场景) 仅 Generation 适用
model Optional[str] 所用 AI 模型的名称 / 标识 仅 Generation 适用
model_parameters Optional[Dict[str, MapValue]] 模型调用参数(如 temperature、max_tokens 等) 仅 Generation 适用
usage_details Optional[Dict[str, int]] Token 用量信息(示例:{"input_tokens": 10, "output_tokens": 20} 仅 Generation 适用
cost_details Optional[Dict[str, float]] 成本信息(示例:{"total_cost": 0.0023} 仅 Generation 适用
prompt Optional[PromptClient] 关联 Langfuse 提示词管理的 PromptClient 对象 仅 Generation 适用

跨服务传播(基于标准协议)

核心原理:OpenTelemetry- Baggage

     Baggage是一种跨信号、跨服务传递上下文信息的机制,本质是与 Context 绑定的键值存储,核心作用是让关键数据能在分布式系统中流转并赋能可观测性分析。

  • 核心工作原理:依赖于传播器(Propagator)。在微服务的一次调用中,发起方服务会将Baggage从上下文(Context)中注入(Inject) 到HTTP请求头等载体中;接收方服务则从传入的请求头中提取(Extract) 这些信息到自己的上下文里,从而获取到这些数据-

  • 本质属性:是与 OpenTelemetry Context 绑定的键值存储,和 Context 一起在服务、进程间传递,不属于追踪(Trace)、指标(Metric)、日志(Log)任一单独信号,但能为所有信号提供数据支持。

  • 核心价值:解决 “分布式系统中关键信息跨服务传递” 的问题,无需在代码中反复复制数据(如用户 ID、账户标识),就能让这些信息在下游服务的追踪、指标、日志中可用。

  • 参考文献:https://opentelemetry.io/docs/concepts/signals/baggage/

使用 Baggage 时需重点关注两个风险:

  1. 敏感信息泄露风险:Baggage 会随网络请求(如 HTTP 头)自动传播,网络流量中可见,可能被第三方 API 或下游服务扩散到外部网络,因此禁止存储密码、令牌等敏感数据

  2. 数据完整性无保障:Baggage 没有内置的完整性校验机制,无法确认数据是否被篡改或是否来自可信来源,读取时需谨慎判断有效性。

实现过程

OpenTelemetry 协议标准 Http Header 头注入

  1. 通过OpenTelemetry创建Span后,TraceID,SpanId 会缓存到SpanContext 上下文中;

  2. 如果需要额外的透传参数如Session_id,User_id ,OpenTelemetry 建议通过组装Baggage 的方式,先放入上下文对象中。
  3. 通过OpenTelemetry 传播对象,将上下文对象中的SpanContent 和 Baggage 传入Header 头,此时Header 头中包含两个对象traceparent 和 baggage ;
    1. traceparent  主要包含TraceId,SpanId,
    2. baggage 是用户自行组装的内容。

OpenTelemetry 协议标准Http Header 头提取

  1. 从header 头中,使用 OpenTelemetry 传播对象的extract 方法,提取current_span的span_context,获取TraceId,SpanId
  2. 使用baggage.getall,获取header 头中的baggage 参数。

跨服务传播实现

  1. 在创建current_span的时候传递

    trace_context={"trace_id": trace_id, "parent_span_id": parent_span_id}

  2. 通过相同的 trace_id 和确认当前span 的父类Id,parent_span_id,此时即可实现跨服务传播的过程。

Langfuse实现方式(Java)

        langfuse 官网提供了 langfuse-java-sdk ,是基于langfuse的openAPI 自动生成的Java

端封装。但是官网有明确说明,Java 端建议使用OpenTelemetry-java-sdk 的方式去接入Langfuse。

基于(langfuse-java-sdk)

  • 创建 Langfuse 客户端
// 创建 Langfuse 客户端
        LangfuseClient client = LangfuseClient.builder()
                .url("https://localhost:3000") // 本地部署
                .credentials("public-key", "private-key") // 替换为您的 API 密钥
                .build();
  • 创建最外层的Trace-event
 // 1. 创建 Trace
TraceEvent traceEvent = TraceEvent.builder()
                .id(UUID.randomUUID().toString())
                .timestamp(timestamp)
                .body(TraceBody.builder()
                        .id(traceId)
                        .name("LLM Call Trace")
                        .userId("user-789")
                        .sessionId("session-101")
                        .input("User question about capitals")
                        .environment("production")
                        .build())
                .build();
  • 创建span
// 2. 创建 Span(数据预处理)
CreateSpanEvent preprocessingSpan = CreateSpanEvent.builder()
                .id(UUID.randomUUID().toString())
                .timestamp(timestamp)
                .body(CreateSpanBody.builder()
                        .id(UUID.randomUUID().toString())
                        .traceId(traceId)
                        .name("Preprocessing")
                        .input("User question: What is the capital of France?")
                        .output("Formatted prompt: What is the capital of France?")
                        .level(ObservationLevel.DEFAULT)
                        .startTime(OffsetDateTime.now(ZoneOffset.UTC))
                        .endTime(OffsetDateTime.now(ZoneOffset.UTC).plusSeconds(1))
                        .build())
                .build();
  • 创建Observation
    • 目前Java-SDK-Observation只支持 event,span,Generation(LLM调用) 三种类型
// 3. 创建 Generation(LLM 调用)
String generationId = UUID.randomUUID().toString();
CreateObservationEvent generationEvent = CreateObservationEvent.builder()
                .id(UUID.randomUUID().toString())
                .timestamp(timestamp)
                .body(ObservationBody.builder()
                        .type(ObservationType.GENERATION)  // 必需:设置观察类型
                        .id(generationId)
                        .traceId(traceId)
                        .name("OpenAI GPT-4 Call")
                        .input("What is the capital of France?")
                        .output("The capital of France is Paris.")
                        .model("gpt-4")
                        .modelParameters(createModelParameters())
                        .usage(createUsageForObservation())
                        .completionStartTime(OffsetDateTime.now(ZoneOffset.UTC))
                        .startTime(OffsetDateTime.now(ZoneOffset.UTC))
                        .endTime(OffsetDateTime.now(ZoneOffset.UTC).plusSeconds(2))
                        .level(ObservationLevel.DEFAULT)
                        .metadata(Map.of("provider", "openai", "temperature", 0.7))
                        .build())
                .build();
  • 批量上报
// 批量上报所有事件
IngestionRequest request = IngestionRequest.builder()
                .addBatch(IngestionEvent.traceCreate(traceEvent))
                .addBatch(IngestionEvent.spanCreate(preprocessingSpan))
                .addBatch(IngestionEvent.observationCreate(generationEvent))
                .addBatch(IngestionEvent.spanCreate(postprocessingSpan))
                .build();

// 执行批量上报
IngestionResponse response = client.ingestion().batch(request);
System.out.println("成功上报: " + response.getSuccesses().size());
System.out.println("失败数量: " + response.getErrors().size());
  • 更新 Trace
 //更新 Trace(使用相同的 traceId 但不同的事件 ID)
TraceEvent updateTraceEvent = TraceEvent.builder()
                .id(UUID.randomUUID().toString()) // 新的事件 ID
                .timestamp(OffsetDateTime.now(ZoneOffset.UTC).toString())
                .body(TraceBody.builder()
                        .id(traceId) // 相同的 traceId
                        .output("Updated output")
                        .metadata(Map.of("status", "completed", "updated_at", System.currentTimeMillis()))
                        .build())
                .build();

基于OpenTelemetry-java-sdk

初始化

SdkTracerProvider Clock(时钟) setClock(Clock clock) 设置用于生成时间戳的时钟 Clock.getDefault() -
IdGenerator(ID 生成器) setIdGenerator(IdGenerator idGenerator) 配置 Trace ID 和 Span ID 的生成逻辑 IdGenerator.random() 支持自定义实现
Resource(资源) setResource(Resource resource)、addResource(Resource resource) 设置 / 合并服务描述信息(如服务名、版本) Resource.getDefault() set = 覆盖,add = 合并
SpanLimits(Span 限制) setSpanLimits(SpanLimits)、setSpanLimits(Supplier<SpanLimits>) 限制 Span 的属性、事件、链接数量等 SpanLimits::getDefault 支持直接设置或通过 Supplier 延迟获取
Sampler(采样器) setSampler(Sampler sampler) 配置 Span 采样策略(决定哪些 Span 被记录) Sampler.parentBased(Sampler.alwaysOn()) 内置多种采样器(如 AlwaysOn、Probability)
SpanProcessor(处理器) addSpanProcessor(SpanProcessor) 添加 Span 生命周期处理器(支持多个),负责 Span 导出等逻辑 空列表 需配合具体 Processor 实现(如 BatchSpanProcessor)
BatchSpanProcessor 导出未采样 Span setExportUnsampledSpans(boolean) 是否导出未采样的 Span false 1.34.0+ 版本支持
调度延迟 setScheduleDelay(long, TimeUnit)、setScheduleDelay(Duration) 两次批量导出的时间间隔 5000 毫秒(5 秒) -
导出超时 setExporterTimeout(long, TimeUnit)、setExporterTimeout(Duration) 单次导出操作的最大超时时间 30000 毫秒(30 秒) 设为 0 则无超时(Long.MAX_VALUE)
最大队列大小 setMaxQueueSize(int) 队列缓存的最大 Span 数量,超限丢弃 2048 必须为正数
最大导出批次大小 setMaxExportBatchSize(int) 单次导出的最大 Span 数量 512 必须为正数,且不超过 maxQueueSize(超限自动调整)
OtlpHttpSpanExporter Endpoint(端点) setEndpoint(String endpoint) 设置 OTLP HTTP 导出的目标 URL "http://localhost:4318/v1/traces" 需符合 OTLP HTTP 协议格式
Timeout(超时时间) setTimeout(long, TimeUnit)、setTimeout(Duration) 设置 HTTP 请求超时时间 内部默认值(未明确) -
Compression(压缩) setCompression(String compressionMethod) 设置请求压缩方式 "none" 仅支持 "gzip" 或 "none"
Headers(HTTP 头) addHeader(String key, String value) 添加自定义 HTTP 请求头 可多次调用添加多个头
Trusted Certificates setTrustedCertificates(byte[] trustedCertificatesPem) 设置验证服务器证书的信任证书(PEM 格式) 系统默认信任库 字节数组为 PEM 格式内容
Client TLS(客户端 TLS) setClientTls(byte[] privateKeyPem, byte[] certificatePem) 设置客户端 TLS 认证的私钥和证书(PEM 格式) 用于双向 TLS 认证
SSL Context(SSL 上下文) setSslContext(SSLContext sslContext, X509TrustManager trustManager) 直接配置 SSL 上下文和信任管理器 优先级高于单独设置证书
Retry Policy(重试策略) setRetryPolicy(RetryPolicy retryPolicy) 配置导出失败时的重试逻辑 内部默认重试策略(未明确) 需配合 RetryPolicy 实现类
SdkTracerProvider Meter Provider(指标提供者) setMeterProvider(MeterProvider)、setMeterProvider(Supplier<MeterProvider>) 设置用于导出指标(metrics)的提供者 支持直接设置或通过 Supplier 延迟获取,关联指标采集能力

OTEL 上报方法

  • 初始化 OpenTelemetry SDK
 //初始化 OpenTelemetry SDK
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(tracerProvider)
                .setPropagators(contextPropagators)  // 设置 propagator
                .buildAndRegisterGlobal();
  • 初始化traceProvider
 // 配置 Tracer Provider(批量上报 Span,提升性能)
        tracerProvider = SdkTracerProvider.builder()
                .setResource(resource)
                .addSpanProcessor(
                        BatchSpanProcessor.builder(otlpExporter)
                                .setMaxExportBatchSize(512)
                                .setScheduleDelay(5, TimeUnit.SECONDS)
                                .build()
                )
                .build();
  • BatchSpanProcessor:批量上报Span,可以配置每次上报的最大batchSize、上报时间
  • Resource:配置资源(服务名称、版本、环境等)
// 配置资源(服务名称、版本、环境等)
        Resource resource = Resource.getDefault()
                .merge(Resource.create(Attributes.of(
                        AttributeKey.stringKey("service.name"), SERVICE_NAME,
                        AttributeKey.stringKey("service.version"), "1.0.0",
                        AttributeKey.stringKey("deployment.environment"), "dev"
                )));
  • 初始化OtlpHttpSpanExporter
 OtlpHttpSpanExporter otlpExporter = OtlpHttpSpanExporter.builder()
                .setEndpoint(fullEndpoint)
                .addHeader("Authorization", "Basic " + authString)
                .setTimeout(30, TimeUnit.SECONDS)
                .build();
/**
     * 生成 Basic Auth 认证头
     */
    private static String generateAuthHeader(String publicKey, String secretKey) {
        String credentials = publicKey + ":" + secretKey;
        return Base64.getEncoder().encodeToString(credentials.getBytes());
    }
  • 创建Span
/**
     * 示例:用户查询接口
     * 演示如何创建 Span 并设置 Langfuse 相关属性
     */
    public String getUserInfo(String userId) {
        // 1. 创建 Span(描述当前操作)
        Span span = tracer.spanBuilder("user-service.get-user-info") // Span 名称(建议:服务名.接口名)
                .startSpan();

        try (var scope = span.makeCurrent()) { // 绑定 Span 到当前线程
            // 设置 Langfuse Trace 级别属性(可选)
            span.setAttribute("langfuse.trace.name", "Get User Info");
            span.setAttribute("langfuse.user.id", userId);
            span.setAttribute("langfuse.trace.input", "userId: " + userId);

            // 2. 业务逻辑(模拟接口调用)
            String userInfo = fetchUserFromDB(userId);

            // 3. 记录 Span 结果(可选:添加输出、耗时等元数据)
            span.setAttribute("user.info", userInfo);
            span.setAttribute("langfuse.trace.output", userInfo);
            span.setStatus(StatusCode.OK); // 标记成功
            return userInfo;
        } catch (Exception e) {
            // 4. 异常处理(标记失败,记录异常信息)
            span.setStatus(StatusCode.ERROR, e.getMessage());
            span.recordException(e);
            span.setAttribute("langfuse.trace.output", "Error: " + e.getMessage());
            throw e;
        } finally {
            // 5. 结束 Span(必须调用,否则数据不会上报)
            span.end();
        }
    }
  • 创建子节点Span
/**
     * 模拟数据库查询
     * 演示如何创建子 Span(嵌套追踪)
     */
    private String fetchUserFromDB(String userId) {
        // 子 Span(可选:追踪内部调用,如 DB 查询、第三方 API)
        Span childSpan = tracer.spanBuilder("user-service.fetch-from-db")
                .startSpan();
        try (var scope = childSpan.makeCurrent()) {
            // 设置 Langfuse Observation 级别属性(可选)
            childSpan.setAttribute("langfuse.observation.type", "span");
            childSpan.setAttribute("langfuse.observation.input", "userId: " + userId);

            Thread.sleep(50); // 模拟耗时
            String result = "User{id=" + userId + ", name='test'}";
            
            childSpan.setAttribute("langfuse.observation.output", result);
            return result;
        } catch (InterruptedException e) {
            childSpan.setStatus(StatusCode.ERROR);
            childSpan.recordException(e);
            childSpan.setAttribute("langfuse.observation.status_message", e.getMessage());
            throw new RuntimeException(e);
        } finally {
            childSpan.end();
        }
    }
  • 实时推送
tracerProvider.forceFlush().join(10, TimeUnit.SECONDS);
  • 优雅关闭
tracerProvider.shutdown().join(10, TimeUnit.SECONDS);

Langfuse实现方式(python)

        我们可以直接使用 langfuse-python-sdk 实现 langfuse 的接入。

初始化

一、必填参数(无默认值,必须配置)

public_key LANGFUSE_PUBLIC_KEY Langfuse 项目的公开 API 密钥,用于身份识别,从项目「Settings → API Keys」获取。
secret_key LANGFUSE_SECRET_KEY Langfuse 项目的私有 API 密钥,用于权限校验,需妥善保管,避免泄露。

二、核心可选参数(常用配置,适配不同部署 / 网络场景)

base_url LANGFUSE_BASE_URL Langfuse 服务的 API 地址:- 云版本默认 https://cloud.langfuse.com;- 自部署版本需改为自身部署地址(https://cslangfuse.lenovo.com.cn
)。
"https://cloud.langfuse.com"
timeout LANGFUSE_TIMEOUT API 请求超时时间(单位:秒),用于控制网络请求阻塞时长,避免因服务不可用导致业务卡顿。 5
environment LANGFUSE_TRACING_ENVIRONMENT 追踪环境名称(如 developmentstagingproduction),用于区分不同环境的追踪数据,支持小写字母、数字、连字符(-)、下划线(_)。 "default"
release LANGFUSE_RELEASE 应用的版本号 / 代码哈希(如 v1.0.0a1b2c3d),用于按版本分组分析追踪数据(如对比不同版本的 LLM 调用成本)。 -(无默认)
sample_rate LANGFUSE_SAMPLE_RATE 追踪采样率(取值范围 0.0~1.0):- 1.0 表示 100% 全量采样;- 0.5 表示采样 50% 追踪数据,适用于高并发场景降低数据量。 1.0

三、进阶配置参数(控制数据上报 / 调试 / 敏感数据处理)

flush_at LANGFUSE_FLUSH_AT 批量上报阈值:累计达到该数量的 Span 后,自动批量发送到 Langfuse 服务,减少网络请求次数(性能优化)。 512
flush_interval LANGFUSE_FLUSH_INTERVAL 批量上报间隔(单位:秒):即使未达到 flush_at 阈值,每隔该时间也会自动上报一次,避免数据堆积。 5
debug LANGFUSE_DEBUG 开启调试模式:输出更详细的日志(如请求参数、响应状态),用于排查客户端与服务端的连接问题,设置为 True 或 "True" 生效。 False
tracing_enabled LANGFUSE_TRACING_ENABLED 启用 / 禁用追踪功能:设置为 False 时,所有 Langfuse 观测调用都会变成 “空操作”(不上报数据),适用于本地开发、测试等无需追踪的场景。 True
httpx_client -(仅代码参数) 自定义 httpx.Client 实例,用于发起非追踪相关的 HTTP 请求(如自定义请求头、代理、证书配置)。 -(默认自动创建)
mask -(仅代码参数) 敏感数据脱敏函数:接收原始数据(Any 类型),返回脱敏后的数据,用于过滤追踪中的密码、手机号等敏感信息(如替换手机号为 ****)。 -(无默认,不脱敏)
media_upload_thread_count LANGFUSE_MEDIA_UPLOAD_THREAD_COUNT 媒体文件上传线程数:处理图片、音频等多模态数据上传的后台线程数量,调整为更高值可提升多模态数据上报效率。 1
LANGFUSE_MEDIA_UPLOAD_ENABLED LANGFUSE_MEDIA_UPLOAD_ENABLED 是否允许上传媒体文件到 Langfuse S3 存储:自部署环境若无需多模态数据存储,可设置为 False 禁用。 -(默认启用)

Python SDK Method

tracing相关

start_span():

  • 创建新的 span,但不自动设置为当前 span

  • 需要手动调用 .end() 结束

start_as_current_span():

  • 创建 span 并自动设置为当前 span(上下文管理器)

  • 退出时自动结束,适合 with 语句

start_observation():

  • 创建指定类型的 observation(span, generation, agent, tool 等)

  • 通过 as_type 参数指定类型

start_as_current_observation():

  • 创建并设置为当前 observation(上下文管理器)

  • 支持多种类型:span, generation, agent, tool, chain 等

update_current_span():更新当前活动的 span 信息

update_current_trace():更新当前 trace 的元数据(用户 ID、会话 ID、标签等)

create_trace_id():生成唯一的 trace ID(32 位十六进制字符串)

create_observation_id():生成唯一的 observation ID(16 位十六进制字符串)

get_current_trace_id():获取当前活动 span 的 trace ID

get_current_observation_id():获取当前活动 span 的 observation ID

create_event():创建 EVENT 类型的 observation(瞬时事件,立即结束)

工具方法

flush():强制刷新所有待发送的数据到 Langfuse API

shutdown():优雅关闭客户端,确保数据已发送

get_trace_url():获取在 Langfuse UI 中查看 trace 的 URL

resolve_media_references():将媒体引用字符串替换为 base64 数据 URI

auth_check():检查提供的凭证是否有效

基于LangChain 框架

  • 使用方式:初始化CallbackHandler并将其添加到您的 Langchain 调用中,可以全局添加,也可以按调用添加。
  • 原理:回调处理函数会将各种 Langchain 事件映射到 Langfuse 观测值,Langchain事件包括:
  • Chains (on_chain_starton_chain_endon_chain_error): Traced as spans.
  • LLMs (on_llm_starton_llm_endon_llm_erroron_chat_model_start): Traced as generations, capturing model name, prompts, responses, and usage if available from the LLM provider.
  • Tools (on_tool_starton_tool_endon_tool_error): Traced as spans, capturing tool input and output.
  • Retrievers (on_retriever_starton_retriever_endon_retriever_error): Traced as spans, capturing the query and retrieved documents.
  • Agents (on_agent_actionon_agent_finish): Agent actions and final finishes are captured within their parent chain/agent span.

拓展方法

propagate_attributes():将属性拓展到子节点

  • 值必须是长度不超过 200 个字符的字符串。
  • 元数据键:仅限字母数字字符(不含空格或特殊字符)
  • 在跟踪初期就进行调用,以确保涵盖所有观测结果。这样可以确保 Langfuse 中的所有指标都准确无误。

跨业务传播

        对于跨多个服务的分布式追踪,请使用as_baggage参数(更多详细信息请参阅OpenTelemetry 文档)通过 HTTP 标头传播属性。

将新生成的观测数据(如 Span)关联到外部已存在的追踪(Trace)

  • 适用场景:当你拥有外部来源的 trace_id(可选 parent_span_id)时,需要将 Langfuse 中新建的 Span 关联到这个已有追踪上。例如:外部服务、批处理任务已生成了追踪 ID,现在要在 Langfuse 中记录该任务下游操作的 Span,并让它归属到同一个追踪链路中。
  • 前提说明:OpenTelemetry 本身支持 “已接入 OTEL 的服务间” 自动传递追踪上下文,无需手动处理;该方法仅用于对接未自动传递上下文的外部系统,或需要手动关联追踪的特殊场景。

参考文献

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐