Strands Agents(一)Strands Agents 介绍

Strands Agent

AWS 最新开源的 Strands Agents SDK 是一款采用模型驱动架构的 AI 代理开发框架,旨在通过极简开发方式,帮助开发者快速构建和部署 AI 代理。它将代理的核心要素------模型、工具和提示词抽象化,开发者只需几行代码,即可构建从简单任务到复杂多代理协作的多样化 AI 应用。

与那些要求开发者为智能体(agent)定义复杂工作流程的框架相比,Strands 通过充分利用最先进的模型在规划、思维链、工具调用和反思方面的能力,大大简化了智能体的开发过程。使用 Strands,开发者只需在代码中定义一个提示词(prompt)和一个可用工具列表,即可构建一个智能体,并能够在本地进行测试后部署到云端。正如 DNA 的双螺旋结构一样,Strands(在分子生物学中,"strand" 指的是 DNA 或 RNA 分子的单链) 将智能体的两个核心部分:模型和工具 ------ 紧密地连接在一起。Strands 利用模型强大的推理能力来规划智能体的下一步行动,并自动调用相应的工具。对于更复杂的智能体应用场景,开发者还可以在 Strands 中自定义智能体的行为。例如,你可以指定工具的选择方式、自定义上下文管理机制、选择会话状态和记忆的存储位置,甚至构建多智能体协同的应用[1]。

Strands 具备高度可移植性,可以在任何环境中运行,并支持所有具备推理和工具调用能力的模型。借助 LiteLLM,它兼容包括 Amazon Bedrock、Anthropic、Ollama、Meta 等在内的主流模型提供商,展现出极强的灵活性和扩展性。目前Strands Agents 的开源社区也十分活跃,吸引了包括 Anthropic、Meta 等在内的多家公司参与共建。开发者可以通过 GitHub 获取最新动态、参与社区讨论和贡献代码。

本文首先会介绍 Strands Agents的基本特性,并以示例的方式展示使用方法。最后通过一个示例展示通过使用Strands Agents SDK,如何简单且快速的构建一个基于Web检索的QAbot。

1. 核心概念

1.1. Agent Loop

智能体循环(Agent Loop)是 Strands Agents SDK 中的一个核心概念,它通过思考推理(reasoning)、工具调用和响应生成的循环过程,使智能体能够展现出智能化自主的行为。它支持复杂的多步骤推理和行动,并无缝集成工具和语言模型。Agent Loop的流程如下图所示:

其执行流程可以总结为如下流程:

  1. 接收用户输入和上下文信息
  2. 使用LLM处理输入
  3. 决定是否使用工具来收集信息或执行操作
  4. 执行工具并接收结果
  5. 用新信息继续推理
  6. 生成最终响应或再次循环

这个循环可能在一次用户交互中重复多次,使Agent能够执行复杂的多步骤推理和自主行为。

Event Loop Cycle

Event Loop Cycle是协调information flow的核心机制,由event_loop_cycle() 函数实现:

复制代码
def event_loop_cycle(
    model: Model,
    system_prompt: Optional[str],
    messages: Messages,
    tool_config: Optional[ToolConfig],
    callback_handler: Any,
    tool_handler: Optional[ToolHandler],
    tool_execution_handler: Optional[ParallelToolExecutorInterface] = None,
    **kwargs: Any,
) -> Tuple[StopReason, Message, EventLoopMetrics, Any]:
# ... implementation details ...

它负责:

  1. 使用语言模型处理消息
  2. 处理工具执行请求
  3. 管理对话状态
  4. 通过指数退避机制处理错误并进行重试
  5. 收集指标和追踪数据以实现系统可观测性

事件循环周期采用递归结构,使得在使用工具时可以进行多次迭代,同时在整个对话过程中保持状态的一致性。

Agent Loop工作流程

下面我们使用一个简单的示例来描述Agent Loop工作的流程:

复制代码
from strands import Agent
from strands_tools import calculator
from strands.models import BedrockModel

# Create a Bedrock model instance
bedrock_model = BedrockModel(
    model_id="us.amazon.nova-premier-v1:0",
    temperature=0.3,
    top_p=0.8,
    region_name="us-east-1"
)

# Create an agent using the BedrockModel instance
agent = Agent(
    model=bedrock_model,
    tools=[calculator],
    system_prompt="You are a helpful assistant."
)

# Process user input
result = agent("Calculate 25 * 48")

1. 初始化阶段

在如上代码中,初始化Agent对象时,后台会初始化以下工作:

  • 创建tools注册表并注册tool
  • 设置对话管理器
  • 配置并行处理能力
  • 初始化指标收集

2. 用户输入处理阶段

在用户输入信息后,例如示例里(Calculate 25 * 48的用户输入),会调用agent将消息添加到对话历史中,并在初始化新的Event Loop Cycle之前应用conversation management 策略。

3. 模型处理阶段

模型会接收到 System prompt(如果有指定)、完整的对话历史、配置的可用的tools,这三部分信息。然后,模型会生成一个response,可以是面向用户的文本回复,或者在agent可用的情况下,包含对一个或多个工具的调用请求。

4. Response分析 & Tool执行

在模型返回function call的返回后,event loop首先提取并验证tool的请求,然后在tools注册表里查找对应的tool,接着执行这个tool(可以并行执行其他tool),最后获取执行结果并格式化

5. Tool结果处理

Tool执行结果会格式话为以下格式:

复制代码
{
  "role": "user",
  "content": [
    {
      "toolResult": {
        "toolUseId": "tool_123",
        "status": "success",
        "content": [
          {"text": "1200"}
        ]
      }
    }
  ]
}

这个结果将被添加到对话历史中,并再次调用模型,使其对工具的执行结果进行reasoning。

6. 迭代处理

如果模型要求执行更多工具、需要进一步澄清,或需要进行多步骤推理,Agent Loop可以递归地持续运行。这种迭代的特性可以支持构建复杂的操作流程,例如:用户继续提出问题、智能体使用搜索工具查找信息、智能体综合生成最终回答。

7. 完成

当模型生成最终的文本响应,或发生无法处理的异常时,循环过程结束。在循环结束时,系统会收集指标和追踪数据,更新对话状态,并将最终响应返回给调用者。

1.2. Tools

Tools是扩展Agent能力的主要方式,使得Agent能够执行超出简单文本生成的操作。Strands提供了3种Tools的形式:

  • 内置tools:Strands提供了内置的tools,包括常用的文件读写(file_read, file_write),python代码执行器(python_repl)等
  • Python:将python-based tool转为Strands可用的tools,有两种方式:
    • 使用@tool的装饰器将一个常规的python func转为tools(需要依赖sdk)
    • 遵循tool的要求(包含tool specification和tool function两部分)编写一个tools(无需依赖sdk)
  • MCP:通过 MCP,Strands Agents 可以与提供额外工具的 MCP 服务器进行通信,从而扩展代理的能力。

2. Multi-Agent

2.1. Agents as Tools架构

在Strands中,使用了一种名为Agents as Tools的架构,也就是说,将其他的agents视为tools,以便可以相互之间进行调用。这种模式也创建了一种层次结构:

  • 一个主coordinator agent:处理用户交互,并决定调用哪个tool agent
  • 专门的"tool agents":在coordinator agent调用它时,执行其特定领域的任务

这种方式模仿的是人类团队的运作模式,其中coordinator是管理协调各个专家,每个专家都有独特的技能和专业知识。预期让一个agent处理所有事情,不如将特定任务委托给最合适的专家来完成。其模式如下图所示:

这个架构能提供如下优势:

  1. **分离关注的领域:**每个Agent都有一个专门的责任领域,使系统更容易理解和维护
  2. **层次化的委托:**coordinator决定调用哪个专家,创建了一个清晰的指挥链
  3. 模块化架构:"专家"可以独立添加、删除或修改,而不会影响整个系统
  4. **提升性能:**每个代理都可以拥有为其量身定制的System Prompts和tools

在实现Agents as Tools的模式时,需要遵循以下原则:

  1. **清晰的tool文档:**编写清晰的文档,解释agent的专业知识
  2. **专注领域的system prompts:**让每个专门的代理聚焦于其领域
  3. **适当的response处理:**使用一致的模式来提取和格式化response
  4. **指导tool选择:**为coordinator提供明确的标准,说明何时使用哪个agent

在strands中,可以直接使用@tool的装饰器将agent转为tool,而后这个agent即可被coordinator agent调用。

2.2. Multi-Agent系统与群体智能

群体智能(Swarm Intelligence)强调通过代理之间的协作和信息共享来实现集体智能,从而产生比单个代理更高效和有效的解决方案。

Multi-Agent系统由:在一个环境中互相协作的多个agent组成。这类系统能够实现:

  • 分布式问题求解:将复杂任务拆分为子任务,进行并行处理
  • 信息共享:agent之间交换见解,构建集体知识
  • 专业化:不通的agent专注于一个问题的多个方面
  • 冗余性:多个agent执行类似任务,提高系统的可靠性
  • 智能涌现:系统整体展现出超出其各个组成部分的能力

群体智能(Swarm Intelligence)强调以下几个关键点:

  • 去中心化控制:没有单一的agent直接掌控整个系统
  • 本地交互:agent主要与其邻近的agents进行互动
  • 简单的规则:每个agent遵循相对简单的行为规则
  • 涌现复杂性:复杂的系统行为由简单的agent之间的交互中自然产生

一个群体架构由几个关键组件组成:

  1. 交流模式:网状通信,所有的agent之间都可以相互交流
  2. 共享的记忆系统:agents之间的合作需要一种机制来共享信息,方式包括:
    1. 集中知识库:所有agents共享的信息空间
    2. 消息传递系统:agents之间直接通信
    3. 黑板系统:agents发布和读取信息的共享空间
  3. 协调机制:agents之间需要一种机制来高效的合作,方式包括:
    1. 协作式:agent基于其他agents的insight构建解决方案并寻求共识
    2. 竞争式:agent开发独立的解决方案并提供独特视角
    3. 混合式:平衡协作与独立探索
  4. 任务分配:任务如何分配会影响群体的效率,分配方式包括:
    1. 静态分配:任务预先分配给特定agent
    2. 动态分配:根据agent的可用性和能力分配任务
    3. 自组织:agent根据本地信息选择任务

在后续的章节中,我们会介绍群体智能的构建。

3. 基于Web搜索的QAbot示例

下面我们使用Strands Agent快速构建一个基于web搜索的回答应用。

安装环境与依赖:

复制代码
conda create -n strands-agents python=3.10
conda activate strands-agents
pip install strands-agents strands-agents-tools

对于web检索的功能,我们使用 DuckDuckGo Search Server的MCP来实现。示例代码如下所示:

复制代码
def search_with_duckduckgo(query):
    """使用DuckDuckGo MCP服务器搜索信息"""
    # 创建MCP客户端连接到DuckDuckGo服务器
    stdio_mcp_client = MCPClient(lambda: stdio_client(
        StdioServerParameters(
            command="uvx", 
            args=["duckduckgo-mcp-server"]
        )
    ))
    
    # 使用MCP客户端
    with stdio_mcp_client:
        # 获取MCP服务器提供的工具
        tools = stdio_mcp_client.list_tools_sync()
        
        # 创建带有这些工具的Agent
        agent = Agent(
            model=bedrock_model,
            tools=tools,
            system_prompt="You are a helpful assistant. Use the DuckDuckGo search tool to find information and provide comprehensive answers."
        )
        
        # 执行搜索查询
        result = agent(f"Please search for information about: {query}")
        return result

然后运行:

复制代码
if __name__ == "__main__":
    # 执行搜索查询
    query = "玉米须茶有什么作用?"
    result = search_with_duckduckgo(query)
    
    # 打印结果
    print("\n搜索结果:")
    print(result)

Agent便会自动执行web搜索,回答提出的问题。从打印的日志我们可以看到,agent做的第一步是:Processing request of type ListToolsRequest。也就是先列出Tools,并打印了对应的思考过程:

<thinking>The user wants to know about the effects of corn silk tea. To provide accurate information, I need to first search for reliable sources that explain its benefits and uses. Since corn silk tea is a traditional remedy, I should look for both traditional uses and any scientific evidence supporting its efficacy. The search should cover potential health benefits, preparation methods, and any precautions or side effects.</thinking>

然后第二步是调用了Tool #1: search,执行CallToolRequest的请求,然后调用了DuckDuckGo的MCP工具,发起HTTP请求:HTTP Request: POST https://html.duckduckgo.com/html "HTTP/1.1 200 OK"

获得多个查询结果后,继续思考,要对获取的材料进行总结:

<thinking>The search results provide a comprehensive overview of the effects and contraindications of corn silk tea. To give the user a well-rounded answer, I'll summarize the key benefits mentioned across multiple sources: diuretic properties, blood pressure/sugar/lipid regulation, antioxidant effects, and digestive aid. I'll also note important precautions like avoiding dehydration and consulting healthcare providers for certain conditions. The consistent themes across different platforms (Baidu Zhidao, Zhihu, specialty tea sites) strengthen the credibility of these claims.</thinking>

并最终输出结果:

复制代码
玉米须茶主要有以下几个作用:

1. **利尿降肿**:玉米须具有利尿作用,有助于排除体内多余水分,缓解水肿。

2. **降血压、血脂、血糖**:有研究表明玉米须茶可以降低血压、血脂和血糖,对高血压、高血脂、高血糖人群有一定辅助作用。

3. **抗氧化**:玉米须含有丰富的黄酮类化合物,具有抗氧化作用,有助于延缓衰老。

4. **促进消化**:玉米须茶可促进肠胃蠕动,帮助消化,缓解便秘困难。

5. **舒缓情绪**:有镇静作用,可缓解压力和焦虑。

**注意事项**:
- 身体缺水时不宜饮用,因其利尿作用可能加重脱水。
- 孕妇和哺乳期妇女应谨慎饮用。
- 肾功能不全者应避免长期大量饮用。

玉米须茶作为传统草药茶,有多种保健功效,但需根据个人体质合理饮用,最好在医生指导下使用。

以上便是Strands Agent的简要介绍与示例。可以看到,通过Strands Agents SDK,我们可以非常快速的构建出一个自驱的Agent应用。后续我们会继续介绍 Strands Agents SDK 更丰富的用法。

References

1\] Introducing Strands Agents, an Open Source AI Agents SDK: \[2\] Example Built-in Tools: