Agent 轨迹语义相似度评测:基于 Levenshtein 与 DAG 同构的路径评估
在评估一个多智能体系统(Multi-Agent System)或复杂 ReAct 规划器时,传统的评测往往只看**“最终产物是否正确(End-to-End Output Accuracy)”**。
然而,在企业级生产环境中,“结果对了,但过程完全走偏”的隐形故障极度危险:
- 场景痛点:用户要求“查询张三的账户余额”;标准的最优执行轨迹是简单的
[query_crm_balance](1 步搞定,耗时 300ms); - 但某个退化后的大模型却走了如下极其奇葩的弯路:
[search_google] -> [query_all_users] -> [python_filter] -> [query_crm_balance]; - 最终结果虽然侥幸对了,但多消耗了 4 轮大模型调用、多烧了 10 倍 Token,延迟从 300ms 恶化到了 6 秒!
- 如果评测系统只看终态结果,这个严重的**“规划路径退化与死循环倾向(Path Degradation)”**将被完全掩盖。
如何构建一套脱离单一终态判定、能够对 Agent 的“多步工具调用执行轨迹(Execution Trajectory)”进行严密拓扑与顺序度量的“轨迹语义相似度评估中枢(Trajectory Evaluation Engine)”?
一、轨迹评估的双维数学度量模型(Levenshtein 距离 + DAG 同构度)
[ 金标标准轨迹 (Golden Trajectory): S = [Tool_A, Tool_B, Tool_C] ] [ 实际预测轨迹 (Actual Trajectory): T = [Tool_A, Tool_X, Tool_B, Tool_C] ] │ ▼ ┌────────────────────────────────────────────────────────┐ │ 维度 1: 序列编辑距离相似度 (Levenshtein Trajectory Sim)│ │ 计算将预测序列转换为金标序列所需的 [插入/删除/替换] 步数│ │ 公式: $Sim_{seq} = 1 - \frac{\text{Levenshtein}(S, T)}{\max(|S|, |T|)}$│ │ 本例: 插入了 Tool_X, 距离=1, 相似度 = $1 - 1/4 = 0.75$ │ └──────────────────────────────┬─────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ 维度 2: 任务有向无环图同构度 (DAG Graph Edit Distance) │ │ 计算节点依赖拓扑的因果保真度与多余冗余边判定 │ └──────────────────────────────┬─────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ 综合轨迹评测得分 = 0.6 × 序列相似度 + 0.4 × 拓扑同构度 │ └────────────────────────────────────────────────────────┘二、生产级 Python Agent 轨迹相似度评测引擎实现实操
from typing import List, Dict, Any from pydantic import BaseModel class TrajectoryStep(BaseModel): step_index: int tool_name: str class TrajectoryEvaluationReport(BaseModel): golden_path: List[str] actual_path: List[str] levenshtein_similarity: float redundant_steps_count: int missing_steps_count: int is_optimal_trajectory: bool class AgentTrajectoryEvaluator: @staticmethod def calculate_levenshtein_similarity(golden_seq: List[str], actual_seq: List[str]) -> float: """计算两个工具调用序列的编辑距离相似度 (0.0 ~ 1.0)""" m, n = len(golden_seq), len(actual_seq) if m == 0 and n == 0: return 1.0 if m == 0 or n == 0: return 0.0 # 构建 DP 动态规划矩阵 dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(m + 1): dp[i][0] = i for j in range(n + 1): dp[0][j] = j for i in range(1, m + 1): for j in range(1, n + 1): if golden_seq[i - 1] == actual_seq[j - 1]: dp[i][j] = dp[i - 1][j - 1] else: dp[i][j] = 1 + min( dp[i - 1][j], # 删除 dp[i][j - 1], # 插入 dp[i - 1][j - 1] # 替换 ) edit_distance = dp[m][n] max_len = max(m, n) similarity = 1.0 - (edit_distance / max_len) return round(similarity, 4) @classmethod def evaluate_trajectory(cls, golden_tools: List[str], actual_tools: List[str]) -> TrajectoryEvaluationReport: sim = cls.calculate_levenshtein_similarity(golden_tools, actual_tools) # 统计多走的冤枉路 (Redundant Steps) redundant = max(0, len(actual_tools) - len(golden_tools)) missing = max(0, len(golden_tools) - len(actual_tools)) is_optimal = (sim == 1.0 and redundant == 0) print(f"📊 【轨迹评测】金标: {golden_tools} | 实际: {actual_tools}") print(f" └── 轨迹语义相似度: {sim*100:.1f}% | 冗余多余步骤: {redundant} 步") return TrajectoryEvaluationReport( golden_path=golden_tools, actual_path=actual_tools, levenshtein_similarity=sim, redundant_steps_count=redundant, missing_steps_count=missing, is_optimal_trajectory=is_optimal )三、在自动化测试与大模型选型中的实战应用
在评测 GPT-4o、Claude 3.5 与开源 Qwen2.5 在复杂 ReAct 任务下的执行效率时:
golden_trajectory = ["query_dwd_sql", "calculate_growth_rate", "send_feishu_alert"] # 模型 A 虽然得到了最终结果,但多调了无用的搜索 model_a_actual = ["google_search", "query_dwd_sql", "calculate_growth_rate", "send_feishu_alert"] report = AgentTrajectoryEvaluator.evaluate_trajectory(golden_trajectory, model_a_actual) # 自动捕获到多余的 google_search 冗余步骤并扣分!四、生产治理收益
通过在多智能体系统评测体系中推行轨迹相似度度量:
- 精准揪出“结果正确但过程极度浪费”的劣质推理路径;
- 全团队具备了定量评估大模型规划决策效率(Planning Efficiency)的核心标尺;
- 推动智能体系统朝着“以最少步骤、最低成本、最短延迟达成目标”的极致工程方向稳健演进。