Langfuse 数据分析:如何获取上报数据并搭建独立可视化平台

---
title: "Langfuse 数据分析:如何获取上报数据并搭建独立可视化平台"
published_at: "2026-07-03"
language: "zh"
---

# Langfuse 数据分析:如何获取上报数据并搭建独立可视化平台

业务系统接入 Langfuse 后,第一阶段解决的是“能不能看清一次 LLM 请求”。Trace、Span、Generation、Score 都上报以后,你可以打开 Langfuse,看某一次请求的输入、输出、耗时、token、成本、错误和用户反馈。

但如果接下来要做的是一个单独的可视化分析平台,思路就要变一下。

这个平台不应该只是复刻 Langfuse。Langfuse 更适合做单条 trace 调试、prompt 回放、观测链路排障;新的分析平台应该面向业务分析:哪个租户最烧钱、哪个模型最慢、哪个 prompt 版本差评最多、哪个业务场景最容易触发 fallback、RAG 命中率是否下降。

真正要解决的问题是:**业务已经把数据上报到 Langfuse 了,如何把这些数据取出来,整理成分析模型,再做一套自己的可视化平台。**

## 先分清两层系统

不要把 Langfuse 和分析平台混成一个东西。

```text
Langfuse:采集、调试、回放单次请求
分析平台:聚合、对比、趋势、业务决策
```

更合理的结构是:

```text
业务系统 / 模型网关
  ↓
Langfuse:trace / generation / span / score 原始观测数据
  ↓
数据同步层:API 拉取、数据库同步或事件双写
  ↓
分析仓库:PostgreSQL / ClickHouse / BigQuery
  ↓
分析 API
  ↓
独立可视化平台
```

Langfuse 继续做原始链路观测;新平台基于这些数据重新建业务分析层。

## 平台要回答的问题

如果只是看“某一次请求发生了什么”,Langfuse 已经够用。独立平台真正要回答的是聚合问题。

| 方向 | 典型问题 |
|---|---|
| 成本 | 哪个业务线、租户、用户、模型最烧钱? |
| 性能 | 哪类请求最慢?P95 延迟卡在哪一步? |
| 质量 | 哪些场景差评多?哪个 prompt 版本效果差? |
| 模型 | 不同模型的成本、延迟、质量如何对比? |
| RAG | 检索是否命中?哪个知识库版本效果下降? |
| Agent | tool 成功率、平均 step 数、fallback 情况如何? |
| 业务 | 不同渠道、客户等级、功能模块的 AI 使用情况如何? |

也就是说,分析平台的核心不是再做一个“Trace UI”,而是做 **LLM Analytics**:把单次请求的观测数据,变成可按业务维度聚合、筛选和下钻的数据资产。

## 先给结论:怎么选数据路线

| 场景 | 推荐路线 | 原因 |
|---|---|---|
| 使用 Langfuse Cloud,先做 MVP | API 增量同步 | 不碰底层表结构,升级风险低 |
| 自部署 Langfuse,数据量不大 | API 同步或只读库同步 | 实现简单,先验证分析需求 |
| 自部署 Langfuse,数据量较大 | 只读库 / CDC / ClickHouse 同步 | 聚合查询更快,不拖慢 Langfuse |
| 长期内部平台 | 业务系统 / 网关双写 | 不被 Langfuse API 和内部 schema 绑定 |

第一版优先把已有 Langfuse 数据取出来,不急着改业务链路。等指标和页面稳定后,再把数据源前移到内部 SDK 或模型网关。

## 数据怎么获取

有三条路线。它们不是互斥关系,通常是从 A 开始,逐步走向 C。

### 路线 A:通过 Langfuse API 拉取

适合 Langfuse Cloud,或不想依赖底层数据库结构的团队。

```text
Langfuse API
  ↓
Sync Worker
  ↓
Analytics DB
  ↓
Dashboard
```

同步任务按时间增量拉取,至少覆盖这些对象:

```text
traces
observations / generations / spans
scores
sessions
prompt versions
metadata
```

注意不要只按“上次同步时间之后的新数据”拉。LLM trace 常常是先创建 trace,后面再补 generation、score、output、latency。如果窗口太窄,会漏掉后续更新。

推荐策略:

```text
每 1-5 分钟同步一次
每次同步 now - 10min 到 now
按 trace_id / observation_id 做 upsert
每天补跑一次过去 24h 的修正任务
```

这条路最稳,缺点是受 API 分页、字段暴露和限流影响。适合第一版 MVP。

需要注意两点:

```text
1. API 拉到的是 Langfuse 的观测对象,不等于已经适合分析
2. 拉回后必须转成自己的 fact / dim 表,而不是直接把 JSON 扔给前端
```

### 路线 B:自部署 Langfuse 时读只读库

如果 Langfuse 是自部署,并且数据量较大,可以从 Langfuse 的数据库或 ClickHouse 做只读同步。

但不要让前端直接查 Langfuse 生产库。分析查询通常是大范围聚合,和 Langfuse 自己的 trace 查询负载不同。更稳的方式是:

```text
Langfuse DB / ClickHouse
  ↓
只读同步 / CDC / 定时 ETL
  ↓
analytics schema
  ↓
分析平台
```

这样做有三个好处:

1. 避免拖慢 Langfuse;
2. 避免前端绑定 Langfuse 内部表结构;
3. 可以补充业务维度表,比如租户、渠道、套餐、工单类型。

数据量小可以先用 PostgreSQL + JSONB;数据量大、聚合查询多时,用 ClickHouse 更合适。

### 路线 C:业务系统或模型网关双写

长期最稳的是把数据源前移,不只从 Langfuse 取。

```text
业务系统 / LLM 网关
  ↓
统一观测事件
  ├── Langfuse
  └── Analytics Warehouse
```

或者:

```text
内部 obs SDK
  ├── LangfuseAdapter
  ├── AnalyticsAdapter
  └── NoopAdapter
```

这样 Langfuse 和分析平台都是下游消费者。以后即使换掉 Langfuse,分析平台也不会断。

这条路适合长期平台化,但第一版不一定要马上做。建议先用 API / DB 同步验证需求,再把稳定指标前移到双写链路。

## 推荐落地路线

实际项目里可以分两阶段。

第一阶段:先用 Langfuse 作为数据源。

```text
Langfuse
  ↓
langfuse-sync-worker
  ↓
PostgreSQL / ClickHouse
  ↓
分析平台
```

目标是快速验证三件事:

```text
1. 业务到底想看哪些图
2. 哪些筛选条件最常用
3. 现在上报的 metadata 缺了什么
```

第二阶段:做统一观测事件层。

```text
业务系统 / 模型网关
  ↓
统一事件模型
  ├── 写 Langfuse
  └── 写分析仓库
```

目标是让分析平台不再受 Langfuse API、分页、内部表结构影响。

## 分析仓库的数据模型

不要把 Langfuse 原始 JSON 直接丢给前端。要转成分析友好的事实表。

### fact_traces

一行代表一次完整 AI 请求。

```text
trace_id
project_id
app_name
environment
tenant_id
user_id
session_id
trace_name
status
started_at
ended_at
latency_ms
total_cost
total_input_tokens
total_output_tokens
total_tokens
model_list
prompt_name
prompt_version
tags
metadata
```

它回答:请求量、成本、延迟、错误、租户使用量、功能使用量。

### fact_observations

一行代表 trace 里的一个节点,可以是 span、generation 或 event。

```text
observation_id
trace_id
parent_observation_id
type              -- span / generation / event
name
status
started_at
ended_at
latency_ms
input_ref / input_summary
output_ref / output_summary
metadata
error_type
error_message
```

它支撑 trace 树、步骤耗时、RAG / tool / fallback 分析。生产环境里不建议把大段 prompt、completion、RAG context 全塞进明细表,可以只放摘要和对象存储引用。

### fact_generations

模型调用建议单独拆出来,方便成本和模型分析。

```text
generation_id
trace_id
observation_id
provider
model
input_tokens
output_tokens
total_tokens
cost
latency_ms
first_token_latency_ms
prompt_name
prompt_version
status
error_type
started_at
ended_at
input_ref / output_ref
metadata
```

它回答:哪个模型贵、哪个模型慢、哪个 prompt 版本 token 暴涨、哪类请求成本异常。大文本同样放对象存储,表里只保留引用、摘要和聚合字段。

### fact_scores

一行代表一次评价。

```text
score_id
trace_id
observation_id
score_name
score_value
score_source       -- user / human / rule / llm_judge
comment
created_at
metadata
```

它回答:差评率、低分场景、幻觉率、JSON 合法率、引用缺失率。

### 维度表

还需要几张业务维度表:

```text
dim_tenant
dim_user
dim_model_price
dim_prompt_version
dim_app
dim_release
dim_knowledge_base
```

尤其是 `dim_model_price`。模型价格会变,私有模型和代理模型价格也不同。不要只把 cost 当成 Langfuse 给出的静态字段,最好能按历史价格重算。

```text
provider
model
input_price_per_1m_tokens
output_price_per_1m_tokens
effective_from
effective_to
```

## 关键 metadata 必须补齐

如果业务系统只上报 prompt、completion、token、cost,后面只能做模型调用统计,看不出业务意义。

建议每条 trace 至少带:

```text
tenant_id
user_id
session_id
app_name
feature_name
environment
release
channel
request_type
prompt_name
prompt_version
model
provider
trace_id
```

RAG 场景额外带:

```text
retriever
top_k
reranker
index_name
index_version
doc_ids
chunk_ids
similarity_scores
rerank_scores
citation_present
```

Agent 场景额外带:

```text
agent_name
agent_version
tool_name
tool_count
step_index
max_steps
stopped_reason
fallback_used
```

质量分析额外带:

```text
user_feedback
human_review_score
rule_score
llm_judge_score
resolved
escalated_to_human
```

这一步很关键。没有业务 metadata,分析平台只能看到“模型请求很多”,但看不出“哪个产品功能出问题”。

## 同步任务怎么做

第一版可以做一个独立 worker:

```text
langfuse-sync-worker
  ↓
1. 拉 traces
2. 拉 observations / generations
3. 拉 scores
4. 标准化字段
5. upsert 到 analytics tables
6. 记录 checkpoint
```

需要一张同步状态表:

```text
sync_checkpoint
---------------
source_name
last_synced_at
last_window_start
last_window_end
status
error
updated_at
```

写入必须幂等:

```text
trace_id 唯一
observation_id 唯一
score_id 唯一
重复拉取时 upsert
```

这样才能安全使用 overlap window。

## 可视化第一版做什么

不要第一版就做复杂大屏。先做五个必选页面,再补一个专项页面。

### 1. 总览

```text
总请求数
总 token
总成本
平均成本 / 次
平均延迟
P95 延迟
错误率
用户反馈好评率
低分 trace 数
```

筛选条件:

```text
时间
业务线
tenant
用户
模型
环境
prompt version
trace name
```

### 2. 成本分析

```text
每日成本趋势
按模型成本排行
按 tenant 成本排行
按业务功能成本排行
输入 / 输出 token 占比
单位请求成本分布
```

这个页面回答“钱花到哪里去了”。

### 3. 延迟和错误分析

```text
P50 / P95 / P99 latency
first token latency
模型调用耗时
RAG 检索耗时
tool call 耗时
fallback 次数
error rate
timeout rate
```

这个页面回答“慢在哪里、错在哪里”。

### 4. 质量和反馈分析

```text
好评率
差评率
平均 score
低分 trace 分布
hallucination rate
citation missing rate
JSON invalid rate
```

这个页面必须能从聚合图下钻到具体 trace。

### 5. Trace 列表和详情(必选)

Trace 列表字段:

```text
时间
trace name
user_id
tenant
status
latency
cost
model
score
tags
```

Trace 详情仍然是最重要的排障页面:

```text
Trace: support-chat
├── Span: vector-search
├── Span: rerank
├── Generation: answer
├── Span: tool-call
└── Score: user_feedback = thumbs_down
```

每个节点展开看:

```text
input
output
metadata
latency
token
cost
error
```

第一版如果时间紧,可以不完全重做 trace 详情,先在分析平台里提供“打开 Langfuse 原始 trace”的链接。聚合分析自己做,单条回放交给 Langfuse。

### 6. RAG / Agent 专项页(第二阶段)

RAG 看:

```text
知识库版本
检索器类型
top_k
命中文档数
chunk 命中率
相似度分数
rerank 分数
引用是否出现
回答是否忠于 context
```

Agent 看:

```text
平均 step 数
tool call 次数
tool 成功率
tool 错误率
fallback 次数
循环 / 超步数终止
stopped_reason
```

这类页面比普通大盘更能暴露 AI 应用的问题。

## 权限和脱敏

分析平台不能忽略权限。

至少要做:

```text
tenant 级隔离
项目级权限
用户 PII 脱敏
input / output 可开关采集
字段级脱敏规则
按环境采样
按错误全量采集
```

生产环境建议支持三档:

```text
不采集正文,只采 token / cost / latency
采集摘要,不采全文
采集全文,但做字段级脱敏
```

否则客服、医疗、金融、企业知识库场景会有数据合规风险。

## 最小可用版本

第一版只做这些就够:

```text
1. 从 Langfuse 同步 traces / observations / scores
2. 建 fact_traces / fact_observations / fact_generations / fact_scores
3. 做总览、成本、延迟、质量、Trace 列表五个页面
4. Trace 详情先跳转 Langfuse,后续再自研
5. 补齐 tenant_id、feature_name、prompt_version、model、cost、latency、feedback
6. 大 input / output / context 先放对象存储,分析表只放摘要和引用
```

这已经能回答大部分管理和排障问题:

```text
今天 AI 请求量多少?
花了多少钱?
哪个模型最贵?
哪个业务功能最慢?
哪个 prompt 版本差评最多?
哪些用户点踩了?
差评 trace 里模型到底看到了什么?
```

## 最终形态

长期来看,最好不要让分析平台只依赖 Langfuse。

更稳的最终结构是:

```text
业务系统 / 模型网关
  ↓
统一观测事件层
  ├── Langfuse:调试和回放
  ├── ClickHouse:聚合分析
  ├── Object Storage:大输入输出和 RAG context
  └── BI / 自研 Dashboard:业务可视化
```

Langfuse 是链路显微镜;分析平台是业务仪表盘。

前者看清一次请求,后者看清一类问题。要做独立可视化平台,关键就是把已经上报到 Langfuse 的观测数据,转成稳定的数据资产,再围绕成本、延迟、质量和业务维度搭建自己的分析平台。