There are subtle differences between the experiments SDK using Arize vs. Phoenix, but the base are the same. The example below runs an experiment to write a haiku, and evaluate its tone using an .
You can check out a full notebook example of each.
Dataset Upload
Arize uses the ArizeDatasetsClient . arize_client.create_dataset returns a dataset_id, instead of a dataset object. So if you want to print or manipulate the dataset, you will need to get the dataset using arize_client.get_dataset.
Phoenix uses px.Client().upload_dataset.
# Create dataframe to upload
data = [{"topic": "Zebras"}]
df = pd.DataFrame(data)
#############
# FOR ARIZE
#############
# Setup Imports
import pandas as pd
from arize.experimental.datasets import ArizeDatasetsClient
from arize.experimental.datasets.utils.constants import GENERATIVE
from uuid import uuid1
# Setup Arize datasets connection
developer_key = ""
space_id = ""
api_key = ""
arize_client = ArizeDatasetsClient(developer_key=developer_key, api_key=api_key)
# Create dataset in Arize
dataset_id = arize_client.create_dataset(
dataset_name="haiku-topics"+ str(uuid1())[:5],
data=df,
space_id=space_id,
dataset_type=GENERATIVE
)
# Get dataset from Arize
dataset = arize_client.get_dataset(
space_id=space_id,
dataset_id=dataset_id
)
#############
# FOR PHOENIX
#############
import phoenix as px
# Upload dataset to Phoenix
dataset = px.Client().upload_dataset(
dataset_name="haiku-topics",
dataframe=df,
input_keys=("topic")
)
Task definition
input, expected, dataset_row, metadata .
input, expected, reference, example, metadata
#############
# FOR ARIZE
#############
def create_haiku(dataset_row) -> str:
# Dataset row uses the dataframe from above
topic = dataset_row.get("topic")
# send topic to LLM generation
#############
# FOR PHOENIX
#############
def create_haiku(example) -> str:
topic = example.get("topic")
# send topic to LLM generation
Evaluator definition
For both Arize and Phoenix, you can often use the exact same function as your evaluator. Phoenix does have slightly different way of accessing metadata from your dataset.
# FOR ARIZE IMPORT
from arize.experimental.datasets.experiments.evaluators.base import EvaluationResult
# FOR PHOENIX IMPORT
from phoenix.experiments.types import EvaluationResult
#############
# FOR ARIZE AND PHOENIX
#############
from phoenix.evals import (
OpenAIModel,
llm_classify,
)
CUSTOM_TEMPLATE = """
You are evaluating whether tone is positive, neutral, or negative
[Message]: {output}
Respond with either "positive", "neutral", or "negative"
"""
def is_positive(output):
df_in = pd.DataFrame({"output": output}, index=[0])
eval_df = llm_classify(
dataframe=df_in,
template=CUSTOM_TEMPLATE,
model=OpenAIModel(model="gpt-4o"),
rails=["positive", "neutral", "negative"],
provide_explanation=True
)
# return score, label, explanation
return EvaluationResult(score=1, label=eval_df['label'][0], explanation=eval_df['explanation'][0])
Run the experiment
Arize and Phoenix use slightly different functions to run an experiment due to the permissioning available in Arize.
In Arize, you must pass in the dataset_id and space_id.
#############
# FOR ARIZE
#############
# Uses ArizeDatasetsClient from above
experiment_id = arize_client.run_experiment(
space_id=space_id,
dataset_id=dataset_id,
task=create_haiku,
evaluators=[is_positive],
experiment_name="haiku-example"
)
#############
# FOR PHOENIX
#############
from phoenix.experiments import run_experiment
experiment_results = run_experiment(
dataset=dataset,
task=create_haiku,
evaluators=[is_positive],
experiment_name="haiku-example"
)
, we use data from the dataset_row as prompt template variables. The possible variables to pass in are:
, you can do this using example . The possible variables to pass in are:
uses input, output, dataset_row, metadata as the optional input variables to pass into the function.
uses input, expected, reference, example, metadata as the input variables to pass into the function.