mcpField
P
phoenix-observability

phoenix-observability

github.com/kalarislabs其他7343 次安装4 天前更新
代码仓库

关于 phoenix-observability

Phoenix 是面向 LLM 应用的开源可观测与评估平台,适合开发和运维团队调试、评测及监控应用。它结合追踪、数据集、实验和实时监控,并支持自托管。

主要功能

  1. 01基于 OpenTelemetry 收集追踪
  2. 02使用评估器评测输出质量
  3. 03管理版本化测试数据集
  4. 04比较提示词、模型和配置
  5. 05通过 Playground 测试提示词
  6. 06支持 PostgreSQL 或 SQLite

适用场景

  1. 01排查 LLM 应用执行问题
  2. 02在数据集上运行系统化评测
  3. 03监控生产环境中的 LLM 系统
  4. 04比较不同提示词与模型配置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill phoenix-observability

安装后在 Claude Code 中输入/phoenix-observability确认已加载。

附带文件references/advanced-usage.mdreferences/troubleshooting.md

详细介绍

Phoenix - AI 可观测性平台

面向 LLM 应用的开源 AI 可观测性与评估平台,提供追踪、评估、数据集、实验和实时监控功能。

何时使用 Phoenix

在以下情况下使用 Phoenix:

  • 通过详细追踪排查 LLM 应用问题
  • 在数据集上运行系统化评估
  • 实时监控生产环境中的 LLM 系统
  • 构建用于提示词/模型对比的实验流水线
  • 无供应商锁定的可自托管可观测性方案

主要功能:

  • 追踪:基于 OpenTelemetry,为任意 LLM 框架收集追踪数据
  • 评估:使用 LLM-as-judge 评估器评估质量
  • 数据集:用于回归测试的版本化测试集
  • 实验:对比提示词、模型和配置
  • Playground:交互式提示词测试,支持多个模型
  • 开源:可自托管,使用 PostgreSQL 或 SQLite

以下情况请改用其他方案:

  • LangSmith:托管平台,与 LangChain 优先集成
  • Weights & Biases:专注于深度学习实验追踪
  • Arize Cloud:具备企业功能的托管版 Phoenix
  • MLflow:通用机器学习生命周期管理,专注于模型注册表

快速开始

安装
pip install arize-phoenix

# With specific backends
pip install arize-phoenix[embeddings]  # Embedding analysis
pip install arize-phoenix-otel         # OpenTelemetry config
pip install arize-phoenix-evals        # Evaluation framework
pip install arize-phoenix-client       # Lightweight REST client
启动 Phoenix 服务
import phoenix as px

# Launch in notebook (ThreadServer mode)
session = px.launch_app()

# View UI
session.view()  # Embedded iframe
print(session.url)  # http://localhost:6006
命令行服务(生产环境)
# Start Phoenix server
phoenix serve

# With PostgreSQL
export PHOENIX_SQL_DATABASE_URL="postgresql://user:pass@host/db"
phoenix serve --port 6006
基本追踪
from phoenix.otel import register
from openinference.instrumentation.openai import OpenAIInstrumentor

# Configure OpenTelemetry with Phoenix
tracer_provider = register(
    project_name="my-llm-app",
    endpoint="http://localhost:6006/v1/traces"
)

# Instrument OpenAI SDK
OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)

# All OpenAI calls are now traced
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}]
)

核心概念

追踪和跨度

追踪代表完整的执行流程,跨度则是该追踪中的单个操作。

from phoenix.otel import register
from opentelemetry import trace

# Setup tracing
tracer_provider = register(project_name="my-app")
tracer = trace.get_tracer(__name__)

# Create custom spans
with tracer.start_as_current_span("process_query") as span:
    span.set_attribute("input.value", query)

    # Child spans are automatically nested
    with tracer.start_as_current_span("retrieve_context"):
        context = retriever.search(query)

    with tracer.start_as_current_span("generate_response"):
        response = llm.generate(query, context)

    span.set_attribute("output.value", response)
项目

项目用于组织相关的追踪:

import os
os.environ["PHOENIX_PROJECT_NAME"] = "production-chatbot"

# Or per-trace
from phoenix.otel import register
tracer_provider = register(project_name="experiment-v2")

框架插桩

OpenAI
from phoenix.otel import register
from openinference.instrumentation.openai import OpenAIInstrumentor

tracer_provider = register()
OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)
LangChain
from phoenix.otel import register
from openinference.instrumentation.langchain import LangChainInstrumentor

tracer_provider = register()
LangChainInstrumentor().instrument(tracer_provider=tracer_provider)

# All LangChain operations traced
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
response = llm.invoke("Hello!")
LlamaIndex
from phoenix.otel import register
from openinference.instrumentation.llama_index import LlamaIndexInstrumentor

tracer_provider = register()
LlamaIndexInstrumentor().instrument(tracer_provider=tracer_provider)
Anthropic
from phoenix.otel import register
from openinference.instrumentation.anthropic import AnthropicInstrumentor

tracer_provider = register()
AnthropicInstrumentor().instrument(tracer_provider=tracer_provider)

评估框架

内置评估器
from phoenix.evals import (
    OpenAIModel,
    HallucinationEvaluator,
    RelevanceEvaluator,
    ToxicityEvaluator,
    llm_classify
)

# Setup model for evaluation
eval_model = OpenAIModel(model="gpt-4o")

# Evaluate hallucination
hallucination_eval = HallucinationEvaluator(eval_model)
results = hallucination_eval.evaluate(
    input="What is the capital of France?",
    output="The capital of France is Paris.",
    reference="Paris is the capital of France."
)
自定义评估器
from phoenix.evals import llm_classify

# Define custom evaluation
def evaluate_helpfulness(input_text, output_text):
    template = """
    Evaluate if the response is helpful for the given question.

    Question: {input}
    Response: {output}

    Is this response helpful? Answer 'helpful' or 'not_helpful'.
    """

    result = llm_classify(
        model=eval_model,
        template=template,
        input=input_text,
        output=output_text,
        rails=["helpful", "not_helpful"]
    )
    return result
在数据集上运行评估
from phoenix import Client
from phoenix.evals import run_evals

client = Client()

# Get spans to evaluate
spans_df = client.get_spans_dataframe(
    project_name="my-app",
    filter_condition="span_kind == 'LLM'"
)

# Run evaluations
eval_results = run_evals(
    dataframe=spans_df,
    evaluators=[
        HallucinationEvaluator(eval_model),
        RelevanceEvaluator(eval_model)
    ],
    provide_explanation=True
)

# Log results back to Phoenix
client.log_evaluations(eval_results)

数据集和实验

创建数据集
from phoenix import Client

client = Client()

# Create dataset
dataset = client.create_dataset(
    name="qa-test-set",
    description="QA evaluation dataset"
)

# Add examples
client.add_examples_to_dataset(
    dataset_name="qa-test-set",
    examples=[
        {
            "input": {"question": "What is Python?"},
            "output": {"answer": "A programming language"}
        },
        {
            "input": {"question": "What is ML?"},
            "output": {"answer": "Machine learning"}
        }
    ]
)
运行实验
from phoenix import Client
from phoenix.experiments import run_experiment

client = Client()

def my_model(input_data):
    """Your model function."""
    question = input_data["question"]
    return {"answer": generate_answer(question)}

def accuracy_evaluator(input_data, output, expected):
    """Custom evaluator."""
    return {
        "score": 1.0 if expected["answer"].lower() in output["answer"].lower() else 0.0,
        "label": "correct" if expected["answer"].lower() in output["answer"].lower() else "incorrect"
    }

# Run experiment
results = run_experiment(
    dataset_name="qa-test-set",
    task=my_model,
    evaluators=[accuracy_evaluator],
    experiment_name="baseline-v1"
)

print(f"Average accuracy: {results.aggregate_metrics['accuracy']}")

客户端 API

查询追踪和跨度
from phoenix import Client

client = Client(endpoint="http://localhost:6006")

# Get spans as DataFrame
spans_df = client.get_spans_dataframe(
    project_name="my-app",
    filter_condition="span_kind == 'LLM'",
    limit=1000
)

# Get specific span
span = client.get_span(span_id="abc123")

# Get trace
trace = client.get_trace(trace_id="xyz789")
记录反馈
from phoenix import Client

client = Client()

# Log user feedback
client.log_annotation(
    span_id="abc123",
    name="user_rating",
    annotator_kind="HUMAN",
    score=0.8,
    label="helpful",
    metadata={"comment": "Good response"}
)
导出数据
# Export to pandas
df = client.get_spans_dataframe(project_name="my-app")

# Export traces
traces = client.list_traces(project_name="my-app")

生产环境部署

Docker
docker run -p 6006:6006 arizephoenix/phoenix:latest
使用 PostgreSQL
# Set database URL
export PHOENIX_SQL_DATABASE_URL="postgresql://user:pass@host:5432/phoenix"

# Start server
phoenix serve --host 0.0.0.0 --port 6006
环境变量
变量说明默认值
PHOENIX_PORTHTTP 服务端口6006
PHOENIX_HOST服务绑定地址127.0.0.1
PHOENIX_GRPC_PORTgRPC/OTLP 端口4317
PHOENIX_SQL_DATABASE_URL数据库连接SQLite 临时数据库
PHOENIX_WORKING_DIR数据存储目录操作系统临时目录
PHOENIX_ENABLE_AUTH启用身份验证false
PHOENIX_SECRETJWT 签名密钥启用身份验证时必填
使用身份验证
export PHOENIX_ENABLE_AUTH=true
export PHOENIX_SECRET="your-secret-key-min-32-chars"
export PHOENIX_ADMIN_SECRET="admin-bootstrap-token"

phoenix serve

最佳实践

  1. 使用项目:按环境(dev/staging/prod)分隔追踪
  2. 添加元数据:包含用户 ID、会话 ID,便于排查问题
  3. 定期评估:在 CI/CD 中运行自动化评估
  4. 为数据集添加版本:持续追踪测试集的变更
  5. 监控成本:通过 Phoenix 控制面板追踪 token 使用量
  6. 自行托管:在生产环境部署中使用 PostgreSQL

常见问题

未显示追踪:

from phoenix.otel import register

# Verify endpoint
tracer_provider = register(
    project_name="my-app",
    endpoint="http://localhost:6006/v1/traces"  # Correct endpoint
)

# Force flush
from opentelemetry import trace
trace.get_tracer_provider().force_flush()

Notebook 占用内存过高:

# Close session when done
session = px.launch_app()
# ... do work ...
session.close()
px.close_app()

数据库连接问题:

# Verify PostgreSQL connection
psql $PHOENIX_SQL_DATABASE_URL -c "SELECT 1"

# Check Phoenix logs
phoenix serve --log-level debug

参考资料

资源

相关技能

  • langsmith-observability:用于追踪、评估和监控的 LLM 可观测性平台。
  • chroma:面向 AI 应用的开源嵌入数据库。
  • speculative-decoding:使用推测解码、Medusa 多头和前瞻解码技术加速 LLM 推理。

评论

支持 Markdown