Trajectory 精度スコアラー
Mastra は、Agent または Workflow が期待されるアクションの順序に従っているかを評価する 2 種類の Trajectory 精度スコアラーを提供します。
- コードベースのスコアラー - ステップの厳密な照合と順序による決定論的評価
- LLM ベースのスコアラー - AI で Trajectory の品質と妥当性を判定する意味的評価
どちらのスコアラーも Agent と Workflow に対応します。runEvals パイプラインが Trajectory を自動的に抽出するため、スコアラーは Trajectory オブジェクトを直接受け取ります。
Trajectory の抽出Trajectory の抽出への直接リンク
runEvals パイプラインは、observability ストレージが設定されているかどうかに応じて 2 つの抽出方法を使用します。
Trace ベースの抽出(推奨)Trace ベースの抽出(推奨)への直接リンク
対象の Mastra インスタンスにストレージが設定されている場合、パイプラインは observability ストアから完全な実行 Trace を取得し、extractTrajectoryFromTrace() を呼び出します。これにより、完全な実行ツリーを捉えた、children がネストされた階層型 Trajectory が生成されます。このツリーには、Workflow ステップ内でネストされた Agent の実行と Tool 呼び出しに加え、モデル生成も含まれます。
たとえば、Agent を呼び出し、その Agent が Tool を呼び出す Workflow では、次のようになります。
workflow_run
└─ workflow_step (validate-input)
└─ workflow_step (process-data)
└─ agent_run (my-agent)
└─ model_generation
└─ tool_call (search)
└─ model_generation
└─ tool_call (summarize)
└─ workflow_step (save-result)
フォールバック抽出フォールバック抽出への直接リンク
ストレージを利用できない場合、パイプラインは次の方法にフォールバックします。
- Agent:
extractTrajectory()は、Agent のメッセージ出力にあるtoolInvocationsからToolCallStepエントリを抽出します。Tool 呼び出しのフラットなリストを生成します。 - Workflow:
extractWorkflowTrajectory()は、stepResultsからWorkflowStepStepエントリを抽出します。Workflow ステップのフラットなリストを生成します。
これらのフォールバックでは、ネストされた実行や Tool 呼び出し以外の Span は取得されません。
Trajectory の型Trajectory の型への直接リンク
Trajectory ステップは stepType を判別プロパティとする判別共用体を使用します。各ステップ型には固有のプロパティがあります。
ToolCallSteptoolcallstepへの直接リンク
Agent の Tool 呼び出しを表します。
stepType:
name:
toolArgs?:
toolResult?:
success?:
durationMs?:
metadata?:
children?:
WorkflowStepStepworkflowstepstepへの直接リンク
Workflow ステップの実行を表します。
stepType:
name:
stepId?:
status?:
output?:
durationMs?:
metadata?:
children?:
その他のステップ型その他のステップ型への直接リンク
判別共用体には、次のステップ型も含まれます。
| ステップ型 | 主なプロパティ |
|---|---|
mcp_tool_call | toolArgs, toolResult, mcpServer, success |
model_generation | modelId, promptTokens, completionTokens, finishReason |
agent_run | agentId |
workflow_run | workflowId, status |
workflow_conditional | conditionCount, selectedSteps |
workflow_parallel | branchCount, parallelSteps |
workflow_loop | loopType, totalIterations |
workflow_sleep | durationMs, sleepType |
workflow_wait_event | eventName, eventReceived |
processor_run | processorId |
すべてのステップ型は、基本プロパティ name、durationMs、metadata、children を共有します。
期待されるステップ期待されるステップへの直接リンク
期待される Trajectory を定義する際は、完全な TrajectoryStep 判別共用体ではなく ExpectedStep を使用します。ExpectedStep は TrajectoryStep に対応する判別共用体です。stepType を指定すると、そのバリアントのフィールド(たとえば tool_call の toolArgs、model_generation の modelId)が自動補完されます。バリアント固有のフィールドはすべて任意なので、必要な項目だけを検証できます。
名前だけで任意のステップに一致させるには、stepType を完全に省略します。
name:
stepType?:
(variant fields)?:
tool_call の toolArgs と toolResult、model_generation の modelId、workflow_step の output です。すべて任意で、指定したフィールドだけが比較されます。children?:
単純な期待ステップ単純な期待ステップへの直接リンク
const steps: ExpectedStep[] = [
// Match by name only (any step type)
{ name: 'search' },
// Match by name and step type (autocomplete for tool_call fields)
{ name: 'search', stepType: 'tool_call' },
// Match with specific toolArgs (auto-compared when present)
{ name: 'search', stepType: 'tool_call', toolArgs: { query: 'weather' } },
// Match a model generation step by model ID
{ name: 'gpt-4o', stepType: 'model_generation', modelId: 'gpt-4o' },
]
ネストされた期待値ネストされた期待値への直接リンク
期待される各ステップには、独自の評価ルールを持つ children 設定を含められます。これにより、階層のレベルごとに異なる順序ルールや比較ルールを設定できます。
const scorer = createTrajectoryScorerCode({
defaults: {
ordering: 'strict',
steps: [
{ name: 'validate-input', stepType: 'workflow_step' },
{
name: 'research-agent',
stepType: 'agent_run',
children: {
// Sub-agent can call tools in any order
ordering: 'unordered',
steps: [
{ name: 'search', stepType: 'tool_call' },
{ name: 'summarize', stepType: 'tool_call' },
],
},
},
{ name: 'save-result', stepType: 'workflow_step' },
],
},
})
この例では、親 Workflow のステップには厳密な順序が必要ですが、ネストされた research-agent の Tool 呼び出しは任意の順序で構いません。
スコアラーの選択スコアラーの選択への直接リンク
コードベースのスコアラーが適している場合コードベースのスコアラーが適している場合への直接リンク
- 決定論的で再現可能な結果が必要
- 比較対象となる既知の期待 Trajectory がある
- 厳密なステップ順序を検証したい
- 速度とコストを優先する(LLM 呼び出しなし)
- CI/CD で自動テストを実行している
LLM ベースのスコアラーが適している場合LLM ベースのスコアラーが適している場合への直接リンク
- ステップが適切だったかを意味的に理解する必要がある
- 最適な Trajectory が事前に決まっていない(タスク要件に基づいて評価する)
- 不要、冗長、または欠落したステップを検出したい
- スコア判定の説明が必要
- 本番環境の Agent の動作を評価している
コードベースの Trajectory 精度スコアラーコードベースの Trajectory 精度スコアラーへの直接リンク
@mastra/evals/scorers/prebuilt の createTrajectoryAccuracyScorerCode() 関数は、期待される Trajectory に対するステップの照合と順序に基づく決定論的スコアリングを提供します。
パラメーターパラメーターへの直接リンク
expectedTrajectory?:
comparisonOptions?:
この関数は MastraScorer クラスのインスタンスを返します。.run() メソッドとその入出力の詳細については、MastraScorer リファレンスを参照してください。
期待 Trajectory の取得元期待 Trajectory の取得元への直接リンク
コードベースのスコアラーは、優先順位に従って 2 つの取得元から expectedTrajectory を解決します。
- コンストラクターオプション: スコアラーの作成時に渡す静的 Trajectory。すべてのデータセット項目に使用されます。
- データセット項目:
runEvalsパイプラインを通じて渡される、データセット項目のexpectedTrajectoryフィールド。項目ごとに異なる期待 Trajectory を指定できます。
// Static: same expected trajectory for all items
const scorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search' },
{ stepType: 'tool_call', name: 'summarize' },
],
},
})
// Per-item: each dataset item has its own expectedTrajectory
const scorer = createTrajectoryAccuracyScorerCode()
await runEvals({
target: myAgent,
scorers: { trajectory: [scorer] },
data: [
{
input: 'Search and summarize weather',
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search' },
{ stepType: 'tool_call', name: 'summarize' },
],
},
},
{
input: 'Just search for weather',
expectedTrajectory: {
steps: [{ stepType: 'tool_call', name: 'search' }],
},
},
],
})
評価モード評価モードへの直接リンク
コードベースのスコアラーは、strictOrder に応じて 2 つのモードで動作します。
厳密モード(strictOrder: true)strict-mode-strictorder-trueへの直接リンク
厳密な一致が必要です。実際のステップは、余分なステップや欠落したステップがなく、期待されるステップと同じ順序で一致する必要があります。厳密に一致すれば 1.0、それ以外は 0.0 を返します。
緩和モード(strictOrder: false、デフォルト)relaxed-mode-strictorder-false-defaultへの直接リンク
余分なステップを許可します。期待されるステップは正しい相対順序で現れる必要があります。スコアは一致した期待ステップの数に基づいて計算され、余分なステップや繰り返されたステップには任意でペナルティが適用されます。
コードベースのスコアリング詳細コードベースのスコアリング詳細への直接リンク
- 連続スコア: 緩和モードでは 0.0〜1.0、厳密モードでは二値(0 または 1)を返します
- 決定論的: 同じ入力からは常に同じ出力が得られます
- 高速: 外部 API を呼び出しません
コードベースのスコアラーの結果コードベースのスコアラーの結果への直接リンク
{
runId: string,
preprocessStepResult: {
actualTrajectory: Trajectory,
expectedTrajectory: Trajectory,
comparison: {
score: number,
matchedSteps: number,
totalExpectedSteps: number,
totalActualSteps: number,
missingSteps: string[],
extraSteps: string[],
outOfOrderSteps: string[],
repeatedSteps: string[]
},
actualStepNames: string[],
expectedStepNames: string[]
},
score: number
}
コードベースのスコアラーの例コードベースのスコアラーの例への直接リンク
厳密な順序の Agent Trajectory厳密な順序の Agent Trajectoryへの直接リンク
Agent が Tool 呼び出しの厳密な順序に従うことを検証します。
import { createTrajectoryAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt'
import { runEvals } from '@mastra/core/evals'
const scorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'auth-tool' },
{ stepType: 'tool_call', name: 'fetch-tool' },
],
},
comparisonOptions: { strictOrder: true },
})
const result = await runEvals({
target: myAgent,
scorers: { trajectory: [scorer] },
data: [{ input: 'Get my data' }],
})
console.log(result.scores.trajectory['trajectory-accuracy']) // 1.0
緩和された順序の Agent Trajectory緩和された順序の Agent Trajectoryへの直接リンク
期待されるステップが正しい相対順序で現れる限り、余分なステップを許可します。
const scorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search-tool' },
{ stepType: 'tool_call', name: 'summarize-tool' },
],
},
comparisonOptions: { strictOrder: false },
})
// Agent called search-tool → log-tool → summarize-tool
// The extra log-tool is allowed in relaxed mode
// score: 0.75 — all expected steps matched, small penalty for extra step
Workflow TrajectoryWorkflow Trajectoryへの直接リンク
Workflow の実行パスを評価します。
import { createTrajectoryAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt'
import { runEvals } from '@mastra/core/evals'
const scorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'workflow_step', name: 'validate-input' },
{ stepType: 'workflow_step', name: 'process-data' },
{ stepType: 'workflow_step', name: 'save-result' },
],
},
})
const result = await runEvals({
target: myWorkflow,
scorers: { trajectory: [scorer] },
data: [{ input: { data: 'test' } }],
})
console.log(result.scores.trajectory['trajectory-accuracy'])
ステップデータの比較ステップデータの比較への直接リンク
ステップ名とステップ固有のデータを検証します。Tool 呼び出しでは toolArgs と toolResult、Workflow ステップでは output を比較します。
const scorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{
stepType: 'tool_call',
name: 'search-tool',
toolArgs: { query: 'weather in NYC' },
},
],
},
})
// Data fields like toolArgs are auto-compared when present on expected steps
LLM ベースの Trajectory 精度スコアラーLLM ベースの Trajectory 精度スコアラーへの直接リンク
@mastra/evals/scorers/prebuilt の createTrajectoryAccuracyScorerLLM() 関数は、LLM を使って Agent または Workflow の Trajectory が適切、効率的、かつ完全だったかを評価します。
パラメーターパラメーターへの直接リンク
model:
expectedTrajectory?:
機能機能への直接リンク
LLM ベースのスコアラーは次の機能を提供します。
- タスクを考慮した評価: ユーザーのリクエストに対して各ステップが必要だったかを判定します
- 順序の評価: ステップが論理的な順序で実行されたかを評価します
- 欠落ステップの検出: 実行すべきだったステップを特定します
- 冗長性の検出: 不要なステップや繰り返されたステップを指摘します
- 理由の生成: スコア判定について人が読める説明を提供します
評価プロセス評価プロセスへの直接リンク
- Trajectory の受け取り: パイプラインから抽出済みの
Trajectoryオブジェクトを取得します - ステップの分析: LLM を使って各ステップの必要性と順序を評価します
- スコアの生成: 必要性 60%、順序 30% の重みから、欠落ペナルティ 10% を差し引いてスコアを計算します
- 理由の生成: 人が読める説明を提供します
LLM ベースのスコアリング詳細LLM ベースのスコアリング詳細への直接リンク
- 小数スコア: 0.0〜1.0 の値を返します
- コンテキストを考慮: ユーザーの意図とタスク要件を考慮します
- 説明可能: スコアの理由を提供します
- 柔軟: 期待 Trajectory の有無にかかわらず動作します
LLM ベースのスコアラーのオプションLLM ベースのスコアラーのオプションへの直接リンク
// Evaluate based on task requirements (no expected trajectory)
const openScorer = createTrajectoryAccuracyScorerLLM({
model: { provider: 'openai', name: 'gpt-5.4' },
})
// Evaluate against a static expected trajectory
const guidedScorer = createTrajectoryAccuracyScorerLLM({
model: { provider: 'openai', name: 'gpt-5.4' },
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search-tool' },
{ stepType: 'tool_call', name: 'summarize-tool' },
],
},
})
LLM ベースのスコアラーの結果LLM ベースのスコアラーの結果への直接リンク
{
runId: string,
preprocessStepResult: {
actualTrajectory: Trajectory,
actualTrajectoryFormatted: string,
expectedTrajectoryFormatted?: string,
hasSteps: boolean
},
analyzeStepResult: {
stepEvaluations: Array<{
stepName: string,
wasNecessary: boolean,
wasInOrder: boolean,
reasoning: string
}>,
missingSteps?: string[],
extraSteps?: string[],
overallAssessment: string
},
score: number,
reason: string
}
統合 Trajectory スコアラー統合 Trajectory スコアラーへの直接リンク
@mastra/evals/scorers/prebuilt の createTrajectoryScorerCode() 関数は、精度、効率、ブラックリスト登録された Tool、Tool の失敗パターンを 1 回で確認する多次元の Trajectory 評価を提供します。
パラメーターパラメーターへの直接リンク
defaults?:
weights?:
スコアリング動作スコアリング動作への直接リンク
統合スコアラーは 4 つの次元を評価します。
- 精度: 実際のステップを期待されるステップと照合します(
stepsが設定されている場合)。orderingモードを使用します。 - 効率: ステップの上限(
maxSteps、maxTotalTokens、maxTotalDurationMs)と冗長な呼び出し(noRedundantCalls)を確認します。 - ブラックリスト: 禁止された Tool またはシーケンスを確認します。違反があると、他の次元にかかわらず即座にスコアが 0.0 になります。
- Tool の失敗: 再試行とフォールバックのパターンを検出します。引数の修正パターンも検出します。
最終スコアは有効な次元の加重和であり、有効な次元に応じて正規化されます。デフォルトの重みは、精度 0.4、効率 0.3、Tool の失敗 0.2、ブラックリスト 0.1 ですが、weights オプションでカスタマイズできます。ブラックリスト違反がある場合、他のすべてを上書きして 0 になります。ネストされた評価がある場合、スコアはトップレベルが 70%、ネストされた評価の平均が 30% です。
統合スコアラーの結果統合スコアラーの結果への直接リンク
{
runId: string,
preprocessStepResult: {
accuracy?: TrajectoryComparisonResult,
efficiency?: TrajectoryEfficiencyResult,
blacklist?: TrajectoryBlacklistResult,
toolFailures?: ToolFailureAnalysisResult,
nested?: NestedEvaluationResult[],
},
score: number,
reason: string
}
項目ごとの期待値項目ごとの期待値への直接リンク
各データセット項目は、独自の expectedTrajectory でデフォルトを上書きできます。これにより、プロンプトごとに期待値を変えられます。
import { createTrajectoryScorerCode } from '@mastra/evals/scorers/prebuilt'
import { runEvals } from '@mastra/core/evals'
// Default blacklist applies to all items
const scorer = createTrajectoryScorerCode({
defaults: {
blacklistedTools: ['deleteAll'],
maxSteps: 5,
},
})
const result = await runEvals({
target: myAgent,
scorers: { trajectory: [scorer] },
data: [
{
input: 'Search for weather',
expectedTrajectory: {
steps: [{ stepType: 'tool_call', name: 'search' }],
maxSteps: 2,
},
},
{
input: 'Search and summarize',
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search' },
{ stepType: 'tool_call', name: 'summarize' },
],
},
},
],
})
例: 効率とブラックリスト例: 効率とブラックリストへの直接リンク
import { createTrajectoryScorerCode } from '@mastra/evals/scorers/prebuilt'
const scorer = createTrajectoryScorerCode({
defaults: {
blacklistedTools: ['escalate', 'admin-override'],
blacklistedSequences: [['escalate', 'admin-override']],
maxSteps: 10,
noRedundantCalls: true,
maxRetriesPerTool: 2,
},
// Customize how dimensions contribute to the final score
weights: {
accuracy: 0.5, // prioritize step accuracy
efficiency: 0.3,
toolFailures: 0.1,
blacklist: 0.1,
},
})
runEvals で Trajectory スコアラーを使用するusing-trajectory-scorers-with-runevalsへの直接リンク
Trajectory スコアラーは、スコアラー設定の trajectory キーに設定します。runEvals パイプラインが Trajectory の抽出を自動的に処理します。
Agent Trajectory の評価Agent Trajectory の評価への直接リンク
import { runEvals } from '@mastra/core/evals'
import { createTrajectoryAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt'
const trajectoryScorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'tool_call', name: 'search' },
{ stepType: 'tool_call', name: 'format' },
],
},
})
const result = await runEvals({
target: myAgent,
scorers: {
agent: [qualityScorer], // receives raw MastraDBMessage[] output
trajectory: [trajectoryScorer], // receives pre-extracted Trajectory
},
data: [{ input: 'Find and format the data' }],
})
// result.scores.agent['quality'] — agent-level score
// result.scores.trajectory['trajectory-accuracy'] — trajectory score
Workflow Trajectory の評価Workflow Trajectory の評価への直接リンク
import { runEvals } from '@mastra/core/evals'
import { createTrajectoryAccuracyScorerCode } from '@mastra/evals/scorers/prebuilt'
const workflowTrajectoryScorer = createTrajectoryAccuracyScorerCode({
expectedTrajectory: {
steps: [
{ stepType: 'workflow_step', name: 'validate' },
{ stepType: 'workflow_step', name: 'process' },
{ stepType: 'workflow_step', name: 'notify' },
],
},
})
const result = await runEvals({
target: myWorkflow,
scorers: {
workflow: [outputScorer], // receives workflow output
trajectory: [workflowTrajectoryScorer], // receives pre-extracted Trajectory from step results
},
data: [{ input: { userId: '123' } }],
})
// result.scores.workflow['output-quality'] — workflow-level score
// result.scores.trajectory['trajectory-accuracy'] — trajectory score
関連項目関連項目への直接リンク
- runEvals リファレンス: Trajectory を抽出してスコアラーに渡すパイプライン
- MastraScorer リファレンス: スコアラーの基本インターフェース
- スコアラーのユーティリティ:
extractTrajectoryやcompareTrajectoriesなどのユーティリティ関数