可易

用 Deep Agents 和 Bedrock AgentCore 构建上下文丰富的研究智能体

可易团队阅读约 9 分钟

本文按步骤说明如何用 LangChain Deep Agents 和 Amazon Bedrock AgentCore 构建竞争研究智能体,并部署到 Runtime。

目录

#用 Deep Agents 和 Bedrock AgentCore 构建上下文丰富的研究智能体

人工智能(Artificial Intelligence, AI)驱动的研究工作流中,一个常见挑战是深度与上下文的取舍。如果你的智能体阅读十个网页,它的上下文窗口(context window,大语言模型(Large Language Model, LLM)一次能够处理的文本量)会被原始内容填满。如果它还运行数据分析代码,图表生成逻辑会与战略推理争夺有限空间。团队通常用手工提示链或顺序处理来绕过这一点。

更好的做法是把深入工作委派给隔离的子智能体,它们只返回简洁结果。LangChain Deep Agents 负责这种编排,生成专用的临时子智能体并管理其生命周期。Amazon Bedrock AgentCore 提供每个子智能体所需的基础设施。这包括用于网页研究的、运行在微虚拟机(MicroVM,一种轻量、单一用途的虚拟机)中的真实浏览器,以及用于数据分析的完整 Python 环境。AgentCore 也可以作为 Deep Agents CLI 中的原生沙箱提供者,因此你可以运行 deepagents --sandbox agentcore,在不构建完整智能体的情况下试用 AgentCore CodeInterpreter。

在本文中,你将构建一个竞争研究智能体,端到端演示这一模式。本演练面向正在构建多步骤 AI 工作流、并且需要为智能体提供隔离执行环境的开发者。在笔记本的第 2 部分,你可以使用 AgentCore CLI 把同一个智能体部署到 Bedrock AgentCore Runtime,使它作为托管的、按会话隔离的服务运行。

你将构建的内容

你的协调智能体收到请求后,首先检查 AgentCore Memory 中过去的研究洞察。然后它并行生成三个浏览器子智能体做研究,每个子智能体在自己的 AgentCore Browser MicroVM 中访问一个不同竞争对手的网站。当三者返回结构化发现后,一个分析子智能体接收合并后的数据,并使用 AgentCore Code Interpreter 生成对比图表和 Markdown 报告。最后,关键洞察被保存到 AgentCore Memory,供以后的会话使用。你可以通过 Amazon Bedrock AgentCore Observability 或 LangSmith,用 Amazon CloudWatch 跟踪整个工作流。

每种子智能体只访问自己那一组工具:研究者使用浏览器工具,分析者使用解释器工具,协调者使用记忆工具。

图 1: 解决方案架构,展示 LangChain Deep Agents 编排器、Amazon Bedrock AgentCore Browser MicroVM、Interpreter、Memory,以及 CloudWatch 或 LangSmith 跟踪之间的数据流。

以下各节逐步讲解每个组件。

构建智能体

要构建这个智能体,你配置一个模型,为每种子智能体创建工具包,并用 LangChain Deep Agents 把它们接在一起。

先决条件

开始之前,请确认你具备以下各项:

  • 一个已启用 Amazon Bedrock AgentCore 访问的 AWS 账户
  • 已配置为环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、AWS_REGION)或通过 AWS 命令行界面(AWS Command Line Interface, AWS CLI)配置文件配置的 AWS 凭证。所需 IAM 权限见 AgentCore 入门指南。
  • Python 3.11 或更高版本,以及用于安装包的 pip 或 uv
  • (可选)已启用 Amazon CloudWatch 事务搜索(Transaction Search),以便查看 AgentCore Observability 的跟踪和跨度
  • (可选)一个用于可观测性的 LangSmith 账户
  • (可选)一个至少配置了一种抽取策略的 AgentCore Memory 资源(该策略是决定从对话事件中抽取何种知识的规则)
  • (可选)langchain-aws 示例仓库 中可运行的 Jupyter 笔记本,用于完整实现

步骤 1:设置模型

下列代码配置编排你的智能体的 LLM。此示例通过 Amazon Bedrock 访问 Claude Sonnet:

from langchain_aws import ChatBedrockConverse
from langchain_aws.tools import create_browser_toolkit, create_code_interpreter_toolkit
from deepagents import create_deep_agent
from botocore.config import Config as BotoConfig

model = ChatBedrockConverse(
    model="us.anthropic.claude-sonnet-4-6",
    region_name="us-west-2",
    config=BotoConfig(read_timeout=300),
)

us. 前缀使用跨区域推理配置文件,以获得更高可用性。你也可以直接使用基础模型 ID。

步骤 2:创建浏览器工具包

每个竞争对手获得自己的 BrowserToolkit,后者会预配自己的 AgentCore Browser MicroVM。你在并行研究者之间得到完全隔离。当 LLM 在单轮中发出多次浏览器工具调用时,该工具包处理并发:

COMPETITORS = [\
    ("GitHub", "https://github.com/pricing"),\
    ("GitLab", "https://about.gitlab.com/pricing"),\
    ("Bitbucket", "https://www.atlassian.com/software/bitbucket/pricing"),\
]

toolkits_to_cleanup = []
research_subagents = []

for company_name, company_url in COMPETITORS:
    browser_toolkit, browser_tools = create_browser_toolkit(region="us-west-2")
    browser_toolkit.session_manager.session_wait_timeout = 60.0
    toolkits_to_cleanup.append(browser_toolkit)

    research_subagents.append({
        "name": f"research-{company_name.lower()}",
        "description": f"Researches {company_name} by browsing {company_url}.",
        "system_prompt": RESEARCHER_PROMPT,
        "tools": browser_tools,
    })

每个 MicroVM 运行一个真实的 Chromium 浏览器,通过 WebSocket 使用 Playwright(一个开源浏览器自动化库)连接。会话是临时的,并在数秒内启动。session_wait_timeout 设置为 60 秒(默认:10 秒),以便在多个工具调用并发运行时,给浏览器操作足够时间完成。浏览器工具包括 navigate_browser、extract_text、click_element、type_text、scroll_page、extract_hyperlinks 和 wait_for_element。

图 2: 三个不同的 MicroVM 会话 ID 确认每个研究子智能体都在自己隔离的 Amazon Bedrock AgentCore Browser 环境中运行。

步骤 3:创建解释器工具包

分析子智能体使用 AgentCore Code Interpreter,这是一个隔离的 MicroVM,运行预装了 pandas、matplotlib 和 numpy 的完整 Python 环境:

ci_toolkit, ci_tools = await create_code_interpreter_toolkit(region="us-west-2")
toolkits_to_cleanup.append(ci_toolkit)

analyst_subagent = {
    "name": "data-analyst",
    "description": "Analyzes competitor data, generates charts and reports.",
    "system_prompt": ANALYST_PROMPT,
    "tools": ci_tools,
}

解释器工具包括 execute_code、execute_command、write_files、read_files、list_files、upload_file 和 install_packages。需要额外的库?使用 install_packages 工具在运行时添加它们。

步骤 4:添加跨会话记忆(可选)

协调智能体可以借助直接与长期记忆 API 交互的 AgentCore Memory 工具,随时间积累专长:

from bedrock_agentcore.memory import MemoryClient
from langchain_core.tools import tool

memory_client = MemoryClient(region_name="us-west-2")

@tool
def save_research_insights(insights: str, session_id: str = "default") -> str:
    """Save competitive research insights to AgentCore long-term memory."""
    memory_client.create_event(
        memory_id=memory_id, actor_id=actor_id, session_id=session_id,
        messages=[\
            (f"Save these research insights:\n\n{insights}", "USER"),\
            ("Insights saved to long-term memory.", "ASSISTANT"),\
        ],
    )
    return "Insights saved and are extracted into long-term memory."

重要: 你的 AgentCore Memory 资源必须至少配置一种抽取策略(例如 semanticMemoryStrategy),长期回忆才能工作。没有策略时,create_event 会存储原始事件,但不会抽取洞察供检索。

当智能体保存洞察时,AgentCore Memory 已配置的策略会在后台自动抽取结构化知识。在后续运行中,智能体使用 recall_past_research 搜索这些已抽取的知识。它找到相关事实和过去的发现,而不必从头重新研究。

步骤 5:创建并运行智能体

把组件接在一起并调用智能体:

agent = create_deep_agent(
    model=model,
    subagents=[*research_subagents, analyst_subagent],
    tools=memory_tools,
    system_prompt=COORDINATOR_PROMPT,
    name="competitive-research-coordinator",
    checkpointer=None,  # Simplification; use AgentCoreMemorySaver for session resumability
    store=InMemoryStore(),  # Internal storage for Deep Agents (separate from AgentCore Memory)
)

result = await agent.ainvoke(
    {"messages": [{"role": "user", "content": "Compare pricing for GitHub, GitLab, and Bitbucket"}]},
    config={"configurable": {"thread_id": "session-1", "actor_id": "research-agent"}},
)

带有进度指示和会话显示的可运行笔记本,见配套笔记本。使用 Claude Sonnet 的预期运行时间是 4–6 分钟,反映的是跨三个站点的真实浏览器导航时间。对同一研究做顺序处理最多会慢到 3 倍。

跟踪并调试你的智能体

AgentCore Observability 通过 Amazon CloudWatch 让你看见这个多智能体架构。AgentCore 以 OpenTelemetry(OTEL)格式发出跟踪和跨度,因此你可以在 CloudWatch GenAI Observability 页面查看完整编排层次:顶层是协调者的运行,每个研究子智能体有一个子跨度,随后是分析子智能体。在每个跨度内,你可以查看工具调用的输入、输出、耗时和令牌用量,从墙上时钟时间确认研究子智能体是并发运行的,并在浏览器导航或代码运行未成功时识别是哪个子智能体和哪次工具调用遇到了问题。作为每个账户的一次性设置,你要先启用 CloudWatch Transaction Search,跟踪和跨度才会可用。当你把智能体托管在 AgentCore Runtime(第 2 部分)上时,运行时自动用 OTEL 为你的智能体插桩,因此不需要额外配置。要在运行时之外运行同一个智能体,请把 AWS Distro for OpenTelemetry(ADOT)SDK 和 LangChain 插桩库加到你的智能体上。更多信息见 Amazon Bedrock AgentCore Observability 文档。

你也可以用 Amazon Bedrock AgentCore Evaluations 为这些跟踪的质量打分,它提供目标成功率、工具选择准确率等内置评估器。更多细节见 AgentCore Evaluations 文档。

如果你愿意,也可以使用 LangSmith 做跟踪。借助 LangSmith,你得到端到端跟踪,帮助调试这个多智能体架构。设置三个环境变量以打开自动跟踪:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY="your-langsmith-api-key"
export LANGCHAIN_PROJECT="competitive-research-agent"

配套笔记本说明了这一选项。

为什么这种架构重要

既然你已经看到各组件如何配合,下面说明为什么这一模式有价值。

第一,你的协调者保持专注于高层推理。每个研究子智能体在内部处理多步浏览,只返回简洁摘要,使协调者的上下文可用于综合,而不是被原始页面内容填满。

第二,你在能力之间得到清晰分离。每种子智能体只访问自己的工具,这降低了意外使用工具的可能,也使调试更有针对性。

第三,你的研究跑得更快。三项浏览器研究任务并发运行,各自在自己的 AgentCore MicroVM 中,与顺序处理相比减少了墙上时钟时间。

最后,Amazon Bedrock AgentCore 与模型和框架无关。AgentCore 工具(Browser、Interpreter、Memory)无论由哪个模型编排,工作方式都相同。你可以用一行更改替换模型:

# Default: Amazon Bedrock
from langchain_aws import ChatBedrockConverse
model = ChatBedrockConverse(model="us.anthropic.claude-sonnet-4-6", region_name="us-west-2")

# Alternative: Anthropic API directly
# from langchain_anthropic import ChatAnthropic
# model = ChatAnthropic(model="claude-sonnet-4-6")

# Alternative: Google Gemini
# from langchain_google_genai import ChatGoogleGenerativeAI
# model = ChatGoogleGenerativeAI(model="gemini-2.5-pro")

把智能体托管到 AgentCore Runtime

你构建的智能体运行在笔记本中,这对开发很合适。要把它移到具有按会话隔离和稳定调用 ARN 的托管端点,你可以把它托管在 Amazon Bedrock AgentCore Runtime 上。AgentCore Runtime 把你的智能体托管在 ARM64 容器中,并在专用 microVM 中运行每个会话,最长 8 小时。因为它与框架无关,你的 Deep Agents 协调者、并行浏览器子智能体和分析子智能体都无需改动即可运行。

AgentCore CLI 用四步处理部署工作流:用 agentcore create 搭建项目,用你的智能体代码更新模板,用 agentcore deploy 部署,用 agentcore invoke 调用。部署之后,你可以用 agentcore logs 流式查看日志,用 agentcore traces 检查跟踪。结束后,agentcore remove all 再接 agentcore deploy 会拆除全部已预配资源。

笔记本第 2 部分逐步带你完成这些步骤,包括先决条件和 IAM 权限。

清理

为避免产生费用,清理你创建的 AgentCore 资源:

# Clean up browser sessions
for toolkit in browser_toolkits:
    await toolkit.cleanup()

# Clean up interpreter session
await ci_toolkit.cleanup()

浏览器会话在 1 小时后自动过期。解释器会话在 15 分钟后自动过期。配套笔记本包含会自动运行的清理代码。如果你创建了 AgentCore Memory 资源并且不再需要它,可以通过 Amazon Bedrock AgentCore 控制台或 API 删除它。

结论与后续步骤

在本文中,你构建了一个研究智能体,它使用 LangChain Deep Agents 做编排,使用 Amazon Bedrock AgentCore 做隔离的浏览器自动化、代码解释和持久记忆。你使用 AgentCore CLI 把该智能体部署到 AgentCore Runtime,使它作为具有按会话隔离、稳定端点和内置可观测性的托管服务运行。这种并行收集数据、专门处理和综合的模式,适用于竞争研究之外的许多工作流:

  • 尽职调查: 配置子智能体,为目标公司研究财务申报、新闻稿和监管文件。例如,把竞争对手 URL 换成 SEC EDGAR 申报页面,并以最小改动复用同一浏览器子智能体模式。
  • 内容创作: 使用研究子智能体收集素材,同时让写作子智能体起草各节
  • 数据管道编排: 让子智能体从不同来源抽取数据,然后把合并结果交给分析子智能体做连接和转换

要开始,请打开配套笔记本 并按单元格逐步演练。如果你对本方案有问题或反馈,请在本文留下评论。如果你对本方案有问题或反馈,请在本文留下评论。

PRIMARY_SOURCE: https://aws.amazon.com/blogs/machine-learning/build-context-rich-research-agents-with-deep-agents-and-bedrock-agentcore

  • #Deep Agents
  • #AgentCore
  • #浏览器沙箱
  • #代码解释器
  • #可观测性