Langfuse 技术架构深度分析:从单容器到分布式 LLM 可观测性平台

Langfuse 是什么
Langfuse 是 Langfuse 公司(YC W23)开发的开源 LLM 工程平台(MIT 许可)。它解决了一个核心问题:当你的应用里调了 LLM,你怎么知道它到底做了什么?花了多少钱?哪步出了问题?
它提供四个核心能力:
- Tracing——追踪每次 LLM 调用的完整调用链(含嵌套 tool calls)
- Prompt Management——通过 UI 管理 Prompt 版本,SDK 拉取,不重新部署即可更新
- Evaluation——LLM-as-Judge + 人工评分 + 数据集批量评估
- Cost Tracking——按 token 分项计算成本(input/output/cache/reasoning)
这篇文章深入拆解 Langfuse v3 的技术架构:它的分布式组件如何协作、数据如何在流水线中流动、以及它如何从「一个容器 + 一个 Postgres」演进为能处理每分钟数万事件的分布式平台。
架构全景
Langfuse v3 是典型的 OLTP + OLAP 读写分离 架构。核心设计哲学:将高吞吐的追踪数据写入与低延迟的分析查询彻底解耦。
(Python/JS/Go...)"] end subgraph "应用层" WEB["Langfuse Web
UI + REST API
Next.js | Node.js"] WORKER["Langfuse Worker
事件处理 + 异步任务
BullMQ Consumer"] end subgraph "存储层" REDIS[("Redis
队列 + 缓存
BullMQ | KV")] PG[("PostgreSQL
OLTP 事务数据
Users/Projects/Prompts")] CH[("ClickHouse
OLAP 分析数据
Traces/Obs/Scores")] S3[("S3/MinIO
Blob Storage
Raw Events + Media")] end SDK -->|"HTTP POST
async flush"| WEB WEB -->|"写队列 < 5ms"| REDIS REDIS -->|"拉事件"| WORKER WORKER -->|"合并写入"| CH WORKER -->|"原始事件归档"| S3 WEB -->|"查询"| CH WEB -->|"读写"| PG style SDK fill:#4a9eff,stroke:#333,color:#fff style WEB fill:#ff9f43,stroke:#333 style WORKER fill:#ff9f43,stroke:#333 style REDIS fill:#ee5a24,stroke:#333,color:#fff style PG fill:#336791,stroke:#333,color:#fff style CH fill:#f2c811,stroke:#333 style S3 fill:#569a31,stroke:#333,color:#fff
六个容器,四个存储引擎,两条数据流。与 v2 的单容器+Postgres 架构相比,v3 多了 Worker、Redis、ClickHouse、S3 四个组件。这是 Langfuse 从「开发工具」进化为「生产平台」的代价。
数据摄入管线:从 SDK 到 ClickHouse
这是 Langfuse 最关键的流水线。没有它,一切都是空谈。
创建 Trace/Observation SDK->>SDK: 本地缓冲
(5s/10MB 阈值) Note over SDK,API: 异步 flush,不阻塞用户请求 SDK->>API: POST /api/public/ingestion API->>API: JSON 校验 API->>Redis: LPUSH 到 BullMQ 队列 API-->>SDK: 200 OK (< 10ms) Note over Redis,Worker: 异步处理,解耦 Worker->>Redis: BRPOP 拉取事件 Worker->>CH: 查已有 Observation (Read) Worker->>Worker: 合并新旧数据 (Merge) Worker->>CH: 写回合并结果 (Write) Worker->>S3: 原始事件归档 (Event Sourcing)
关键设计决策:
- API 层只写 Redis,不写数据库。写入延迟从 v2 的数百毫秒(尖峰时 50 秒)降到 v3 的 < 10ms。SDK 端的背压彻底消除
- Worker 异步消化队列。即使流量尖峰导致队列积压,API 层不受影响。Worker 按 CPU 负载水平扩展(>50% 即需扩容)
- S3 是真相源。所有原始事件不可变地持久化到 S3。ClickHouse 是物化视图,可随时从 S3 重建
存储层设计
四个存储引擎,分工明确:
| 组件 | 角色 | 数据特征 | 扩展方式 | 为什么不用 Postgres? |
|---|---|---|---|---|
| PostgreSQL | OLTP 主库 | 事务型、低容量、强一致 | 垂直扩展 | — |
| ClickHouse | OLAP 分析库 | 列式、海量、追加写 | 水平扩展(多节点) | 分析查询只需扫描相关列,行存需要全表扫描 |
| Redis | 队列 + 缓存 | 内存、临时性 | Sentinel/Cluster | Pub/Sub 和 KV 需求不需要 SQL |
| S3/MinIO | 事件溯源 + 媒体 | 不可变、无限制 | 对象存储自带 | 存原始 JSON 和图片不需要关系模型 |
为什么选 ClickHouse?
v2 时代 Langfuse 把所有数据(包括 traces)都塞进 Postgres。到 2024 年中,这已经不可持续:
- 写入瓶颈:尖峰流量下的同步写入导致 API 响应时间飙到 50 秒
- 查询性能:分析查询(如「过去 30 天各模型的日均成本」)需要全表扫描 Postgres 的 JSON 列,每次查询数十秒
- 扩展困难:Postgres 扩展主要靠升级实例,无法水平扩展写入吞吐
ClickHouse 的三个核心优势直接命中了 Langfuse 的痛点:列式存储(分析查询只扫描相关列)、水平扩展(多节点分摊写入)、开源(与 Langfuse 的 MIT 许可一致)。
事件溯源:S3 是真正的真相源
Langfuse v3 采用事件溯源模式,这是一个被低估但极其重要的架构决策。
传统的 LLM 可观测性工具直接把数据写入最终存储(如 Postgres 的 observations 表)。如果写入过程中出错(例如 Worker crash 在 Read-Modify-Write 的中间态),数据可能不一致。Langfuse 的做法不同:
- 每个 Ingestion Event 的原始 JSON 不可变地写入 S3
- Worker 处理事件 → 合并成 Observation → 写入 ClickHouse
- 如果 ClickHouse 数据损坏或不一致 → 从 S3 原始事件完全重建
这带来了几个实用的好处:
- 数据不会丢失:S3 的持久性(11 个 9)远超任何数据库
- 支持事后修复:如果发现某个版本的 Worker 有 bug 导致数据写入错误,可以从 S3 重放所有事件修复
- ClickHouse 可安全清空重建:升级 ClickHouse 版本或迁移 schema 时,不用担心数据丢失
- 写优化:高吞吐场景下可跳过 Read-Modify-Write 中的读步骤,直接用 S3 事件重建
Prompt 管理的独立架构
Prompt 管理是 Langfuse 的一个亮点功能,但它的架构挑战被低估了。
v2 时期,Prompt 和 Tracing 共用同一个 Postgres。高摄入期间,Tracing 的写入负载会导致 Prompt 查询的 P95 延迟飙到 7 秒——对于在 LLM 调用关键路径上的操作来说,这是不可接受的。
v3 的解决方案:
- Redis 作为 Prompt 缓存——SDK 拉取时优先读 Redis(< 5ms)
- 与 ClickHouse 写入负载完全隔离——Prompt 读写只走 Redis + Postgres,不受 Tracing 摄入影响
- 支持 A/B 测试——不同 label 分配不同流量,SDK 按 label 拉取
自部署 vs Cloud:硬件代价
Langfuse 的安装方式有两种:
| 方案 | CPU | 内存 | 磁盘 | 月成本(估) | 适用 |
|---|---|---|---|---|---|
| Docker Compose(测试) | 4 vCPU | 8 GB | 20+ GB | $0(用自己的硬件) | 开发/验证 |
| 生产部署 | 11 vCPU | 25.5 GB | 100+ GB | $40-80(VPS) | 团队/企业 |
| Cloud 免费版 | — | — | — | $0 | 个人/小项目 |
Cloud 免费版每月 50K observations 免费。以 Hermes Agent 的典型用量(每个 turn 约 2-5 个 observations),每天几十个 turn 完全够用。数据保留 30 天。
自部署的硬件成本远高于 Cloud 免费版。如果只是给一两个 Agent 做可观测性,Cloud 免费版是最务实的选择。
数据模型
Langfuse 的核心数据模型以 Trace → Observation → Score 三层嵌套结构组织:
- Trace:一次完整的用户交互(如一次对话 turn)
- Observation:Trace 内的每个步骤——LLM Generation(含 input/output/usage/cost)、Tool Call(含 args/result)、或嵌套 Span
- Score:评估结果,挂载到 Trace 或 Observation
支持任意深度的 Span 嵌套,这对 Agent 场景至关重要。一个典型的 Hermes Agent turn 会产生如下 trace:
Trace: "Hermes turn"
├── Generation: LLM call 0
│ ├── input: [system prompt + user message + memory]
│ ├── output: assistant response with tool_calls
│ ├── usage: {input: 8421, output: 342, reasoning: 2834}
│ └── cost: {input: 0.002, output: 0.0003, reasoning: 0.0015}
├── Observation: Tool: web_search
│ ├── input: {query: "Langfuse ClickHouse architecture"}
│ └── output: [{url, title, description}, ...]
├── Observation: Tool: browser_navigate
│ ├── input: {url: "https://langfuse.com/docs"}
│ └── output: {title, snapshot, ...}
├── Generation: LLM call 1
│ └── output: final answer
└── Score: answer_relevance = 0.92
与 Hermes Agent 的集成
Hermes v0.14.0 内置了 Langfuse 插件。通过 6 个生命周期 hook 实现自动追踪:
pre_api_request/post_api_request:追踪每次 LLM API 调用(含 token usage + cost)pre_tool_call/post_tool_call:追踪每次工具调用(含 args + result)pre_llm_call/post_llm_call:兼容旧版分支
启用只需两步:
pip install langfuse
hermes plugins enable observability/langfuse
然后在 ~/.hermes/.env 中配置 Langfuse 的 public key 和 secret key 即可。插件是 fail-open 设计——SDK 未安装或 key 缺失时静默 no-op,不影响 Agent 正常运行。
竞品对比
| 维度 | Langfuse | LangSmith | Arize Phoenix |
|---|---|---|---|
| 开源 | ✅ MIT | ❌ 闭源 | ✅ |
| 自部署 | ✅ 完整支持 | ❌ SaaS only | ✅ |
| Prompt 管理 | ✅ 内置 | ✅ | ❌ |
| LLM-as-Judge | ✅ 内置 | ✅ | ✅ |
| Agent 嵌套 Span | ✅ 任意深度 | ✅ | ✅ |
| 免费版 | 50K obs/月 | 5K traces/月 | 开源免费 |
| 架构复杂度(自部署) | 6 容器 / 25+ GB RAM | 无需自部署 | 轻量(单容器+PG) |
核心差异:Langfuse 的分布式架构是它最大的竞争优势——代价是自部署的运维复杂度。如果你需要处理海量 trace 数据且想自己掌控基础设施,Langfuse 是最佳选择。如果你只需要轻量级本地 tracing,Arize Phoenix 更简单。如果你不需要自部署,LangSmith 的开发体验更流畅。
总结
Langfuse v3 的技术架构体现了三个关键工程决策:
- 异步 Ingestion:API 层只写 Redis,Worker 异步处理。消除 SDK 侧背压,解耦写入路径
- OLTP/OLAP 读写分离:PostgreSQL 管理事务数据,ClickHouse 承担分析负载。Prompt 查询走 Redis 缓存,与 Tracing 写入完全隔离
- 事件溯源:S3 是所有追踪数据的不可变真相源。ClickHouse 可从 S3 随时重建,消除了数据丢失风险
对个人开发者和 Agent 构建者来说,Cloud 免费版已足够覆盖日常使用。如果未来有数据合规或大规模部署需求,再考虑自部署——但要准备好运维 6 个容器的复杂性。
Langfuse 通过 Hermes Agent v0.14.0 内置插件直接集成,配置只需两行命令。是时候给你的 Agent 装上仪表盘了。