1. Démarrer Phoenix #
En une commande.
Options #
# Docker
docker run -d --name phoenix -p 6006:6006 -p 4317:4317 arizephoenix/phoenix:latest
# ou Python
pip install arize-phoenix
phoenix serve| Port | Usage |
|---|---|
| 6006 | Interface web et OTLP/HTTP (/v1/traces) |
| 4317 | OTLP/gRPC |
À savoir : Par défaut, Phoenix stocke les données dans SQLite, dans son répertoire de travail : avec Docker, sans volume, tout disparaît à la suppression du conteneur. Pour conserver les données, montez un volume ou utilisez PostgreSQL (PHOENIX_SQL_DATABASE_URL).2. Tracer une application #
OpenAI ou modèle local.
Avec un modèle local (gratuit) #
La bibliothèque openai peut parler à tout serveur compatible, par exemple Ollama : l'instrumentation OpenInference d'OpenAI capte alors aussi ces appels.
ollama pull llama3.2
export OPENAI_BASE_URL=http://localhost:11434/v1
export OPENAI_API_KEY=ollama # valeur quelconque pour Ollama
export MODEL=llama3.2Le code #
# app.py
import os
from phoenix.otel import register
register(project_name="support-bot", endpoint="http://localhost:6006/v1/traces", auto_instrument=True)
from openai import OpenAI
client = OpenAI()
model = os.getenv("MODEL", "gpt-4o-mini")
for question in ["Comment réinitialiser mon mot de passe ?", "Quels sont vos horaires ?"]:
r = client.chat.completions.create(
model=model,
messages=[{"role": "system", "content": "Tu es l'assistant du support. Réponds en deux phrases."},
{"role": "user", "content": question}])
print(r.choices[0].message.content)pip install arize-phoenix-otel openinference-instrumentation-openai openai
python app.py3. Lire les traces #
Ce que montre Phoenix.
Dans l'interface #
- Le projet
support-botliste une trace par appel, avec latence, statut et nombre de jetons. - Le span
LLMaffiche les messages (système, utilisateur, assistant), le modèle, les paramètres et les jetons. - Les filtres permettent de retrouver les appels lents, en erreur, ou contenant un mot.
- Les colonnes de jetons servent à estimer le coût par requête et par utilisateur.
Diagnostiquer #
| Symptôme | Cause probable |
|---|---|
| Aucune trace | register() appelé après la création du client, mauvais port, instrumentation non installée |
| Spans sans messages | Masquage activé (OPENINFERENCE_HIDE_*) |
| Traces arrivant par paquets | Normal : export par lots ; elles apparaissent quelques secondes plus tard |
Bonne Pratique : Appelez register() au tout début du programme, avant d'importer et de créer les clients des SDK instrumentés.