#Agent Plan × DeepSeek Harness — Agent评估基准与可观测平台

1. 引言:Agent系统"能跑但不知道跑得好不好"的困境

当一个基于大语言模型的Agent系统从原型走向生产环境,工程团队会很快撞上同一堵墙:系统"能跑起来",但没有人能说清楚它"跑得有多好"。

这个困境的根源在于Agent系统的输出具有高度非确定性。传统的软件系统有明确的输入输出契约——给定输入A,预期输出B,断言通过即视为正确。而Agent系统的行为链路是一个动态的推理-决策-执行循环,同一个任务在不同运行中可能选择完全不同的工具调用序列、产生不同的中间推理路径,甚至得出形式不同但语义等价的最终答案。这使得"正确性"本身从二元判定退化为一个多维度连续光谱。

更复杂的是,Agent系统通常由多个组件协同构成:规划模块负责任务分解与子目标编排,工具调用模块负责与外部环境交互,记忆模块负责上下文管理,反思模块负责自我纠偏。任何一个组件的退化都可能在链路中被放大或掩盖,导致问题定位极其困难。开发者在日常迭代中反复面对的核心问题不是"系不系统工作",而是:

  • 这次Prompt修改让规划质量变好了还是变差了?
  • 工具调用失败率上升是模型能力问题还是接口稳定性问题?
  • 任务完成率从78%提升到82%,是真实改进还是噪声波动?
  • 平均延迟从4.2秒涨到5.8秒,瓶颈卡在哪个环节?

Agent Plan × DeepSeek Harness(以下简称APH框架)正是为回答这些问题而构建的技术体系。其中,Agent Plan是一套标准化的Agent能力评估方法论,定义了评估维度、基准任务集和量化指标体系;DeepSeek Harness则是运行时可观测与实验管理平台,提供Trace采集、指标聚合、A/B实验和可视化仪表盘能力,并以DeepSeek系列模型作为自动化评估和异常检测的推理引擎。

两者的核心理念是:将Agent系统从"感觉还行"推进到"数据驱动迭代",让每一次Prompt修改、模型升级、工具链调整都有可量化的评估依据。

2. Agent评估的核心维度体系

建立评估体系的第一步不是设计指标,而是定义维度。维度是指标的上位概念——它回答"我们在评估什么",而指标回答"我们如何测量"。APH框架定义了五个核心评估维度,构成一个相互正交但彼此关联的评估空间。

规划质量(Planning Quality):衡量Agent将复杂任务分解为可执行子步骤的能力。关注点包括:分解粒度是否合理(既不过粗导致无法执行,也不过细导致冗余开销)、子步骤之间的依赖关系是否正确、是否有遗漏关键步骤、是否产生了不必要的冗余步骤。规划质量直接决定了后续执行的效率上限。

执行效率(Execution Efficiency):衡量Agent在任务执行过程中的资源利用效率。核心指标包括完成单任务所需的工具调用轮次、Token消耗总量、端到端延迟。执行效率回答的问题是"在达到同等结果质量的前提下,系统消耗了多少资源"。

工具调用准确率(Tool Invocation Accuracy):衡量Agent选择和调用外部工具的精确程度。具体考察三个层面:是否选对了工具(工具选择准确性)、传入参数是否正确(参数构造准确性)、对工具返回结果的理解和处理是否正确(结果解析准确性)。这是Agent与外部世界交互质量的直接度量。

任务完成率(Task Completion Rate):衡量Agent端到端完成用户指定任务的比例。这里的关键挑战在于"完成"的定义——APH框架采用分级判定:完全完成(结果完全满足预期)、部分完成(核心目标达成但存在缺陷或遗漏)、未完成(核心目标未达成或中途失败)。分级判定避免了简单的二元分类丢失中间态信息。

成本效益(Cost Effectiveness):将结果质量与资源消耗进行联合度量。一个完成率90%但消耗50000 Token的系统,与一个完成率85%但消耗8000 Token的系统,哪个更好?成本效益维度通过质量-成本比率为这类决策提供量化依据。

这五个维度并非独立运作,而是构成了一个评估矩阵。在实际产品迭代中,不同阶段对不同维度的优先级不同:早期关注完成率和规划质量,中期关注工具准确率和执行效率,成熟期关注成本效益。APH框架支持维度权重的动态配置,使评估策略能够随产品阶段演进。

在行业实践中,不同成熟度阶段的Agent系统在各维度上呈现典型的基准区间。根据APH框架对数十个生产级Agent系统的观测数据,早期阶段系统的完成率通常在50%-65%区间,工具选择准确率在80%-88%,参数构造准确率往往低于75%——后者是最常见的短板。进入中期优化阶段后,完成率提升至70%-80%,工具准确率突破90%,但Token效率比往往不降反升,因为优化过程中增加了更多的检查和重试逻辑。成熟期系统在完成率稳定在80%以上后,成本效益成为核心战场,Token效率比需要从3000+优化到2000以下才具备商业可行性。这些基准区间为新团队提供了"我现在处于什么阶段"的参照系。

3. 评估基准框架设计

APH评估基准框架由四个核心子系统构成,形成从任务输入到评估报告的完整流水线。

报告生成 Report Generation

指标计算层 Metrics Layer

评估引擎 Evaluation Engine

基准任务集 Benchmark Task Suite

模拟工具响应

任务分类器
Task Classifier

难度分级器
Difficulty Grader

数据集仓库
Dataset Repository

任务调度器
Task Scheduler

Agent运行时
Agent Runtime Sandbox

事件采集器
Event Collector

环境模拟器
Env Simulator

原始指标采集
Raw Metrics

聚合计算引擎
Aggregation Engine

DeepSeek Judge
LLM-as-Judge

指标汇总
Metrics Summary

趋势分析
Trend Analysis

可视化报告
Visual Report

基准任务集是评估的输入源。它不是一组随意的测试用例,而是一个经过精心设计、具备分类体系和难度分级的结构化任务集合。任务分类器根据Agent的预期应用场景对任务进行领域归类(如信息检索、数据分析、代码生成、多轮对话等),难度分级器根据任务所需的推理深度、工具调用次数、上下文依赖复杂度进行1-5星分级。数据集仓库负责版本管理和任务去重,确保每次评估运行使用一致的任务集,使结果具有可比性。

评估引擎是执行核心。任务调度器负责将基准任务分发到Agent运行时沙箱中执行,沙箱提供隔离的执行环境——包括模拟的工具接口、受控的网络访问和确定性种子——确保评估的可复现性。事件采集器以结构化方式记录Agent执行过程中的每一个关键事件:规划决策、工具调用请求、工具返回结果、中间推理文本、最终输出。环境模拟器是沙箱的关键组件,它替代了真实的工具后端,提供确定性的响应,消除外部服务波动对评估结果的干扰。

指标计算层将原始事件流转化为可量化的评估指标。原始指标采集负责从事件流中提取原子级数据点(如单次工具调用的延迟、单轮推理的Token数),聚合计算引擎将这些原子数据点按维度和粒度进行统计聚合,DeepSeek Judge则作为LLM-as-Judge组件,对无法用规则判定的开放式输出进行语义级评估。

报告生成将计算结果组织成可操作的评估报告。除了静态指标汇总,报告还包含跨版本趋势分析,帮助团队识别指标变化的方向和幅度。

4. 评测基准任务集构建

基准任务集的质量直接决定了评估结果的有效性。一个设计不当的任务集——比如全是简单单轮任务,或任务之间存在高度同质化——会导致评估结果对真实场景缺乏预测力。APH框架采用"分类-分级-标注"三步法构建任务集。

任务分类体系参照真实Agent应用场景划分为六类:

任务类别描述典型示例核心评估维度
单轮信息检索一次工具调用即可完成的信息查询“查询北京今天的天气”工具准确率、延迟
多步推理检索需要多轮检索和推理链才能完成“对比三个竞品的市场份额并给出分析”规划质量、完成率
代码生成与执行生成代码并在沙箱中运行验证“写一个Python函数计算移动平均”完成率、执行效率
多工具编排需要协调多个不同工具完成复合任务“从数据库取数、用统计工具分析、生成报告”规划质量、工具准确率
纠错与恢复在执行过程中遇到错误需要自我修正工具返回异常时Agent的降级处理能力规划质量、完成率
长上下文推理需要在大量上下文中维持推理一致性基于长文档的问答与总结执行效率、完成率

难度分级采用多维评估矩阵,而非简单的单轴分级。每个任务从三个独立维度评估难度:推理深度(1-5星,衡量所需的推理链长度)、工具复杂度(1-5星,衡量所需工具调用的数量和参数复杂度)、上下文依赖度(1-5星,衡量任务对历史上下文的依赖程度)。一个标记为 [推理:3, 工具:4, 上下文:2] 的任务意味着它需要中等深度的推理、较高的工具编排复杂度,但对上下文记忆的依赖较低。这种多维标注使团队能够精确识别Agent能力短板——比如"推理深度4星以上任务完成率骤降"这一发现,比笼统的"困难任务完成率低"具有更强的行动指导性。

数据集标注为每个任务定义预期行为基准。对于有确定性答案的任务(如信息检索),标注标准答案;对于开放式任务(如报告生成),标注评估要点列表(rubric),供LLM-as-Judge逐点核对。标注还包含时间预算(预期完成该任务所需的合理时间上限)和成本预算(预期Token消耗上限),用于成本效益维度的评估。

任务集的维护采用版本化管理策略。每个版本的任务集附带元数据(创建日期、任务数量、类别分布、难度分布),评估报告必须引用任务集版本号以确保可复现性。当任务集更新时——新增任务、修改标注、调整难度——主版本号递增,历史评估结果不会失效,但跨版本比较时需注明版本差异。

5. 关键指标定义与计算方法

指标定义是评估体系的基石。模糊的指标定义会导致不同评估者对同一结果产生不同解读,使评估结果丧失可比性。APH框架对每个关键指标给出精确的数学定义、计算公式和目标基准值。

指标名称定义计算公式目标值
规划合理度规划步骤中合理步骤占总步骤的比例NvalidNtotal×100%\frac{N_{valid}}{N_{total}} \times 100\%NtotalNvalid×100%≥ 85%
工具选择准确率选择正确工具的调用次数占比Ncorrect_toolNtotal_calls×100%\frac{N_{correct\_tool}}{N_{total\_calls}} \times 100\%Ntotal_callsNcorrect_tool×100%≥ 92%
参数构造准确率工具参数完全正确的调用次数占比Ncorrect_paramNtotal_calls×100%\frac{N_{correct\_param}}{N_{total\_calls}} \times 100\%Ntotal_callsNcorrect_param×100%≥ 88%
任务完成率(完全)完全达成任务目标的运行占比Nfull_completeNtotal_tasks×100%\frac{N_{full\_complete}}{N_{total\_tasks}} \times 100\%Ntotal_tasksNfull_complete×100%≥ 75%
任务完成率(含部分)完全或部分达成目标的运行占比Nfull+NpartialNtotal×100%\frac{N_{full} + N_{partial}}{N_{total}} \times 100\%NtotalNfull+Npartial×100%≥ 90%
平均端到端延迟从任务输入到最终输出的平均耗时1N∑i=1Nte2e(i)\frac{1}{N}\sum_{i=1}^{N} t_{e2e}^{(i)}N1i=1Nte2e(i)≤ 8s
P95延迟95%分位的端到端延迟P95({te2e(i)})P_{95}(\{t_{e2e}^{(i)}\})P95({te2e(i)})≤ 15s
Token效率比每完成一个有效子目标的平均Token消耗Ntotal_tokensNachieved_goals\frac{N_{total\_tokens}}{N_{achieved\_goals}}Nachieved_goalsNtotal_tokens≤ 2000
成本-质量指数完成率与归一化成本的比值CRCostCostbaseline\frac{CR}{\frac{Cost}{Cost_{baseline}}}CostbaselineCostCR≥ 1.2

其中几个关键指标的计算需要进一步说明。

规划合理度的判定采用人工标注与LLM-as-Judge混合策略。对于基准任务集,每个任务的预期规划步骤已预标注,评估时将Agent实际规划与预期规划进行对齐比对。对齐采用基于步骤语义相似度的动态规划算法,而非简单的字符串匹配:

def compute_planning_score(actual_steps, expected_steps, embedder):
    """
    计算规划合理度得分。
    actual_steps: Agent实际生成的规划步骤列表
    expected_steps: 预期规划步骤列表
    embedder: 语义嵌入模型,用于步骤语义对齐
    """
    # 将步骤向量化
    actual_emb = embedder.encode(actual_steps)
    expected_emb = embedder.encode(expected_steps)
    
    # 构建相似度矩阵
    sim_matrix = cosine_similarity(actual_emb, expected_emb)
    
    # 使用动态规划求最优对齐
    aligned_pairs, unmatched_actual, unmatched_expected = \
        optimal_alignment(sim_matrix, threshold=0.75)
    
    valid_count = len(aligned_pairs)
    # 未匹配的预期步骤视为遗漏,未匹配的实际步骤视为冗余
    redundancy_penalty = len(unmatched_actual) * 0.5
    missing_penalty = len(unmatched_expected) * 0.8
    
    score = (valid_count - redundancy_penalty - missing_penalty) / \
            max(len(expected_steps), len(actual_steps))
    return max(0.0, min(1.0, score))

上述对齐算法的核心是一个基于动态规划的最优匹配过程。设实际步骤序列长度为mmm,预期步骤序列长度为nnn,相似度矩阵S∈Rm×nS \in \mathbb{R}^{m \times n}SRm×n,其中Si,jS_{i,j}Si,j表示实际步骤iii与预期步骤jjj的余弦相似度。对齐问题的目标是找到一个匹配M⊆{1,...,m}×{1,...,n}M \subseteq \{1,...,m\} \times \{1,...,n\}M{1,...,m}×{1,...,n},使得匹配对的总相似度最大化,同时满足每个步骤至多被匹配一次的约束。这等价于二部图最大权匹配问题,APH框架采用匈牙利算法在O(max⁡(m,n)3)O(\max(m,n)^3)O(max(m,n)3)时间内求解。相似度阈值θ=0.75\theta=0.75θ=0.75的选取基于校准实验:在人工标注的500对步骤上,0.75的阈值在精确率和召回率之间取得了最佳F1值(0.82),低于此阈值会产生大量语义无关的误匹配,高于此阈值则遗漏过多语义等价但表述不同的步骤对。

任务完成率的分级判定是评估中最具挑战性的环节。对于有确定性答案的任务,完成率判定可以通过结果匹配实现。但对于开放式任务,需要LLM-as-Judge基于预标注的评估要点列表进行多维度评分。APH框架使用DeepSeek作为Judge模型,对每个要点进行"满足/部分满足/不满足"的三级判定,然后聚合为整体完成等级:

def judge_task_completion(agent_output, rubric_points, judge_model):
    """
    使用LLM-as-Judge判定任务完成等级。
    rubric_points: 预标注的评估要点列表
    """
    scores = []
    for point in rubric_points:
        prompt = construct_judge_prompt(agent_output, point)
        result = judge_model.evaluate(prompt)
        # result: {"score": 0|1|2, "reasoning": "..."}
        scores.append(result["score"])
    
    total = sum(scores)
    max_possible = len(rubric_points) * 2
    
    if total >= max_possible * 0.9:
        return "full_complete"
    elif total >= max_possible * 0.5:
        return "partial_complete"
    else:
        return "incomplete"

这个判定逻辑的关键设计在于:Judge模型的推理过程被完整记录,而非仅取最终判定结果。这使得当评估结果存在争议时,团队可以回溯Judge的推理链路,审查判定是否合理,必要时修正rubric标注。

Judge模型的校准采用Cohen’s Kappa系数衡量与人工标注的一致性。APH框架维护一个包含150个任务的校准集,其中每个任务的完成等级均由3位标注者独立判定后取多数投票确定。每当Judge模型的提示词或底层模型版本更新时,必须在校准集上重新运行,要求Kappa值不低于0.70方可上线。此外,APH框架还跟踪校准集上的逐要点一致率——即每个rubric要点上Judge判定与人工判定的一致比例,当某个要点的一致率持续低于60%时,触发该要点的标注审查,通常意味着rubric描述本身存在歧义,需要重新定义。

6. 运行时Trace与日志溯源

评估基准回答了"Agent跑得有多好"的问题,但无法回答"为什么跑成这样"。当任务完成率突然下降,或者某个特定类型的任务表现异常时,团队需要深入到单次执行的内部链路,定位问题根因。这就是运行时Trace与日志溯源的职责。

APH框架的Trace系统采用Span树模型组织执行轨迹。每一次Agent运行被建模为一棵Span树,根Span代表整个任务执行,子Span代表各个执行阶段——规划、工具调用、推理、反思等。每个Span携带标准化的元数据:开始时间、结束时间、持续时间、输入参数、输出结果、Token消耗、状态码。这种树形结构完整保留了执行的时序和因果关系。

可视化层

分析层

存储层

传输层

采集层

Agent运行时
自动埋点

工具调用拦截器
Tool Interceptor

LLM调用拦截器
LLM Interceptor

异步队列
Async Queue

批量缓冲
Batch Buffer

热存储
Hot Store / Redis

冷存储
Cold Store / ClickHouse

索引服务
Index Service

实时聚合
Real-time Aggregator

延迟分析
Latency Analyzer

异常检测
Anomaly Detector

DeepSeek
异常归因

Trace瀑布图
Waterfall View

调用拓扑图
Topology View

日志检索
Log Search

告警通知
Alerting

采集层通过两种机制获取Trace数据。自动埋点在Agent框架的关键执行路径上插入Span创建和关闭逻辑,开发者无需手动编写Trace代码。拦截器机制则通过装饰器模式包装工具调用和LLM调用,自动捕获输入输出和性能数据。这种非侵入式设计确保Trace系统可以平滑接入现有Agent代码库:

import functools
import time
from trace_sdk import Span, tracer

def trace_tool_call(tool_name):
    """工具调用拦截器装饰器,自动采集Trace数据"""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            with tracer.start_span(
                name=f"tool.{tool_name}",
                kind="tool_call",
                attributes={"tool.name": tool_name}
            ) as span:
                start = time.perf_counter()
                try:
                    result = func(*args, **kwargs)
                    span.set_attribute("tool.status", "success")
                    span.set_attribute("tool.result_size", len(str(result)))
                    return result
                except Exception as e:
                    span.set_attribute("tool.status", "error")
                    span.set_attribute("tool.error", str(e))
                    span.record_exception(e)
                    raise
                finally:
                    elapsed = time.perf_counter() - start
                    span.set_attribute("tool.duration_ms", elapsed * 1000)
        return wrapper
    return decorator

传输层采用异步队列解耦Trace采集和存储,避免Trace系统本身成为Agent执行的性能瓶颈。批量缓冲机制将高频Span数据聚合后批量写入存储,在吞吐量和延迟之间取得平衡。

存储层采用冷热分离策略。热存储(基于Redis)保存最近24小时的Trace数据,支持低延迟的实时查询和告警判定。冷存储(基于ClickHouse)保存全量历史Trace,支持复杂的聚合分析和趋势查询。索引服务对Trace的标签和属性建立倒排索引,支持按任务类型、工具名称、错误状态等维度快速检索。

在高流量生产环境中,全量Trace采集会带来不可忽视的存储和计算开销。APH框架支持三种采样策略以适应不同场景:头部采样(Head-based Sampling)在Span创建时即决定是否采集,基于固定采样率(如10%),优点是开销极低、实现简单,缺点是无法保证异常Trace的采集——失败的执行可能恰好未被采样。尾部采样(Tail-based Sampling)在Span树完成后根据执行结果决定是否保留,APH框架默认保留所有错误Trace、延迟超过P95的慢Trace以及随机采样的正常Trace,这种策略确保诊断价值高的Trace优先保留,但需要在内存中缓存完整Span树直到执行结束,对长耗时任务有内存压力。概率采样与强制保留混合策略对正常执行按1%-5%概率采样,对异常执行(错误状态、延迟超阈值、Token消耗超预算)强制保留,这是APH框架推荐的生产默认策略:

class TraceSampler:
    """Trace采样器:概率采样 + 异常强制保留"""
    def __init__(self, normal_rate=0.02, error_force_keep=True,
                 latency_threshold_ms=15000):
        self.normal_rate = normal_rate
        self.error_force_keep = error_force_keep
        self.latency_threshold = latency_threshold_ms

    def should_sample(self, span_tree):
        """在Span树完成后决定是否保留"""
        root = span_tree.root
        # 异常执行强制保留
        if self.error_force_keep and root.status == "error":
            return True
        # 慢Trace强制保留
        if root.duration_ms > self.latency_threshold:
            return True
        # 正常执行概率采样
        return random.random() < self.normal_rate

采样策略的选择本质上是在诊断覆盖率和系统开销之间做权衡。APH框架建议:评估基准运行时使用100%全量采集(任务集规模可控),生产环境使用混合采样策略,将异常Trace的保留率维持在接近100%,正常Trace的采样率根据存储容量动态调整。

分析层在存储之上提供实时计算能力。实时聚合器持续计算各维度的运行时指标(如过去5分钟的工具调用成功率)。延迟分析器对Span树进行时间线分解,计算各阶段的耗时占比。异常检测器基于统计模型(如移动平均+标准差阈值)检测指标的突增突降,当检测到异常时触发DeepSeek异常归因模块,由LLM分析相关Trace日志,生成可能的根因假设。

可视化层提供多种分析视图。Trace瀑布图以时间线方式展示单次执行的完整Span树,帮助开发者直观定位耗时瓶颈。调用拓扑图展示工具调用的关系网络,识别高频调用路径和异常调用模式。日志检索支持全文搜索和结构化过滤,使开发者能快速找到特定条件的执行记录。

7. 成本与延迟分析

在生产环境中,成本和延迟往往是比功能正确性更关键的运营约束。一个完成率95%但每次任务消耗50000 Token、耗时30秒的Agent系统,在大多数商业场景中不可接受。APH框架将成本和延迟分析提升到与功能评估同等重要的地位。

Token消耗统计是成本分析的基础。APH框架将Token消耗分解为四个组成部分:规划Token(用于任务分解和策略选择的推理消耗)、工具调用Token(构造工具调用请求和解析返回结果的消耗)、反思Token(自我评估和纠偏的消耗)、上下文维护Token(维护对话历史和记忆的消耗)。这种分解使团队能够精确识别Token消耗的主要来源:

class TokenBreakdown:
    """Token消耗四维分解"""
    def __init__(self):
        self.planning = 0       # 规划Token
        self.tool_usage = 0     # 工具调用Token
        self.reflection = 0     # 反思Token
        self.context_mgmt = 0   # 上下文维护Token

    @property
    def total(self):
        return (self.planning + self.tool_usage + 
                self.reflection + self.context_mgmt)

    def cost_estimate(self, input_rate, output_rate):
        """估算美元成本,区分输入/输出Token费率"""
        input_tokens = self._classify_io(mode="input")
        output_tokens = self._classify_io(mode="output")
        return (input_tokens * input_rate + 
                output_tokens * output_rate) / 1_000_000

    def efficiency_score(self, achieved_goals):
        """计算每达成一个子目标的Token效率"""
        if achieved_goals == 0:
            return float('inf')
        return self.total / achieved_goals

延迟分解将端到端延迟拆解为可归因的组成部分。在Agent系统中,端到端延迟不是单一因素决定的,而是由多个串行和并行阶段叠加而成。APH框架定义了标准化的延迟分解模型:

  • T_plan:规划阶段延迟,包括LLM推理生成规划方案的时间
  • T_tool:工具调用延迟,包括网络往返和工具执行时间
  • T_llm:LLM推理延迟,包括每次模型调用的等待时间
  • T_serial:串行等待延迟,由于步骤间依赖导致的无法并行化的等待时间
  • T_overhead:框架开销,包括Trace采集、状态管理等系统级耗时

总延迟 Te2e=Tplan+∑(Ttool+Tllm)+Tserial+ToverheadT_{e2e} = T_{plan} + \sum(T_{tool} + T_{llm}) + T_{serial} + T_{overhead}Te2e=Tplan+(Ttool+Tllm)+Tserial+Toverhead

瓶颈定位通过延迟分解数据自动识别性能瓶颈。APH框架实现了基于贡献度的瓶颈检测算法:当某个延迟组成部分贡献了超过总延迟40%的份额,或其P95延迟超过历史基线的2倍标准差时,系统自动标记为瓶颈并生成诊断报告。常见的瓶颈模式包括:上下文过长导致LLM推理延迟激增(通常指向记忆管理策略问题)、工具调用重试导致的串行延迟累积(通常指向工具稳定性问题)、规划粒度过细导致LLM调用次数过多(通常指向Prompt设计问题)。

延迟分析的一个关键洞察是:优化方向取决于瓶颈类型而非绝对延迟值。一个主要由T_tool贡献的延迟瓶颈,优化方向是提升工具响应速度或增加并行调用;而一个主要由T_llm贡献的延迟瓶颈,优化方向是压缩上下文长度或切换更快的模型变体。没有延迟分解,团队可能花费大量精力优化错误的方向。

从行业实践来看,不同复杂度的Agent任务在成本和延迟上呈现显著差异。根据APH框架的观测数据,单轮信息检索类任务的典型Token消耗在800-2000区间,P95延迟在3-6秒;多步推理检索类任务Token消耗在3000-8000区间,P95延迟在8-15秒;多工具编排类任务Token消耗可达8000-20000,P95延迟在15-30秒。这些基准区间为团队设定成本预算和延迟SLA提供了参考。值得注意的是,Token消耗与任务复杂度并非线性关系——当任务复杂度增加时,上下文累积和重试行为会导致Token消耗呈超线性增长,这也是为什么Token效率比在复杂任务上往往显著恶化的原因。

8. A/B实验框架设计

Agent系统的迭代天然适合A/B实验范式:修改Prompt、调整模型参数、更换工具实现——每一次变更都可以设计为一次受控实验。但Agent系统的A/B实验比传统Web服务的A/B测试复杂得多,因为输出不是简单的点击/转化事件,而是多维度的质量指标,且指标本身具有高方差特性。

APH框架的A/B实验设计围绕四个核心问题展开。

实验分组采用分层随机化策略。由于Agent表现受任务类型影响显著,简单的随机分组可能在某些任务类型上产生组间不均衡。APH框架先按任务类别和难度等级对基准任务集进行分层,然后在每层内随机分配到对照组和实验组,确保两组在任务构成上统计一致:

import random
from collections import defaultdict

def stratified_assignment(tasks, seed=42):
    """
    分层随机分组:按任务类别和难度分层后随机分配A/B组。
    确保两组在任务构成上统计一致。
    """
    random.seed(seed)
    strata = defaultdict(list)
    for task in tasks:
        # 分层键: (任务类别, 难度等级)
        key = (task.category, task.difficulty)
        strata[key].append(task)
    
    group_a, group_b = [], []
    for key, stratum_tasks in strata.items():
        random.shuffle(stratum_tasks)
        midpoint = len(stratum_tasks) // 2
        group_a.extend(stratum_tasks[:midpoint])
        group_b.extend(stratum_tasks[midpoint:])
    
    return group_a, group_b

流量分配在在线场景中控制实验组和对照组的任务比例。对于离线基准评估,流量分配退化为任务集分配;对于在线生产环境,APH框架支持基于用户ID哈希的确定性分桶,确保同一用户的请求始终路由到同一实验组,避免交叉污染。流量比例支持动态调整——实验初期使用5%流量验证无严重退化后,逐步放量到50%。

统计显著性检验是A/B实验结论有效性的保障。Agent质量指标的高方差特性使得简单的均值比较容易产生假阳性。APH框架采用以下统计方法:

对于比率型指标(如完成率、工具准确率),使用双比例Z检验。对于连续型指标(如延迟、Token消耗),先通过Shapiro-Wilk检验判断正态性,满足正态假设时使用Welch t检验(不假设等方差),不满足时使用Mann-Whitney U检验。所有检验统一要求显著性水平 α=0.05\alpha = 0.05α=0.05,并报告效应量(Cohen’s d或相对提升百分比)和95%置信区间,避免仅凭p值做出决策。

最小样本量的计算基于统计功效分析。对于双比例Z检验(如完成率对比),假设对照组完成率为p0p_0p0、预期提升为δ\deltaδ、显著性水平α=0.05\alpha=0.05α=0.05、统计功效1−β=0.81-\beta=0.81β=0.8,每组所需样本量为:

n=(zα/22pˉ(1−pˉ)+zβp0(1−p0)+(p0+δ)(1−p0−δ))2δ2n = \frac{(z_{\alpha/2}\sqrt{2\bar{p}(1-\bar{p})} + z_{\beta}\sqrt{p_0(1-p_0)+(p_0+\delta)(1-p_0-\delta)})^2}{\delta^2}n=δ2(zα/22pˉ(1pˉ)+zβp0(1p0)+(p0+δ)(1p0δ))2

其中pˉ=p0+δ/2\bar{p} = p_0 + \delta/2pˉ=p0+δ/2。以完成率从61%提升到68%(δ=0.07\delta=0.07δ=0.07)为例,计算得每组需要约280个任务。APH框架在实验设计阶段自动执行此计算,当基准任务集规模不足时提示团队扩充任务集或降低预期效应量。对于连续型指标,样本量计算基于效应量Cohen’s dddd=(μ1−μ0)/σd = (\mu_1 - \mu_0) / \sigmad=(μ1μ0)/σ,当d=0.5d=0.5d=0.5(中等效应)时每组约需64个样本,d=0.2d=0.2d=0.2(小效应)时每组约需400个样本。

多重比较校正在同时评估多个指标时尤为重要。当一个实验同时考察完成率、延迟、Token消耗等多个指标时,每个指标独立进行假设检验会增加整体假阳性率。APH框架默认采用Benjamini-Hochberg方法控制错误发现率(FDR),在保持检验灵敏度的同时控制多重比较带来的统计风险。

一个常见的陷阱是过早停止实验。Agent指标的方差较大,实验初期可能出现实验组明显领先或落后的假象。APH框架基于序贯检验理论计算最小样本量,在达到最小样本量之前不输出显著性结论,避免"偷看-停止"带来的偏差。

9. 可观测仪表盘设计

仪表盘是APH框架面向工程团队和产品决策者的统一交互界面。它的设计原则是:让不同角色在同一个视图中各取所需——工程师关注技术细节指标,产品经理关注用户体验指标,管理层关注成本和趋势。

用户交互层

仪表盘视图层

数据处理层

数据源层

Trace存储
ClickHouse

指标数据库
TimescaleDB

评估结果库
PostgreSQL

A/B实验元数据
MongoDB

实时流计算
Flink

预聚合任务
Batch Aggregator

查询引擎
Query Engine

概览面板
Overview Panel

质量看板
Quality Board

性能看板
Performance Board

成本看板
Cost Board

实验看板
Experiment Board

时间范围筛选

任务类别下钻

Trace深潜

告警订阅

概览面板提供系统健康度的一览视图。核心元素包括:当日任务完成率(含趋势箭头)、P95延迟、日Token消耗总量和成本、活跃A/B实验数量、异常告警数量。概览面板的设计目标是3秒内回答"系统今天整体状态如何"。

质量看板聚焦Agent能力指标。以任务完成率的多维分解为核心——按任务类别、难度等级、时间维度展开,支持从宏观趋势下钻到具体任务类别。当某个类别的完成率出现异常波动时,面板自动标注异常点并链接到相关Trace,支持一键深潜定位。

性能看板展示延迟和吞吐指标。除了标准的延迟分位数图(P50/P90/P95/P99),性能看板还提供延迟分解瀑布图,将端到端延迟拆解为各组成部分,直观显示哪个阶段贡献了最多延迟。吞吐量视图展示每分钟处理的任务数和并发度,帮助运维团队进行容量规划。

成本看板追踪Token消耗和API调用成本。按四个Token分解维度(规划、工具、反思、上下文)展示消耗分布,支持按时间维度查看成本趋势。成本看板的关键特性是"成本异常预警"——当某类任务的单位成本超过历史基线时自动标注,提示团队审查是否有退化行为导致Token浪费。

实验看板是A/B实验的管控中心。展示每个活跃实验的状态(运行中/已结束/已暂停)、流量分配比例、各组关键指标的实时对比、统计显著性检验结果。实验结束后自动生成实验报告,包含效应量、置信区间和决策建议。

仪表盘的交互设计遵循"渐进式信息揭示"原则:概览层只展示聚合指标和异常标记,用户通过下钻操作逐步展开细节——从"今日完成率下降"到"哪类任务下降"到"具体哪几个任务失败"到"失败的Trace详情"。这种设计避免了信息过载,同时保留了完整的深潜路径。

10. DeepSeek在评估中的角色

DeepSeek在APH框架中不仅是被评估的Agent推理引擎,还承担了三个关键的"元评估"角色,这些角色利用DeepSeek的推理能力来增强评估体系本身的自动化程度和判断质量。

角色一:LLM-as-Judge。对于开放式任务输出,传统评估依赖人工标注,成本高且难以规模化。DeepSeek作为Judge模型,基于预标注的评估要点列表(rubric)对Agent输出进行多维度评分。APH框架针对Judge场景对DeepSeek进行了特定优化:

  • 结构化输出约束:通过系统提示词约束Judge模型输出JSON格式的评估结果,包含每个rubric要点的评分、评分理由和整体判定,确保结果可程序化处理。
  • 校准机制:使用一组人工标注的校准样本定期验证Judge模型的判定一致性。当Judge模型在校准样本上的判定与人工标注的一致率低于阈值时,触发校准告警。
  • 位置偏差消除:对于对比型评估(如A/B实验中的两两比较),随机化输出顺序并取多次评估的多数投票,消除LLM Judge已知的位置偏好偏差。
  • 冗长偏差(Verbosity Bias):LLM Judge倾向于给更长的输出更高评分,即使内容质量相当。APH框架通过在rubric中显式加入"简洁性"评估维度来部分对冲此偏差,同时在Judge提示词中强调"评分基于内容质量而非长度"。
  • 自我偏好偏差(Self-preference Bias):当Judge模型与被评估Agent基于同一模型族时,Judge可能对风格相似的输出给出更高评分。APH框架通过交叉模型验证检测此偏差——使用GPT-4o和Claude作为交叉Judge,当不同Judge的评分排序出现显著不一致时(Spearman相关系数低于0.7),标记该批次评估存在模型偏好风险。
  • 格式偏差(Format Bias):结构化输出(如带标题、列表的格式)可能获得不公平的高分。APH框架在评估前对Agent输出进行格式归一化,去除纯格式差异对评分的影响。

校准流程的工程实现上,APH框架维护一个持续增长的"黄金标注集"——每次人工审查Judge判定时,将争议案例经多标注者复核后加入黄金集。黄金集的规模目标为500+案例,覆盖所有任务类别和难度等级,作为Judge模型版本升级时的回归测试基准。

角色二:自动评估流水线。DeepSeek负责将非结构化的Agent行为日志转化为结构化的评估数据。例如,Agent的规划输出是自然语言文本,需要DeepSeek将其解析为结构化的步骤列表,才能与预期规划进行对齐比对。同样,Agent的反思日志、错误信息等非结构化内容也需要通过DeepSeek的语义理解能力进行分类和标注。

角色三:异常检测与归因。当运行时监控检测到指标异常(如完成率突降、延迟激增)时,DeepSeek负责分析相关Trace日志,生成根因假设。这个过程不是简单的日志搜索,而是基于因果推理的分析:

async def anomaly_attribution(anomaly_event, trace_store, deepseek_client):
    """
    异常归因:使用DeepSeek分析异常Trace,生成根因假设。
    """
    # 1. 检索与异常相关的Trace样本
    related_traces = trace_store.query(
        time_range=anomaly_event.time_window,
        task_category=anomaly_event.affected_category,
        status="error"
    )
    
    # 2. 提取关键特征
    trace_summaries = [summarize_trace(t) for t in related_traces[:20]]
    
    # 3. 构造归因分析Prompt
    prompt = f"""
    以下Agent执行Trace出现了异常模式:
    异常类型: {anomaly_event.metric}
    异常幅度: {anomaly_event.deviation}
    相关Trace摘要: {trace_summaries}
    
    请分析可能的根因,按可能性排序输出假设列表,
    每个假设包含: 根因描述、支撑证据、建议验证方法。
    """
    
    # 4. DeepSeek生成归因假设
    hypotheses = await deepseek_client.analyze(prompt)
    
    return hypotheses

这种基于LLM的异常归因不是替代传统的基于规则的告警系统,而是作为其补充——规则系统负责快速检测已知模式的异常,DeepSeek负责对未知模式的异常进行深度分析和假设生成。

11. 实战案例:Agent产品迭代优化闭环

为了说明APH框架在实际产品迭代中的应用,以下是一个基于真实场景改编的案例。

背景:一个企业知识库问答Agent,基于DeepSeek模型构建,支持用户通过自然语言查询企业内部文档。上线后的初步数据显示用户满意度为72%,但团队无法确定瓶颈在哪里。

第一步:基线评估。团队使用APH基准任务集(知识库问答类,共200个任务,覆盖5个难度等级)对生产版本进行基线评估。评估结果暴露了明确的问题:

指标基线值目标值差距
任务完成率(完全)61%75%-14pp
工具选择准确率89%92%-3pp
参数构造准确率74%88%-14pp
P95延迟22s15s+7s
Token效率比32002000+1200

参数构造准确率和Token效率比是两个最显著的短板。

第二步:Trace溯源定位。通过Trace瀑布图分析,团队发现参数构造准确率低的主要原因是:当用户查询包含多个实体时(如"对比A项目和B项目在Q3的预算执行情况"),Agent在构造检索工具参数时经常遗漏其中一个实体或时间范围。Token效率比高的原因是Agent在检索结果不理想时反复重试,每次重试都携带完整上下文,导致Token消耗快速累积。

第三步:A/B实验验证优化。团队设计了两个优化方案并通过A/B实验验证:

  • 方案A(实验组1):修改规划Prompt,增加"参数完整性检查"步骤,要求Agent在调用检索工具前显式列出查询涉及的所有实体和时间范围。
  • 方案B(实验组2):修改记忆管理策略,当检索重试超过2次时触发上下文压缩,移除不相关的历史轮次。

实验使用分层随机分组,每组100个任务。实验结果:

指标对照组方案A方案B
参数构造准确率74%89% (+15pp)75% (+1pp)
Token效率比32003100 (-3%)2100 (-34%)
P95延迟22s24s (+9%)16s (-27%)
任务完成率61%68% (+7pp)64% (+3pp)

统计检验显示方案A的参数准确率提升显著(p<0.01),但延迟有所增加;方案B的Token效率改善显著(p<0.01),且延迟大幅降低。两个方案分别解决了不同的问题维度。

对实验结果的深入分析揭示了更多工程洞察。方案A的参数准确率提升(+15pp)效应量Cohen’s h=0.32h=0.32h=0.32,属于中小效应,但在200个任务的样本量下统计功效达到0.89,结论可靠。方案A的延迟增加(+9%)主要来自新增的"参数完整性检查"步骤引入的额外LLM调用,每任务平均增加1.2秒——这个代价在可接受范围内,因为参数准确率提升带来的完成率增益(+7pp)显著降低了用户重试率,从系统层面反而降低了总成本。

方案B的Token效率改善(-34%)效应量更大(Cohen’s d=0.71d=0.71d=0.71,大效应),但完成率提升较小(+3pp)。深入分析Trace发现,上下文压缩策略在23%的任务中过度裁剪了相关信息,导致部分任务的完成质量下降——这解释了为什么Token效率大幅改善但完成率提升有限。团队据此对压缩策略进行了微调,将裁剪阈值从2次重试提高到3次,并增加"压缩后上下文完整性验证"步骤,在后续回归中这部分任务的完成质量恢复到了基线水平。

这个细节说明了一个重要的实践原则:单一指标的显著改善不一定意味着整体系统的改善,必须通过多维交叉验证才能确认优化的净效果。APH框架的多维度评估矩阵正是为此设计——任何优化方案的验收必须同时通过完成率、准确率、延迟和成本四个维度的检验,任何一个维度的退化超过阈值都会阻断合并。

第四步:组合优化与回归验证。团队将方案A和方案B的优化合并,在全量基准任务集上回归验证。组合后的结果:参数构造准确率提升至88%,Token效率比降至2300,P95延迟降至17s,任务完成率提升至73%。所有指标均通过统计显著性检验。

这个案例展示了APH框架的核心价值:将"感觉有问题"转化为"数据定位问题",将"我觉得这样改更好"转化为"实验证明这样改更好"。整个迭代过程中,每一次决策都有数据支撑,每一次变更都有对照基准,避免了凭直觉优化带来的试错成本。

12. 挑战与未来方向

尽管APH框架为Agent评估提供了系统化的方法论和工程工具,但在实践中仍面临若干尚未完全解决的挑战。

评估的效度问题。基准任务集无论设计多么精心,都无法完全覆盖真实用户场景的多样性和长尾性。一个在基准任务集上表现优异的Agent,面对真实用户意想不到的输入模式时可能表现退化。这个问题没有银弹解法,APH框架通过定期从生产Trace中采样真实用户案例补充基准任务集来部分缓解,但基准与真实之间的鸿沟始终存在。

LLM-as-Judge的可靠性边界。使用DeepSeek作为Judge模型引入了"评估者偏差"问题——Judge模型自身的偏好和局限性会影响评估结果的客观性。特别是当被评估的Agent也基于DeepSeek时,Judge可能对与自身风格一致的输出给出更高评分。APH框架通过引入交叉模型评估(使用不同模型族作为Judge进行交叉验证)来检测这种偏差,但这增加了评估成本和复杂度。

多轮交互评估的复杂性。当前框架主要针对单任务、单轮或有限多轮的场景设计。对于需要长时间多轮交互的Agent应用(如持续对话的助理型Agent),如何定义和测量"交互质量"是一个开放问题。对话流畅度、上下文连贯性、个性化适应能力等维度难以用当前的指标体系充分覆盖。

未来方向上,APH框架的演进将聚焦三个方向。第一是自适应评估——根据Agent的应用场景自动生成和调整基准任务集,而非依赖静态预定义任务集,使评估更贴近真实场景。第二是实时评估闭环——将评估从离线批处理模式演进为在线实时模式,在生产流量上持续评估Agent表现,实现"部署即评估"的持续监控能力。第三是因果评估——从当前的关联性指标分析(指标A与指标B相关)走向因果性分析(修改A会导致B变化),通过因果推断方法帮助团队更精确地理解Agent行为的影响因素,而非仅仅观察相关性。

Agent系统的评估不是一个一次性的工程项目,而是一个持续演进的工程实践。随着Agent能力的增强和应用场景的扩展,评估体系本身也需要不断进化。Agent Plan × DeepSeek Harness的目标不是提供一个终极答案,而是建立一套可持续运行的评估基础设施,让团队在Agent能力快速迭代的过程中始终握有可靠的数据罗盘。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐