AWS 用 Strands Agents 构建自适应智能体框架 AAIF,本地 SLM 处理常规请求、云端模型负责复杂分析
Adaptive agentic intelligence framework using Strands Agents
AWS Machine Learning Blog 介绍基于 Strands Agents 的自适应智能体框架 AAIF,用本地 SLM(llama3.2:1b 经 Ollama)作为编排层分类请求,例行任务如设备遥测和 llama3.2-vision 图像分析在本地完成,复杂分析经 boto3 路由到 Amazon Bedrock。
构建 AI 智能体的组织面临一个共同挑战:每个请求,无论是例行的状态检查还是复杂的分析,通常都会被路由到单个大型且昂贵的模型。这种一刀切的方式会推高 API 成本,带来不可预测的延迟,并使离线运行成为不可能。即便是可以在本地解决的例行查询,最终也需要与云端托管的大型语言模型(LLM)进行完整的网络往返。
自适应智能体智能框架(Adaptive Agentic Intelligence Framework,AAIF)基于 Strands Agents 构建,采用了不同的方法。它不将所有请求路由到单个大型模型,而是使用小语言模型(SLM)在本地处理例行任务。更复杂的请求则通过 Amazon Bedrock 路由到云端托管模型。这种方法建立在 NVIDIA 的 Belcak 等人的研究观点之上。他们认为,小语言模型“对于智能体系统中的许多调用而言,已经足够强大、天生更适用,且必然更经济”。该框架基于 Strands Agents 构建,展示了智能的模型编排如何在保持本地操作低延迟的同时帮助降低成本。
在本文中,我们将通过 Ollama 使用本地 SLM、通过 Amazon Bedrock 使用云端模型,借助 Strands Agents 逐一介绍 AAIF 的关键组件。我们使用物联网(IoT)监控场景作为参考实现。
解决方案概览
如图 1 所示,AAIF 将 AI 处理组织为三层,每层针对不同的任务类型进行了优化:
- 智能编排使用轻量级 SLM(llama3.2:1b)作为决策层。该编排器对传入请求进行分类,并将其路由到相应的处理层,无需硬编码规则。
- 本地处理通过 Ollama 在本地硬件上运行的 SLM,处理诸如设备遥测数据获取和图像分析等例行任务。这些任务以低延迟完成,且不依赖云端。
- 云端处理通过 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 编排器)与处理工具分离,你可以根据可用的硬件和网络连接情况独立地替换或重新配置它们。
前提条件
要完成本演练,你需要具备以下前提条件:
- 一个 AWS 账户。
- 在所需区域中配置好 Amazon Bedrock 的模型访问权限。
- 已安装 Python 3.10+。
- Ollama installed with the following models pulled:
ollama pull llama3.2:1b(编排器)。ollama pull llama3.2-vision(视觉分析)。
- 已安装 Strands Agents:
pip install strands-agents strands-agents-tools。 - 已使用相应凭证配置好 AWS Command Line Interface (AWS CLI)。
- 已安装 Boto3:
pip install boto3。
设置环境
创建一个项目目录并启动 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 端点的流量。
对于完全物理隔离(air-gapped)或有严格数据主权要求的环境,可以将云端工具替换为更大的本地模型,并在设备上完成全部处理。在内存充足的硬件上运行的 30 亿参数模型可以处理那些原本会被 10 亿参数编排器上报的中等复杂度任务。代价是在最难的问题上推理深度有所下降,但好处是数据不会离开本地环境:
model = OllamaModel(
model_id="llama3.2:3b", # Larger local model for complex tasks
host="http://localhost:11434",
)展望未来:使用 MCP 服务器实现集中式工具调用
本文中的实现使用直接在智能体代码中定义的本地工具调用。对于多个智能体跨服务共享工具的生产部署,可以将这些工具暴露为 Model Context Protocol (MCP) 服务器。MCP 提供了用于工具发现和调用的标准化接口,因此你可以集中管理工具,并在不同的智能体和环境中复用工具。在图 3 中,我们展示了如何将 AAIF 工具转换为 MCP 服务器以实现分布式、集中式的工具调用。
在如图 3 所示的分布式配置中,设备 1 充当编排中心,运行带有 SLM 路由器和本地遥测工具的 Strands 智能体。它通过 MCP 协议连接到运行 llama3.2-vision 边缘视觉处理服务器的设备 2。设备 3 作为连接到 Amazon Bedrock 的云端分析网关。从编排器的视角来看,所有远程工具都表现为本地函数调用,因为 MCP 传输层透明地处理了序列化和网络通信。
图 3:使用 MCP 服务器的分布式智能
清理资源
为避免产生后续费用,请完成以下清理步骤:
- 禁用 Amazon Bedrock 模型访问权限:打开 Amazon Bedrock 控制台,选择 Model access(模型访问),并撤销 Amazon Nova Lite 的访问权限。有关详细步骤,请参阅 Amazon Bedrock 用户指南中的 Manage model access(管理模型访问)。
- Stop the Ollama server and remove models to free local disk space (approximately 2 GB):
ollama stop ollama rm llama3.2:1b ollama rm llama3.2-vision - Delete the project directory if you no longer need the sample code:
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 Blog · aws.amazon.com


