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

May 17, 2026

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 读写分离 架构。核心设计哲学:将高吞吐的追踪数据写入与低延迟的分析查询彻底解耦。

graph TB subgraph "用户应用" SDK["Langfuse SDK
(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 最关键的流水线。没有它,一切都是空谈。

sequenceDiagram participant App as 用户 LLM 应用 participant SDK as Langfuse SDK participant API as Ingestion API participant Redis as Redis Queue participant Worker as Worker participant CH as ClickHouse participant S3 as S3/MinIO App->>SDK: @observe() 装饰器
创建 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?
PostgreSQLOLTP 主库事务型、低容量、强一致垂直扩展
ClickHouseOLAP 分析库列式、海量、追加写水平扩展(多节点)分析查询只需扫描相关列,行存需要全表扫描
Redis队列 + 缓存内存、临时性Sentinel/ClusterPub/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 的做法不同:

  1. 每个 Ingestion Event 的原始 JSON 不可变地写入 S3
  2. Worker 处理事件 → 合并成 Observation → 写入 ClickHouse
  3. 如果 ClickHouse 数据损坏或不一致 → 从 S3 原始事件完全重建

这带来了几个实用的好处:

  • 数据不会丢失:S3 的持久性(11 个 9)远超任何数据库
  • 支持事后修复:如果发现某个版本的 Worker 有 bug 导致数据写入错误,可以从 S3 重放所有事件修复
  • ClickHouse 可安全清空重建:升级 ClickHouse 版本或迁移 schema 时,不用担心数据丢失
  • 写优化:高吞吐场景下可跳过 Read-Modify-Write 中的读步骤,直接用 S3 事件重建

Prompt 管理的独立架构

Prompt 管理是 Langfuse 的一个亮点功能,但它的架构挑战被低估了。

sequenceDiagram participant Dev as 产品/工程师 participant UI as Langfuse UI participant PG as PostgreSQL participant Redis as Redis Cache participant SDK as Langfuse SDK participant LLM as LLM API Dev->>UI: 创建 Prompt v1 UI->>PG: 写入 Prompt 定义 Dev->>UI: 发布 v1 UI->>Redis: 更新缓存 Note over SDK,LLM: Prompt 在 LLM 调用的关键路径上 — 必须低延迟 SDK->>Redis: get_prompt("summarizer") Redis-->>SDK: 缓存命中 → v1 (< 5ms) SDK->>LLM: 组装 Prompt + 用户输入 → 调用 LLM Note over SDK,Redis: 缓存 miss 时 Fallback 到 PG SDK->>PG: 缓存 miss → 查询 Prompt PG-->>SDK: v1 (< 50ms)

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 vCPU8 GB20+ GB$0(用自己的硬件)开发/验证
生产部署11 vCPU25.5 GB100+ 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 正常运行。

竞品对比

维度LangfuseLangSmithArize 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 的技术架构体现了三个关键工程决策:

  1. 异步 Ingestion:API 层只写 Redis,Worker 异步处理。消除 SDK 侧背压,解耦写入路径
  2. OLTP/OLAP 读写分离:PostgreSQL 管理事务数据,ClickHouse 承担分析负载。Prompt 查询走 Redis 缓存,与 Tracing 写入完全隔离
  3. 事件溯源:S3 是所有追踪数据的不可变真相源。ClickHouse 可从 S3 随时重建,消除了数据丢失风险

对个人开发者和 Agent 构建者来说,Cloud 免费版已足够覆盖日常使用。如果未来有数据合规或大规模部署需求,再考虑自部署——但要准备好运维 6 个容器的复杂性。

Langfuse 通过 Hermes Agent v0.14.0 内置插件直接集成,配置只需两行命令。是时候给你的 Agent 装上仪表盘了。