Langfuse 接入指南:指标、上报与可视化

---
title: "Langfuse 接入指南:指标、上报与可视化"
published_at: "2026-07-03"
language: "zh"
---

# Langfuse 接入指南:指标、上报与可视化

Langfuse 不是一套行业标准。它是一个面向 LLM / Agent 应用的 observability、tracing、evaluation 和 prompt management 平台。

更准确的分类是:

| 类型 | 例子 | 作用 |
|---|---|---|
| 标准 / 协议 | OpenTelemetry、W3C Trace Context | 规定数据怎么表示、怎么传播 |
| 通用 APM | Datadog、New Relic、Grafana Tempo | 观察普通后端服务 |
| LLM 观测平台 | Langfuse、LangSmith、Helicone、Arize Phoenix | 观察 LLM 调用、prompt、token、RAG、agent |
| 模型网关 | LiteLLM、NewAPI、OpenRouter、自建 proxy | 管模型流量、鉴权、限流、计费、fallback |

Langfuse 有自己的 trace / observation / score / prompt / dataset 数据模型,也可以通过 SDK、API、OpenTelemetry、框架集成或模型网关上报数据。

## 采集哪些数据

Langfuse 采集的数据可以分成五类:

```text
Trace:一次完整请求
Span:请求里的中间步骤
Generation:一次模型调用
Score:质量评价
Metadata:业务自定义字段
```

## Trace:请求级信息

Trace 通常代表一次用户请求、一次 agent run、一次 RAG 查询或一次业务任务。

常见字段:

| 字段 | 含义 |
|---|---|
| `trace_id` | 请求唯一 ID |
| `name` | 请求名称,如 `chat-request`、`rag-answer` |
| `user_id` | 用户 ID |
| `session_id` | 会话 ID |
| `input` | 用户输入 |
| `output` | 最终输出 |
| `metadata` | 业务自定义信息 |
| `tags` | 标签,如 `prod`、`rag`、`vip-user` |
| `environment` | 环境,如 `dev`、`staging`、`prod` |
| `release` | 应用版本 |
| `timestamp` | 发生时间 |

示例:

```json
{
  "name": "support-chat",
  "user_id": "user_123",
  "session_id": "session_abc",
  "input": "我可以退款吗?",
  "output": "根据政策,7 天内可以退款。",
  "metadata": {
    "tenant": "acme",
    "plan": "pro",
    "channel": "web"
  },
  "tags": ["prod", "support", "rag"]
}
```

## Generation:模型调用信息

Generation 是 Langfuse 最核心的数据之一。每次模型调用都可以记录:

| 字段 | 含义 |
|---|---|
| `model` | 使用的模型 |
| `provider` | OpenAI、Anthropic、Gemini、DeepSeek 等 |
| `input` | prompt / messages |
| `output` | completion |
| `usage.input` | 输入 token |
| `usage.output` | 输出 token |
| `usage.total` | 总 token |
| `cost` | 调用成本 |
| `latency` | 模型调用耗时 |
| `temperature` | 采样参数 |
| `max_tokens` | 最大输出长度 |
| `prompt_name` | 使用的 prompt |
| `prompt_version` | prompt 版本 |
| `metadata` | 自定义字段 |

示例:

```json
{
  "name": "answer-generation",
  "model": "gpt-4.1",
  "input": [
    {"role": "system", "content": "You are a support agent."},
    {"role": "user", "content": "我可以退款吗?"}
  ],
  "output": "根据退款政策,购买后 7 天内可以退款。",
  "usage": {
    "input": 1200,
    "output": 180,
    "total": 1380
  },
  "metadata": {
    "temperature": 0.2,
    "prompt_version": "v7"
  }
}
```

用 Generation 可以回答:

- 哪个模型最贵?
- 哪个 prompt token 特别长?
- 哪类请求最耗 token?
- 哪个 prompt 版本成本升高?
- 某次回答差时,模型到底看到了什么?

## Span:中间步骤信息

Span 用来记录非模型调用的中间步骤。

常见 Span:

| 类型 | 例子 |
|---|---|
| 检索 | vector search、BM25、hybrid search |
| rerank | reranker model 调用 |
| tool call | web search、SQL query、browser action |
| 业务 API | 查订单、查库存、查用户资料 |
| 文件处理 | PDF 解析、chunking、OCR |
| agent step | plan、act、observe、reflect |
| fallback | 主模型失败后切备用模型 |

Span 通常记录:

| 字段 | 含义 |
|---|---|
| `name` | 步骤名 |
| `input` | 输入 |
| `output` | 输出 |
| `start_time` / `end_time` | 耗时 |
| `metadata` | 自定义信息 |
| `status` | 成功 / 失败 |
| `error` | 错误信息 |

示例:

```json
{
  "name": "vector-search",
  "input": {
    "query": "退款政策",
    "top_k": 5
  },
  "output": {
    "documents": ["doc_1", "doc_7", "doc_9"]
  },
  "metadata": {
    "index": "support_kb",
    "rerank": true
  }
}
```

## Score:质量评价

Score 是对 trace 或 generation 的评价结果。

来源可以是:

| 来源 | 例子 |
|---|---|
| 用户反馈 | 点赞 / 点踩、满意度 |
| 人工标注 | 客服质检人员打分 |
| 程序规则 | JSON 是否合法、是否有引用 |
| LLM-as-a-judge | 相关性、忠实度、是否幻觉 |
| 离线评测 | dataset experiment 结果 |

常见 score:

| 指标 | 含义 |
|---|---|
| `helpfulness` | 是否有帮助 |
| `relevance` | 是否相关 |
| `faithfulness` | 是否忠于上下文 |
| `correctness` | 是否正确 |
| `toxicity` | 是否有害 |
| `hallucination` | 是否幻觉 |
| `json_valid` | JSON 是否合法 |
| `citation_present` | 是否有引用 |
| `user_feedback` | 用户反馈 |

示例:

```json
{
  "name": "faithfulness",
  "value": 0.86,
  "comment": "回答基本忠于检索内容,但遗漏退款时限。"
}
```

## 能不能自定义指标

可以。Langfuse 的 metadata、tags、score、trace name、span name、业务字段都可以自定义。

可以自定义的内容:

| 类型 | 示例 |
|---|---|
| Trace name | `checkout-chat`、`legal-rag` |
| Span name | `vector-search`、`rerank`、`sql-query` |
| Metadata | `tenant_id`、`plan`、`region` |
| Tags | `prod`、`vip`、`ab-test-b` |
| Score name | `faithfulness`、`contains_citation` |
| Dataset | 自己维护评测集 |
| Prompt | 自己定义 prompt 名称和版本 |

客服机器人可以加:

```json
{
  "metadata": {
    "tenant": "acme",
    "channel": "web",
    "user_plan": "enterprise",
    "ticket_type": "refund",
    "knowledge_base_version": "2026-07-01"
  }
}
```

RAG 系统可以加:

```json
{
  "metadata": {
    "retriever": "hybrid",
    "top_k": 8,
    "reranker": "bge-reranker-v2",
    "index_version": "kb_2026_07"
  }
}
```

Agent 系统可以加:

```json
{
  "metadata": {
    "agent_version": "v12",
    "tool_count": 5,
    "max_steps": 12,
    "stopped_reason": "final_answer"
  }
}
```

## 如何上报

常见上报方式有五种。

### 方式一:直接用 SDK

适合想精确控制 trace、span、generation 结构的项目。

```python
from langfuse import Langfuse

langfuse = Langfuse(
    public_key="pk-lf-...",
    secret_key="sk-lf-...",
    host="https://cloud.langfuse.com",
)

trace = langfuse.trace(
    name="chat-request",
    user_id="user_123",
    input={"message": "什么是 Langfuse?"},
    metadata={
        "tenant": "acme",
        "environment": "prod",
    },
)

generation = trace.generation(
    name="answer-generation",
    model="gpt-4.1",
    input=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "什么是 Langfuse?"},
    ],
    output="Langfuse 是 LLM 应用的观测平台。",
    usage={
        "input": 100,
        "output": 30,
        "total": 130,
    },
)

langfuse.flush()
```

优点是结构清楚;缺点是代码侵入相对明显。

### 方式二:OpenAI / Anthropic SDK wrapper

如果项目已经直接调用 OpenAI 或 Anthropic SDK,可以通过 wrapper 自动捕获模型调用。

优点:

- 改动少
- 自动记录模型输入输出
- 自动记录 token 和 latency

缺点:

- 复杂 agent / tool call 结构不一定足够清楚
- 业务 metadata 仍要自己补

### 方式三:框架集成

如果项目使用 LangChain、LlamaIndex、Vercel AI SDK、Haystack、Semantic Kernel 等框架,可以用框架集成接入。

优点:

- 自动记录 chain / tool / model call
- agent 步骤更容易形成树状 trace
- 接入成本低

缺点:

- trace 结构取决于框架
- 字段不一定符合业务习惯
- 高质量接入仍需要补 metadata / score

### 方式四:OpenTelemetry

如果服务已经有 OpenTelemetry,可以把 LLM 调用作为 span 上报,再让 Langfuse 接收或映射。

适合:

- 已经有 OTel 基础设施
- 想和后端服务 trace 打通
- 想把 HTTP / DB / LLM 放在一条链路里
- 不想被单一平台 SDK 绑定太深

注意:OpenTelemetry 是标准;Langfuse 是消费和展示 LLM trace 的平台。OTel 能描述通用 span,但 prompt、completion、token、cost、score 这些 LLM 语义字段仍需要约定和映射。

### 方式五:通过模型网关接入

如果所有模型调用都经过 LiteLLM、NewAPI 或自建 proxy,可以在网关层统一接入 Langfuse。

优点:

- 应用层改动少
- 所有模型请求统一采集
- 方便统计模型成本、token、latency
- 对多 provider 友好

缺点:

- 网关层只能看到模型调用,不一定知道完整业务上下文
- RAG 检索、tool call、agent step 可能看不到
- 需要应用层补 trace id、user id、session id,才能串起来

更稳的结构是:

```text
应用层上报 trace / span / metadata
网关层上报 generation / token / cost
两边用同一个 trace_id 关联
```

## 如何可视化显示

Langfuse UI 通常从四个视角展示数据。

### Trace 列表

可以看到最近请求:

```text
name              user       latency    cost     status
support-chat      user_123   2.1s       $0.004   ok
rag-answer        user_456   5.8s       $0.031   error
agent-run         user_789   18.2s      $0.12    ok
```

可以按时间、用户、tag、environment、model、prompt version、score、cost、latency、error 筛选。

### Trace 详情

点进一条 trace,可以看到树状结构:

```text
Trace: support-chat
├── Span: classify-intent
├── Span: vector-search
├── Span: rerank
├── Generation: answer-generation
└── Score: user_feedback = thumbs_up
```

每个节点可以展开看 input、output、metadata、model、token、cost、latency、error。

### Dashboard

可以看聚合指标:

- 总请求数
- 总 token
- 总成本
- 平均延迟
- P95 延迟
- 错误率
- 不同模型成本占比
- 不同用户 / tenant 成本
- prompt 版本表现

### Evaluation / Dataset / Experiment

可以看:

- 某个 dataset 的测试结果
- 不同 prompt 版本的 score
- 不同模型的回答质量
- 哪些样本失败
- 哪些 regression 新增了错误

## 已有项目如何接入

不要一上来全量改。按五步走。

### 第一步:确定要回答的问题

先列出最想知道的问题:

```text
1. 哪些请求最贵?
2. 哪些请求最慢?
3. 用户差评是因为检索错还是模型答错?
4. 哪个 prompt 版本效果更好?
5. agent 失败时卡在哪一步?
```

再决定要采集哪些字段。不要一开始什么都采,否则很容易变成日志垃圾场。

### 第二步:先接最外层 Trace

在请求入口创建 trace:

```python
trace = langfuse.trace(
    name="chat-request",
    user_id=current_user.id,
    session_id=session_id,
    input=user_message,
    metadata={
        "tenant": tenant_id,
        "environment": "prod",
        "app_version": APP_VERSION,
    },
    tags=["chat", "prod"],
)
```

这一步先保证每次用户请求都有一个可追踪 ID。

### 第三步:接模型调用 Generation

把原来的模型调用包一层:

```python
result = llm.call(messages)

trace.generation(
    name="main-answer",
    model="claude-sonnet-4",
    input=messages,
    output=result.text,
    usage={
        "input": result.usage.input_tokens,
        "output": result.usage.output_tokens,
        "total": result.usage.total_tokens,
    },
    metadata={
        "temperature": 0.2,
        "prompt_version": "v7",
    },
)
```

这一步先解决模型到底看到了什么、输出了什么、花了多少 token。

### 第四步:补关键 Span

不要把所有函数都接成 span。只记录会影响答案质量、成本、延迟的步骤。

RAG 项目优先接:

```text
query rewrite
embedding
vector search
rerank
context assembly
generation
```

Agent 项目优先接:

```text
planning
tool call
tool result
reflection
final generation
```

业务机器人优先接:

```text
intent classification
policy lookup
order lookup
generation
human handoff
```

### 第五步:接 Score

先接最简单的用户点赞 / 点踩。

再接规则型 score:

```text
JSON 是否合法
是否有引用
是否触发 fallback
```

最后再接 LLM-as-a-judge:

```text
faithfulness
relevance
correctness
```

先跑通反馈闭环,再做复杂评测。

## 接入架构怎么选

### 小项目

直接 SDK:

```text
应用代码 → Langfuse SDK → Langfuse
```

简单直接,但对代码有一定侵入。

### LangChain / LlamaIndex 项目

用框架集成:

```text
应用代码 → LangChain callback / LlamaIndex callback → Langfuse
```

适合自动记录 chain、tool、model call。

### 已经有 LiteLLM / NewAPI 网关

推荐双层接入:

```text
应用层:Trace / Span / user_id / session_id / metadata
网关层:Generation / model / token / cost / latency
共同字段:trace_id
```

结构类似:

```text
用户请求
  ↓
应用服务创建 trace_id
  ↓
RAG / Agent 步骤写 span
  ↓
模型请求带 trace_id 经过网关
  ↓
网关把 generation 上报 Langfuse
  ↓
Langfuse UI 合并展示
```

这样既能看业务链路,也能看模型成本和质量。

## 接入注意事项

### 不要泄露敏感信息

Langfuse 会存 prompt、输入、输出、metadata。里面可能有用户隐私、API key、内部文档、订单信息、代码 secret、商业数据。

接入前要决定:

- 哪些字段脱敏
- 哪些字段不上报
- 是否自托管
- 数据保留多久
- 谁能看 trace

### 不要把日志粒度打太碎

每个小函数都上报 span,会让 trace 很难读。

优先记录模型调用、RAG 检索、tool call、外部 API、失败 / fallback、质量相关节点。

### 统一命名

trace、span、score 名称要稳定。

不要一会叫 `answer-generation`,一会叫 `main_llm_call`,一会叫 `chatgpt_response`。命名不稳定,后面聚合会很痛苦。

### 给业务字段留 metadata

纯模型指标不够。一定要加业务维度:

```text
tenant
user_plan
channel
region
app_version
prompt_version
knowledge_base_version
experiment_group
```

否则只能看到总体平均,看不到是哪类用户、哪版系统、哪组实验出了问题。

### 先做最小闭环

最小可用接入是:

```text
Trace + Generation + user feedback
```

也就是记录一次请求、记录模型输入输出和 token、记录用户点踩 / 点赞。这个闭环跑通后,再加 RAG span、agent span、dataset、experiment。

## 总结

Langfuse 不是标准,而是一个 LLM observability 平台。它能接入标准协议,也能通过 SDK、框架集成、模型网关或 OpenTelemetry 上报数据。

最稳的已有项目接入路径是:

```text
1. 请求入口创建 Trace
2. 模型调用记录 Generation
3. RAG / Agent 关键步骤补 Span
4. 用户反馈和规则结果写 Score
5. 再逐步接 Dataset / Experiment
```

如果项目已经有模型网关,推荐应用层记录业务 trace 和 span,网关层记录模型 generation、token、cost,再用 trace_id 串起来。