前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8649
  • Spec-Driven 开发:摆脱 Vibe Coding 的工程化实践
  • AI 编程助手 CSS 好看但上生产就崩的根因与修复
  • Agent 诊断结果上线前如何验证:分离决策与执行
  • AI编码导致CI成瓶颈?我们重新设计了CI流程
  • 从氛围记忆到确定性自主:AI 原生基础设施设计思路
  • 用 Agent 流程开发简单 SPA 的实战经验
  • AI 生成 React UI 的真实问题:从第二页开始组件漂移
  • vLLM 深度解析:高吞吐 LLM 推理的性能瓶颈
  • AWS 开源 AI 编程助手,成本比 Claude Code 低 45%
  • 用Docker Compose构建可复现的AI Agent评测环境
  • 阿里发布Qwen-Image-2.1:7B开源图像生成编辑模型
  • Benchling 用 Bedrock AgentCore 为多租户 AI Agent 构建深度防御安全架构
  • Mac Studio 2026:M5 Ultra 支持最高 512GB 统一内存,可本地运行超大模型
  • Grok 4.7登陆GitHub Copilot,面向Agent化编程
  • AI 安全是工程问题:Agent 堆栈每一层的防护实践
  • Agent 系统的瓶颈不是模型,是架构设计
  • 防御式 Agent 架构:Schema 注入与超时控制
  • 自研研究 Agent 拦截 AI 编程幻觉:文档先行策略
  • 像物理学家一样剪枝 LLM:区块移除的伊辛模型优化
  • Mac mini上的AI开发新范式:OpenClaw与Codex实战
  • Cloudflare Python Workers 正式上线,可用纯 Python 开发边缘应用
  • 浏览器直接给 ESP32 烧录 Claude 写的宏,无需 IDE 或工具链
  • Google 发布 Agent 安全风险报告:5 万美元循环消耗与凭证窃取案例
  • 多 Agent 合规流水线:用 RAG + 自修正架构对抗 WCAG 幻觉问题
  • Anthropic 发布金融领域 Claude 参考智能体套件
  • OpenAI 披露强化学习模型在上下文压缩时插入 Prompt 注入
  • Jev 决策模型实测:0.3秒完成意图分类和工具路由,$0.00004/次
  • Kimi Code Desktop 上线:图形界面 + 内置终端 + Git 状态,支持 Swarm 多 Agent 协
  • StepFun Step 5 Preview:600B 总参数 MoE 模型,1M 超长上下文,10 月开源
  • JSON-Render:通吃 React/Vue/Svelte/React Native 等 10+ 框架的生成式 UI
  • Agent-Native:让 Agent 能力同时暴露给 LLM 工具调用和 UI 操作的 TypeScript 框架
  • 清华联合无问芯穹开源具身智能体RPent,GPT-6 Astra注入机器人
  • AI Agent工具调用边界case:路由错误比想象中更脆弱
  • AI按它能读的契约编程,而非你想要的
  • MCP 远程服务器实现 AI 驱动的确定性 UI 编排
  • 阶跃Step 5 Preview实测:27B参数开源模型冲至Top2
  • 用Responses API构建有边界的GPT-6 Astra Agent
  • 用破坏不变量法审查 AI 生成代码
  • AI 编程测试冻结:保存异常指纹而非测试名
  • 程序员亲历:全公司用 Claude Code 批量生产代码,没人读代码,12 小时工作制
  • 已加载 40 / 8649
8.0
热点
AI SCORE
编程提效2026-09-22 00:51

用Docker Compose构建可复现的AI Agent评测环境

dev.to · AI#Docker#AI Agent#测试
Editor brief · 编辑速览

用Docker Compose固定工具响应、数据库状态、时钟和依赖版本,消除CI与本地环境差异,支持合成案例回放和故障注入。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个 Agent 评估在 CI 环境中失败,却在本地通过了。在责怪模型之前,先问问自己:两次运行是否看到了相同的工具响应、数据库状态、时钟、配置和依赖版本。

容器无法让外部模型变得确定性,但可以消除围绕它的大量意外可变性。

我使用 Docker Compose 作为评估实验室:一个小型、版本化的环境,可以重放合成测试用例、提供受控工具、注入故障并保留证据。

Separate the core from optional experiments

当同一个实验室支持多种模式时,Compose profiles 非常有用。没有 profile 的服务正常启动;有 profile 的服务只有在启用或明确指定时才会启动。

services:
  fixture-api:
    image: ghcr.io/example/agent-fixtures@sha256:REPLACE_WITH_DIGEST
    environment:
      FIXED_NOW: "2026-09-01T12:00:00Z"
      DATASET_PATH: /fixtures/cases.json
    volumes:
      - ./fixtures:/fixtures:ro
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8080/health"]
      interval: 2s
      timeout: 1s
      retries: 20

  eval-runner:
    build:
      context: .
      dockerfile: Dockerfile.eval
    depends_on:
      fixture-api:
        condition: service_healthy
    environment:
      FIXTURE_URL: http://fixture-api:8080
      EVAL_SEED: "1701"
    volumes:
      - ./fixtures:/app/fixtures:ro
      - ./evidence:/app/evidence
    profiles: [eval]

  fault-proxy:
    image: ghcr.io/shopify/toxiproxy@sha256:REPLACE_WITH_DIGEST
    profiles: [fault]

  otel-collector:
    image: otel/opentelemetry-collector@sha256:REPLACE_WITH_DIGEST
    profiles: [observe]

摘要占位符:在仓库中解析并提交真实的镜像摘要。将 fixture 服务等核心依赖保持为无 profile。可选运行器、故障注入器、本地模型或遥测服务应显式标记。

docker compose run --rm eval-runner

在测试超时和重试时,添加可选的故障服务:

docker compose --profile fault run --rm eval-runner

Compose 自动启动目标 profile 服务及其声明的依赖。多个 --profile 标志可以组合模式。

Version more than the application image

可重放的测试用例需要一份环境清单:

{
  "caseId": "refund-approval-required",
  "datasetRevision": "fixtures-2026-09-01",
  "promptRevision": "refund-v7",
  "policyRevision": "policy-v3",
  "toolSchemaRevision": "tools-v5",
  "model": "configured-model-id",
  "temperature": 0,
  "seed": 1701,
  "clock": "2026-09-01T12:00:00Z"
}

即使提供商不保证 seed 的确定性,也要记录这些值。清单描述的是尝试的条件,并不承诺产生完全相同的 token。尽可能固定这些输入:

  • 按摘要固定容器镜像;
  • JavaScript 依赖使用 lockfile 并冻结安装;
  • 合成数据集按内容哈希固定;
  • prompt、policy 和 tool-schema 的版本;
  • locale、时区、时钟和随机 seed;
  • 提供商和模型标识符。

Make tools reproducible before judging the agent

假设 lookup_order 通常调用一个变化中的生产 API。在实验室中,将其路由到 fixture-api 并通过 case ID 选择行为:

const result = await fetch(
  `${process.env.FIXTURE_URL}/orders/synthetic-42`,
  { headers: { "x-eval-case": "refund-approval-required" } },
);

fixture 应为该版本返回相同的响应体、状态码和人工延迟。fault profile 可以随后引入故意的超时或畸形响应。

这赋予了失败以意义。如果 Agent 在固定的 fixture 面前跳过了授权,则更容易将行为回归与后端变更区分开来。

Persist evidence outside the containers

不要让唯一的结果只是一个进程退出码。将有限的 artifact 集写入挂载的 ./evidence 目录:

evidence/
  environment.json
  results.json
  junit.xml
  traces/
  README.md

README 应标识命令、fixture 版本、预期不变量以及执行的任何脱敏处理。CI 甚至可以在运行器失败时上传该目录。

当用候选版本评估相对于基线时,添加机器可读的比较文件:

{
  "baseline": "prompt-v6",
  "candidate": "prompt-v7",
  "dataset": "fixtures-2026-09-01",
  "casesAdded": 0,
  "casesRegressed": ["refund-approval-required"],
  "casesImproved": ["policy-timeout-recovery"],
  "unknown": []
}

不要将其压缩为一个平均分数。候选版本可能改善了十个无害用例,却在一个受保护操作上回归。

让 evidence 目录每次运行都唯一,并原子性地写入。在并行 CI 作业间复用 ./evidence/results.json 可能导致新结果与旧环境清单混在一起。简单的运行标识符和完成标记使部分输出显而易见:

evidence/run-2026-09-09-1701/
  environment.json
  results.json
  comparison.json
  COMPLETE

只有在所有必需的 artifact 都刷入后才创建 COMPLETE。为诊断目的上传不完整的目录,但绝不将它们作为已完成评估进行评分。

如果使用本地 trace 工具如 AgentInspect,应保持可选且以元数据优先。实验室架构不应依赖托管的查看器,而且捕获的 prompt 或工具 payload 仍需经过共享审查。

Know what Compose does not solve

该实验室不能复现提供商负载、生产向量索引、浏览器调度或每一种分布式竞态。temperature 为零并不等同于数学上保证输出相同。容器隔离也不是对所执行代码的安全评估。

它的价值更为局限:它使受控输入变得明确且可重复,足以评估稳定的 outcomes 和轨迹。

明确指定 eval-runner 会启用其 Compose profile 并启动声明的依赖,但不会启用无关的 profile 服务。将 profile 组合保存在命名的脚本或 CI 作业中,这样开发者就不会意外地将故障注入的运行与干净基线进行比较。

当 Agent 测试发生变化时,你希望第一个问题是「哪种行为发生了变化?」——而不是「我的笔记本是否使用了不同的时钟、数据集或工具服务器?」一个小的 Compose 实验室将许多这类变量转移到版本化的工程决策中。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
AWS 开源 AI 编程助手,成本比 Claude Code 低 45%
下一篇
阿里发布Qwen-Image-2.1:7B开源图像生成编辑模型