跳到正文
AWS Machine Learning Blog· Suheel Farooq·· 2 小时前精选

在 Amazon Bedrock 上用 Grok 4.7 构建长时程智能体

Build long-horizon agents with Grok 4.7 on Amazon Bedrock

AI 导读

AWS 发布教程,介绍如何在 Amazon Bedrock 上通过 us.xai.grok-4.7 或 global.xai.grok-4.7 推理配置文件调用 Grok 4.7,构建工具调用智能体。

推荐理由

原文用 72 次可复现的智能体运行,量化了 Grok 4.7 各推理档位在准确率与 token 成本之间的取舍。

正文 · AI 翻译

SpaceXAI 的 Grok 4.7 现已在 Amazon Bedrock 上线,该平台提供来自多个提供商的基础模型(FM)供选择。据 SpaceXAI 称,Grok 4.7 经过训练,能够在更困难的任务上工作更长时间,并且知道何时检查自己的工作。这对智能体来说最为重要,因为智能体需要将任务贯穿多个步骤,并且必须验证沿途发现的内容。

以这种方式工作的智能体不能只是查找信息。它必须形成一个候选答案,将其与已学到的内容进行核对,并不断改进直到契合。Grok 4.7 提供了一个推理强度设置,用于控制每次响应前进行多少思考,而对于智能体工作负载,一个实际问题是应该运行在哪个级别。

在本文中,我们在 Grok 4.7 上构建了一个工具调用智能体,并在三个需要搜索而非查找的任务上对其进行评估。这些任务分别是:根据告警诊断双服务故障、在相互作用的约束下安排维护,以及在预算内选择最优的迁移集合。每个任务都恰好有一个正确答案,并通过暴力法验证。我们在每个推理强度级别上运行了全部三个任务,每个运行六次,共 72 次智能体运行。

该智能体在 72 次运行中正确回答了 67 次。在 xhigh 级别,它全部 18 次回答正确;在 low 级别,它 18 次中回答正确 15 次,同时使用的输出 token 约为八分之一。这给出了一个清晰的权衡,你可以根据每个请求进行调整,我们将展示如何在你自己的任务上衡量它,以及如何在生产环境中监控它。

我们在全文中报告 token 数量而非货币金额。Token 价格会变化,而数量才是你自身成本的来源,因此以 token 表示的测量结果始终有效。

SpaceXAI 对 Grok 4.7 的说明

据 SpaceXAI 称,Grok 4.7 使用了比 Grok 4.6 更大的基础模型,并在更困难的任务组合上进行了更长时间的强化学习训练。该任务组合偏重于需要数小时才能完成的问题。SpaceXAI 报告称,该模型更擅长验证自己的工作以及管理更长的上下文。

SpaceXAI 公布的基准测试结果也体现了这一重点。相比 Grok 4.6 的最大提升出现在衡量持续工作而非单轮回答的类别中。

基准测试 类别 Grok 4.6 Grok 4.7
Terminal-Bench 4.0 多小时终端工作 20.3% 37.6%
EEBench 电气工程 53.0% 64.0%
Harvey Legal Agent Benchmark 法律工作 15.8% 19.6%
CursorBench 4.0 更长时间的编码 40.4% 46.3%
HealthBench Professional 临床推理 48.5% 56.7%
AA Briefcase v1.1 多小时办公工作 1,546 1,657

来源:SpaceXAI,Introducing Grok 4.7(https://x.ai/news/grok-4-7)。分数为 SpaceXAI 在模型发布时公布的数据。

基准测试展示了模型在标准任务上的表现。对于你自己的负载,有用的下一步是在与你类似的任务上进行衡量,这正是本文其余部分要介绍的内容。

SpaceXAI 列出 Grok 4.7 的上下文窗口为 500K token,支持文本和图像输入以及文本输出。在 Amazon Bedrock 上,该模型支持可配置的推理强度、工具调用和结构化输出。

如何在 Amazon Bedrock 上访问 Grok 4.7

Grok 4.7 运行在 bedrock-runtime 端点上,并通过 跨区域推理配置文件进行访问。有两个配置文件可用:

推理配置文件 路由 使用场景
us.xai.grok-4.7 美国地理范围内 你有美国数据驻留要求
global.xai.grok-4.7 商业 AWS 区域 你没有驻留限制,并希望获得最广泛的容量

跨区域推理会将请求路由到多个 AWS 区域,从而在不逐区域管理容量的情况下为你提供更高的吞吐量。请求需指定某个推理配置文件,而不是裸模型 ID。

该模型支持 OpenAI 兼容的 Chat Completions 和 Responses API,以及 Amazon Bedrock Converse API。在 Converse 上,推理会作为 reasoningContent 块与 text 块一起返回。在 inferenceConfig 中,仅设置 maxTokens,并将模型特定参数(如推理强度)放入 additionalModelRequestFields。

有关当前支持的区域、服务层级和 token 价格的列表,请参阅 Amazon Bedrock 用户指南中的 Grok 4.7 模型卡以及 Amazon Bedrock 定价页面(https://aws.amazon.com/bedrock/pricing/)。

先决条件

  • 一个可访问 Amazon Bedrock 的 AWS 账户,并且已为 Grok 4.7 启用模型访问权限。
  • Python 3.9 或更高版本,并已安装 openai、boto3 和 aws-bedrock-token-generator。
  • 已在你的环境中配置 AWS 凭证。

你的 AWS Identity and Access Management (IAM) 身份需要在推理配置文件和你账户的默认项目上拥有 bedrock:InvokeModel:

  • arn:aws:bedrock:{region}::inference-profile/us.xai.grok-4.7 或等效的 global.。
  • arn:aws:bedrock:{region}:{account-id}:project/default。

在策略语句中包含这两个资源。除推理配置文件外,还需要默认项目权限。

连接到模型

对于生产用途,我们建议从现有 AWS 凭证生成短期 bearer token,这样身份验证会与你的 IAM 身份保持绑定,并且不会存储长期密钥:

from aws_bedrock_token_generator import provide_token
from openai import OpenAI

REGION = "us-west-2"
MODEL_ID = "us.xai.grok-4.7"

client = OpenAI(
    api_key=provide_token(region=REGION),
    base_url=f"https://bedrock-runtime.{REGION}.amazonaws.com/openai/v1",
    timeout=360,
    max_retries=0,  # retries are handled explicitly, see "Build in retries" below
)

推理 token 计入输出 token,并在生成答案文本之前消耗 max_completion_tokens,因此请设置限制以为两者都留出空间。如果在推理期间达到限制,响应将不包含答案文本返回,因此请在 agent 代码中检查空内容,如果发现则提高限制。我们的运行使用了 32,768 个 token 的限制,这在每个强度级别都留有余量。

Grok 4.7 支持四种强度级别:low、medium、high 和 xhigh。强度级别可能随模型版本而变化,因此值得对照服务进行确认,而不是硬编码列表:

def supported_effort_levels(candidates=("none", "low", "medium", "high", "xhigh", "max")):
    supported = []
    for level in candidates:
        try:
            client.responses.create(model=MODEL_ID, input="Say OK.",
                reasoning={"effort": level}, max_output_tokens=2048)
            supported.append(level)
        except Exception as exc:
            if "unsupported_value" not in str(exc) and "invalid_value" not in str(exc):
                raise
    return supported


print(supported_effort_levels())  # ['low', 'medium', 'high', 'xhigh']

设计需要推理的任务

许多 agent 评估测试的是勤勉程度:读取一条记录、过滤它、把它加起来。这些任务值得保留,但要看出推理强度的贡献,任务必须要求搜索:答案不能直接从数据中读出,而必须被提出然后加以验证。

我们构建了一个由 20 个服务组成的合成环境,通过七个工具暴露,并在其上设置了三个任务。每个任务都恰好有一个正确答案,并且每个任务的设计都使得快速启发式方法不足以找到它。

任务 agent 必须做什么 为什么这是推理任务
two_fault_diagnosis 两个服务在 03:00 静默失败,另外 12 个服务发出警报。找出失败的两个服务 失败的服务不会发出警报,因此答案不在发出警报的服务之中。共有 190 种可能的配对,只有一种能准确解释观察到的警报
maintenance_schedule 在四个晚上为八个服务打补丁,每晚两个,需满足十项约束以及一条规则:同一团队的两个服务绝不共用同一个晚上 共有 2,520 种可能的排期,只有一种有效。团队规则取决于 agent 必须查找的数据
migration_budget 在预算内选择要迁移的候选对象,以最大化风险降低,包括传递性前置条件 53 个可行集合,一个最优解。优先选择最佳比率得到的集合比最优解少九分

四项实践让这样的测量值得信赖,而且它们适用于大多数智能体评估。

明确列出评分器依赖的每一条规则。如果提示词留下了未覆盖的边界情况,一个合理的答案也可能被判为错误,评估最终衡量的是规范而非模型。例如,诊断提示词明确说明,失败的服务本身不会触发任何告警。

证明每个任务只有一个答案。每个环境都小到可以枚举,因此我们在运行任何东西之前检查了每一个候选答案。对于排班任务,这只需几行:

import itertools

ALL_SLOTS = sorted(set(itertools.permutations([1, 1, 2, 2, 3, 3, 4, 4])))

def valid_schedules(services, constraints):
    return [s for slots in ALL_SLOTS
        if satisfies(s := dict(zip(services, slots)), constraints)]

assert len(valid_schedules(SERVICES, CONSTRAINTS)) == 1  # exactly one answer
assert len(valid_schedules(SERVICES, CONSTRAINTS_WITHOUT_TEAM_RULE)) > 1  # the rule matters

只对必需的最终行评分,而不是整个回复。每个提示词都要求智能体以一行如 FINAL: auth, checkout 的内容结尾。评分器只读取那一行,因此一个在解释推理过程时讨论了其他候选答案的回复,是按其结论来评分的:

def final_line(answer):
    lines = [l for l in (answer or "").splitlines() if "FINAL" in l.upper()]
    return lines[-1] if lines else None

将格式与正确性分开追踪。缺少最终行与最终行错误是不同的信号。在我们的运行中,全部 72 个回复都包含了可评分的最终行。

在有效值已知的地方用 enum 约束工具参数,使每次工具调用都针对真实资源:

TOOLS = [
    {"type": "function", "function": {
        "name": "get_dependencies",
        "description": "Services that one service directly depends on.",
        "parameters": {
            "type": "object",
            "properties": {"service": {"type": "string", "enum": SERVICE_NAMES}},
            "required": ["service"],
        }}},
    # The remaining six tools follow the same shape.
]

系统提示词刻意保持简短,并要求智能体在给出答案前先检查它:

AGENT_SYSTEM = (
    "You are an infrastructure analyst agent. Use the tools to gather facts and never guess "
    "a value you can look up. Before answering, check your answer against every rule in the "
    "task. End with the FINAL line exactly as the task specifies."
)

智能体循环是一个标准的工具调用循环:以设置好的 reasoning_effort 调用模型,执行每个返回的工具调用,以 tool_call_id 为键追加结果,并重复直到模型不再请求工具。在整个循环中追踪 prompt_tokens 和 completion_tokens 即可得到下一节报告的 token 计数。

结果

每个任务在每个努力级别上运行六次,共 72 次运行。智能体正确回答了 67 次。

任务 低 中 高 极高
two_fault_diagnosis 6 次中 5 次 6 次中 6 次 6 次中 6 次 6 次中 6 次
maintenance_schedule 6 次中 5 次 6 次中 5 次 6 次中 5 次 6 次中 6 次
migration_budget 6 次中 5 次 6 次中 6 次 6 次中 6 次 6 次中 6 次
全部三个任务 18 次中 15 次 18 次中 17 次 18 次中 17 次 18 次中 18 次
每次运行 低 中 高 极高
平均输出 token 数 1,184 6,430 6,778 9,147
输出 token 数相对于低 1.0x 5.4x 5.7x 7.7x
平均工具调用次数 17.2 18.7 17.8 18.1
中位耗时 18s 98s 89s 106s

Bar charts showing correctness rate and mean output tokens per run across low, medium, high, and xhigh reasoning effort levels

图 1:每个推理努力级别下正确回答的运行占比(左),以及每次运行的平均输出 token 数并叠加每次运行的中位秒数(右)

三点观察。

xhigh 每次运行都正确回答。三个任务的全部 18 次运行在 xhigh 下都正确,而 medium 和 high 各答对了 18 次中的 17 次。每个任务和级别只有六次运行,因此级别之间的差异是指示性的而非统计上确凿的,但方向在三个任务中是一致的。

努力程度改变的是智能体推理的多少,而不是它探索的多少。工具调用次数基本持平,在每个级别下每次运行都在 17.2 到 18.7 之间。无论努力程度如何,智能体收集到的事实相同,改变的是它对这些事实施加了多少推理,输出 token 数从 low 下的 1,184 上升到 xhigh 下的 9,147。

low 提供了很高的性价比。在 low 下,该 agent 在 18 次运行中正确回答了 15 次,所用输出 token 约为 xhigh 的八分之一,中位运行时间为 18 秒。在可以接受略低完成率、或答案会在下游被审核的场景中,low 是高效之选。而在每个答案都必须一次就正确的场景中,更高的级别是更稳妥的默认选择。

努力程度如何塑造答案

这些任务围绕一种特定类型的难度而设计,观察每个努力级别如何处理它们,可以厘清额外的推理在何时是值得的。

优化。该迁移任务奖励的是考虑各种组合,而非一次只对选项排序。挑选单项比率最佳的候选者会得到一个合理的答案,但比最优解低九分。在 medium 及以上,该 agent 在全部 18 次运行中都找到了最优集合。

假设检验。该诊断任务要求对候选配对进行双向检查:每个告警都必须得到解释,每个保持沉默的服务都必须与答案一致。在 medium 及以上,该 agent 在全部 18 次运行中都识别出了正确的配对。

约束满足。该排班任务将十项列出的约束与一条依赖所查所有权数据的团队规则结合在一起。xhigh 在每次运行中都生成了有效的排班,而这也是最高级别带来最明显差异的任务。

这三者呈现出的规律是:当 agent 必须在多个候选答案之间相互权衡,而非沿着单一路径得出结果时,额外的推理努力最有价值。

在生产环境中监控推理

在生产环境中,你没有已知答案可供评分,但你确实知道每次运行使用了多少输出 token 和工具调用。这些能为你提供有用的运营信号。

各级别的正确运行都保持在明确的推理量下限之上。在 medium 及以上,每次正确运行都至少使用了 1,739 个输出 token,而典型运行则使用了数千个。一次不进行任何工具调用、或产生的输出远低于其级别正常水平的运行,值得标记以供审查:

def flag_for_review(run, baseline):
    """baseline: output tokens of graded, correct runs at the same effort level."""
    reasons = []
    if run["tool_calls"] == 0:
        reasons.append("made no tool calls")
    if run["output_tokens"] < 0.2 * min(baseline):
        reasons.append(f"used {run['output_tokens']} output tokens, "
            f"under a fifth of the lowest correct run ({min(baseline)})")
    return reasons

根据你已评分的运行,按任务和努力级别校准基线,然后将其应用于你尚未评分的运行。把标记视为检查或重新运行的提示。在 low 下,每次运行都很简短,输出量是较弱的信号,因此要配合抽查。

在系统提示中要求 agent 验证其答案是值得保留的,因为这能让你在审查一次运行时轻松跟进 agent 的推理过程。在存在已知答案的地方,将其与自动评分配合使用,这样质量就能独立于对话记录来衡量。

选择推理努力程度

这些结果给出了几条实用规则。

让努力程度与任务类型相匹配。涉及搜索、优化或检验假设的任务,从 medium 或更高级别中获益最多。遵循单一路径、或答案会在下游被审核的任务,可以在 low 下高效运行。

按请求而非按 agent 设置努力程度。努力程度是一个请求参数,因此 agent 可以在更高级别运行其规划和验证步骤,而在 low 下运行其机械性步骤,例如格式化工具结果。这样就能将更高级别的大部分可靠性与更低的 token 成本结合起来。

在你自己的任务上测量,并重复运行。 每种配置只运行一次只能得到一个观测值。将每种配置重复运行多次,才能看出它有多稳定。

监控推理量。 按努力级别跟踪每次运行的输出 token 和工具调用,能让你在结果被使用之前就获得需要审查某次运行的早期信号。

本次测量的局限性

每个任务和努力级别运行六次。 足以在三个任务上显示出一致的方向,但不足以给出置信区间。请将这些级别之间的差异视为指示性的。

合成环境。 这些工具读取的是代码生成的数据,正因如此才能证明每个任务恰好只有一个答案,并实现自动评分。真实工具会带来延迟、部分结果和错误,这些在此均未测试。

以分钟计,而非小时。 中位运行时间从 low 的 18 秒到 xhigh 的 106 秒不等。这是长时程工作的缩小版代理。方法可以迁移,绝对数值则不行。

单一模型版本、单一区域、每个任务单一提示词。 同一任务的不同措辞可能会改变结果,这也是为什么明确陈述每条规则很重要。

Token 数量,而非成本。 要换算成货币,请使用 Amazon Bedrock 定价页面上你所用推理配置和服务层级的当前费率。Global 和 US Geo 配置的定价不同,Flex 和 Priority 服务层级会应用乘数。

代理工作负载的运维控制

内置重试。 发出大量调用的代理应将重试视为设计的一部分。设置请求超时,只重试可重试的错误,使用带抖动的指数退避,并在返回 Retry-After 标头时遵循它:

import random, time

RETRYABLE = {408, 429, 500, 502, 503, 504}

def call_with_backoff(fn, attempts=7, base=4.0, cap=180.0):
    for attempt in range(1, attempts + 1):
        try:
            return fn()
        except Exception as exc:
            status = getattr(exc, "status_code", None)
            retryable = status in RETRYABLE or "timed out" in str(exc).lower()
            if not retryable or attempt == attempts:
                raise
            time.sleep(random.uniform(base, min(cap, base * 2 ** attempt)))

按需吞吐量会随时间扩展,因此新的高流量工作负载应逐步提升,而不是一开始就以全速运行。

审计一次运行。 模型调用日志会将请求和响应数据写入 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch Logs。这让你可以在事后获得想要审查的运行的完整记录。

大规模监控推理量。 Amazon CloudWatch 指标为你提供 token 使用量的聚合视图,前面描述的按级别基线正是在这里变成可以设置告警的东西。

在各代理之间归集支出。 AWS Cost Explorer 和 AWS Cost and Usage Report 中的成本明细按模型拆分用量,结合每任务 token 数量,你既能得到单位经济性,也能得到总账单。

让成本与紧迫性相匹配。 服务层级按请求设置,因此一次部署可以将夜间分析走 Flex 层级,将交互式请求走 Priority 层级。对于以更高努力级别运行的工作负载,层级选择是进一步控制成本的杠杆。

选择路由配置。 跨区域推理拓宽了长时间运行所依赖的容量池。Global 配置从你选择的商业 AWS 区域提供服务,每 token 定价通常低于地理路由。US 配置将处理保留在美国境内。请根据你的数据驻留要求以及成本来选择。

清理

本文中的示例除了按请求计费的 token 用量外,不会创建任何计费的 AWS 资源。如果你生成了长期有效的 Amazon Bedrock API 密钥,请在完成后于 Amazon Bedrock 控制台中将其删除,因为它在被撤销之前一直有效。由 IAM 凭证生成的短期令牌会自行过期。

如果你在测试期间启用了向 Amazon S3 的模型调用日志记录,请检查该存储桶并删除不再需要的对象。

结论

SpaceXAI 训练 Grok 4.7 在更困难的任务上工作更长时间,并知道何时检查自己的工作。在三个需要搜索而非查找的任务中,该 agent 在 72 次运行中正确回答了 67 次,并且每次运行都达到 xhigh。由于推理力度是按请求设置的,你可以选择 agent 的每一步在彻底性与 token 成本之间的权衡中处于何处。

有三点值得带入你自己的评估中。设计具有一个可证明答案的任务,并说明评分器所依赖的每一条规则。重复运行,这样你就能看到每种配置的一致性如何。并按力度级别监控输出 token 和工具调用,这样你就能在质量测量之外拥有一个运营信号。

延伸阅读


关于作者

Suheel Farooq

Suheel Farooq

Suheel 是 AWS 的首席解决方案架构师,专注于人工智能、机器学习和生成式 AI。他帮助基础模型提供商客户在 AWS 上设计、构建、现代化和扩展其 AI/ML 与生成式 AI 工作负载——从将基础模型引入 Amazon Bedrock,到优化训练和推理,再到构建 Agentic AI 解决方案。他的经验涵盖 AWS AI/ML 和生成式 AI 产品组合,尤其是 Amazon Bedrock、Amazon Bedrock AgentCore 和 Amazon SageMaker AI。闲暇时,Suheel 喜欢健身和徒步。

Anirban Gupta

Anirban Gupta

Anirban 是 AWS 的首席工程师,常驻美国西雅图,专注于为 Amazon Bedrock 设计安全、大规模模型服务基础设施。他推动了该平台上多个基础模型发布背后的技术工作。在加入 Amazon Bedrock 之前,他曾是 AWS Outposts 的首席工程师,构建混合本地云基础设施。

James Wang

James Wang

James 是 SpaceXAI 的高级产品增长经理。此前,他曾任 Cerebras 的产品营销总监,负责推出 Cerebras Inference 和 CS-3 AI 加速器。在那之前,James 是 ARK Invest 的首席 AI 分析师。他的职业生涯始于 NVIDIA,在深度学习早期推出了首批支持 CUDA 的 GPU。

Ikenna Izugbokwe

Ikenna Izugbokwe

Ikenna 是 AWS 的首席解决方案架构师,专注于网络、容器和 AI 基础设施。他指导模型提供商扩展其训练和推理系统,同时支持在 AWS 上快速部署不断演进的前沿模型。他的工作日益涵盖 agentic AI——构建可靠、高性价比的多 agent 系统及其背后的生产推理基础设施。

来源:AWS Machine Learning Blog · aws.amazon.com