使用 SageMaker AI 與 Bedrock AgentCore 構建智慧體工作流
本文介紹如何將 Amazon SageMaker AI 上相容 OpenAI 的終端節點與 Amazon Bedrock AgentCore 執行時結合,構建多智慧體工作流,每個專用智慧體使用最適合其任務的模型。文章還展示瞭如何獲取 SageMaker 終端節點的令牌級可觀測性,而 Strands Agents 預設不提供此項功能。
在構建智慧體工作流時,一個常見挑戰是如何將託管的基座模型與您自己的成本最佳化或領域專用模型混合使用,而無需重寫智慧體框架。本文介紹瞭如何將 Amazon SageMaker AI 上的 OpenAI 相容終端節點與 Amazon Bedrock AgentCore 執行時(Amazon Bedrock AgentCore 的一項功能)及其託管部署相結合。專用智慧體可以協作處理複雜任務,同時各自使用最適合其工作的模型。這種組合可以在單個生產級架構中實現成本最佳化、資料駐留和模型靈活性。
解決方案概述:架構透過單個 Amazon Bedrock AgentCore 容器連線三條模型託管路徑。協調器智慧體(Bedrock 上的 Claude Haiku 4.5)負責對使用者意圖進行分類,並透過全域性跨區域推理路由任務;預算智慧體(Bedrock 上的 Claude Sonnet 4.6)使用結構化的 Pydantic 輸出處理 50/30/20 預算分解;財務分析智慧體(SageMaker AI 上的 Qwen 3.5 9B)使用工具呼叫來進行股票分析和投資組合構建。需要注意,Amazon Bedrock 模型可用性因 AWS 區域而異,請參閱文件。
使用者請求進入 AgentCore 執行時中的協調器智慧體。協調器使用 Strands Agents 的 agents as tools 模式將請求路由到預算智慧體或財務分析智慧體。預算智慧體透過 Amazon Bedrock 呼叫 Claude Sonnet 4.6,財務分析智慧體透過 SageMaker AI 即時終端節點使用 OpenAI 相容 API 呼叫 Qwen 3.5 9B。結果透過協調器返回給使用者。完整原始碼見 GitHub 倉庫。
前提條件:需要具有 SageMaker AI、Amazon Bedrock 和 AgentCore 許可權的 AWS 賬戶;安裝相關 Python 包;擁有包含 sagemaker:InvokeEndpoint 和 sagemaker:CallWithBearerToken 的 IAM 角色;啟用 Claude Haiku 4.5 和 Claude Sonnet 4.6 的 Bedrock 模型訪問;Python 3.12 以上。
步驟1:在 SageMaker AI 上部署 Qwen 3.5 9B。使用 vLLM 深度學習容器映象 vllm:0.22.1-gpu-py312-cu130,在 ml.g6e.2xlarge 上部署。設定環境變數如 SM_VLLM_MODEL、SM_VLLM_TENSOR_PARALLEL_SIZE、SM_VLLM_MAX_MODEL_LEN,然後建立模型、端點配置和端點。
步驟2:構建多智慧體系統。SageMaker AI 的 OpenAI 相容 API 需要 bearer token,且 token 會過期,因此對於長時間執行的智慧體會話,需要在每次請求時重新整理 token。可以使用 httpx.Auth 子類實現自動重新整理。然後使用 Strands Agents 的 agents as tools 模式,為每次呼叫建立新的智慧體例項。
步驟3:部署到 Amazon Bedrock AgentCore 執行時。使用 bedrock-agentcore-starter-toolkit 進行配置和啟動,設定環境變數如 SAGEMAKER_ENDPOINT_NAME、SAGEMAKER_REGION 和 AGENT_OBSERVABILITY_ENABLED。
可觀測性配置:AgentCore 執行時使用 OpenTelemetry 自動對智慧體進行插樁,但這種插樁並不均勻地擴充套件到每個模型提供商。Amazon Bedrock 模型呼叫會自動獲得包含令牌數的完整生成式 AI span,但 SageMaker OpenAI 相容端點(透過 Strands OpenAIModel)不會自動獲得令牌遙測。根本原因是 Strands 的 OTEL 整合會發出工具呼叫和智慧體生命週期事件的 span,但不會為 OpenAIModel 提供者發出包含令牌屬性的 gen_ai.chat span。AgentCore 的自動插樁只能識別透過 boto3 進行的 Amazon Bedrock 模型推理呼叫。
解決方案是手動發出一個 gen_ai.chat span,包裹 SageMaker 智慧體呼叫,並從 Strands 的內部 AgentResult.metrics.accumulated_usage 中提取令牌使用量。關鍵細節:Strands 內部使用 inputTokens、outputTokens 和 totalTokens 作為鍵,僅當模型提供程式返回使用資料時才會填充該字典。
為什麼 stream_options 對 vLLM 是必須的?預設情況下,vLLM 在流式響應中不包含 usage chunk。Strands 接收文本塊,但永遠收不到最終的使用物件,因此 accumulated_usage 保持為零。新增 stream_options: {"include_usage": True} 可讓 vLLM 傳送帶有令牌計數的額外最終塊。沒有此引數,gen_ai.chat span 將報告 0 個令牌。
逐步配置:啟用 Amazon CloudWatch Transaction Search;安裝 strands-agents[otel];設定 AGENT_OBSERVABILITY_ENABLED=true;使用 opentelemetry-instrument 作為容器 CMD;向 OpenAIModel params 新增 stream_options;建立自定義 gen_ai.chat span。示例 trace 輸出顯示了輸入令牌、輸出令牌、總令牌和持續時間。
關鍵學習:Bedrock AgentCore 自動插樁 Bedrock 呼叫;SageMaker OpenAI 端點需要手動 span;令牌使用需要 stream_options;使用 result.metrics.accumulated_usage;AWS X-Ray 取樣率很重要(預設1%會丟棄大部分 trace,開發時建議使用100%);每次請求使用新的智慧體例項以避免併發問題。
擴充套件模式:可以將 SM_VLLM_MODEL 指向 S3 上的微調檢查點,以替換為微調模型,認證層、OTEL span 和 AgentCore 部署保持不變;也可以使用推理元件進行 A/B 測試。