Skip to content

Tensile:テストの自動化によりエージェントの信頼性を向上

信頼性の高いAIエージェントを構築し、維持することは困難です。 エージェントは、測定および改善が可能な方法で、タスクから逸脱せず、ポリシーに従い、失敗から回復する必要があります。 このアクセラレーターでは、テストの自動合成とトラジェトリ分析を通じて、AIエージェントの信頼性、タスクパフォーマンス、およびポリシー遵守を向上させるための、DataRobotにおけるテスト駆動開発フレームワーク「Tensile」を紹介します。

Tensileは、エージェントを計装し、実行トラジェトリをキャプチャして、成功や失敗を繰り返し実行可能なテストへと変換するのに役立ちます。 これにより、実行の評価やリプレイ、システムプロンプトの変更の比較、クラスタリングやコンテキストヒントの注入を用いて、問題を反復的に修正することが可能になります。

このアクセラレーターでは、以下の操作を行います。

  • TrajectoryLoggerを使用してエージェントを計装し、実行トラジェトリを記録します。
  • トラジェトリを分析して、テスト可能な瞬間(成功と失敗)を特定します。
  • 実行を評価およびリプレイして、改善を定量化し、システムプロンプトの変更を比較します。
  • DataRobot LLM GatewayでTensileを設定します。
  • クラスタリング(DashアプリおよびClusteringHintInjector)を使用して問題を探索し、コンテキストヒントを注入します。
  • 反復的な改善のために、ProgrammaticHintInjectorを使用したトラジェトリアナライザーのワークフローを適用します。

前提条件

アクセラレーターを実行する前に、以下が準備されていることを確認してください。

  • Tensileがインストールされていること(下記のクイックスタートを参照)。
  • LLMとトラジェトリの設定が含まれるconfig.yamlがあること。
  • DataRobotの場合:test.env(または環境変数内)にDATAROBOT_API_TOKENを設定します。 オプションで、オブザーバビリティのためにDATAROBOT_LLM_GATEWAY_URLDATAROBOT_TRACE_CONTEXTを設定します。

プロジェクトのルートからのクイックスタート:

uv venv --python 3.13
uv sync; pre-commit install
uv pip install -e .
cp config.yaml.sample config.yaml   # And fill in credentials
tensile   # show help 

トラジェトリロギングのためのエージェントを計装する

TrajectoryLoggerhttpxクライアントのトランスポートとして使用し、そのクライアントをOpenAI互換のエージェントに渡します。 トラジェトリは<trajectory_dir>/<subdir>に書き込まれます(trajectory_dirconfig.yamlで指定します)。

from tensile.logging import TrajectoryLogger

http_client = httpx.AsyncClient(
    transport=TrajectoryLogger(
        httpx.AsyncHTTPTransport(),
        trajectory_subdir=<subdir> | None
    )
)
client = AsyncOpenAI(
    api_key=api_key,
    base_url=f"{endpoint_url}/v1",
    http_client=http_client,
) 

トラジェトリの分析とテスト可能な瞬間の評価

分析パイプラインを実行します(デフォルトではanalysis_output/に出力されます)。

tensile analyze <trajectory_file> 

テスト可能な瞬間を手動で(たとえば10回)実行するには:

tensile test <moment_path> -n 10 

トラジェトリのリプレイ

トラジェトリのステップをリプレイして、新しいLLMレスポンスを収集したり、偶発的な挙動(flukes)を特定したり、システムプロンプト変更後の挙動を比較したりします。 output_pathを省略すると、<trajectory_file>.replay.jsonlに書き込まれます。

tensile replay <trajectory_file> [output_path]
tensile replay <trajectory_file> --num-replays 5
tensile replay <trajectory_file> --num-replays 3 --max-concurrency 10
tensile replay <trajectory_file> --num-replays 3 --system-prompt-path <system_prompt_path_txt>

# Examples
tensile replay <trajectory_file>
tensile replay <trajectory_file> -n 5
tensile replay <trajectory_file> output/replay.jsonl -n 3 

設定

DataRobot LLM Gateway

DataRobot LLM Gatewayを使用するには、config.yamlに以下を追加します。

# config.yaml
llm:
  name: "<model_name>"       # e.g., vertex_ai/gemini-3-pro-preview
  api_base: "<llm_gateway_url>"
  api_key: "<your_api_token>" 

クラスタリング

クラスタリングアプリ

ブラウザで分析出力を探索およびクラスタリングするためのDashアプリを起動します。 これにはdev依存関係グループが必要です。uvを使用する場合は、以下を実行します。

task dev-env
task apps:clustering 

クラスタリングベースのヒント注入

Tensileの出力およびレポートストア(InMemoryReportStoreまたはFileSystemReportStore)を指定するanalysis_dirstrajectories_dirsを用いて、ClusteringHintInjectorを使用します。 例:

from pathlib import Path

import httpx
from openai import AsyncOpenAI

from tensile.logging.hint_injector import (
    ClusteringHintConfig,
    ClusteringHintInjector,
    InMemoryReportStore,
    SentenceTransformersEmbeddingBackend,
)

base_transport = httpx.AsyncHTTPTransport()
embedding_backend = SentenceTransformersEmbeddingBackend(
    model_name="<embedding_model_name>",
)
report_store = InMemoryReportStore()
config = ClusteringHintConfig(
    analysis_dirs=[Path("analysis_output")],
    trajectories_dirs=[Path("trajectories")],
)

hinting_transport = ClusteringHintInjector(
    base_transport,
    embedding_backend=embedding_backend,
    report_store=report_store,
    config=config,
)

http_client = httpx.AsyncClient(transport=hinting_transport)
client = AsyncOpenAI(
    api_key=api_key,
    base_url=f"{endpoint_url}/v1",
    http_client=http_client,
) 

トラジェトリアナライザーのワークフロー

  1. ProgrammaticHintInjectorTrajectoryLoggerを使用して、エージェントを計装します。
from tensile.logging import TrajectoryLogger
from tensile.logging.hint_injector.programmatic_hint_injector import ProgrammaticHintInjector

http_client = httpx.AsyncClient(
    transport=ProgrammaticHintInjector(
        wrapped=TrajectoryLogger(
            wrapped=httpx.AsyncHTTPTransport(),
            trajectory_subdir=<subdir>,
        ),
        hint_file_path=None,
    )
)

# It's recommended to start with hint_file_path=None until a hint file is generated by the analyzer 
  1. エージェントを実行してトラジェトリを生成します。
  2. tensile analyze <trajectory_path>実行します。 分析が終了したら、生成されたhints.json、更新されたシステムプロンプトや、更新されたツール定義をエージェントにコピーして戻します。
  3. hint_file_pathhints.jsonファイルのパスを設定し、エージェントを再度実行して新しいトラジェトリを生成します。
  4. tensile analyze <new_traj_path> --hints-file <path_to_hints.json>実行し、新しいヒントを用いて再分析します。
  5. 挙動が収束するまで繰り返します。