源码深度学习 · 零基础友好 · 20 天

Langfuse 源码学习

面向团队的开源 LLM 工程平台:追踪、提示词、评测、数据集和调试。这不是 API 速查表,而是一条可以重复走的源码路线:每天用 30 分钟,从一个真实相对路径出发,先用类比建立直觉,再把它接回整条运行链路。

00

开篇 · 这是个什么项目

Langfuse 可以先想成一间AI 应用的飞行记录仪 + 实验室。它的代码不是一堆孤立文件:入口接到需求,核心对象做判断,工具或模型完成工作,状态把结果交给下一个环节。

💡 20 天的主线先找入口和地图,再跟一次真实任务穿过核心循环;随后研究状态、模型、工具与扩展;最后用复盘把全部概念连成一张可迁移的地图。不要背目录名,要不断问「谁创建它、它把什么交给谁」。
大白话读源码像参观工厂:第一天先看门牌和楼层,不急着拆机器。后面每节课只打开一个焦点路径,但始终知道它属于哪层、服务哪个业务动作。
01

架构全景(动起来看)

发光扫过的每一层都是一次任务可能经过的站点。不同仓库命名不同,但「接入 → 编排 → 核心能力 → 资源」的责任边界很相似。

L5 · 接入层
SDK本层职责
Public API本层职责
OTel本层职责
L4 · 应用层
Next.js本层职责
tRPC本层职责
Features本层职责
L3 · 领域层
Repositories本层职责
Prompt本层职责
Dataset本层职责
L2 · 异步层
Queues本层职责
Worker本层职责
Ingestion本层职责
L1 · 数据层
Postgres本层职责
ClickHouse本层职责
Redis本层职责
输入用户任务组织对象 / 流程执行模型 / 工具沉淀状态 / 记忆
设计取舍分层会增加跳转文件的次数,却让每层只承担一种职责:入口容易替换,核心逻辑能测试,模型与外部工具可插拔。读代码时先沿箭头追「数据」而不是追每一个类。
02

怎么使用这份教程

⏱️

每天 30 分钟

6 讲,每讲先问问题,再给本质和大白话。

📍

真实相对路径

所有路径都从项目根目录算,不把你的机器路径写进源码引用。

🧪

先验证再推理

每页都有可复制 bash 命令;文件版本变化时以本地实际内容为准。

🧭

可迁移方法

学会从入口、数据结构、循环和扩展点读任何 AI 项目。

S1

阶段 1 · 平台全景

D01-D03 · 数据流和 monorepo 边界
01

Turbo Monorepo 与应用边界

package.json:区分 web、worker 和 shared 三个核心包。

≈30 min · 6 讲开始学 →
02

共享服务端入口

packages/shared/src/index.ts:认识跨 Web 与 Worker 复用的基础能力。

≈30 min · 6 讲开始学 →
03

Web 与 Worker 启动

worker/src/index.ts:理解同步请求服务和异步后台服务的分工。

≈30 min · 6 讲开始学 →
S2

阶段 2 · 可观测性数据

D04-D07 · Trace、Observation、事件摄取
04

追踪领域模型

packages/shared/src/server/repositories/traces.ts:学习 trace 在产品查询层的基本形态。

≈30 min · 6 讲开始学 →
05

Observation 查询模型

packages/shared/src/server/repositories/observations.ts:区分模型生成、工具调用等细粒度观测。

≈30 min · 6 讲开始学 →
06

事件与会话仓储

packages/shared/src/server/repositories/events.ts:认识事件、session 与 trace 的关联。

≈30 min · 6 讲开始学 →
07

Public Trace API

web/src/pages/api/public/traces:跟踪 SDK/用户如何访问追踪数据。

≈30 min · 6 讲开始学 →
S3

阶段 3 · 异步数据管道

D08-D11 · Redis 队列与 ClickHouse
08

摄取服务

worker/src/services/IngestionService:理解输入事件如何被校验、转换和批处理。

≈30 min · 6 讲开始学 →
09

摄取队列

worker/src/queues/ingestionQueue.ts:学习可靠异步摄取的生产者与消费者边界。

≈30 min · 6 讲开始学 →
10

ClickHouse 写入器

worker/src/services/ClickhouseWriter:理解高吞吐观测数据写入分析数据库的职责。

≈30 min · 6 讲开始学 →
11

OTel 摄取队列

worker/src/queues/otelIngestionQueue.ts:认识 OpenTelemetry 数据接入的专用流程。

≈30 min · 6 讲开始学 →
S4

阶段 4 · 服务端产品能力

D12-D14 · API、仓储和领域服务
12

tRPC 根路由

web/src/server/api/root.ts:了解 Web 前端调用后端领域能力的组织方式。

≈30 min · 6 讲开始学 →
13

追踪表查询 API

web/src/server/api/routers/traces.ts:阅读筛选、分页和权限后的 trace 查询。

≈30 min · 6 讲开始学 →
14

Prompt 领域服务

packages/shared/src/server/services/PromptService:理解提示词版本、缓存和服务端规则。

≈30 min · 6 讲开始学 →
S5

阶段 5 · 产品界面

D15-D17 · 追踪、提示词、评测和数据集
15

数据集领域服务

packages/shared/src/server/services/DatasetService:学习数据集与数据项的验证和管理。

≈30 min · 6 讲开始学 →
16

追踪产品页面模块

web/src/features/tracing-tables:将表格、过滤器和后端查询对应起来。

≈30 min · 6 讲开始学 →
17

提示词产品模块

web/src/features/prompts:理解提示词 UI 如何接入版本化服务。

≈30 min · 6 讲开始学 →
S6

阶段 6 · 评估闭环

D18-D20 · 实验、保留与扩展方案
18

评测与实验队列

worker/src/queues/evalQueue.ts:学习异步评测任务的触发与处理。

≈30 min · 6 讲开始学 →
19

Score 查询与配置

packages/shared/src/server/repositories/scores.ts:理解质量分数如何成为可分析数据。

≈30 min · 6 讲开始学 →
20

保留、删除与数据生命周期

worker/src/queues/dataRetentionQueue.ts:复盘从摄取到分析、保留和删除的完整闭环。

≈30 min · 6 讲开始学 →