AWS Machine Learning来源发布时间

使用 Strands Agents 的自适应智能体智能框架

构建AI代理的组织面临一个共同的挑战:每个请求,无论是常规的状态检查还是复杂的分析,通常都会被路由到单个大型且昂贵的模型。这种“一刀切”的方式可能推高API成本,引入不可预测的延迟,并使离线操作成为不可能。

构建AI代理的组织面临一个共同的挑战:每个请求,无论是常规的状态检查还是复杂的分析,通常都会被路由到单个大型且昂贵的模型。这种“一刀切”的方式可能推高API成本,引入不可预测的延迟,并使离线操作成为不可能。即使是本可以本地解决的常规查询,最终也需要与云端托管的大型语言模型(LLM)进行完整的网络往返。

基于 Strands Agents 构建的自适应智能体框架(AAIF)采用了不同的方法。它不是将所有请求都路由到单个大型模型,而是使用小型语言模型(SLM)在本地处理常规任务,更复杂的请求则通过以下方式路由到云端托管的模型: Amazon Bedrock。这一方法建立在以下研究立场之上: NVIDIA的Belcak等人。他们认为,小型语言模型“足够强大、天然更适合,且对于智能体系统中的许多调用而言必然更经济”。该框架基于 Strands Agents 构建,展示了智能的模型编排如何在保持本地操作低延迟的同时帮助降低成本。

在这篇文章中,我们通过 Ollama 使用本地 SLM 并通过 Amazon Bedrock 使用云模型,逐步讲解 AAIF 的关键组件。我们以物联网(IoT)监控场景作为参考实现。

解决方案概述

AAIF 将 AI 处理组织为三个层次,每层针对不同任务类型进行优化,如图 1 所示:

  1. 智能编排使用一个轻量级 SLM(llama3.2:1b)作为决策层。该编排器对传入请求进行分类,并将其路由到相应的处理层,而无需硬编码规则。
  2. 本地处理通过运行在本地硬件上的SLM来处理例程任务,例如设备遥测数据获取和图像分析,借助 Ollama。这些任务以低延迟完成,且不依赖云端。
  3. 云处理通过Amazon Bedrock中的前沿模型来处理复杂的模式分析和战略性建议。这些请求需要更广泛的上下文和多步推理,而小语言模型(SLM)无法可靠地提供这些能力。

图1:用于智能编排、本地处理和云处理的AAIF三个处理层

图1展示了完整的AAIF系统架构。核心是Strands代理,它连接到一个Ollama运行时,该运行时同时承载1B参数的编排模型和视觉模型。该代理提供三个工具:用于本地传感器数据检索的get_device_telemetry、通过llama3.2-vision进行设备端视觉处理的analyze_camera_feed,以及通过boto3调用Amazon Bedrock进行复杂分析的get_expert_insights。传入的用户请求流经SLM编排器,编排器对每个请求进行分类,并根据任务复杂度将其分派到本地工具或云端端点。

图2:完整的AAIF系统架构,展示了Strands代理、Ollama运行时、工具集成以及Amazon Bedrock连接

该框架会适应你的部署约束,而不是要求你围绕它重构基础设施。这一架构可以在拥有 8 GB 内存的 Raspberry Pi 等边缘设备上运行,也可以在所有推理都交给 Amazon Bedrock 的全云部署中运行,或在结合本地速度与云端推理的混合配置中运行。这种灵活性来自于将路由逻辑(即 SLM 编排器)与处理工具分离,你可以根据可用的硬件和网络连接情况独立地更换或重新配置它们。

先决条件

在本演练中,您应具备以下先决条件:

设置环境

创建一个项目目录并启动 Ollama 服务器:

mkdir aaif-demo && cd aaif-demo
ollama serve

拉取所需的模型:

ollama pull llama3.2:1b
ollama pull llama3.2-vision

创建一个名为 aaif_agent.py 的文件,并添加以下组件。

实现本地处理工具

Strands Agents 使用 @tool 装饰器来定义代理可以调用的功能。首先创建用于本地处理的工具。

第一个工具用于获取设备遥测数据。在生产环境中,它会连接到实际的 IoT 传感器。在本演练中,它使用模拟的设备数据:

from strands import Agent, tool
import random

DEVICE_TELEMETRY = {
    "sensor-001": {
        "device_type": "Temperature Sensor",
        "location": "Building A - Floor 2",
        "temperature": 72.5,
        "humidity": 45.2,
        "status": "normal"
    },
    "camera-001": {
        "device_type": "Security Camera",
        "location": "Main Entrance",
        "fps": 30,
        "resolution": "1080p",
        "status": "recording"
    },
    "hvac-001": {
        "device_type": "HVAC Controller",
        "location": "Building A - Central",
        "set_temp": 71.0,
        "current_temp": 72.5,
        "mode": "cooling",
        "status": "active"
    }
}

@tool
def get_device_telemetry() -> str:
    """Retrieve current telemetry data from connected IoT devices."""
    device_id = random.choice(list(DEVICE_TELEMETRY.keys()))
    device_data = DEVICE_TELEMETRY[device_id]

    report = f"Device: {device_id} ({device_data['device_type']})\n"
    report += f"Location: {device_data['location']}\n"
    report += f"Status: {device_data['status']}\n"
    for key, value in device_data.items():
        if key not in ['device_type', 'location', 'status']:
            report += f"{key}: {value}\n"
    return report

第二个工具使用本地 SLM 执行视觉分析。llama3.2-vision 模型完全在本地硬件上运行,这意味着敏感的摄像头画面不会离开设备:

import ollama

@tool
def analyze_camera_feed(image_path: str) -> str:
    """Analyze visual data from cameras using local vision model."""
    stream = ollama.chat(
        model='llama3.2-vision',
        messages=[{
            'role': 'user',
            'content': 'Describe this image in one sentence. '
            'What are the 3 most important things you see?',
            'images': [image_path]
        }],
        stream=True,
    )

    full_response = ""
    for chunk in stream:
        chunk_content = chunk['message']['content']
        print(chunk_content, end='', flush=True)
        full_response += chunk_content

    return f"Object Detection Report:\n{full_response}"

实现云端处理

对于需要更广泛推理能力的复杂分析,可以创建一个调用 Amazon Bedrock 的工具。该工具仅在编排器判定本地模型无法处理请求时才被调用:

import boto3

@tool
def get_expert_insights(context_data: str, question: str) -> str:
    """Get advanced analysis and expert recommendations
    for complex questions via Amazon Bedrock."""
    client = boto3.client("bedrock-runtime", region_name="us-east-1")

    conversation = [
        {
            "role": "user",
            "content": [
                {"text": f"Context: {context_data}\n\nQuestion: {question}"}
            ],
        }
    ]

    response = client.converse(
        modelId="<<model_id>", //Refer model id [details](https://docs.aws.amazon.com/bedrock/latest/userguide/foundation-models-reference.html)
        messages=conversation,
        inferenceConfig={
            "maxTokens": 512,
            "temperature": 0.5,
            "topP": 0.9
        }
    )

    response_text = response["output"]["message"]["content"][0]["text"]
    return f"Expert Analysis:\n{response_text}"

配置具备智能编排能力的 Strands 代理

AAIF 的核心是 Strands 代理配置。该代理使用本地 SLM(llama3.2:1b)作为其编排器。Strands Agents 支持多种模型提供商,这里我们使用 Ollama 提供商在本地运行编排器:

from strands.models.ollama import OllamaModel

model = OllamaModel(
    model_id="llama3.2:1b",
    host="http://localhost:11434",
    params={
        "max_tokens": 300,
        "temperature": 0.3,
    },
)

system_prompt = """You are a monitoring assistant for operational facilities.
You have access to device telemetry tools, analysis capabilities,
and expert insights to help monitor operations effectively.

When users ask for:
- Device status or telemetry: use get_device_telemetry
- Image or data analysis: use analyze_camera_feed
- Expert advice or complex questions: use get_expert_insights

Always return the complete tool results directly to the user."""

agent = Agent(
    model=model,
    system_prompt=system_prompt,
    tools=[
        get_device_telemetry,
        analyze_camera_feed,
        get_expert_insights,
    ],
)

由 SLM 驱动的编排器会分析每个请求,并将其路由到合适的工具,而无需硬编码的关键词匹配。路由是通过模型对请求的理解来完成的:

请求 路由 延迟
“检查设备状态” 本地 SLM 低(本地推理)
“分析这张图像” 本地视觉 AI 低(本地推理)
“你推荐哪些优化策略?” 云端(Amazon Bedrock) 较高(网络往返)

表 1:本地推理与云端推理在请求、路由和延迟方面的对比估算

运行代理

代理配置完成后,你可以直接与其交互:

# Local processing - device telemetry
response = agent("What's the current status of our devices?")
print(response)

# Local processing - vision analysis
response = agent("Analyze the camera feed from camera-001")
print(response)

# Cloud processing - complex analysis
response = agent(
    "Based on current telemetry patterns, "
    "what optimization strategies do you recommend?"
)
print(response)

代理会自动对每个请求进行分类,并将其路由到合适的处理层。无需显式的路由规则。

适应不同的部署场景

AAIF 架构可以通过更改模型配置来适应不同的基础设施需求:

当你的工作负载完全在云端运行且没有可用的边缘硬件时,可将 Ollama 模型配置替换为 Amazon Bedrock 来处理所有任务。这会将每个请求都路由到托管云推理,从而无需本地 GPU 资源即可获得自动伸缩能力。拥有可靠低延迟连接且无数据驻留限制要求的团队最能从这种配置中受益:

from strands.models import BedrockModel

model = BedrockModel(
    model_id="<<model_id>", //Refer model id [details](https://docs.aws.amazon.com/bedrock/latest/userguide/foundation-models-reference.html)
    region_name="us-east-1"
)

混合配置保留本地 SLM 编排器,同时为超出本地模型能力的请求添加云模型。这是本演练中展示的默认 AAIF 配置。它适用于大多数请求都足够常规、可在本地解决,但少数请求需要更大模型进行更广泛推理的环境。成本节约可来自大约 80% 不会命中付费 API 端点的流量。

对于完全物理隔离或有严格数据主权要求的环境,可将云工具替换为更大的本地模型,并在设备上运行所有处理。运行在具备足够内存的硬件上的 3B 参数模型可以处理那些原本会被 1B 编排器升级处理的 moderately 复杂任务。其代价是在最难的查询上推理深度有所降低,但好处是数据不会离开本地场所:

model = OllamaModel(
    model_id="llama3.2:3b", # Larger local model for complex tasks
    host="http://localhost:11434",
)

展望未来:使用 MCP 服务器实现集中式工具调用

本文中的实现使用直接在代理代码中定义的本地工具调用。对于多个代理跨服务共享工具的生产部署,可以将这些工具作为模型上下文协议(MCP)服务器暴露出来。MCP 提供了一个标准化的工具发现与调用接口,因此你可以集中管理工具,并在不同的代理和环境中复用工具。在图 3 中,我们展示了如何将 AAIF 工具转换为 MCP 服务器以实现分布式、集中式的工具调用。

如图 3 所示的分布式配置中,设备 1 作为编排中心,运行带有 SLM 路由器和本地遥测工具的 Strands 代理。它通过 MCP 协议连接到设备 2,后者运行带有 llama3.2-vision 的边缘视觉处理服务器。设备 3 作为连接到 Amazon Bedrock 的云分析网关。从编排器的角度来看,所有远程工具都表现为本地函数调用,因为 MCP 传输层会透明地处理序列化和网络通信。

图 3:使用 MCP 服务器的分布式智能

清理

为避免产生后续费用,请完成以下清理步骤:

  1. 禁用 Amazon Bedrock 模型访问权限:打开 Amazon Bedrock 控制台,选择 模型访问权限,并撤销对 Amazon Nova Lite 的访问权限。有关详细步骤,请参阅 Amazon Bedrock 用户指南中的 管理模型访问权限 。
  2. 停止 Ollama 服务器并删除模型以释放本地磁盘空间(约 2 GB):
    ollama stop
    ollama rm llama3.2:1b
    ollama rm llama3.2-vision
  3. 如果不再需要示例代码,请删除项目目录:
    rm -rf aaif-demo

结论

我们展示了如何使用 Adaptive Agentic Intelligence Framework 和 Strands Agents 构建经济高效的 AI 智能体。通过将常规请求路由到本地 SLM,并将 Amazon Bedrock 上的云端模型保留用于复杂分析,AAIF 可以帮助降低 API 成本,同时保持常规操作的低延迟。

在生产环境中运行此模式之前,请为云端推理路径添加负责任的 AI 控制措施,因为这些请求包含工具输出、检索到的数据和用户输入。您可以使用护栏 ID 和版本将 Amazon Bedrock Guardrails 附加到 Strands BedrockModel。随后,它会针对有害类别应用内容过滤器、应用提示词注入过滤器,并执行上下文关联性检查,从而阻断源数据不支持的响应。要将相同的策略应用于本地 SLM 层,请对其输入和输出调用独立的 ApplyGuardrail API。这样,无论由哪个模型处理,每个请求都遵循同一套安全标准。

这一架构模式的应用不仅限于物联网监控。医疗机构可以在本地运行患者监护,同时将诊断支持路由到云端模型。金融服务公司可以在本地处理交易,并为风险分析保留云端容量。制造团队可以在边缘运行质量控制视觉模型,同时将优化请求发送到云端。

要了解有关使用 Strands Agents 构建智能体的更多信息,请访问 Strands Agents 文档。有关可用基础模型的信息,请参阅 Amazon Bedrock.


关于作者

原始出处

AWS Machine Learning

内容说明

原始发布及相关权利归来源方。

机器翻译 · 请以原文为准