AI Solution Architecture

Deep Dives

View source

Ghi chú kiến trúc Langfuse

Tóm tắt điều hành

Langfuse là nền tảng LLM engineering mã nguồn mở dùng cho tracing, quản lý prompt, dataset, đánh giá, playground và tự động hóa LLMOps. Trong repository này, Langfuse được tổ chức như một TypeScript monorepo: web/ là ứng dụng Next.js và lớp API, worker/ xử lý các tác vụ nền qua queue, còn packages/shared/ chứa schema miền dùng chung, truy cập Prisma, truy cập ClickHouse, logic ingestion, định nghĩa queue và các query builder. File gốc package.json cho biết phiên bản 3.178.0, Node 24, pnpm@11.1.3, cùng các tác vụ Turborepo cho build, typecheck, lint, test, phát triển, migrate database và hạ tầng local.

Kiến trúc repo hướng đến quan sát LLM ở lưu lượng cao. Metadata vận hành, định danh, cấu hình dự án và trạng thái workflow nằm trong PostgreSQL qua Prisma. Dữ liệu trace/event có tính phân tích nằm trong ClickHouse. Công việc nền được điều phối qua Redis và BullMQ. Payload lớn, media, batch export và dữ liệu cần replay đi qua object storage tương thích S3. File docker-compose.yml thể hiện rõ topology này với các service langfuse-web, langfuse-worker, postgres, clickhouse, redisminio.

Bài toán được giải quyết

Langfuse lấp khoảng trống giữa log ứng dụng thô và các câu hỏi thực tế của nhóm AI: prompt version nào tạo ra câu trả lời này, bước retrieval nào lỗi, session của người dùng tốn bao nhiêu chi phí, trace nào cần người kiểm tra, và liệu biến thể prompt hoặc model mới có làm giảm chất lượng trên dataset kiểm thử hay không. Thay vì buộc đội ngũ ghép dữ liệu từ logging backend tổng quát, Langfuse đưa trace, generation, score, dataset, comment, annotation, prompt, model metadata và evaluation result thành các khái niệm sản phẩm trực tiếp.

Vai trò trong AI stack

Trong một nền tảng AI lớn hơn, Langfuse nằm ở lớp control plane của LLMOps:

Bản đồ source tree

Bằng chứng chính trong repository:

Khái niệm cốt lõi

Kiến trúc nội bộ

graph TB SDK[SDK va integrations] --> API[Next.js API routes] User[Nguoi dung web] --> UI[Next.js UI] UI --> TRPC[tRPC appRouter] API --> Auth[Auth va API key checks] TRPC --> Domain[Feature routers] Domain --> Prisma[Prisma va PostgreSQL] Domain --> CHRead[ClickHouse query layer] API --> S3[Object storage event payloads] API --> Redis[Redis va BullMQ] Redis --> Worker[Langfuse worker] Worker --> Ingestion[IngestionService] Ingestion --> CHWrite[ClickhouseWriter] CHWrite --> ClickHouse[(ClickHouse)] Worker --> Prisma Worker --> Integrations[Webhooks va external integrations] Prisma --> Postgres[(PostgreSQL)]

Ứng dụng web chịu trách nhiệm tương tác người dùng, xác thực, phân quyền theo project và các API đồng bộ. web/src/server/api/root.ts là điểm đọc tốt nhất vì file này liệt kê các module sản phẩm tạo thành hợp đồng API nội bộ. Các thư mục feature trong web/src/features/ sở hữu hành vi domain như dataset, prompt, experiment, public API key, RBAC, batch export, table view, evaluation, LLM tool và integration.

packages/shared/ là lớp hợp đồng giữa web và worker. Lớp này ngăn hai process tự định nghĩa event shape khác nhau. Queue schema trong packages/shared/src/server/queues.ts đặc biệt quan trọng: một job ingestion, deletion, export hoặc evaluation phải hợp lệ trước khi được xử lý. Phần ClickHouse trong packages/shared/src/server/clickhouse/packages/shared/src/server/queries/clickhouse-sql/ cô lập chi tiết analytical storage khỏi feature router.

Worker chịu trách nhiệm độ bền và side effect. Nó consume Redis/BullMQ queue, validate payload, enrich ingestion, ghi ClickHouse, cập nhật Postgres, chạy eval, gửi webhook, thực thi retention/deletion và thu thập queue metrics.

Luồng runtime và dữ liệu

sequenceDiagram participant App as Ung dung AI participant API as Langfuse web API participant Obj as S3 hoac MinIO participant Q as Redis va BullMQ participant W as Worker participant CH as ClickHouse participant PG as PostgreSQL participant UI as Langfuse UI App->>API: Gui trace, observation, score, OTEL event API->>API: Xac thuc project key va validate payload API->>Obj: Luu event body lon hoac can replay API->>Q: Enqueue Ingestion hoac OtelIngestion job W->>Q: Consume typed job W->>Obj: Doc event body khi can W->>W: Normalize, mask, enrich, tinh gia, map model metadata W->>CH: Batch write trace analytical rows W->>PG: Cap nhat relational metadata va job state UI->>PG: Doc project, prompt, eval config, RBAC UI->>CH: Query trace, observation, score, session

Quyết định kiến trúc quan trọng nhất là tách bước nhận ingestion khỏi bước xử lý ingestion. API route nên trả lời nhanh sau khi xác thực, validate, upload object và đưa job vào queue. Worker xử lý phần tốn tài nguyên hoặc dễ lỗi như enrich và ghi ClickHouse. Thiết kế này hỗ trợ replay: worker/src/scripts/replayIngestionEventsV2/README.md mô tả cách replay ingestion lỗi từ S3 key qua admin API vào IngestionSecondaryQueue hoặc OtelIngestionQueue.

Topology triển khai và vận hành

graph LR subgraph Clients Browser[Browser] App[Instrumented AI apps] end subgraph LangfuseRuntime Web[langfuse-web port 3000] Worker[langfuse-worker port 3030 health] end subgraph State PG[(Postgres)] CH[(ClickHouse)] Redis[(Redis noeviction)] MinIO[(S3 compatible storage)] end Browser --> Web App --> Web Web --> PG Web --> CH Web --> Redis Web --> MinIO Worker --> PG Worker --> CH Worker --> Redis Worker --> MinIO Worker --> Email[SMTP] Worker --> Hooks[Webhooks va analytics integrations]

docker-compose.yml ràng buộc hầu hết backing service vào localhost và chỉ để web cùng MinIO ở dạng có thể truy cập trực tiếp trong kịch bản local. Production nên giữ nguyên tinh thần đó: web/API là entrypoint bên ngoài, còn Postgres, Redis, ClickHouse và object storage nằm trong mạng riêng. Các nhóm cấu hình quan trọng gồm DATABASE_URL, NEXTAUTH_SECRET, SALT, ENCRYPTION_KEY, CLICKHOUSE_URL, CLICKHOUSE_*, REDIS_*, LANGFUSE_S3_EVENT_UPLOAD_*, LANGFUSE_S3_MEDIA_UPLOAD_*, LANGFUSE_S3_BATCH_EXPORT_*, SMTP và biến khởi tạo org/project/user đầu tiên.

Vòng đời và phụ thuộc module

stateDiagram-v2 [*] --> Instrument Instrument --> Ingest Ingest --> Normalize Normalize --> Store Store --> Explore Explore --> Annotate Explore --> Evaluate Evaluate --> Dataset Dataset --> Experiment Experiment --> PromptIteration PromptIteration --> Instrument Store --> RetainOrDelete RetainOrDelete --> [*]

Vòng đời này ánh xạ trực tiếp vào source. Instrumentation đi vào public API routes. Validate và transform ingestion nằm trong packages/shared/src/server/ingestion/ và worker ingestion services. Storage dùng Prisma/Postgres cho relational state và ClickHouse cho bảng trace phân tích. Exploration nằm trong feature router, UI dưới web/src/features/ và ClickHouse query builder. Annotation queue, eval router, experiment, dataset và prompt router khép kín vòng lặp từ trace production đến cải tiến có kiểm soát.

Điểm mở rộng

Tích hợp

README liệt kê SDK và framework integration cho Python và JS/TS, OpenAI, LangChain, LlamaIndex, Haystack, LiteLLM, Vercel AI SDK, Mastra, Amazon Bedrock, AutoGen, Flowise, Langflow, Dify, OpenWebUI, Promptfoo, CrewAI và nhiều provider hoặc app builder khác. Trong repository, hành vi integration xuất hiện ở product router, ingestion adapter, webhook processor, blob storage integration queue, PostHog/Mixpanel integration queue và các test chuyển đổi framework trace trong worker/src/__tests__/chatml/.

Cấu hình, triển khai và vận hành

Các run mode nằm trong script gốc: hạ tầng local qua infra:dev:up, phát triển qua dev:webdev:worker, build/test/typecheck qua Turborepo. Thay đổi database đi qua các script workspace như db:migrate, db:generatedb:seed.

Khi vận hành, cần theo dõi:

Observability, testing, evaluation và failure modes

Repository có nhiều test trong worker/src/__tests__/, worker/src/queues/__tests__/, worker/src/services/IngestionService/tests/, web/src/__tests__/ và test ở package. Tên test cho thấy các vùng rủi ro được kiểm soát: ingestion masking, process event batch, OTEL conversion, queue processing, eval execution, model matching, secure LLM fetch, outbound connection validation, webhook, retention cleaning, deletion, batch export, pricing và ClickHouse writer.

Các failure mode thường gặp:

Rủi ro bảo mật và quản trị

Hãy xem Langfuse như telemetry production nhạy cảm. Nó lưu prompt người dùng, output, tham số tool, retrieval context, mức sử dụng model, score, comment và có thể cả dữ liệu chịu quy định. Kiểm soát cần có gồm API key theo project, NEXTAUTH_SECRET mạnh, xoay vòng ENCRYPTION_KEY, backing service trong mạng riêng, TLS, RBAC, SSO khi cần, review audit log, outbound network validation, retention policy, object storage lifecycle rule và masking PII/secret trước ingestion.

File compose có nhiều giá trị mẫu CHANGEME cho password và secret mật mã. Các giá trị mặc định đó chỉ dành cho local setup. Production cũng phải chặn truy cập trực tiếp vào ClickHouse, Redis, Postgres và object storage, chỉ cho phép các service Langfuse kết nối.

Hướng dẫn đọc

  1. Bắt đầu với README.md để nắm phạm vi sản phẩm và integration được hỗ trợ.
  2. Đọc package.json, pnpm-workspace.yamlturbo.json để hiểu monorepo và build graph.
  3. Đọc docker-compose.yml để hiểu phụ thuộc runtime.
  4. Đọc web/src/server/api/root.tsweb/src/server/api/trpc.ts để thấy biên API của ứng dụng.
  5. Đọc packages/shared/src/server/queues.ts, packages/shared/src/server/ingestion/packages/shared/src/server/clickhouse/ để nắm hợp đồng giữa process.
  6. Đọc worker/src/queues/workerManager.ts, các queue processor, worker/src/services/IngestionService/index.tsworker/src/services/ClickhouseWriter/index.ts để hiểu xử lý bất đồng bộ.
  7. Dùng test trong worker/src/__tests__/worker/src/queues/__tests__/ để học cách hệ thống xử lý lỗi.

Lộ trình học

  1. Đi qua quickstart trong README ở mức khái niệm: project, API key, SDK ingestion.
  2. Theo dấu một event từ public API route đến queue schema, worker processor và ClickHouse writer.
  3. Nghiên cứu một tRPC feature router, rồi tìm UI feature và test tương ứng.
  4. Nghiên cứu một luồng eval từ lựa chọn dataset hoặc observation đến eval queue và score writeback.
  5. Review biến triển khai và quyết định secret, retention setting, storage policy nào cần cho môi trường của bạn.
  6. Chỉ chạy hạ tầng dev local sau khi đã rõ kiến trúc; tác vụ tài liệu này không cài dependency và không khởi động service.

Thuật ngữ

Deep Dive Bám Theo Repository

Nên đọc Langfuse trước hết như một hệ thống event lưu lượng cao, sau đó mới là dashboard. Cấu trúc source củng cố cách nhìn này: web/src/features/public-api/web/src/features/traces/ định nghĩa ingestion và hành vi sản phẩm xoay quanh trace; worker/src/features/traces/, worker/src/features/evaluation/, worker/src/features/scores/worker/src/features/datasets/ xử lý công việc bất đồng bộ; packages/shared/prisma/schema.prisma giữ relational state cho project; còn packages/shared/clickhouse/migrations/ mô tả analytical store cho trace/event. API sinh từ fern/apis/ và ví dụ môi trường như .env.prod.example là contract vận hành cần review cùng nhau.

flowchart LR SDK["SDK hoac OTEL producer"] --> PublicAPI["public API routes web/src/features/public-api"] PublicAPI --> Auth["project key auth va ingestion validation"] Auth --> Queue["Redis va BullMQ queues"] Queue --> TraceWorker["worker trace processors"] Queue --> EvalWorker["worker evaluation processors"] TraceWorker --> ClickHouse["ClickHouse trace, observation, score tables"] EvalWorker --> Postgres["Postgres qua Prisma schema"] EvalWorker --> ClickHouse WebUI["Next.js UI web/src/features/traces"] --> Postgres WebUI --> ClickHouse

Một trace có hai vòng đời: vòng đời ingest để raw observations trở nên durable và queryable, và vòng đời chất lượng để gắn score, annotation, eval result hoặc so sánh dataset run. Reviewer senior nên tách hai đường này. ClickHouse tối ưu cho event analytics và khám phá trace, còn Postgres/Prisma giữ organizations, projects, API keys, users, prompts, datasets, score configs và workflow metadata. Nếu nhập nhằng hai trách nhiệm này, quyết định migration và retention sẽ dễ sai.

stateDiagram-v2 [*] --> Observed Observed --> Stored: ingestion accepted Stored --> Reviewed: human annotation queue Stored --> Evaluated: worker evaluation job Evaluated --> Scored: score persisted Reviewed --> Scored Scored --> Compared: dataset or experiment view Compared --> Retained: retention policy keeps data Compared --> Deleted: project or trace deletion flow Deleted --> [*]
flowchart TD Risk["Rui ro production"] --> Ingest["ingestion burst"] Risk --> QueueLag["queue lag"] Risk --> Warehouse["ClickHouse migration hoac retention"] Risk --> Secret["LLM provider secrets"] Risk --> EvalCost["eval cost va recursion"] Risk --> Privacy["PII va media retention"] Ingest --> I1["API accept nhanh hon worker persist"] QueueLag --> Q1["scores va webhooks den tre"] Warehouse --> W1["dashboard query thieu partition"] Secret --> S1["playground/eval worker co the goi model ngoai"] EvalCost --> E1["judge runs vuot budget"] Privacy --> P1["trace payload hoac media song lau hon policy"]

Checklist Sẵn Sàng Production

Hướng Dẫn Đọc Cho Senior Architect

Bắt đầu với docker-compose.yml.env.prod.example để hiểu runtime dependencies. Sau đó đọc packages/shared/prisma/schema.prismapackages/shared/clickhouse/migrations/ để tách relational state khỏi event analytics. Tiếp theo trace một ingest endpoint trong web/src/features/public-api/ vào worker processors ở worker/src/features/traces/. Cuối cùng đọc web/src/features/evals/, worker/src/features/evaluation/web/src/features/datasets/ để hiểu cách Langfuse biến hành vi quan sát được thành quality signal có governance.

Kịch Bản Vận Hành Cần Diễn Tập

Trước khi xem Langfuse là hạ tầng LLMOps production, nên diễn tập ba kịch bản cụ thể. Thứ nhất, gửi burst traces có nested tool calls, media và scores, rồi kiểm tra queue lag, ClickHouse inserts, dashboard filters và deletion behavior. Thứ hai, chạy evaluator trên dataset trong lúc LLM provider chậm hoặc unavailable, rồi inspect retries, score writeback và cost reporting. Thứ ba, rotate project API keys và provider credentials, rồi xác nhận ingestion, playground, webhooks và annotation queues vẫn tôn trọng project boundaries dự kiến.