「エージェントが何をやったのか、ぜんぜん追えない」
実際にAIエージェントを本番運用し始めた開発チームから、最もよく聞く悩みです。ツール呼び出しが連鎖し、RAGが走り、LLMが何かを判断する—その過程でどこに時間がかかり、どこで回答品質が落ちているのかが見えない。ログを追っても、print文を仕込んでも、すぐに限界がくる。
Arize Phoenixは、そうした「エージェントの中身が見えない問題」をOpenTelemetryベースのトレーシングとLLMベースの評価で解決するOSSのオブザーバビリティプラットフォームです。この記事では、PhoenixをPythonプロジェクトに導入し、AIエージェントのトレース収集・評価・デバッグを実践する方法を、コピペ可能なコードつきで全公開します。5分で起動できるローカルセットアップから本番グレードの構成まで、順番に紹介していきますので、ぜひ今日から試してみてください。
なお、LangfuseやLangSmithとの比較についてはLangfuse実践ガイドも参照してください。Arize Phoenix単独の深掘りに特化したのがこの記事です。
まず5分で試す:Phoenixのローカル起動と最初のトレース
セットアップは驚くほど簡単です。まずパッケージをインストールして、Phoenixをバックグラウンドで起動します。
# 動作環境: Python 3.10+
# インストール(OTelトレーシング一式)
pip install arize-phoenix arize-phoenix-otel openinference-instrumentation-openai openai
# Phoenixサーバーをバックグラウンド起動(デフォルト: http://localhost:6006)
python -c "import phoenix as px; px.launch_app()"
起動後、http://localhost:6006 にアクセスするとPhoenixのダッシュボードが開きます。次に、OpenAIエージェントのトレースを自動収集するコードを書いてみましょう。
# 動作環境: Python 3.10+, openai>=1.26, arize-phoenix>=4.0
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
from openai import OpenAI
from phoenix.otel import register
# Phoenixにトレースを送信するプロバイダーを登録
# auto_instrument=True で OpenAI SDK を自動インスツルメント
tracer_provider = register(
project_name="my-ai-agent",
auto_instrument=True, # OpenAI, LangChain等を自動検出
batch=True, # バッチ送信でオーバーヘッドを最小化
endpoint="http://localhost:6006/v1/traces",
)
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# このリクエストのトレースがPhoenixに自動送信される
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "AIエージェントのオブザーバビリティとは?"}],
)
print(response.choices[0].message.content)
これだけで、ダッシュボード上にトレースが表示されます。レイテンシ、入出力トークン数、モデル名が自動収集されます。
Arize Phoenixが解決する4つの問題
Phoenixは単なるロガーではありません。AIエージェントのオブザーバビリティに必要な機能を4つの柱で提供しています。
| 機能 | 何を解決するか | 主なユースケース | 自前実装との比較 |
|---|---|---|---|
| トレーシング | エージェントの実行フローを可視化 | ツール呼び出し、RAGステップの追跡 | print文の10倍の情報量 |
| LLMベース評価 | 回答品質を自動測定 | ハルシネーション検出、関連性評価 | 人手レビューを大幅削減 |
| プロンプト管理 | プロンプトのバージョン管理・比較 | A/Bテスト、本番データでの改善 | Gitとの二重管理が不要 |
| データセット&実験 | 変更前後の品質比較 | モデル切り替え、RAGチューニング | 評価基盤の構築工数ゼロ |
特に「トレーシング」は、マルチステップエージェントのデバッグで真価を発揮します。どのツール呼び出しに何秒かかったか、どのRAGチャンクが使われたか、どの判断分岐でどの応答が生成されたか—全部が1つのトレースビューに収まります。
マルチステップエージェントのトレース実装(LangChainとClaude Agent SDK)
AIエージェントのオブザーバビリティで最も重要なのは、複数ステップにまたがるトレースの連鎖です。LangChainとAnthropic Agent SDKへのインテグレーション例を示します。
LangChainエージェントのトレース
# 動作環境: Python 3.10+, langchain>=0.1.0, openinference-instrumentation-langchain>=0.1.0
# pip install openinference-instrumentation-langchain langchain langchain-openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
from phoenix.otel import register
from openinference.instrumentation.langchain import LangChainInstrumentor
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.tools import tool
# Phoenixに接続
tracer_provider = register(
project_name="langchain-agent",
endpoint="http://localhost:6006/v1/traces",
)
# LangChainを自動インスツルメント(tool呼び出しも全てトレース)
LangChainInstrumentor().instrument(tracer_provider=tracer_provider)
@tool
def search_web(query: str) -> str:
"""ウェブ検索を実行する"""
# 実装省略(本番ではTavily等を使用)
return f"検索結果: {query}に関する最新情報..."
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [search_web]
# エージェント実行 — tool呼び出しの全ステップがPhoenixにトレースされる
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "あなたはAI研究者です。"),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad"),
])
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "Arize Phoenixの最新バージョンは?"})
print(result["output"])
Anthropic Claude Agent SDKとのインテグレーション
# 動作環境: Python 3.10+, anthropic>=0.49
# pip install openinference-instrumentation-anthropic anthropic arize-phoenix-otel
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
from phoenix.otel import register
from openinference.instrumentation.anthropic import AnthropicInstrumentor
import anthropic
# Phoenixプロバイダーを登録してAnthropicをインスツルメント
tracer_provider = register(
project_name="claude-agent",
endpoint="http://localhost:6006/v1/traces",
)
AnthropicInstrumentor().instrument(tracer_provider=tracer_provider)
client = anthropic.Anthropic()
# このAPI呼び出しのトレース(入出力トークン、レイテンシ)がPhoenixに送信される
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "AIエージェントの認証設計のベストプラクティスは?"}],
)
print(message.content[0].text)
AIエージェントの構築パターン全般については、AIエージェント構築完全ガイドで体系的にまとめています。
LLMベース評価:ハルシネーションと関連性を自動測定する
トレースを収集したら、次は評価です。PhoenixにはLLMを使った評価器が組み込まれており、ハルシネーション、関連性、毒性を自動でスコアリングできます。
# 動作環境: Python 3.10+, arize-phoenix-evals>=0.8
# pip install arize-phoenix-evals openai
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import pandas as pd
from phoenix.evals import (
HallucinationEvaluator,
RelevanceEvaluator,
OpenAIModel,
run_evals,
)
# 評価対象のデータ(トレースから自動取得も可能)
eval_data = pd.DataFrame({
"input": [
"Arize Phoenixとは何ですか?",
"AIエージェントのオブザーバビリティツールは?",
],
"reference": [
"Arize PhoenixはOSSのAIオブザーバビリティプラットフォームです。",
"Langfuse、LangSmith、Arize Phoenixなどがあります。",
],
"output": [
"Arize Phoenixは2025年にリリースされたクローズドソースの評価ツールです。", # ハルシネーション例
"Langfuse、LangSmith、Arize Phoenixが主要なツールです。",
],
})
# GPT-4oを評価器として使用
model = OpenAIModel(model="gpt-4o")
evaluators = [
HallucinationEvaluator(model), # ハルシネーション検出
RelevanceEvaluator(model), # 関連性評価
]
# バッチ評価実行
results = run_evals(
dataframe=eval_data,
evaluators=evaluators,
provide_explanations=True, # 判定理由も出力
)
print(results)
# 出力例:
# hallucination relevance hallucination_explanation ...
# HALLUCINATED RELEVANT "クローズドソースという記述は誤り。実際はOSS"
# NOT_HALLUCINATED RELEVANT ""
評価結果はPhoenixダッシュボードに自動で紐付けられます。どのトレースで評価スコアが低かったかを一覧から確認し、プロンプトを改善するサイクルが回せるようになります。
本番環境への移行:クラウドホスティングとOTelエクスポーター
ローカルのPhoenixから本番環境に移行する際の構成を示します。Arize AI Cloudを使うか、自前でPhoenixサーバーをホスティングするかの2択です。
# 動作環境: Python 3.10+
# Arize AI Cloud(SaaS版)への送信設定
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
import os
from phoenix.otel import register
# 環境変数でAPIキーを管理(ハードコード厳禁)
PHOENIX_API_KEY = os.environ.get("PHOENIX_API_KEY")
PHOENIX_COLLECTOR_ENDPOINT = "https://app.phoenix.arize.com/v1/traces"
tracer_provider = register(
project_name="production-agent",
auto_instrument=True,
endpoint=PHOENIX_COLLECTOR_ENDPOINT,
headers={"api_key": PHOENIX_API_KEY},
batch=True,
)
# セルフホストの場合はDockerで起動
# docker run -p 6006:6006 -p 4317:4317 arizephoenix/phoenix:latest
セルフホスト構成では、エージェントのトレースデータが外部に出ないため、機密データを扱う金融・医療系プロジェクトに適しています。OTel標準のため、既存のDatadog/Grafana環境と共存することもできます。
【要注意】よくある失敗パターンと回避策
Phoenixを実際に導入したプロジェクトで遭遇しやすい問題をまとめました。
失敗1:トレースが収集されない(インスツルメントのタイミング問題)
❌ OpenAIクライアントを初期化してからInstrumentorを設定する
client = OpenAI() # ← この後にinstrumentすると効かない
LangChainInstrumentor().instrument()
⭕ Instrumentorを先に設定してからクライアントを初期化する
tracer_provider = register(...)
LangChainInstrumentor().instrument(tracer_provider=tracer_provider)
client = OpenAI() # ← instrument後に初期化する
なぜ重要か: OpenInferenceはpatchingでSDKをラップするため、初期化順序が逆だとフックが効きません。
失敗2:評価コストが爆増する
❌ 全トレースに毎回LLMベース評価を実行する
⭕ 評価対象をサンプリング(全体の5-10%)し、コードベース評価(正規表現等)を優先する
なぜ重要か: LLMベース評価は1件あたり数セントかかります。1日1万件のトレースに全部かけると月数万円になる可能性があります。
失敗3:ローカルPhoenixのデータが再起動で消える
❌ px.launch_app()だけで起動する(インメモリモード)
⭕ 永続化ストレージを指定して起動する
python -c "import phoenix as px; px.launch_app(storage='sqlite:///phoenix.db')"
# または Docker + ボリュームマウント
docker run -v $(pwd)/phoenix-data:/data -p 6006:6006 arizephoenix/phoenix:latest
失敗4:マルチエージェントでスパン親子関係が崩れる
❌ 並列実行されるサブエージェントのコンテキストを引き継がない
⭕ OTelコンテキストを明示的に伝播する
from opentelemetry import context, trace
def run_subagent(ctx):
token = context.attach(ctx)
try:
# サブエージェントの処理(親スパンに紐付く)
with tracer.start_as_current_span("subagent-task"):
...
finally:
context.detach(token)
current_ctx = context.get_current() # 親コンテキストを取得
thread = threading.Thread(target=run_subagent, args=(current_ctx,))
thread.start()
参考・出典
- What is Arize Phoenix? — Arize AI公式ドキュメント(参照日: 2026-04-11)
- Arize-ai/phoenix — GitHub(参照日: 2026-04-11)
- Trace & Evaluate your Agent with Arize Phoenix — Hugging Face Blog(参照日: 2026-04-11)
- OpenInference OpenAI Instrumentation — openinference公式ドキュメント(参照日: 2026-04-11)
- Amazon Bedrock Agents observability using Arize AI — AWS Machine Learning Blog(参照日: 2026-04-11)
まとめ:今日から始める3つのアクション
- 今日やること:
pip install arize-phoenix arize-phoenix-otel openinference-instrumentation-openaiを実行し、既存のOpenAIコードにregister(auto_instrument=True)を追加してローカルPhoenixでトレースを確認する - 今週中: LLMベース評価(HallucinationEvaluator)を既存のCIパイプラインに組み込み、回答品質のスコアを計測する
- 今月中: 本番環境のエージェントにPhoenixを導入し、レイテンシ・エラー率・評価スコアのダッシュボードを整備する
あわせて読みたい:
- AIエージェント構築完全ガイド — 設計から本番運用まで体系的にまとめた入門記事
- LangSmith vs Arize vs Maxim 評価ツール比較 — 自社のスタックに合うツールを選ぶための横断比較
この記事はAIgent Lab編集部がお届けしました。