DSPy トレース

自動ログを使用した DSPy トレース

DSPy は、モジュール式 AI システムを構築するためのオープンソース フレームワークであり、プロンプトと重みを最適化するためのアルゴリズムを提供します。

MLflow トレース は、DSPy の自動トレース機能を提供します。 dsPy のトレースを有効にするには、 mlflow.dspy.autolog 関数を呼び出します。入れ子になったトレースは、DSPy モジュールの呼び出し時にアクティブな MLflow 実験に自動的に記録されます。

import mlflow

mlflow.dspy.autolog()

サーバーレス コンピューティング クラスターでは、自動ログは自動的に有効になりません。 この統合の自動トレースを有効にするには、 mlflow.dspy.autolog() を明示的に呼び出す必要があります。

[前提条件]

DSPy で MLflow Tracing を使用するには、MLflow と dspy-ai ライブラリをインストールする必要があります。

発達

開発環境の場合は、Databricks の追加機能と dspy-aiを含む完全な MLflow パッケージをインストールします。

pip install --upgrade "mlflow[databricks]>=3.1" dspy-ai

完全な mlflow[databricks] パッケージには、Databricks でのローカル開発と実験のためのすべての機能が含まれています。

生産

運用環境のデプロイの場合は、 mlflow-tracingdspy-aiをインストールします。

pip install --upgrade mlflow-tracing dspy-ai

mlflow-tracing パッケージは、運用環境で使用するために最適化されています。

DSPy で最適なトレース エクスペリエンスを得る場合は、MLflow 3 を強くお勧めします。

例を実行する前に、環境を構成する必要があります。

Databricks ノートブックの外部のユーザーの場合: Databricks 環境変数を設定します。

export DATABRICKS_HOST="https://your-workspace.cloud.databricks.com"
export DATABRICKS_TOKEN="your-personal-access-token"

Databricks ノートブック内のユーザーの場合: これらの資格情報は自動的に設定されます。

API キー: LLM プロバイダー API キーが構成されていることを確認します。 運用環境では、セキュリティで保護された API キー管理にハードコーディングされた値の代わりに 、Mosaic AI Gateway または Databricks シークレット を使用します。

export OPENAI_API_KEY="your-openai-api-key"
# Add other provider keys as needed

使用例

import dspy
import mlflow
import os

# Ensure your OPENAI_API_KEY (or other LLM provider keys) is set in your environment
# os.environ["OPENAI_API_KEY"] = "your-openai-api-key" # Uncomment and set if not globally configured

# Enabling tracing for DSPy
mlflow.dspy.autolog()

# Set up MLflow tracking to Databricks
mlflow.set_tracking_uri("databricks")
mlflow.set_experiment("/Shared/dspy-tracing-demo")

# Define a simple ChainOfThought model and run it
lm = dspy.LM("openai/gpt-4o-mini")
dspy.configure(lm=lm)


# Define a simple summarizer model and run it
class SummarizeSignature(dspy.Signature):
    """Given a passage, generate a summary."""

    passage: str = dspy.InputField(desc="a passage to summarize")
    summary: str = dspy.OutputField(desc="a one-line summary of the passage")


class Summarize(dspy.Module):
    def __init__(self):
        self.summarize = dspy.ChainOfThought(SummarizeSignature)

    def forward(self, passage: str):
        return self.summarize(passage=passage)


summarizer = Summarize()
summarizer(
    passage=(
        "MLflow Tracing is a feature that enhances LLM observability in your Generative AI (GenAI) applications "
        "by capturing detailed information about the execution of your application's services. Tracing provides "
        "a way to record the inputs, outputs, and metadata associated with each intermediate step of a request, "
        "enabling you to easily pinpoint the source of bugs and unexpected behaviors."
    )
)

Warnung

運用環境では、セキュリティで保護された API キー管理にハードコーディングされた値の代わりに 、Mosaic AI Gateway または Databricks シークレット を使用します。

評価中のトレース

DSPy モデルの評価は、AI システムの開発における重要なステップです。 MLflow トレースは、各入力に対するプログラムの実行に関する詳細情報を提供することで、評価後にプログラムのパフォーマンスを追跡するのに役立ちます。

DSPy に対して MLflow 自動トレースが有効になっている場合、DSPy の組み込みの評価スイートを実行すると、トレースが自動的に生成されます。 次の例では、MLflow で評価を実行し、トレースを確認する方法を示します。

import dspy
from dspy.evaluate.metrics import answer_exact_match
import mlflow
import os

# Ensure your OPENAI_API_KEY (or other LLM provider keys) is set in your environment
# os.environ["OPENAI_API_KEY"] = "your-openai-api-key" # Uncomment and set if not globally configured

# Enabling tracing for DSPy evaluation
mlflow.dspy.autolog(log_traces_from_eval=True)

# Set up MLflow tracking to Databricks if not already configured
# mlflow.set_tracking_uri("databricks")
# mlflow.set_experiment("/Shared/dspy-eval-demo")

# Define a simple evaluation set
eval_set = [
    dspy.Example(
        question="How many 'r's are in the word 'strawberry'?", answer="3"
    ).with_inputs("question"),
    dspy.Example(
        question="How many 'a's are in the word 'banana'?", answer="3"
    ).with_inputs("question"),
    dspy.Example(
        question="How many 'e's are in the word 'elephant'?", answer="2"
    ).with_inputs("question"),
]


# Define a program
class Counter(dspy.Signature):
    question: str = dspy.InputField()
    answer: str = dspy.OutputField(
        desc="Should only contain a single number as an answer"
    )


cot = dspy.ChainOfThought(Counter)

# Evaluate the programs
with mlflow.start_run(run_name="CoT Evaluation"):
    evaluator = dspy.evaluate.Evaluate(
        devset=eval_set,
        return_all_scores=True,
        return_outputs=True,
        show_progress=True,
    )
    aggregated_score, outputs, all_scores = evaluator(cot, metric=answer_exact_match)

    # Log the aggregated score
    mlflow.log_metric("exact_match", aggregated_score)
    # Log the detailed evaluation results as a table
    mlflow.log_table(
        {
            "question": [example.question for example in eval_set],
            "answer": [example.answer for example in eval_set],
            "output": outputs,
            "exact_match": all_scores,
        },
        artifact_file="eval_results.json",
    )

MLflow UI を開き、[CoT Evaluation]\(CoT 評価\) の実行に移動すると、評価結果と、評価中に生成されたトレースの一覧が Traces タブに表示されます。

これらの手順のトレースを無効にするには、mlflow.dspy.autolog パラメーターを log_traces_from_eval に設定してFalse関数を呼び出します。

コンパイル中のトレース (最適化)

コンパイル (最適化) は DSPy の主要な概念です。 DSPy は、コンパイルによって、最適なパフォーマンスを実現するために DSPy プログラムのプロンプトと重みを自動的に最適化します。

既定では、複雑化によって DSPy モジュールの呼び出しが数百または数千回トリガーされる可能性があるため、MLflow では複雑化中にトレースは生成 されません 。 コンパイルのトレースを有効にするには、mlflow.dspy.autolog パラメーターを log_traces_from_compile に設定してTrue関数を呼び出すことができます。

import dspy
import mlflow
import os

# Ensure your OPENAI_API_KEY (or other LLM provider keys) is set in your environment
# os.environ["OPENAI_API_KEY"] = "your-openai-api-key" # Uncomment and set if not globally configured

# Enable auto-tracing for compilation
mlflow.dspy.autolog(log_traces_from_compile=True)

# Set up MLflow tracking to Databricks if not already configured
# mlflow.set_tracking_uri("databricks")
# mlflow.set_experiment("/Shared/dspy-compile-demo")

# Optimize the DSPy program as usual
tp = dspy.MIPROv2(metric=metric, auto="medium", num_threads=24)
optimized = tp.compile(cot, trainset=trainset, ...)

自動トレースを無効にする

LlamaIndex の自動トレースは、 mlflow.llama_index.autolog(disable=True) または mlflow.autolog(disable=True)を呼び出すことによってグローバルに無効にすることができます。