Skip to Content

21d - Langfuse 设置指南

本文是《AI Agent 实战手册》第 21 章第 4 节。 上一节:21c-LangSmith设置指南 | 下一节:21e-成本优化策略

⏱ 阅读时间:70 分钟 | 难度:⭐⭐⭐⭐ 中高级 | 前置知识:Docker 基础、Python/TypeScript 开发经验、LLM 应用开发经验

概述

Langfuse 是一个开源优先的 LLM 工程平台,提供端到端的追踪、Prompt 管理、评估工作流和成本追踪能力。2026 年 1 月被 ClickHouse 收购后,Langfuse 在数据处理性能上获得了质的飞跃——从 PostgreSQL 迁移到 ClickHouse 后,查询延迟从分钟级降至近实时,分析查询速度提升 20 倍。本节将从零开始,逐步引导你完成 Langfuse 的自托管部署、SDK 集成、成本追踪、Prompt 管理、评估工作流,以及与主流框架的集成。


1. Langfuse 概览与定价

1.1 平台定位与发展动态

Langfuse 是一个框架无关的开源 LLM 可观测性平台,核心理念是”开源优先、自托管友好”。它帮助开发者追踪 LLM 调用链路、管理 Prompt 版本、评估输出质量、监控成本——所有功能在自托管模式下完全免费。

关键里程碑:

  • 2023 年:Langfuse 开源发布,MIT 协议
  • 2024 年 12 月:发布 v3 架构,引入 ClickHouse + Redis + S3 的新后端
  • 2025 年 5 月:Python SDK v3 GA,基于 OpenTelemetry 标准重构
  • 2025 年 8 月:TypeScript SDK v4 GA,基于 OpenTelemetry JS v2 重构
  • 2026 年 1 月:被 ClickHouse 以 $400M Series D 的一部分收购,GitHub Stars 超 16,600

工具推荐

工具用途价格适用场景
Langfuse 自托管完整 LLM 可观测性平台免费(MIT 开源)数据主权要求高、预算有限的团队
Langfuse Cloud Core托管版基础方案$29/月小团队快速启动
Langfuse Cloud Pro托管版专业方案$199/月中型团队、高速率限制
Langfuse Enterprise企业级方案定制报价大型企业、合规认证、专属支持
Docker容器化部署免费自托管部署基础设施
Kubernetes + Helm生产级编排免费(开源)高可用生产部署

1.2 v3 架构概览

Langfuse v3 采用了全新的后端架构,由以下组件构成:

┌─────────────────────────────────────────────────────────┐ │ Langfuse v3 架构 │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Langfuse Web │ │ Langfuse │ │ │ │ (UI + API) │ │ Worker │ │ │ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ ┌────▼───────────────────▼────┐ │ │ │ Redis / Valkey │ ← 队列 + 缓存 │ │ └────┬───────────────────┬───┘ │ │ │ │ │ │ ┌──────▼───────┐ ┌──────▼───────┐ ┌─────────────┐ │ │ │ PostgreSQL │ │ ClickHouse │ │ S3 / Blob │ │ │ │ (事务数据) │ │ (分析数据) │ │ (事件存储) │ │ │ └──────────────┘ └──────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────┘

组件说明:

组件作用说明
Langfuse Web主应用容器提供 UI 界面和 API 服务
Langfuse Worker异步处理容器异步处理事件、执行评估
PostgreSQL事务数据库存储用户、项目、Prompt 等事务数据
ClickHouse分析数据库存储 traces、observations、scores 等分析数据
Redis/Valkey缓存和队列事件队列、API Key 缓存、Prompt 缓存
S3/Blob Store对象存储持久化所有传入事件、多模态输入、大型导出

2. 自托管部署:Docker Compose

操作步骤

步骤 1:环境准备

确保你的服务器满足以下最低要求:

资源最低要求推荐配置
CPU2 vCPU4 vCPU
内存8 GB RAM16 GB RAM
存储50 GB SSD100+ GB SSD
Docker20.10+最新稳定版
Docker Composev2.0+最新稳定版
# 验证 Docker 和 Docker Compose 版本 docker --version docker compose version

步骤 2:克隆仓库并启动

# 克隆 Langfuse 仓库 git clone https://github.com/langfuse/langfuse.git cd langfuse # 生成加密密钥(必须) export ENCRYPTION_KEY=$(openssl rand -hex 32) echo "ENCRYPTION_KEY=$ENCRYPTION_KEY" >> .env # 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps

启动后,访问 http://localhost:3000 即可看到 Langfuse UI。

步骤 3:配置核心环境变量

创建 .env 文件,配置以下关键变量:

# ===== 必需配置 ===== # 加密密钥(用于加密 API Key 等敏感数据) ENCRYPTION_KEY=your_generated_hex_key_here # 数据库连接 DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres # ClickHouse 连接 CLICKHOUSE_URL=http://clickhouse:8123 CLICKHOUSE_USER=default CLICKHOUSE_PASSWORD=your_clickhouse_password # Redis 连接 REDIS_CONNECTION_STRING=redis://redis:6379 # S3/MinIO 对象存储 LANGFUSE_S3_EVENT_UPLOAD_BUCKET=langfuse LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT=http://minio:9000 LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID=minioadmin LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=minioadmin LANGFUSE_S3_EVENT_UPLOAD_REGION=us-east-1 LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE=true # ===== 可选配置 ===== # 应用 URL(生产环境必须设置) NEXTAUTH_URL=https://langfuse.your-domain.com NEXTAUTH_SECRET=$(openssl rand -base64 32) # 邮件配置(用于邀请和通知) SMTP_CONNECTION_URL=smtp://user:password@smtp.example.com:587 EMAIL_FROM_ADDRESS=langfuse@your-domain.com # 禁用注册(生产环境推荐) AUTH_DISABLE_SIGNUP=false # 日志级别 LOG_LEVEL=info

步骤 4:验证部署

# 检查所有容器是否正常运行 docker compose ps # 查看 Web 容器日志 docker compose logs langfuse-web --tail 50 # 查看 Worker 容器日志 docker compose logs langfuse-worker --tail 50 # 健康检查 curl http://localhost:3000/api/public/health

提示词模板

你是一个 DevOps 工程师,请帮我生成 Langfuse 自托管部署的配置方案: 部署环境:[本地开发 / AWS EC2 / GCP GCE / Azure VM / Kubernetes] 团队规模:[1-3 人 / 5-10 人 / 10+ 人] 日均 trace 量:[1,000 / 10,000 / 100,000+] 数据保留期:[7 天 / 30 天 / 90 天 / 永久] 安全要求:[基础 / 需要 HTTPS / 需要 SSO / 需要网络隔离] 请输出: 1. 完整的 docker-compose.yml 配置 2. 环境变量配置文件 .env 3. Nginx 反向代理配置(如需 HTTPS) 4. 备份策略建议 5. 监控告警配置建议

3. 自托管部署:Kubernetes (Helm)

操作步骤

步骤 1:添加 Helm 仓库

# 添加 Langfuse Helm 仓库 helm repo add langfuse https://langfuse.github.io/langfuse-k8s helm repo update

步骤 2:创建 values.yaml

# values.yaml - Langfuse Kubernetes 部署配置 langfuse: web: replicas: 2 resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "2" memory: "4Gi" worker: replicas: 2 resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "2" memory: "4Gi" # 使用内置 PostgreSQL(测试用) postgresql: enabled: true auth: password: "your-secure-password" # 使用内置 ClickHouse(测试用) clickhouse: enabled: true auth: password: "your-clickhouse-password" # 使用内置 Redis redis: enabled: true # 使用内置 MinIO(S3 兼容存储) minio: enabled: true # Ingress 配置 ingress: enabled: true className: nginx hosts: - host: langfuse.your-domain.com paths: - path: / pathType: Prefix tls: - secretName: langfuse-tls hosts: - langfuse.your-domain.com

步骤 3:部署

# 创建命名空间 kubectl create namespace langfuse # 创建加密密钥 Secret kubectl create secret generic langfuse-secrets \ --namespace langfuse \ --from-literal=ENCRYPTION_KEY=$(openssl rand -hex 32) \ --from-literal=NEXTAUTH_SECRET=$(openssl rand -base64 32) # 安装 Langfuse helm install langfuse langfuse/langfuse \ --namespace langfuse \ --values values.yaml # 查看部署状态 kubectl get pods -n langfuse

步骤 4:生产环境建议

对于生产环境,建议使用外部托管的数据库服务:

# values-production.yaml # 使用外部 PostgreSQL(如 AWS RDS、Cloud SQL) postgresql: enabled: false langfuse: extraEnv: - name: DATABASE_URL valueFrom: secretKeyRef: name: langfuse-db-secrets key: database-url # 使用外部 ClickHouse(如 ClickHouse Cloud) clickhouse: enabled: false langfuse: extraEnv: - name: CLICKHOUSE_URL value: "https://your-instance.clickhouse.cloud:8443" - name: CLICKHOUSE_USER value: "default" - name: CLICKHOUSE_PASSWORD valueFrom: secretKeyRef: name: langfuse-ch-secrets key: password # 使用外部 Redis(如 ElastiCache、Memorystore) redis: enabled: false langfuse: extraEnv: - name: REDIS_CONNECTION_STRING valueFrom: secretKeyRef: name: langfuse-redis-secrets key: connection-string

4. Python SDK 安装与集成

操作步骤

步骤 1:安装 SDK

# 使用 pip(推荐 v3,基于 OpenTelemetry) pip install langfuse # 使用 poetry poetry add langfuse # 安装特定集成 pip install langfuse langchain langchain-openai # LangChain 集成 pip install langfuse llama-index # LlamaIndex 集成

步骤 2:配置环境变量

# .env 文件 LANGFUSE_PUBLIC_KEY=pk-lf-xxx # 项目公钥 LANGFUSE_SECRET_KEY=sk-lf-xxx # 项目密钥 LANGFUSE_HOST=https://cloud.langfuse.com # 云版地址(自托管改为你的地址)
# 或在代码中配置 import os os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-xxx" os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-xxx" os.environ["LANGFUSE_HOST"] = "http://localhost:3000" # 自托管地址

步骤 3:使用 @observe() 装饰器追踪

@observe() 是 Langfuse Python SDK 的核心追踪机制,灵感来自 Sentry 和 Modal 的开发者体验设计:

from langfuse.decorators import observe from langfuse.openai import openai # Langfuse 包装的 OpenAI 客户端 @observe() def retrieve_context(query: str) -> str: """检索相关上下文——自动记录为子 span""" # 实际项目中调用向量数据库 return "Langfuse 是一个开源 LLM 可观测性平台..." @observe() def generate_answer(query: str, context: str) -> str: """生成回答——OpenAI 调用自动追踪""" response = openai.chat.completions.create( model="gpt-4.1-mini", messages=[ {"role": "system", "content": f"基于以下上下文回答:\n{context}"}, {"role": "user", "content": query} ] ) return response.choices[0].message.content @observe() def rag_pipeline(query: str) -> str: """RAG 管线——自动创建完整的 trace 树""" context = retrieve_context(query) # 子 span 1 answer = generate_answer(query, context) # 子 span 2 return answer # 执行——trace 自动上报到 Langfuse result = rag_pipeline("什么是 Langfuse?") print(result)

在 Langfuse UI 中,你会看到如下 trace 结构:

📊 Trace: rag_pipeline ├── 🔍 retrieve_context (耗时: 0.1s) └── 🤖 generate_answer (耗时: 2.3s) └── 💬 ChatCompletion (gpt-4.1-mini, Token: 523)

步骤 4:手动 Span 创建(更精细的控制)

from langfuse.decorators import observe, langfuse_context @observe() def complex_agent(query: str) -> str: # 获取当前观测对象,添加元数据 langfuse_context.update_current_observation( metadata={"user_id": "user_123", "session_id": "sess_456"}, tags=["production", "customer-service"] ) # 手动记录自定义事件 langfuse_context.update_current_trace( user_id="user_123", session_id="sess_456", metadata={"environment": "production"} ) # 使用 start_as_current_observation 创建手动 span with langfuse_context.start_as_current_observation( name="custom-processing", metadata={"step": "preprocessing"} ): # 这里的代码会被记录在 custom-processing span 下 processed_query = query.strip().lower() return generate_answer(processed_query, "context...") # 手动记录分数(用户反馈) langfuse_context.score_current_trace( name="user-feedback", value=1.0, comment="用户点击了👍" )

步骤 5:OpenAI SDK 直接集成

Langfuse 提供了 OpenAI SDK 的直接包装,无需装饰器即可追踪所有 OpenAI 调用:

# 方法 1:导入替换(推荐) from langfuse.openai import openai # 所有 openai 调用自动追踪 response = openai.chat.completions.create( model="gpt-4.1-mini", messages=[{"role": "user", "content": "你好"}], # Langfuse 特有参数 langfuse_prompt=my_prompt, # 关联 Prompt 版本 name="greeting", # 自定义 span 名称 metadata={"feature": "chat"} ) # 方法 2:包装现有客户端 from langfuse.openai import OpenAI client = OpenAI() # 自动追踪

5. TypeScript/JavaScript SDK 安装与集成

操作步骤

步骤 1:安装 SDK

# npm(v4 基于 OpenTelemetry JS v2) npm install langfuse # pnpm pnpm add langfuse # yarn yarn add langfuse

步骤 2:配置环境变量

LANGFUSE_PUBLIC_KEY=pk-lf-xxx LANGFUSE_SECRET_KEY=sk-lf-xxx LANGFUSE_BASEURL=https://cloud.langfuse.com

步骤 3:基础追踪

import { Langfuse } from "langfuse"; import { observeOpenAI } from "langfuse"; import OpenAI from "openai"; // 初始化 Langfuse const langfuse = new Langfuse({ publicKey: process.env.LANGFUSE_PUBLIC_KEY!, secretKey: process.env.LANGFUSE_SECRET_KEY!, baseUrl: process.env.LANGFUSE_BASEURL, }); // 包装 OpenAI 客户端 const openai = observeOpenAI(new OpenAI(), { clientInitParams: { publicKey: process.env.LANGFUSE_PUBLIC_KEY!, secretKey: process.env.LANGFUSE_SECRET_KEY!, }, }); // 所有 OpenAI 调用自动追踪 const response = await openai.chat.completions.create({ model: "gpt-4.1-mini", messages: [ { role: "system", content: "你是一个有帮助的助手。" }, { role: "user", content: "什么是 Langfuse?" }, ], }); console.log(response.choices[0].message.content);

步骤 4:手动创建 Trace 和 Span

import { Langfuse } from "langfuse"; const langfuse = new Langfuse(); async function ragPipeline(query: string): Promise<string> { // 创建 trace const trace = langfuse.trace({ name: "rag-pipeline", userId: "user_123", sessionId: "sess_456", metadata: { environment: "production" }, tags: ["rag", "customer-service"], }); // 创建检索 span const retrievalSpan = trace.span({ name: "knowledge-retrieval", input: { query }, }); const context = await retrieveDocuments(query); retrievalSpan.end({ output: { context } }); // 创建生成 span(记录为 generation 类型) const generation = trace.generation({ name: "answer-generation", model: "gpt-4.1-mini", input: [ { role: "system", content: `上下文:${context}` }, { role: "user", content: query }, ], }); const answer = await callLLM(query, context); generation.end({ output: answer, usage: { input: 150, output: 80, unit: "TOKENS" }, }); // 记录用户反馈 trace.score({ name: "helpfulness", value: 0.9, comment: "回答准确且有帮助", }); return answer; }

步骤 5:Vercel AI SDK 集成

import { Langfuse } from "langfuse"; import { streamText } from "ai"; import { openai } from "@ai-sdk/openai"; const langfuse = new Langfuse(); const trace = langfuse.trace({ name: "vercel-ai-chat" }); const generation = trace.generation({ name: "stream-response", model: "gpt-4.1-mini", }); const result = await streamText({ model: openai("gpt-4.1-mini"), prompt: "用一句话解释 AgentOps", }); generation.end({ output: await result.text, }); // 确保所有事件发送完毕 await langfuse.flushAsync();

6. OpenTelemetry 集成

6.1 为什么选择 OpenTelemetry

Langfuse Python SDK v3 和 TypeScript SDK v4 均基于 OpenTelemetry 标准重构。这意味着:

  • 无供应商锁定:使用标准 OTel 协议,未来可轻松迁移
  • 生态兼容:与现有 OTel 基础设施(Jaeger、Zipkin、Datadog)无缝集成
  • 自动插桩:利用 OTel 社区的自动插桩库追踪更多框架

操作步骤

步骤 1:Python OpenTelemetry 集成

# 安装依赖 # pip install langfuse opentelemetry-sdk from langfuse import get_client # Langfuse SDK v3 自动基于 OTel 运行 # 只需配置环境变量即可 import os os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-xxx" os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-xxx" os.environ["LANGFUSE_HOST"] = "http://localhost:3000" # @observe 装饰器内部使用 OTel span from langfuse.decorators import observe @observe() def my_function(): # 自动创建 OTel span 并转换为 Langfuse observation pass

步骤 2:将现有 OTel 数据发送到 Langfuse

如果你已有 OpenTelemetry 基础设施,可以将 span 数据直接发送到 Langfuse:

from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # 配置 Langfuse 作为 OTel 后端 exporter = OTLPSpanExporter( endpoint="http://localhost:3000/api/public/otel/v1/traces", headers={ "Authorization": "Basic <base64(public_key:secret_key)>" } ) provider = TracerProvider() provider.add_span_processor(BatchSpanProcessor(exporter)) trace.set_tracer_provider(provider) # 使用标准 OTel API 创建 span tracer = trace.get_tracer("my-app") with tracer.start_as_current_span("my-operation") as span: span.set_attribute("langfuse.type", "generation") span.set_attribute("gen_ai.usage.input_tokens", 150) span.set_attribute("gen_ai.usage.output_tokens", 80) # 你的业务逻辑 pass

步骤 3:TypeScript OpenTelemetry 集成

// TypeScript SDK v4 同样基于 OTel JS v2 import { NodeSDK } from "@opentelemetry/sdk-node"; import { LangfuseExporter } from "langfuse"; const sdk = new NodeSDK({ traceExporter: new LangfuseExporter({ publicKey: process.env.LANGFUSE_PUBLIC_KEY!, secretKey: process.env.LANGFUSE_SECRET_KEY!, baseUrl: process.env.LANGFUSE_BASEURL, }), }); sdk.start();

7. 成本追踪与预算管理

7.1 自动成本计算

Langfuse 内置了主流模型的价格表,自动根据 Token 用量计算成本。支持的模型包括 OpenAI、Anthropic、Google、Mistral 等 100+ 模型。

操作步骤

步骤 1:查看成本仪表板

1. 登录 Langfuse UI → 选择项目 2. 进入 "Dashboard" 页面 3. 查看以下核心成本指标: - 总成本趋势(按天/周/月) - 按模型的成本分布 - 按用户的成本分布 - 按 trace 名称的成本分布 - 平均每次交互成本

步骤 2:手动记录 Token 用量和成本

当使用自定义模型或 Langfuse 未内置价格的模型时,手动记录用量:

from langfuse.decorators import observe, langfuse_context @observe(as_type="generation") def custom_model_call(prompt: str) -> str: # 调用自定义模型 result = call_my_model(prompt) # 手动记录用量 langfuse_context.update_current_observation( model="my-custom-model-v2", usage={ "input": 250, # 输入 token 数 "output": 120, # 输出 token 数 "unit": "TOKENS", "input_cost": 0.0025, # 输入成本(美元) "output_cost": 0.0036, # 输出成本(美元) "total_cost": 0.0061 # 总成本(美元) } ) return result
// TypeScript 版本 const generation = trace.generation({ name: "custom-model-call", model: "my-custom-model-v2", input: prompt, }); const result = await callMyModel(prompt); generation.end({ output: result, usage: { input: 250, output: 120, unit: "TOKENS", inputCost: 0.0025, outputCost: 0.0036, totalCost: 0.0061, }, });

步骤 3:自定义模型价格配置

在 Langfuse UI 中配置自定义模型的价格:

1. 进入 Settings → Model Prices 2. 点击 "Add Model Price" 3. 配置: - Model Name: my-custom-model-v2 - Match Pattern: my-custom-model-*(支持通配符) - Input Price: $0.01 / 1K tokens - Output Price: $0.03 / 1K tokens 4. 保存——后续所有匹配的 generation 自动计算成本

步骤 4:成本分析 API

from langfuse import Langfuse langfuse = Langfuse() # 获取项目的每日成本统计 # 通过 Langfuse UI 的 Dashboard 查看更直观 # 或使用 API 导出数据进行自定义分析 # 按用户统计成本(通过 trace 的 user_id 字段) traces = langfuse.get_traces( user_id="user_123", limit=100 ) total_cost = sum( t.total_cost for t in traces.data if t.total_cost is not None ) print(f"用户 user_123 的总成本: ${total_cost:.4f}")

提示词模板

你是一个 AI 成本分析师。请根据以下 Langfuse 成本数据,生成优化建议: ## 当前成本数据 - 日均 LLM 调用次数:[数量] - 月度总成本:$[金额] - 主要模型使用分布:[GPT-4o: X%, GPT-4o-mini: Y%, Claude 3.5: Z%] - 平均每次交互 Token 数:输入 [N] / 输出 [M] - 成本最高的 trace 类型:[类型名称] ## 请分析 1. 成本异常点识别(哪些调用成本不合理?) 2. 模型降级建议(哪些场景可以用更便宜的模型?) 3. Prompt 优化建议(如何减少 Token 消耗?) 4. 缓存策略建议(哪些查询适合缓存?) 5. 预计优化后的月度成本

8. Prompt 管理与版本控制

8.1 Prompt 管理概述

Langfuse 的 Prompt 管理功能允许你将 Prompt 与代码分离,支持版本控制、标签管理和生产部署。SDK 内置客户端缓存机制——Prompt 在首次获取后缓存在本地,后续只在后台静默刷新,确保零延迟。

操作步骤

步骤 1:在 UI 中创建 Prompt

1. 左侧菜单选择 "Prompts" 2. 点击 "New Prompt" 3. 选择类型:Text(纯文本)或 Chat(消息数组) 4. 输入名称(如 "customer-service-v1") 5. 编写 Prompt 内容,使用 {{变量名}} 标记占位符 6. 配置模型参数(temperature、max_tokens 等) 7. 添加标签(如 "production"、"staging") 8. 点击 "Save" 保存

步骤 2:通过 SDK 获取和使用 Prompt

from langfuse import Langfuse langfuse = Langfuse() # 获取最新版本的 Prompt prompt = langfuse.get_prompt("customer-service-v1") # 获取特定标签的 Prompt(如生产版本) prompt = langfuse.get_prompt("customer-service-v1", label="production") # 获取特定版本 prompt = langfuse.get_prompt("customer-service-v1", version=3) # 编译 Prompt(替换变量) compiled = prompt.compile( role="客服专家", language="中文", knowledge_base="电商退货政策..." ) # 在 LLM 调用中使用,并关联 Prompt 版本 from langfuse.openai import openai response = openai.chat.completions.create( model="gpt-4.1-mini", messages=[{"role": "user", "content": compiled}], langfuse_prompt=prompt # 关联 Prompt 版本到 trace )
// TypeScript 版本 import { Langfuse } from "langfuse"; const langfuse = new Langfuse(); // 获取 Chat 类型的 Prompt const prompt = await langfuse.getPrompt("customer-service-v1", undefined, { label: "production", }); // 编译并使用 const messages = prompt.compile({ role: "客服专家", language: "中文", }); // 在 generation 中关联 Prompt const generation = trace.generation({ name: "customer-service", prompt: prompt, // 自动关联版本 input: messages, });

步骤 3:Prompt 版本管理工作流

推荐的 Prompt 版本管理流程: 1. 开发阶段: - 在 Playground 中迭代测试 Prompt - 每次修改自动创建新版本(v1, v2, v3...) 2. 测试阶段: - 给候选版本添加 "staging" 标签 - 在测试环境中使用 label="staging" 获取 - 运行评估数据集验证质量 3. 发布阶段: - 验证通过后,将标签改为 "production" - 生产环境使用 label="production" 获取 - SDK 自动缓存,零停机切换 4. 回滚: - 将 "production" 标签移回上一个版本 - SDK 后台刷新缓存,自动回滚

9. 评估工作流

9.1 评估概述

Langfuse 支持多种评估方式:手动标注、自定义评估函数、LLM-as-Judge 自动评估。评估结果以 Score 的形式关联到 Trace,用于质量监控和持续改进。

操作步骤

步骤 1:手动评分(用户反馈)

from langfuse.decorators import observe, langfuse_context @observe() def chatbot(query: str) -> str: answer = generate_answer(query) # 记录用户反馈分数 langfuse_context.score_current_trace( name="user-feedback", value=1, # 1 = 正面,0 = 负面 comment="用户点击了👍" ) # 记录多维度评分 langfuse_context.score_current_trace( name="helpfulness", value=0.8, comment="回答基本有帮助但缺少细节" ) langfuse_context.score_current_trace( name="accuracy", value=1.0, comment="事实准确" ) return answer

步骤 2:自定义评估函数

from langfuse import Langfuse langfuse = Langfuse() # 创建评估数据集 dataset = langfuse.create_dataset( name="customer-service-eval", description="客服机器人评估数据集" ) # 添加评估样本 langfuse.create_dataset_item( dataset_name="customer-service-eval", input={"question": "如何退款?"}, expected_output={"answer": "您可以在订单页面点击'申请退款'按钮,7天内无理由退货。"} ) langfuse.create_dataset_item( dataset_name="customer-service-eval", input={"question": "配送需要多久?"}, expected_output={"answer": "标准配送3-5个工作日,加急配送1-2个工作日。"} ) # 运行评估 dataset = langfuse.get_dataset("customer-service-eval") for item in dataset.items: # 调用你的 Agent with item.observe(run_name="eval-v2.1") as trace_id: result = my_agent(item.input["question"]) # 计算评分 expected = item.expected_output["answer"] # 简单的关键词匹配评估(实际项目中用 LLM-as-Judge) score = 1.0 if any(kw in result for kw in ["退款", "退货", "配送", "工作日"]) else 0.0 # 记录评分 langfuse.score( trace_id=trace_id, name="keyword-match", value=score )

步骤 3:LLM-as-Judge 自动评估

from langfuse.decorators import observe from langfuse.openai import openai @observe() def llm_judge_evaluate(question: str, expected: str, actual: str) -> float: """使用 LLM 作为评判者""" response = openai.chat.completions.create( model="gpt-4.1-mini", temperature=0, messages=[{ "role": "user", "content": f"""请评估以下回答的质量(返回 0-1 之间的数字): 问题:{question} 参考答案:{expected} 实际回答:{actual} 评分标准: - 1.0:完全正确且有帮助 - 0.7:基本正确但有遗漏 - 0.3:部分正确但有误导 - 0.0:完全错误 请只返回一个数字。""" }] ) return float(response.choices[0].message.content.strip()) # 在评估循环中使用 for item in dataset.items: with item.observe(run_name="eval-llm-judge") as trace_id: result = my_agent(item.input["question"]) score = llm_judge_evaluate( item.input["question"], item.expected_output["answer"], result ) langfuse.score(trace_id=trace_id, name="llm-judge", value=score)

步骤 4:在 UI 中查看评估结果

1. 进入 "Datasets" → 选择数据集 2. 查看各 run 的评分对比 3. 点击具体 run 查看每个样本的详细评分 4. 对比不同版本(如 v2.0 vs v2.1)的评分趋势 5. 导出评估报告

10. 框架集成

10.1 LangChain / LangGraph 集成

Langfuse SDK 自动捕获 LangChain 执行的详细 trace,为 chains、LLMs、tools 和 retrievers 创建正确嵌套的 observations。

# 安装 # pip install langfuse langchain langchain-openai import os os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-xxx" os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-xxx" os.environ["LANGFUSE_HOST"] = "http://localhost:3000" from langfuse.langchain import CallbackHandler # 创建 Langfuse 回调处理器 langfuse_handler = CallbackHandler() # 在 LangChain 调用中使用 from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate llm = ChatOpenAI(model="gpt-4.1-mini") prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个有帮助的助手。"), ("user", "{input}") ]) chain = prompt | llm # 传入回调——自动追踪整个 chain response = chain.invoke( {"input": "什么是 AgentOps?"}, config={"callbacks": [langfuse_handler]} )

LangGraph 多 Agent 追踪:

from langgraph.graph import StateGraph, START, END from langfuse.langchain import CallbackHandler langfuse_handler = CallbackHandler() # 构建 LangGraph(省略节点定义) app = graph.compile() # 执行时传入回调——每个节点自动记录为子 span result = app.invoke( {"messages": ["分析 AgentOps 趋势"]}, config={"callbacks": [langfuse_handler]} )

10.2 LlamaIndex 集成

# 安装 # pip install langfuse llama-index from langfuse.llama_index import LlamaIndexInstrumentor # 初始化插桩器 instrumentor = LlamaIndexInstrumentor() instrumentor.start() # 所有 LlamaIndex 操作自动追踪 from llama_index.core import VectorStoreIndex, SimpleDirectoryReader documents = SimpleDirectoryReader("data").load_data() index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() # 这个查询的完整链路(检索 + 生成)自动记录到 Langfuse response = query_engine.query("什么是 RAG?") # 停止插桩 instrumentor.stop()

10.3 OpenAI SDK 直接集成

# Python:使用 Langfuse 包装的 OpenAI from langfuse.openai import openai # 所有调用自动追踪,包括: # - Token 用量 # - 延迟 # - 流式响应的首 Token 时间 # - API 错误 # - 模型参数 # 普通调用 response = openai.chat.completions.create( model="gpt-4.1-mini", messages=[{"role": "user", "content": "你好"}] ) # 流式调用(自动追踪 time-to-first-token) stream = openai.chat.completions.create( model="gpt-4.1-mini", messages=[{"role": "user", "content": "写一首诗"}], stream=True ) for chunk in stream: print(chunk.choices[0].delta.content or "", end="")
// TypeScript:使用 observeOpenAI 包装 import { observeOpenAI } from "langfuse"; import OpenAI from "openai"; const openai = observeOpenAI(new OpenAI()); const response = await openai.chat.completions.create({ model: "gpt-4.1-mini", messages: [{ role: "user", content: "你好" }], });

10.4 Anthropic SDK 集成

from langfuse.decorators import observe from anthropic import Anthropic client = Anthropic() @observe(as_type="generation") def call_claude(prompt: str) -> str: response = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=1024, messages=[{"role": "user", "content": prompt}] ) # 手动记录用量(Anthropic SDK 不自动捕获) from langfuse.decorators import langfuse_context langfuse_context.update_current_observation( model="claude-sonnet-4-20250514", usage={ "input": response.usage.input_tokens, "output": response.usage.output_tokens, "unit": "TOKENS" } ) return response.content[0].text

10.5 集成兼容性总览

框架/SDKPythonJS/TS集成方式自动追踪
OpenAISDK 包装✅ Token、延迟、错误
LangChainCallback Handler✅ Chain、Tool、Retriever
LlamaIndexInstrumentor✅ 检索、生成、索引
Anthropic@observe 装饰器⚠️ 需手动记录用量
Vercel AI SDKExporter
LiteLLMCallback✅ 100+ 模型
CrewAI自动集成
MistralSDK 包装
Google AI@observe 装饰器⚠️ 需手动记录用量

11. 生产最佳实践

11.1 数据保留与备份

# 生产环境数据保留策略 # 在 Langfuse 配置中设置 # ClickHouse 数据保留(traces、observations、scores) # 通过 ClickHouse TTL 配置 # 建议:生产环境保留 90 天,归档到 S3 # PostgreSQL 备份(用户、项目、Prompt 等事务数据) # 使用 pg_dump 定期备份 # 建议:每日全量备份 + 持续 WAL 归档

备份脚本示例:

#!/bin/bash # langfuse-backup.sh DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/backups/langfuse" # PostgreSQL 备份 pg_dump -h localhost -U postgres -d langfuse \ | gzip > "$BACKUP_DIR/pg_$DATE.sql.gz" # ClickHouse 备份(使用 clickhouse-backup 工具) clickhouse-backup create "backup_$DATE" clickhouse-backup upload "backup_$DATE" # S3 事件数据已自动持久化,无需额外备份 # 清理 30 天前的本地备份 find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete echo "备份完成: $DATE"

11.2 扩展与性能优化

场景日均 Trace推荐配置
开发/测试< 1,000单节点 Docker Compose,2 vCPU / 8 GB
小型生产1,000 - 10,000单节点,4 vCPU / 16 GB,外部 PostgreSQL
中型生产10,000 - 100,000Kubernetes,2+ Web 副本,2+ Worker 副本
大型生产100,000+Kubernetes,水平扩展,ClickHouse Cloud,Redis 集群

关键优化点:

# Kubernetes HPA 配置示例 apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: langfuse-web-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: langfuse-web minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70

11.3 安全加固

# 生产环境安全配置 # 禁用公开注册 AUTH_DISABLE_SIGNUP=true # 强制 HTTPS NEXTAUTH_URL=https://langfuse.your-domain.com # 配置 SSO(Enterprise 功能) AUTH_GOOGLE_CLIENT_ID=xxx AUTH_GOOGLE_CLIENT_SECRET=xxx # 或 OIDC 通用配置 AUTH_CUSTOM_CLIENT_ID=xxx AUTH_CUSTOM_CLIENT_SECRET=xxx AUTH_CUSTOM_ISSUER=https://your-idp.com # API 速率限制 LANGFUSE_RATE_LIMIT_ENABLED=true # 加密密钥(务必安全存储) ENCRYPTION_KEY=your_hex_key_stored_in_vault

实战案例:从零搭建 AI 客服系统的 Langfuse 监控体系

场景描述

一个 SaaS 公司的 AI 客服系统,使用 RAG 架构,需要完整的可观测性体系。团队 5 人,数据不能出境,选择 Langfuse 自托管方案。

案例的具体操作流程

import os from langfuse import Langfuse from langfuse.decorators import observe, langfuse_context from langfuse.openai import openai # ===== 第 1 步:配置 Langfuse(指向自托管实例)===== os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-xxx" os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-xxx" os.environ["LANGFUSE_HOST"] = "https://langfuse.internal.company.com" langfuse = Langfuse() # ===== 第 2 步:创建 Prompt 并管理版本 ===== # 在 UI 中创建 Prompt "customer-service-v1",内容如下: # 你是{{company_name}}的客服助手。 # 基于以下知识库内容回答用户问题: # {{knowledge_base}} # 要求:准确、简洁、友好。如果不确定,请说"我需要转接人工客服"。 # ===== 第 3 步:带追踪的 Agent 实现 ===== @observe() def search_knowledge_base(query: str) -> str: """知识库检索——自动记录为子 span""" # 实际项目中调用向量数据库 knowledge = { "退货": "7天无理由退货政策,请在订单页面点击'申请退款'...", "发票": "支持电子发票,订单完成后在订单详情页申请...", "会员": "会员享受9折优惠和免运费服务..." } for key, value in knowledge.items(): if key in query: return value return "未找到相关信息,建议联系人工客服。" @observe() def customer_service_agent(query: str, user_id: str, session_id: str) -> str: """客服 Agent 主流程""" # 设置 trace 级别的元数据 langfuse_context.update_current_trace( user_id=user_id, session_id=session_id, tags=["production", "customer-service"], metadata={"channel": "web-chat"} ) # 获取生产版本的 Prompt prompt = langfuse.get_prompt("customer-service-v1", label="production") # 检索知识库 context = search_knowledge_base(query) # 编译 Prompt system_message = prompt.compile( company_name="示例科技", knowledge_base=context ) # 调用 LLM(自动追踪 Token、延迟、成本) response = openai.chat.completions.create( model="gpt-4.1-mini", messages=[ {"role": "system", "content": system_message}, {"role": "user", "content": query} ], langfuse_prompt=prompt # 关联 Prompt 版本 ) answer = response.choices[0].message.content return answer # ===== 第 4 步:创建评估数据集 ===== dataset = langfuse.create_dataset( name="cs-golden-set-v1", description="客服机器人黄金测试集" ) test_cases = [ {"input": {"q": "怎么退货?"}, "expected": {"a": "7天无理由退货"}}, {"input": {"q": "发票怎么开?"}, "expected": {"a": "电子发票"}}, {"input": {"q": "会员有什么优惠?"}, "expected": {"a": "9折优惠"}}, {"input": {"q": "你们公司在哪?"}, "expected": {"a": "人工客服"}}, ] for tc in test_cases: langfuse.create_dataset_item( dataset_name="cs-golden-set-v1", input=tc["input"], expected_output=tc["expected"] ) # ===== 第 5 步:运行评估 ===== dataset = langfuse.get_dataset("cs-golden-set-v1") for item in dataset.items: with item.observe(run_name="v1.0-gpt4mini") as trace_id: result = customer_service_agent( item.input["q"], user_id="eval-user", session_id="eval-session" ) # 关键词匹配评分 expected_keywords = item.expected_output["a"] score = 1.0 if expected_keywords in result else 0.0 langfuse.score(trace_id=trace_id, name="keyword-match", value=score) print("评估完成,请在 Langfuse UI 查看结果")

案例分析

  1. 自托管数据主权:所有数据存储在公司内网,满足数据不出境的合规要求
  2. Prompt 版本管理:通过标签(production/staging)管理 Prompt 版本,支持零停机切换和快速回滚
  3. 分层追踪:知识库检索和 LLM 调用分别记录为独立 span,便于定位性能瓶颈
  4. 成本可视化:每次 LLM 调用的 Token 用量和成本自动记录,在仪表板中按用户、按功能分析
  5. 持续评估:黄金测试集确保每次 Prompt 或模型更新不会导致质量回退

避坑指南

❌ 常见错误

  1. 自托管时忽略 ClickHouse 的资源需求

    • 问题:Langfuse v3 引入了 ClickHouse 作为分析数据库,但很多团队按 v2 的资源规格部署,导致 ClickHouse 内存不足频繁 OOM
    • 正确做法:为 ClickHouse 分配至少 4 GB RAM(推荐 8 GB),并配置合理的 max_memory_usage 参数。生产环境建议使用 ClickHouse Cloud 托管服务
  2. 忘记配置 ENCRYPTION_KEY 导致数据丢失

    • 问题:ENCRYPTION_KEY 用于加密 API Key 等敏感数据。如果部署后更换此密钥,所有已加密的数据将无法解密,等同于数据丢失
    • 正确做法:首次部署时生成 ENCRYPTION_KEY 并安全存储在密钥管理服务中(如 AWS Secrets Manager、HashiCorp Vault),永远不要更换
  3. 在高流量场景下未配置 S3 事件存储

    • 问题:v3 架构依赖 S3/Blob Store 作为事件缓冲层。如果未配置或 S3 不可用,事件可能丢失
    • 正确做法:生产环境必须配置可靠的 S3 兼容存储(AWS S3、MinIO、GCS),并确保足够的存储空间和 IOPS
  4. SDK 未正确 flush 导致 trace 丢失

    • 问题:Langfuse SDK 使用批量异步发送机制。在短生命周期的应用(如 Serverless 函数)中,进程退出前 trace 可能还未发送
    • 正确做法:在 Serverless 或脚本场景中,显式调用 langfuse.flush()await langfuse.flushAsync() 确保所有事件发送完毕
  5. 混淆 v2 和 v3 的部署方式

    • 问题:v3 引入了 Worker 容器、ClickHouse、Redis、S3 等新组件,但很多教程仍基于 v2 的单容器 + PostgreSQL 架构
    • 正确做法:确认使用 v3 的 docker-compose.yml(包含 langfuse-web、langfuse-worker、clickhouse、redis、minio 等服务),参考官方文档的 v3 部署指南
  6. 评估数据集与生产数据脱节

    • 问题:评估数据集长期不更新,与实际用户问题脱节,评估分数高但用户满意度低
    • 正确做法:定期从生产 trace 中筛选典型案例加入评估数据集,每月至少更新一次。利用 Langfuse 的”Add to Dataset”功能从 trace 直接创建评估样本

✅ 最佳实践

  1. 先云版验证,再迁移自托管:使用 Langfuse Cloud($29/月)快速验证工作流,确认满足需求后再投入自托管部署
  2. 按环境隔离项目:创建独立项目(如 app-devapp-stagingapp-prod),通过环境变量 LANGFUSE_PUBLIC_KEY 区分
  3. 利用 Session 追踪多轮对话:为同一用户的多轮对话设置相同的 session_id,在 UI 中查看完整对话上下文
  4. Prompt 与代码分离:将 Prompt 存储在 Langfuse 中而非硬编码,利用标签管理生产/测试版本,实现零停机 Prompt 更新
  5. 建立评估驱动的开发循环:每次修改 Prompt 或模型后,自动运行评估数据集对比前后效果,防止质量回退
  6. 监控 ClickHouse 磁盘使用:trace 数据增长很快,定期检查 ClickHouse 磁盘使用率,配置 TTL 自动清理过期数据

相关资源与延伸阅读

  1. Langfuse 官方文档  — 最权威的 Langfuse 使用指南,涵盖所有功能和集成
  2. Langfuse GitHub 仓库  — 开源代码(16,600+ Stars),MIT 协议,包含 Docker Compose 配置
  3. Langfuse 自托管部署指南  — 官方自托管文档,覆盖 Docker、Kubernetes、AWS/Azure/GCP Terraform
  4. Langfuse Python SDK 参考  — Python SDK v3 完整 API 文档
  5. Langfuse JS/TS SDK 文档  — TypeScript SDK v4 使用示例
  6. Langfuse Helm Chart  — 社区维护的 Kubernetes Helm Chart
  7. Langfuse 加入 ClickHouse 公告  — 了解收购后的发展方向和承诺
  8. Langfuse 环境变量配置  — 自托管所有可配置环境变量参考
  9. Langfuse OpenTelemetry 集成  — OTel 标准集成指南
  10. Langfuse Changelog  — 版本更新日志,追踪最新功能发布

参考来源


📖 返回 总览与导航 | 上一节:21c-LangSmith设置指南 | 下一节:21e-成本优化策略

Last updated on