AIアプリケーションの評価

生成的な AI アプリケーションを評価するには、以下の手順に従います。

  1. アプリケーションをビルドし、Trulens SDK を使用して計測します (Python を使用してビルドされたアプリケーションがサポートされています)。

  2. Snowflakeにアプリを登録します。

  3. 入力データセットを指定して実行を作成します。

  4. 実行を実行してトレースを生成し、評価メトリクスを計算します。

  5. Snowsightで評価結果を表示。

アプリのインストゥルメント

Pythonで生成的な AI アプリケーションを作成したら、 TruLens SDK をインポートして計測します。TruLens SDK は @instrument() デコレーターを提供し、アプリケーションの関数をインスツルメンテーションしてトレースを生成し、メトリックを計算します。

  • デコレーターを使うには、Pythonアプリケーションに以下のimportを追加します。

    from trulens.core.otel.instrument import instrument
    
    Copy

@instrument() デコレーターの粒度は依存関係に応じて変更できます。

シナリオ1: 関数のトレース

トレースが必要な関数の前に @instrument() を追加できます。これは自動的に関数への入力、出力(戻り値)、実行の待ち時間をキャプチャします。例えば、次のコードは、入力クエリと最終レスポンスを自動的にキャプチャする answer_query 関数のトレースを示しています。

@instrument()
def answer_query(self, query: str) -> str:
    context_str = self.retrieve_context(query)
    return self.generate_completion(query, context_str)
Copy

シナリオ 2: 特定のスパンタイプで関数をトレースします。

スパンタイプは、関数の性質を特定し、トレースの可読性と理解を向上させます。例えば、 RAG アプリケーションでは、検索サービス(またはレトリーバー)用にスパンタイプを "RETRIEVAL" と指定し、 LLM 推論コール用にスパンタイプを "GENERATION" と指定することができます。以下のスパンタイプがサポートされています。

  • RETRIEVAL: 検索または検索関数用のスパンタイプ。

  • GENERATION: LLM からのモデル推論呼び出し用のスパンタイプ。

  • RECORD_ROOT: アプリケーションのメイン関数のスパンタイプ

@instrument() でスパンタイプを指定しない場合、デフォルトで UNKNOWN のスパンタイプが割り当てられます。span属性を使用するには、Pythonアプリケーションに以下のimportを追加します。

from trulens.otel.semconv.trace import SpanAttributes
Copy

次のコード・スニペットは、 RAG アプリケーションのトレースを示しています。スパンタイプのプレフィックスは必ず SpanAttributes.SpanType とします。

@instrument(span_type=SpanAttributes.SpanType.RETRIEVAL)
def retrieve_context(self, query: str) -> list:
    """
    Retrieve relevant text from vector store.
    """
    return self.retrieve(query)

@instrument(span_type=SpanAttributes.SpanType.GENERATION)
def generate_completion(self, query: str, context_str: list) -> str:
    """
    Generate answer from context by calling an LLM.
    """
    return response

@instrument(span_type=SpanAttributes.SpanType.RECORD_ROOT)
def answer_query(self, query: str) -> str:
    context_str = self.retrieve_context(query)
    return self.generate_completion(query, context_str)
Copy

シナリオ 3: 関数のトレースと評価の計算

スパン・タイプをプロバイダーとして提供するだけでなく、アプリケーションの関連パラメーターをスパン属性に割り当てて、メトリックスを計算する必要があります。例えば、 RAG アプリケーションでコンテキストの関連性を計算するには、関連するクエリと検索結果のパラメーターをそれぞれ適切な属性 RETRIEVAL.QUERY_TEXTRETRIEVAL.RETRIEVED_CONTEXTS に割り当てる必要があります。各メトリクスの計算に必要な属性は、Metricsページで確認できます。

各スパンのタイプでは、以下のスパン属性がサポートされています。

  • RECORD_ROOT: INPUT, OUTPUT, GROUND_TRUTH_OUTPUT

  • RETRIEVAL: QUERY_TEXT, RETRIEVED_CONTEXTS

  • GENERATION: なし

span属性を使用するには、Pythonアプリケーションに以下のimportを追加する必要があります。

from trulens.otel.semconv.trace import SpanAttributes
Copy

次のコードスニペットは、検索サービスのコンテキスト関連性を計算する例です。属性は常に形式 SpanAttributes.<span type>.<attribute name> (例えば、 SpanAttributes.RETRIEVAL.QUERY_TEXT) に従わなければなりません。

@instrument(
    span_type=SpanAttributes.SpanType.RETRIEVAL,
    attributes={
        SpanAttributes.RETRIEVAL.QUERY_TEXT: "query",
        SpanAttributes.RETRIEVAL.RETRIEVED_CONTEXTS: "return",
    }
)
def retrieve_context(self, query: str) -> list:
    """
    Retrieve relevant text from vector store.
    """
    return self.retrieve(query)
Copy

先の例では、 queryretrieve_context() への入力パラメーターを表し、 return が返される値を表しています。これらは、 RETRIEVAL.QUERY_TEXTRETRIEVAL.RETRIEVED_CONTEXTS という属性に割り当てられて、コンテキストの関連性が計算されます。

Snowflakeへのアプリ登録

生成的な AI アプリケーションを Snowflake に登録し、トレースを取得して評価を行うには、 TruLens SDK を使用して TruApp オブジェクトを作成する必要があります。このオブジェクトは、ユーザーのアプリケーションの起動(実行)を記録し、トレースを Snowflake にエクスポートします。

tru_app = TruApp(
    test_app: Any,
    app_name: str,
    app_version: str,
    connector: SnowflakeConnector,
    main_method: callable  # i.e. test_app.answer_query
)
Copy

パラメーター:

  • test_app: Any: 評価のための実行の間に後に呼び出されるユーザー定義アプリケーションのインスタンス。例えば、 test_app = RAG()

  • app_name: str: はユーザーが指定できるアプリケーション名で、ユーザーの Snowflake アカウントで管理されます。

  • app_version: str: これはユーザーがtest_appに指定できるバージョンで、実験の追跡や比較を可能にします。

  • connector: SnowflakeConnector: Snowpark セッションと Snowflake DB 接続を管理するラッパークラスです。

  • main_method: callable (オプション): ユーザーアプリケーションのエントリーポイントメソッドです。 SDK に、test_app がユーザーからどのように呼び出されることを期待されているか、また、 (test_app で指定された) ユーザーアプリケーションの起動のトレースをどこで開始するかを伝えます。RAG クラスの例では、アンサーメソッドがアプリのエントリーポイントであるとして、main_method は test_app.answer_query として指定できます。あるいは、span 属性 RECORD_ROOT でエントリーポイントメソッドをインスツルメンテーションします。その場合、このパラメーターは必要ありません。

実行を作成

評価ジョブを開始するには、実行を作成する必要があります。実行を作成するには、実行構成を指定する必要があります。 add_run() 関数は、実行の構成を使用して新しい実行を作成します。

構成

RunConfig から1つの実行が作成されます。

run_config = RunConfig(
    run_name=run_name,
    description="desc",
    label="custom tag useful for grouping comparable runs",
    source_type="DATAFRAME",
    dataset_name="My test dataframe name",
    dataset_spec={
        "RETRIEVAL.QUERY_TEXT": "user_query_field",
        "RECORD_ROOT.INPUT": "user_query_field",
        "RECORD_ROOT.GROUND_TRUTH_OUTPUT": "golden_answer_field",
    },
    llm_judge_name: "mistral-large2"
)
Copy
  • run_name: str: 実行の名前で、同じ TruApp の下の一意のものであるべきです。

  • description: str (オプション): 実行の文字列説明

  • label: str (オプション): グループにまとめるためのラベル。

  • source_type: str: データセットのソースを指定します。Python dataframeの DATAFRAME 、またはSnowflakeアカウントのユーザーテーブルの TABLE

  • dataset_name: str: source_type が DATAFRAME の場合、ユーザーが指定した任意の名前。または、現在のコンテキスト (データベースとスキーマ) でのユーザーアカウントの有効な Snowflake テーブル名、または "database.schema.table_name" 形式の Snowflake 完全修飾名。

  • dataset_spec: Dict[str, str]: サポートされているスパンの属性を、データフレームまたはテーブルのユーザーの列名にマッピングする辞書。許可されるキーは、データセット・ページで指定されたスパン属性で、許可される値は、ユーザーが指定したデータフレームまたはテーブルの列名です。例えば、上記の実行設定例の "golden_answer_field "は有効な列名でなければなりません。

  • llm_judge_name: str (オプション): LLM-based メトリック計算中に LLM ジャッジとして使用する名前。対応ジャッジはモデルページをご覧ください。指定がない場合、デフォルト値は llama3.1-70b

run = tru_app.add_run(run_config=run_config)
Copy

リクエストパラメーター:

  • run_config: RunConfig: 実行の構成が含まれます。

実行の検索

実行を取得します。

run = tru_app.get_run(run_name=run_name)
Copy

リクエストパラメーター:

  • run_name: str: 実行の名前

実行のメタデータ表示

実行の詳細を説明します。

run.describe()
Copy

実行の起動

run.start() 関数を使用して実行を呼び出すことができます。実行構成で指定されたデータセットから入力を読み取り、各入力に対してアプリケーションを起動し、トレースを生成し、Snowflakeアカウントにストレージするために情報をインジェストします。 run.start() は、データセット内のすべての入力に対してアプリケーションが起動され、インジェストが完了するかタイムアウトするまで、ブロック呼び出しとなります。

run.start()  # if source_type is "TABLE"

run.start(input_df=user_input_df)  # if source_type is "DATAFRAME"
Copy

リクエストパラメーター:

  • input_df: DataFrame (オプション): SDK からpandasデータフレーム実行構成の source_type が DATAFRAME に指定されている場合、このフィールドは必須です。source_type が TABLE の場合、このフィールドは必須ではありません。

メトリクスの計算

アプリケーションが起動され、すべてのトレースが取り込まれた後、 run.compute_metrics() を使用してメトリック計算を開始できます。実行のステータスが INVOCATION_IN_PROGRESS である限り、計算を開始することはできません。ステータスが INVOCATION_COMPLETED または INVOCATION_PARTIALLY_COMPLETED になると、 run.compute_metrics() を開始することができます。 run.compute_metrics() は非同期のノンブロッキング関数です。同じ実行で、異なるメトリクスのセットで compute_metrics を複数回呼び出すことができ、呼び出すたびに新しい計算ジョブがトリガーされます。一度計算されたメトリクスは、同じ実行で再度計算することはできません。

run.compute_metrics(metrics=[
    "coherence",
    "answer_relevance",
    "groundedness",
    "context_relevance",
    "correctness",
])
Copy

リクエストパラメーター:

  • metrics: List[str]: Metrics にリストされているメトリクスの文字列名のリスト。メトリクスの名前は、大文字と小文字で指定します。例えば、Context Relevance は context_relevance と指定します。

実行のステータスの確認

実行中のステータスは、実行後に確認することができます。ステータスのリストはRun Statusセクションにあります。

run.get_status()
Copy

実行のキャンセル

run.cancel() を使用して、既存の実行をキャンセルできます。この演算子により、実行のステータスやメタデータフィールドを含め、今後実行が更新されることはありません。

run.cancel()
Copy

実行の削除

run.delete() を使用して、既存の実行を削除できます。この演算子により、実行に関連するメタデータが削除され、評価結果にアクセスできなくなります。しかし、実行の一部として生成されたトレースや評価は削除されず、保存されたままです。評価とトレースのストレージと削除に関する詳細情報については、Observabilityデータのセクションを参照してください。

run.delete()
Copy

アプリケーションの実行リスト

list_runs() 関数を使用すると、特定の TruApp アプリケーションオブジェクトに対応するすべての可 用性実行のリストを見ることができます。

tru_app.list_runs()
Copy

応答:

tru_app の基になるすべての実行のリストを返します。

評価とトレースの表示

評価結果を表示するには、次のようにします。

  1. Snowsight に移動します。

  2. AI & ML を選択します。

  3. Evaluations を選択します。

アプリケーション実行の評価結果を表示するには、以下の手順に従ってください。

  • 特定のアプリケーションに対応する実行を表示するには、アプリケーションを選択します。

  • 実行の評価結果を表示するには、その実行を選択します。集計結果と各記録に対応する結果を表示します。

  • 記録のトレースを表示するには、その記録を選択します。詳細なトレース、レイテンシ、アプリケーションの各ステージへの入力と出力、評価結果、生成された精度スコアに対する LLM 審査員による説明を表示できます。

同じデータセットを使用する実行を比較するには、複数の実行を選択し、 Compare を選択して出力と評価スコアを比較します。