用 Amazon Nova Act 与 Bedrock AgentCore 构建更耐用的用户旅程监控

2026-09-28 28 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:12 分钟

传统合成监控通常依赖 CSS 选择器、XPath 和固定点击顺序。页面一旦调整 DOM、按钮文案或弹窗位置,脚本就可能失败,即使真实用户仍能正常完成操作。Amazon Nova Act 提供了一种更偏向“理解任务并操作浏览器”的执行方式,再结合 Amazon Bedrock AgentCore 托管运行,可以把登录、搜索、结账前检查等用户旅程包装成持续执行、可观测的监控任务。

这里的重点不是用智能体取代所有断言,而是把容易碎裂的页面操作交给智能体,同时保留确定性的成功标准、超时、隔离和告警。

从元素脚本转向“意图 + 检查点”

传统脚本经常把实现细节写死:

page.locator('#login-form > div:nth-child(2) input').fill(password)
page.locator('button.primary.large').click()

这种脚本检查的是“某个元素是否仍在原位置”。面向任务的旅程则可以表达为:

  • 使用专用测试账户登录;
  • 搜索指定商品;
  • 将商品加入购物车;
  • 确认购物车中出现正确名称和数量;
  • 在产生付款、发货或数据修改之前停止。

页面布局变化时,智能体仍可能根据文本、视觉信息和上下文找到正确入口。不过,语义操作不应成为模糊验收的借口。每一步之后仍要设置明确检查点,例如“订单摘要中必须出现测试商品 SKU”“当前页面不能出现账户锁定提示”。

一个实用的分层方式是:

  1. 动作层:由 Nova Act 执行自然语言描述的浏览器任务。
  2. 断言层:要求返回严格的 PASS/FAIL,必要时再用页面 URL、API 或数据库查询进行二次确认。
  3. 运行层:由 AgentCore 承载任务,统一处理身份、超时、日志和扩缩容。
  4. 调度与告警层:定期触发旅程,把延迟、失败阶段和错误原因送入监控系统。

托管运行时应该承担什么

可以采用下面的逻辑架构。具体服务配置应根据账户区域、AgentCore 版本和组织安全要求调整:

EventBridge Scheduler / CI
            |
            v
Bedrock AgentCore Runtime
            |
            +--> Nova Act browser journey
            |         |
            |         +--> application under test
            |
            +--> structured logs and metrics
                      |
                      +--> dashboard / alarm / incident system

AgentCore 不只是脚本托管位置。一个可靠的运行单元还应具备:

  • 每次运行使用独立会话,避免 Cookie 和购物车状态相互污染;
  • 为整个旅程和单个步骤分别设置超时;
  • 限制可访问域名,防止任务偏离目标系统;
  • 从密钥服务注入测试账户,不把密码写入提示词文件或日志;
  • 输出结构化结果,包括旅程名称、步骤、耗时、失败类别和运行标识;
  • 对失败进行有限重试,并区分页面偶发抖动与稳定故障。

不要无限重试。连续重试可能掩盖真实可用性问题,也会放大浏览器运行和模型调用成本。常见做法是最多重试一次,并在指标中同时记录首次结果与最终结果。

可改造的最小旅程示例

下面的示例假设当前 Nova Act Python SDK 提供 NovaAct(starting_page=...) 和 act(...) 接口。安装方式、认证方式及返回对象字段可能随 SDK 版本变化,接入时应以所在环境的 SDK 文档为准。示例本身展示的是可复用的旅程结构、严格检查点和机器可读指标。

先创建 journey.yaml,把域名、任务描述和断言改成自己的测试环境:

name: catalog-smoke
start_url: https://staging.example.com
steps:
  - name: open-catalog
    task: Open the product catalog from the main navigation.
    checkpoint: The catalog page is visible and contains at least one product card.

  - name: search-product
    task: Search for the product with SKU SYNTHETIC-001.
    checkpoint: A search result whose SKU is exactly SYNTHETIC-001 is visible.

  - name: inspect-product
    task: Open the matching product detail page. Do not add it to the cart or place an order.
    checkpoint: The page shows SKU SYNTHETIC-001 and a price, and no error banner is visible.

安装依赖:

python -m venv .venv
source .venv/bin/activate
pip install nova-act PyYAML

再保存以下 monitor.py:

import json
import sys
import time
from pathlib import Path

import yaml
from nova_act import NovaAct


def result_text(result) -> str:
    for attribute in ('response', 'text', 'message'):
        value = getattr(result, attribute, None)
        if value:
            return str(value).strip()
    return str(result).strip()


def emit_metric(journey: str, duration_ms: int, failed: bool, failed_step: str = ''):
    print(json.dumps({
        '_aws': {
            'Timestamp': int(time.time() * 1000),
            'CloudWatchMetrics': [{
                'Namespace': 'Synthetic/NovaAct',
                'Dimensions': [['Journey']],
                'Metrics': [
                    {'Name': 'Duration', 'Unit': 'Milliseconds'},
                    {'Name': 'Failure', 'Unit': 'Count'}
                ]
            }]
        },
        'Journey': journey,
        'Duration': duration_ms,
        'Failure': 1 if failed else 0,
        'FailedStep': failed_step
    }))


def run(config_path: str) -> None:
    config = yaml.safe_load(Path(config_path).read_text(encoding='utf-8'))
    journey = config['name']
    started = time.monotonic()
    current_step = ''

    try:
        with NovaAct(starting_page=config['start_url']) as browser_agent:
            for step in config['steps']:
                current_step = step['name']
                print(json.dumps({
                    'event': 'step_started',
                    'journey': journey,
                    'step': current_step
                }))

                browser_agent.act(step['task'])

                verification_prompt = (
                    'Inspect the current browser state only. '
                    f"Condition: {step['checkpoint']} "
                    'Return exactly PASS if the condition is true; otherwise return exactly FAIL.'
                )
                verification = result_text(browser_agent.act(verification_prompt)).upper()

                if verification != 'PASS':
                    raise RuntimeError(
                        f'Checkpoint failed for {current_step}: {verification}'
                    )

                print(json.dumps({
                    'event': 'step_passed',
                    'journey': journey,
                    'step': current_step
                }))

        duration_ms = int((time.monotonic() - started) * 1000)
        emit_metric(journey, duration_ms, failed=False)

    except Exception as exc:
        duration_ms = int((time.monotonic() - started) * 1000)
        print(json.dumps({
            'event': 'journey_failed',
            'journey': journey,
            'step': current_step,
            'error_type': type(exc).__name__,
            'error': str(exc)
        }), file=sys.stderr)
        emit_metric(journey, duration_ms, failed=True, failed_step=current_step)
        raise


if __name__ == '__main__':
    run(sys.argv[1] if len(sys.argv) > 1 else 'journey.yaml')

本地运行:

python monitor.py journey.yaml

部署到 AgentCore 时,可以把配置文件与执行器打包为同一个工作负载,也可以让运行时根据事件参数读取不同旅程。例如调度器发送:

{
  "journey": "catalog-smoke",
  "config": "journeys/catalog-smoke.yaml",
  "environment": "staging"
}

生产实现中,最好不要只依赖智能体对 PASS 的判断。对于关键步骤,可以增加第二条确定性证据:查询只读订单 API、检查后端健康状态,或者核对测试数据是否产生预期变化。这样既保留了自然语言操作的适应性,也降低了模型误判造成的假阳性。

韧性来自边界,而不只是模型能力

智能体驱动的浏览器任务仍然会遇到网络延迟、A/B 页面、Cookie 横幅、验证码和站点限流。设计时可以把失败分成几类:

  • 业务失败:页面打开了,但商品不可搜索、登录失败或关键文本缺失;
  • 环境失败:DNS、TLS、浏览器启动或依赖服务异常;
  • 策略阻断:验证码、机器人防护或访问权限拒绝执行;
  • 智能体不确定性:无法判断下一步,或者没有按要求返回严格结果。

这些类别应该使用不同告警。业务失败通常需要应用团队处理;策略阻断可能需要调整测试入口或白名单;智能体不确定性则可能通过收紧任务描述、缩短旅程或增加确定性定位手段解决。

还要防范页面中的提示注入。被监控页面属于智能体的输入,恶意或意外文本可能诱导它偏离任务。应限制访问域名和允许动作,为测试账户设置最小权限,并明确禁止付款、删除、发送消息等不可逆操作。

上线前检查清单

适合优先迁移的,是那些业务价值高、页面经常变化、但结果容易验证的用户旅程。纯 API 健康检查或稳定的单元素检查通常没有必要引入智能体。

上线前建议确认:

  • 使用专用、低权限、可随时重置的测试账户;
  • 旅程不会真实付款、发货、发送邮件或污染生产数据;
  • 每一步都有清晰检查点,关键结果还有 API 或数据层佐证;
  • 设置了总超时、步骤超时和有限重试;
  • 日志会脱敏,不记录密码、会话令牌和个人信息;
  • 指标至少包含成功率、总耗时、失败步骤和失败类别;
  • 页面访问范围和智能体动作受到约束;
  • 保留少量确定性探针,用于区分应用故障与智能体运行故障。

Nova Act 与 Bedrock AgentCore 的组合价值,在于让合成监控从脆弱的 DOM 自动化转向更贴近用户意图的托管旅程。但可靠性仍来自工程约束:可验证的结果、最小权限、清晰的失败分类,以及对成本和不确定性的持续度量。


相关推荐