AI Solution Architecture

Deep Dives

View source

Ghi chú kiến trúc Phoenix

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

Phoenix là nền tảng observability và evaluation mã nguồn mở cho AI của Arize. Repository mô tả Phoenix như một nền tảng cho tracing, evaluation, dataset, experiment, playground để lặp prompt và prompt management. Phần triển khai là sản phẩm kết hợp Python và TypeScript: src/phoenix/ chứa server, tracing, database, dataset, session, metrics và utilities; app/ cùng tài sản frontend cung cấp web UI; packages/ chứa subpackage Python như phoenix-client, phoenix-evals, phoenix-otel; js/packages/ chứa package TypeScript như phoenix-otel, phoenix-client, phoenix-evals, phoenix-mcpphoenix-cli.

File gốc pyproject.toml định nghĩa package arize-phoenix, license Elastic-2.0, yêu cầu Python >=3.10,<3.15, và phụ thuộc FastAPI, Starlette, Uvicorn, Strawberry GraphQL, SQLAlchemy async, Alembic, OpenTelemetry, OpenInference semantic conventions, gRPC, Prometheus, Authlib, LDAP cùng các package client/eval/OTel của Phoenix. Server chính có thể chạy local, trong notebook, trong container hoặc Kubernetes. Docker, Compose, Helm và Kustomize trong repo thể hiện topology dự kiến: web/API Phoenix ở port 6006, OTLP gRPC ingestion ở port 4317, persistence bằng SQLite hoặc PostgreSQL.

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

Phoenix giải quyết vòng lặp debug AI quanh trace, evaluation và experiment. Với LLM và agent system, APM tổng quát thường chỉ thấy latency mà không hiểu prompt variable, retrieval document, token/cost detail, tool call, evaluator label, dataset example hoặc lineage của experiment. Phoenix nhận span OpenTelemetry/OpenInference, lưu chúng trong schema hiểu ngữ cảnh AI, hiển thị phân tích trace/span trong UI và kết nối telemetry đó với dataset, experiment, playground run, code evaluator, LLM-as-judge evaluator và prompt version.

Vai trò trong AI stack

Phoenix là workbench quan sát và đánh giá trong AI stack:

Bản đồ source tree

Bằng chứng trong repository:

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

Kiến trúc nội bộ

graph TB Apps[AI apps va OpenInference instrumentations] --> OTLP[OTLP gRPC va HTTP ingestion] SDK[Python va TypeScript Phoenix clients] --> REST[FastAPI REST API] Browser[Web UI] --> GQL[Strawberry GraphQL] Browser --> REST OTLP --> Decode[decode_otlp_span va trace schemas] Decode --> Bulk[BulkInserter va Facilitator] REST --> DBSession[Async SQLAlchemy sessions] GQL --> Loaders[GraphQL DataLoaders] Loaders --> DBSession Bulk --> DB[(SQLite hoac PostgreSQL)] DBSession --> DB Daemons[Experiment runner, sweepers, cost calculator, disk monitor] --> DB Packages[phoenix-evals va phoenix-client] --> REST MCP[phoenix-mcp va phoenix-cli] --> REST

src/phoenix/server/app.py là trung tâm kiến trúc. File này import FastAPI, GraphQL router support, gRPC interceptor, data loader, BulkInserter, Facilitator, GrpcServer, DbDiskUsageMonitor, ExperimentRunner, ExperimentSweeper, GenerativeModelStore, SpanCostCalculator, TraceDataSweeper, authentication backend, redaction, encryption, sandbox session management và OpenTelemetry server instrumentation. Đây không phải wrapper API mỏng mà là composition root của sản phẩm.

Lớp database là async và có kỷ luật migration. src/phoenix/db/alembic.inisrc/phoenix/db/migrations/ cho thấy schema được quản lý bằng migration. src/phoenix/db/aws_auth.py cho thấy hỗ trợ xác thực database theo cloud. Phoenix có thể dùng SQLite local cho triển khai nhẹ hoặc PostgreSQL cho self-host nhiều người dùng và production.

Lớp trace bám sát OpenTelemetry. src/phoenix/trace/attributes.py mô tả cách flatten và unflatten OTEL attributes mà vẫn giữ cấu trúc nested, còn src/phoenix/trace/schemas.py định nghĩa span data structure lấy cảm hứng từ OpenTelemetry.

Luồng runtime và dữ liệu

sequenceDiagram participant App as Ung dung AI da instrument participant OTel as OpenInference hoac Phoenix OTel SDK participant GRPC as Phoenix OTLP gRPC 4317 participant Server as Phoenix server 6006 participant DB as SQLite hoac PostgreSQL participant UI as Phoenix UI participant Eval as phoenix-evals hoac code evaluator App->>OTel: Tao span voi AI semantic attributes OTel->>GRPC: Export OTLP spans GRPC->>Server: Decode va enqueue span insertion Server->>DB: Bulk insert trace, span, cost, annotation UI->>Server: Query GraphQL va REST resources Server->>DB: Load trace, dataset, prompt, experiment Eval->>Server: Submit annotation hoac experiment result UI->>Server: So sanh trace, dataset, prompt variants

Đường ingestion được tối ưu cho payload observability AI chứ không chỉ metric tổng quát. Phoenix nhận span OpenTelemetry, decode thành trace model của Phoenix, insert qua database facilitator/bulk inserter, rồi hiển thị qua GraphQL dataloader và REST resource. Workflow evaluation và experiment có thể xuất phát từ UI, client package hoặc agent tooling; kết quả quay lại database dưới dạng annotation, experiment run hoặc evaluator output.

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

graph LR subgraph Sources Py[Python apps] TS[TypeScript apps] Agents[Coding agents] end subgraph PhoenixPod Server[Phoenix web va API port 6006] Collector[OTLP gRPC port 4317] Sandbox[Optional evaluator sandbox] end subgraph Persistence SQLite[(SQLite volume)] PG[(PostgreSQL)] end subgraph Ops Prom[Prometheus scrape] OTelCollector[External OTLP collector] SMTP[SMTP] IdP[OAuth2 OIDC hoac LDAP] end Py --> Collector TS --> Collector Agents --> Server Server --> SQLite Server --> PG Collector --> Server Server --> Prom Server --> OTelCollector Server --> SMTP Server --> IdP Sandbox --> Server

Topology Compose đơn giản chạy phoenixdb, map 6006:60064317:4317, đặt PHOENIX_SQL_DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres. Các tùy chọn Kubernetes hoàn thiện hơn: helm/README.mdhelm/values.yaml phơi bày authentication, CORS, CSRF trusted origins, brute-force login protection, OAuth2/OIDC, LDAP, PostgreSQL settings, read replica, retention policy, health checks, server host/port/root URL, PHOENIX_MAX_SPANS_QUEUE_SIZE, endpoint export OTLP instrumentation, SMTP, TLS và allowlist sandbox provider. kustomize/base/phoenix.yaml có Prometheus scrape annotation và readiness probe.

Vòng đời và quyết định

stateDiagram-v2 [*] --> Capture Capture --> StoreTrace StoreTrace --> Inspect Inspect --> DatasetDecision DatasetDecision --> AddToDataset: example co gia tri DatasetDecision --> DebugOnly: su co mot lan AddToDataset --> RunExperiment RunExperiment --> Evaluate Evaluate --> Compare Compare --> PromotePrompt: chat luong tang Compare --> RevisePrompt: phat hien regression PromotePrompt --> Capture RevisePrompt --> RunExperiment DebugOnly --> [*]

Phoenix mạnh nhất khi trace không phải điểm kết thúc. Một trace production có thể trở thành dataset example, dataset có thể chạy experiment, experiment có thể được evaluator chấm điểm, và output đã chấm điểm hướng dẫn thay đổi prompt hoặc model. Repository phản ánh vòng lặp này qua src/phoenix/trace/, src/phoenix/datasets/, GraphQL dataloader cho trạng thái experiment/dataset và packages/phoenix-evals/.

Điểm mở rộng

Tích hợp

README liệt kê hỗ trợ rộng qua OpenInference: OpenAI Agents SDK, Claude Agent SDK, LangGraph, Vercel AI SDK, Mastra, CrewAI, LlamaIndex, DSPy, OpenAI, Anthropic, Google GenAI, Google ADK, Bedrock, OpenRouter, LiteLLM và nhiều hệ khác. Phoenix cũng có Python subpackage cho OTel, client và evals; TypeScript package cho OTel, client, evals, MCP và CLI; cùng coding-agent skills trong .agents/skills/.

Thiết kế package cho thấy sự tách vai trò rõ: server sở hữu storage và UI, phoenix-otel sở hữu instrumentation default, phoenix-client sở hữu tương tác API, phoenix-evals sở hữu thực thi metric, còn phoenix-mcp/phoenix-cli đưa dữ liệu Phoenix vào workflow của agent.

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

Các nhóm cấu hình quan trọng:

Trong vận hành, cài đặt capacity rủi ro nhất là PHOENIX_MAX_SPANS_QUEUE_SIZE; Helm ghi chú rằng span đang queue tiêu thụ memory và phải được sizing theo throughput database. Cần theo dõi disk usage database, trạng thái migration, span queue rejection, sức khỏe experiment runner, sandbox availability và drift cấu hình auth.

Observability, testing, evaluation và failure modes

Phoenix có unit, integration và package test trong tests/, packages/phoenix-client/tests/, packages/phoenix-evals/tests/js/packages/*/test/. Tên test bao phủ client resource cho trace/span/session/dataset/experiment, evaluator prompt và adapter, rate limiter, concurrency controller, OTel registration, MCP trace/span/project/dataset utilities và chuyển đổi ATIF trajectory.

Các failure mode cần thiết kế:

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

Phoenix lưu AI telemetry, evaluator output, prompt version, dataset example, annotation và cấu hình provider. Kiểm soát bảo mật nên gồm authentication trong môi trường dùng chung, SSO/OIDC hoặc LDAP khi phù hợp, PHOENIX_SECRET mạnh, TLS cho HTTP và gRPC, cô lập network database, mã hóa secret, redaction rule, trace retention, credential database least privilege và giới hạn sandbox cho code evaluator.

Đội governance nên xem dataset và experiment như hồ sơ chất lượng. Nếu evaluator definition thay đổi, kết quả phải được diễn giải theo evaluator version. Nếu prompt version được promote từ playground, team nên giữ liên kết trace và bằng chứng experiment.

Hướng dẫn đọc

  1. Đọc README.md để nắm workflow sản phẩm và integration.
  2. Đọc pyproject.toml để biết dependency, package entrypoint và optional extra.
  3. Đọc src/phoenix/server/app.py để hiểu composition root của ứng dụng.
  4. Đọc src/phoenix/trace/attributes.py, schemas.pytrace_dataset.py để hiểu biểu diễn trace.
  5. Đọc src/phoenix/db/, nhất là model, migration, bulk inserter và facilitator.
  6. Đọc packages/phoenix-otel/, packages/phoenix-client/, packages/phoenix-evals/ để hiểu vai trò SDK bên ngoài.
  7. Đọc helm/README.md, helm/values.yamlkustomize/base/phoenix.yaml cho cấu hình production.
  8. Dùng test trong packages/js/packages/ để hiểu edge case.

Lộ trình học

  1. Theo dấu một trace từ OpenInference instrumentation đến OTLP gRPC ingestion.
  2. Xem cách một span thành database record rồi thành GraphQL query cho UI.
  3. Học khái niệm dataset và experiment từ README, src/phoenix/datasets/ và dataloader.
  4. Nghiên cứu packages/phoenix-evals để hiểu cách dựng LLM judge và classification evaluator.
  5. Nghiên cứu js/packages/phoenix-mcp nếu muốn đưa dữ liệu Phoenix vào coding agent.
  6. Review cấu hình bảo mật Helm trước khi dùng Phoenix ngoài local environment.

Thuật ngữ

Deep Dive Bám Theo Repository

Nên hiểu Phoenix như một ứng dụng LLMOps đặt OpenTelemetry làm nền, gồm Python server, TypeScript UI và các package evaluator/client riêng. Runtime lõi nằm trong github-repos/05-observability-evaluation-llmops/phoenix/src/phoenix/, với ranh giới quan trọng ở server/, trace/, db/, datasets/metrics/. UI nằm ở app/src/. Package evaluator nằm trong packages/phoenix-evals/, còn JavaScript client/OTEL nằm dưới js/packages/phoenix-client/js/packages/phoenix-otel/. Ví dụ deployment nằm trong kustomize/, helm/scripts/docker/devops/.

flowchart LR App["LLM app co OpenInference instrumentation"] --> OTLP["OTLP HTTP hoac gRPC ingestion"] OTLP --> Server["Phoenix server src/phoenix/server"] Server --> Trace["trace normalization src/phoenix/trace"] Trace --> DB["database layer src/phoenix/db"] DB --> GraphQL["GraphQL resolvers va dataloaders"] GraphQL --> UI["React UI app/src"] DB --> Datasets["datasets va experiments"] EvalPkg["packages/phoenix-evals"] --> Datasets ClientPkg["js/packages/phoenix-client"] --> Server

Ranh giới kiến trúc quan trọng vì Phoenix vừa là ingestion system vừa là analysis workbench. OTLP/OpenInference spans là bằng chứng thô. GraphQL và DataLoader định hình bằng chứng đó để UI khám phá. Datasets, experiments, annotations, prompt versions và evaluators biến observation thành tài sản regression. Nếu team chỉ monitor span ingestion, họ có thể bỏ sót sức khỏe của experiment comparison, evaluator execution, prompt release hoặc dataset mutation.

sequenceDiagram participant Inst as Instrumented app participant OTLP as Phoenix OTLP endpoint participant Srv as Phoenix server participant DB as DB session va migrations participant UI as GraphQL UI participant Eval as Evaluator package Inst->>OTLP: export spans voi OpenInference attributes OTLP->>Srv: parse va normalize spans Srv->>DB: persist traces, spans, annotations UI->>DB: batched GraphQL reads qua dataloaders UI->>Eval: request experiment hoac evaluator workflow Eval->>Srv: submit scores hoac experiment results Srv->>DB: attach evaluations vao datasets hoac spans
flowchart TD Risk["Rui ro van hanh"] --> Ingest["OTLP schema mismatch"] Risk --> DB["database migration drift"] Risk --> Eval["LLM judge nondeterminism"] Risk --> Sandbox["code evaluator sandbox"] Risk --> UI["GraphQL hot query"] Risk --> Auth["auth va reverse proxy"] Ingest --> I1["span attributes lam hong downstream filters"] DB --> D1["experiments hoac annotations khong load duoc"] Eval --> E1["score distributions shift sau doi prompt/model"] Sandbox --> S1["untrusted code can isolation va limits"] UI --> U1["dataloader batching che dau access pattern dat"] Auth --> A1["headers hoac base path loi sau proxy"]

Checklist Sẵn Sàng Production

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

Đọc src/phoenix/server/ trước để hiểu ingestion và API boundaries. Sau đó đọc src/phoenix/trace/src/phoenix/db/ để xem spans thành records queryable như thế nào. Tiếp theo chuyển sang app/src/ cho product concepts, nhất là trace và experiment screens. Cuối cùng inspect packages/phoenix-evals/, packages/phoenix-otel/, js/packages/phoenix-client/ và deployment manifests. Thứ tự này giữ telemetry, persistence, product workflow, SDK behavior và operations thành các lớp riêng.

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

Hãy chạy một kịch bản cho từng plane của Phoenix. Với ingestion, export traces từ một framework integration và xác nhận OpenInference attributes đi qua OTLP parsing, persistence, GraphQL reads và UI rendering. Với evaluation, tạo dataset, chạy experiment bằng evaluator đã pin, rồi kiểm tra annotations và scores vẫn so sánh được sau khi server restart. Với operations, đặt Phoenix sau các reverse-proxy examples, sau đó kiểm tra base URL handling, auth headers, TLS termination và phân trang trace lớn.

Dấu Hiệu Cần Review Lại Kiến Trúc

Cần review lại kiến trúc Phoenix nếu trace tree hiển thị đúng nhưng dataset/experiment không liên kết được với span gốc, nếu evaluator chạy thành công nhưng score distribution thay đổi mà không có version note, hoặc nếu GraphQL UI chậm dù OTLP ingestion vẫn ổn. Những dấu hiệu này cho thấy vấn đề nằm ở lớp phân tích và workflow, không nhất thiết ở ingestion. Trong môi trường production, hãy tách dashboard health, database migration health, evaluator health và OTLP ingestion health thành các tín hiệu vận hành độc lập.

Một kiểm tra hữu ích là chọn một trace phức tạp có tool call, retrieval và annotation, rồi lần lượt truy xuất nó qua UI, GraphQL/API client và evaluator workflow. Nếu ba đường này không kể cùng một câu chuyện dữ liệu, tài liệu vận hành cần ghi rõ nguồn sự thật và quyền ưu tiên của từng store.