? ?最近,亞馬遜網絡服務(AWS)宣布推出 Strands Agents(https://github.com/strands-agents/sdk-python),這一開源軟件開發工具包(SDK)采用模型驅動的方法,助力開發者僅用數行代碼即可構建并運行人工智能(AI)代理。Strands Agents 能夠涵蓋從簡單到復雜的各類代理使用場景,無論是本地開發還是生產環境部署都能勝任。目前,AWS 的多個團隊已在生產環境中借助 Strands 構建 AI 代理,包括亞馬遜 Q 開發者助手、AWS Glue 數據集成服務以及 VPC 可達性分析器等。如今,AWS 激動地將 Strands Agents 推向大眾,助力開發者打造專屬的 AI 代理。
相較于要求開發者為代理定義復雜工作流的框架,Strands Agents 通過擁抱尖端模型的規劃、聯想思考、調用工具和反思能力,極大地簡化了代理開發流程。借助 Strands,開發者只需在代碼中定義一個提示詞和一組工具即可構建代理,隨后在本地進行測試并將其部署到云端。正如 DNA 的雙螺旋結構一般,Strands 將代理的兩大核心組件——模型與工具——緊密相連。Strands 借助模型的強大推理能力來規劃代理的下一步行動并執行相應工具。對于更為復雜的代理使用場景,開發者可以在 Strands 中自定義代理的行為。例如,可以指定工具的選擇方式、自定義上下文管理方式、選擇會話狀態和內存的存儲位置,以及構建多代理應用程序。Strands 可在任何環境中運行,支持具備推理和工具使用能力的各類模型,包括亞馬遜 Bedrock、Anthropic、Ollama、Meta 以及其他通過 LiteLLM 提供服務的供應商的模型。
Strands Agents 是一個開放的社區,眾多公司紛紛加入并貢獻自己的力量,包括埃森哲(Accenture)、Anthropic、Langfuse、mem0.ai、Meta、普華永道(PwC)、Ragas.io 和 Tavily。例如,Anthropic 已在 Strands 中貢獻了通過 Anthropic API 使用模型的支持,而 Meta 則通過 Llama API 為 Llama 模型提供了支持。
AWS 構建代理的歷程
AWS 的一名開發者主要負責亞馬遜 Q 開發者助手的工作,這是一個由生成式 AI 驅動的軟件開發助手。他和團隊在 2023 年初開始構建 AI 代理,這大約是在原始 ReAct(推理與行動)科學論文發表之時。該論文表明大型語言模型(LLMs)能夠推理、規劃并在其環境中采取行動。例如,LLMs 可以推理出需要調用應用編程接口(API)來完成任務,然后生成該 API 調用所需的輸入。他們隨后意識到大型語言模型可以作為代理來完成多種類型的任務,包括復雜的軟件開發和運維故障排除。
當時,大型語言模型通常并未被訓練成代理的行為模式,它們大多主要被訓練用于自然語言對話。要想成功地利用大型語言模型進行推理和行動,需要復雜的提示詞指令來指導如何使用工具、模型響應的解析器以及編排邏輯。僅僅是讓大型語言模型可靠地生成語法正確的 JSON 格式響應在當時都是一項挑戰!為了 prototype(原型設計)和部署代理,他和團隊依賴各種復雜的代理框架庫,這些庫處理了代理所需的基本架構和編排,以便與早期模型配合可靠地完成任務。即便有了這些框架,讓一個代理做好生產環境的準備仍需數月的調試和優化。
從那以后,他們在大型語言模型的能力上見證了戲劇性的提升,這些模型如今已具備強大的推理和使用工具完成任務的能力。他們意識到不再需要如此復雜的編排來構建代理,因為模型現在已具備原生的工具使用和推理能力。實際上,他們之前用于構建代理的某些代理框架庫開始阻礙他們充分利用新一代 LLMs 的能力。盡管 LLMs 的性能有了顯著提升,但這些改進并不意味著他們能利用現有框架更快地構建和迭代代理。讓一個代理做好生產環境的準備仍然需要數月時間。
于是,他們開始構建 Strands Agents,旨在為 Q 開發者團隊去除這種復雜性。他們發現,依賴最新模型的能力來驅動代理,與使用復雜編排邏輯構建代理相比,大幅縮短了上市時間并提升了最終用戶體驗。過去,Q 開發者團隊從原型設計到生產環境部署一個新代理需要數月時間,如今借助 Strands,他們能夠在數天至數周內推出新的代理。
Strands Agents 的核心概念
對代理最簡單的定義是模型、工具和提示詞的組合。代理利用這三大組件自主完成任務,例如回答問題、生成代碼、規劃假期或優化財務組合等。在模型驅動的方法中,代理利用模型動態指導自身步驟并使用工具以完成指定任務。
?
通過 Strands Agents SDK 定義代理時,需在代碼中定義以下三大組件:
-
1.?模型?:Strands 提供靈活的模型支持。可以使用亞馬遜 Bedrock 中支持工具使用和流處理的任何模型、通過 Anthropic API 使用 Anthropic 的 Claude 模型家族的模型、通過 Llama API 使用 Llama 模型家族的模型、用于本地開發的 Ollama,以及通過 LiteLLM 使用的眾多其他模型供應商,例如 OpenAI。此外,還可以在 Strands 中自定義模型供應商。
-
2.?工具?:可以從數千個已發布的模型上下文協議(MCP)服務器中選擇工具供代理使用。Strands 還提供了 20 多個預構建示例工具,包括用于操作文件、發起 API 請求和與 AWS API 交互的工具等。只需使用 Strands 的?
@tool
?裝飾器,即可輕松地將任何 Python 函數用作工具。 -
3.?提示詞?:提供一個自然語言提示詞,為代理定義任務,例如回答最終用戶的問題。還可以提供一個系統提示詞,為代理提供通用指令和期望行為。
代理會與模型和工具進行交互,直至完成提示詞所提供的任務,這一過程通過代理循環實現,它是 Strands 能力的核心所在。Strands 的代理循環充分利用了大型語言模型的強大功能以及它們在推理、規劃和工具選擇方面的原生能力。在每次循環中,Strands 會帶著提示詞、代理上下文以及代理工具的描述調用大型語言模型。大型語言模型可以選擇用自然語言回應代理的最終用戶、規劃一系列步驟、反思代理之前的步驟和 / 或選擇使用一個或多個工具。當大型語言模型選擇工具時,Strands 負責執行該工具并將結果反饋給大型語言模型。當大型語言模型完成任務后,Strands 返回代理的最終結果。
?
在 Strands 的模型驅動方法中,工具是定制代理行為的關鍵。例如,工具可以從知識庫中檢索相關文檔、調用 API、運行 Python 邏輯,或僅僅返回包含額外模型指令的靜態字符串。工具還有助于在模型驅動的方法中實現復雜使用場景,比如以下 Strands Agents 示例預構建工具:
-
??檢索工具(Retrieve tool)?:該工具利用亞馬遜 Bedrock 知識庫實現語義搜索。除了檢索文檔外,檢索工具還可以通過語義搜索檢索其他工具,從而幫助模型進行規劃和推理。例如,AWS 的一個內部代理有超過 6000 個工具可供選擇!如今的模型尚無法準確地從如此眾多的工具中進行選擇。與其向模型描述所有 6000 個工具,代理可利用語義搜索找到與當前任務最相關的工具,并僅向模型描述這些工具。可以通過將眾多工具描述存儲在知識庫中,并讓模型使用檢索工具來檢索當前任務相關的工具子集,從而實現這一模式。
-
??思考工具(Thinking tool)?:該工具通過多個周期促使模型進行深入的分析思考,使復雜的思考處理和自我反思成為代理的一部分。在模型驅動方法中,將思考建模為工具,使模型能夠推理任務是否需要深入分析以及何時需要。
-
??多代理工具(Multi-agent tools)?:如工作流、圖和群集工具等。對于復雜任務,Strands 可以在多種多代理協作模式下協調多個代理。通過將子代理和多代理協作建模為工具,模型驅動方法使模型能夠推理任務是否需要定義好的工作流、圖或子代理群集。Strands 對多代理應用的 Agent2Agent(A2A)協議支持即將推出。
入門 Strands Agents
讓我們通過一個示例來了解如何使用 Strands Agents SDK 構建代理。長期以來,命名一直被認為是計算機科學中最困難的問題之一,為開源項目命名也不例外!為了幫助我們為 Strands Agents 項目構思潛在名稱,開發人員使用 Strands 構建了一個命名人工智能助手。在本示例中,你將使用 Strands 構建一個命名代理,使用亞馬遜 Bedrock 中的默認模型、MCP 服務器和預構建的 Strands 工具。
創建一個名為?agent.py
?的文件,代碼如下:
from strands import Agent
from strands.tools.mcp import MCPClient
from strands_tools import http_request
from mcp import stdio_client, StdioServerParameters# Define a naming-focused system prompt
NAMING_SYSTEM_PROMPT = """
You are an assistant that helps to name open source projects.When providing open source project name suggestions, always provide
one or more available domain names and one or more available GitHub
organization names that could be used for the project.Before providing your suggestions, use your tools to validate
that the domain names are not already registered and that the GitHub
organization names are not already used.
"""# Load an MCP server that can determine if a domain name is available
domain_name_tools = MCPClient(lambda: stdio_client(StdioServerParameters(command="uvx", args=["fastdomaincheck-mcp-server"])
))# Use a pre-built Strands Agents tool that can make requests to GitHub
# to determine if a GitHub organization name is available
github_tools = [http_request]with domain_name_tools:# Define the naming agent with tools and a system prompttools = domain_name_tools.list_tools_sync() + github_toolsnaming_agent = Agent(system_prompt=NAMING_SYSTEM_PROMPT,tools=tools)# Run the naming agent with the end user's promptnaming_agent("I need to name an open source project for building AI agents.")
你需要一個 GitHub 個人訪問令牌來運行代理。設置環境變量?GITHUB_TOKEN
,其值為你的 GitHub 令牌。還需要在 us-west-2 地區獲得 Anthropic Claude 3.7 Sonnet 的 Bedrock 模型訪問權限,并在當地配置好 AWS 憑證。
然后運行你的代理:
pip install strands-agents strands-agents-tools
python -u agent.py
你應該會看到類似于以下片段的代理輸出:
Based on my checks, here are some name suggestions for your?
open source AI agent building project:## Project Name Suggestions:1. **Strands Agents**?
- Available domain: strandsagents.com?
- Available GitHub organization: strands-agents?
如今,你可以輕松地在喜愛的人工智能輔助開發工具中使用 Strands Agents SDK 開始構建新的代理。為了幫助你快速上手,我們發布了一個 Strands MCP 服務器,可用于任何支持 MCP 的開發工具,例如 Q Developer CLI 或 Cline。對于 Q Developer CLI,可以使用以下示例將 Strands MCP 服務器添加到 CLI 的 MCP 配置中。你可以在 GitHub (https://github.com/strands-agents/mcp-server/)上查看更多的配置示例。
{"mcpServers": {"strands": {"command": "uvx","args": ["strands-agents-mcp-server"]}}
}
在生產環境中部署 Strands Agents
在生產環境中運行代理是 Strands 設計的核心原則之一。Strands Agents 項目包含一個部署工具包,其中有一系列參考實現,可幫助你將代理投入生產。Strands 足夠靈活,能夠支持生產環境中的多種架構。你可以使用 Strands 構建對話代理,以及由事件觸發、按計劃運行或持續運行的代理。你可以將使用 Strands Agents SDK 構建的代理部署為單體架構,即將代理循環和工具執行都運行在同一個環境中,或者將其部署為一組微服務。下面將介紹在 AWS 內部使用 Strands Agents 的四種代理架構。
下圖展示了一種代理架構,Strands 完全在用戶的本地環境中通過客戶端應用程序運行。GitHub 上的示例命令行工具遵循這種架構,用于構建基于命令行的人工智能助手。
下一圖展示了一種將代理及其工具部署在生產環境中的 API 后端的架構。他們在 GitHub 上提供了參考實現,展示如何將使用 Strands Agents SDK 構建的代理部署在 AWS 的 API 后端,使用的服務包括 AWS Lambda、AWS Fargate 或亞馬遜彈性計算云(Amazon EC2)。
你可以通過將 Strands 代理循環和工具執行在不同環境中運行來分離關注點。下圖展示了一種代理架構,其中代理通過 API 調用其工具,而工具則在與代理環境相隔離的后端環境中運行。例如,你可以將代理工具運行在 Lambda 函數中,而將代理本身運行在 Fargate 容器中。
你還可以使用 Strands 實現一種控制權回歸模式,由客戶端負責運行工具。該圖展示了一種代理架構,使用 Strands Agents SDK 構建的代理可以使用混合工具,這些工具一部分托管在后端環境中,另一部分通過調用代理的客戶端應用程序在本地運行。
無論采用何種架構,對代理的可觀測性至關重要,這有助于了解代理在生產環境中的表現。Strands 提供了用于收集生產代理軌跡和指標的工具。Strands 使用 OpenTelemetry(OTEL)將遙測數據發送到任何兼容 OTEL 的后端,用于可視化、故障排除和評估。Strands 對分布式追蹤的支持使你能夠追蹤架構中不同組件的請求,從而全面了解代理會話的情況。
總結
Strands Agents SDK 提供了一個既結構化又靈活的框架,用于構建 AI 代理。它強調模型、工具以及提示詞之間的清晰分離。其基于模型驅動的循環機制,以及與現存大型語言模型(LLM)生態系統的集成,使其成為開發者在實現自主代理時的技術合理之選。開發者可以借此在減少樣板代碼的同時,獲得強大的定制化能力。