
FOMC Research Agent 深度解析用 Google ADK 构建多智能体金融分析工作流【免费下载链接】adk-samplesA collection of sample agents built with Agent Development Kit (ADK)项目地址: https://gitcode.com/GitHub_Trending/ad/adk-samples本文基于 python/agents/fomc-research 示例系统拆解一个面向美联储联邦公开市场委员会FOMC会议的自动化金融研究 Agent它如何以多智能体、多模态架构配合工具调用、实时联网抓取与外部数据库BigQuery集成自动生成会议分析报告。读完本文你将掌握该 Agent 的完整工作流、六个子智能体的分工协作方式、六个核心工具的实现原理、BigQuery 数据准备流程以及从本地adk run到 Agent Runtime 云端部署的完整实战路径。FOMC 研究场景为什么需要一个「非对话式」Agent联邦公开市场委员会Federal Open Market CommitteeFOMC是负责制定美国利率政策的官方机构其会议声明与新闻发布会被全球金融市场参与者密切关注并深度解读。FOMC Research Agent 正是面向这一场景设计的它展示如何用多智能体架构自动为「最近一次 FOMC 会议」生成详尽的分析报告。与仓库中大多数示例 Agent 不同FOMC Research Agent 是**高度非对话式non-conversational**的绝大部分工作发生在各子智能体之间的来回协作中而不是与用户的连续对话里。仅在必要时它会向用户索要一个关键信息——待分析会议的日期ISO 格式YYYY-MM-DD随后便自主完成从数据抓取到报告生成的全部流程。这种「多阶段、非对话式」的 agentic workflow非常适合事件驱动的金融研究类自动化任务。该 Agent 的关键特性可总结如下特性说明交互类型Interaction TypeWorkflow工作流复杂度ComplexityAdvanced高级Agent 类型Agent TypeMulti Agent多智能体组件ComponentsTools、Multimodal、AgentTools垂直领域VerticalFinancial Services金融服务下图展示了 Agent 生成分析报告所遵循的高层工作流注意第 3 步「Review press conference video」仍在开发中整体架构root_agent 协调下的六级流水线下图展示了实现该工作流所用到的全部子智能体与工具的详细架构从源码结构看整个 Agent 的编排入口位于 fomc_research/agent.py其核心定义如下root_agent Agent( modelMODEL, nameroot_agent, description( Use tools and other agents provided to generate an analysis report about the most recent FOMC meeting. ), instructionroot_agent_prompt.PROMPT, tools[store_state_tool], sub_agents[ RetrieveMeetingDataAgent, ResearchAgent, AnalysisAgent, ], before_model_callbackrate_limit_callback, )这里有几个值得注意的工程细节模型可配置MODEL来自 fomc_research/init.py默认值为gemini-2.5-flash可通过环境变量GOOGLE_GENAI_MODEL覆盖。默认走 Vertex AI__init__.py会自动通过google.auth.default()推断 GCP project并setdefault设置GOOGLE_CLOUD_PROJECT、GOOGLE_CLOUD_LOCATIONglobal、GOOGLE_GENAI_USE_VERTEXAITrue。日志级别可调环境变量GOOGLE_GENAI_FOMC_AGENT_LOG_LEVEL控制日志级别默认INFO。回调贯穿全链路before_model_callbackrate_limit_callback被挂在每个 Agent 上统一做请求限流。核心组件六个子智能体AgentsAgent职责root_agent工作流入口协调其他 Agent 的活动research_agent协调各单项研究组件的检索analysis_agent接收research_agent的输出并生成分析报告retrieve_meeting_data_agent从网页抓取 FOMC 会议数据extract_page_data_agent从 HTML 页面中提取特定数据summarize_meeting_agent阅读会议纪要transcript并生成摘要root_agent获取会议日期并启动流水线根智能体提示词 定义了它的行为先向用户索要待分析的会议日期并校验合理性拿到日期后调用store_state工具以键user_requested_meeting_date将日期写入 ToolContextISO 格式随后把控制权交给retrieve_meeting_data_agent从 Fed 官网抓取当次会议数据。retrieve_meeting_data_agent联网抓取会议元数据定义见 retrieve_meeting_data_agent.py它同时使用普通工具和AgentToolRetrieveMeetingDataAgent Agent( ... tools[ fetch_page_tool, AgentTool(ExtractPageDataAgent), ], ... )其提示词给出严格有序的执行步骤调用fetch_page工具抓取美联储会议日历页https://www.federalreserve.gov/monetarypolicy/fomccalendars.htm调用extract_page_data_agent提取 6 个字段requested_meeting_date、previous_meeting_date日期区间取最后一天、requested_meeting_url、previous_meeting_url、requested_meeting_statement_pdf_url、previous_meeting_statement_pdf_url再次调用fetch_page抓取会议详情页若返回的 URL 不是完整域名则用https://www.federalreserve.gov/requested_meeting_url模板拼接再次调用extract_page_data_agent提取transcript_url网页上标注为 Press Conference Transcript 的 PDF 链接将控制权转移给research_agent。extract_page_data_agent让 LLM 直接「读」HTML定义见 extract_page_data_agent.py。其提示词明确要求不使用任何 HTML 解析器而是让模型自行阅读page_contents中的 HTML 并提取所需字段先调用store_state把提取结果存入 ToolContext再以 JSON 格式返回给用户。这是「LLM 即解析器」的一种轻量实现方式省去了维护 DOM 选择器的成本。research_agent研究协调器定义见 research_agent.py挂载了store_state、compare_statements、fetch_transcript、compute_rate_move_probability四个工具并辖有summarize_meeting_agent一个子 Agent。其提示词规定五步流水线调用compare_statements生成当前与上次 FOMC 声明之间差异的 HTML redline调用fetch_transcript抓取会议纪要调用summarize_meeting_agent参数为 Summarize the meeting transcript provided调用compute_rate_move_probability计算市场隐含的利率变动概率若出错用错误信息向用户解释并继续全部完成后将控制权转移给analysis_agent完成分析——研究协调器自身绝不生成分析或输出。summarize_meeting_agent会议纪要摘要定义见 summarize_meeting_agent.py。其提示词以{artifact.transcript_fulltext}注入会议纪要全文要求模型分析内容与情绪基调调用store_state以键meeting_summary保存摘要不直接输出给用户最后transfer_to_agent转回research_agent。analysis_agent最终报告生成定义见 analysis_agent.py被描述为「分析输入并判断对未来 FOMC 行动的影响」。其提示词通过模板变量把前期研究成果注入上下文{artifact.requested_statement_fulltext}当次会议声明全文{artifact.previous_statement_fulltext}上次会议声明全文{artifact.statement_redline}两份声明的差异对照redline{meeting_summary}会议纪要摘要{rate_move_probabilities}市场隐含利率变动概率。提示词要求忽略 ToolContext 中的其他数据生成 1~2 页的短报告且必须使用具体数字避免泛泛而谈。核心组件六个工具Tools工具说明fetch_page_tool封装一次 HTTP 请求用于抓取网页store_state_tool将特定信息存入 ToolContextanalyze_video_tool处理与分析 YouTube 视频compute_probability_tool依据 Fed Futures 定价计算利率变动概率compare_statements对比当前与上次 FOMC 声明fetch_transcript获取 FOMC 会议纪要注analyze_video_tool在 README 中列于工具清单但当前 tools/ 目录下尚无对应实现文件与工作流图中「Review press conference video」步骤仍在开发中的状态一致。fetch_page_tool最小化网页抓取实现见 tools/fetch_page.py使用标准库urllib.request设置User-Agent: Mozilla/5.0后 GET 目标 URL把页面 UTF-8 文本以键page_contents写入 ToolContext stateHTTP 错误时返回{status: ERROR, ...}。实现极简仅 40 行左右展示了 ADK 工具「接收tool_context、读写 state、返回状态字典」的标准形态。store_state_tool跨 Agent 状态桥实现见 tools/store_state.pydef store_state_tool( state: dict[str, typing.Any], tool_context: ToolContext ) - dict[str, str]: tool_context.state.update(state) return {status: ok}它是整个工作流的数据骨干会议日期user_requested_meeting_date、提取的会议元数据、meeting_summary、rate_move_probabilities等均通过它写入 ToolContext供后续子 Agent 读取。这也是为什么 root_agent 与各子 Agent 都挂载了该工具。compare_statementsPDF 下载 语义 diff 生成 redline实现见 tools/compare_statements.py。它从 state 读取requested_meeting_statement_pdf_url与previous_meeting_statement_pdf_url相对路径自动拼接https://www.federalreserve.gov前缀经 shared_libraries/file_utils.py 的download_file_from_url下载 PDF 并保存为 artifactcurr.pdf/prev.pdf再用pdfplumber逐页抽取文本分别以requested_statement_fulltext、previous_statement_fulltext保存为 artifact最后基于diff-match-patch生成带删除红色del与新增绿色ins高亮的 HTML redline存为statement_redlineartifact。fetch_transcript会议纪要 PDF 抽取实现见 tools/fetch_transcript.py逻辑与 compare_statements 的下载部分一致从 state 读取transcript_url下载 PDF 并保存为transcript.pdfartifact抽取全文后以transcript_fulltext存入 artifact供summarize_meeting_agent通过{artifact.transcript_fulltext}读取。compute_probability_toolFed Futures 隐含概率计算实现见 tools/compute_rate_move_probability.py读取 state 中的requested_meeting_date调用 shared_libraries/price_utils.py 的compute_probabilities结果以rate_move_probabilities写入 state。其计算原理见price_utils.py从 BigQuery 表{dataset}.timeseries_data查询近月/远月联邦基金期货价格默认时间序列代码SFRH5,SFRZ5可用环境变量GOOGLE_GENAI_FOMC_AGENT_TIMESERIES_CODES覆盖BigQuery 数据集名可用GOOGLE_CLOUD_BQ_DATASET覆盖默认fomc_research_agent隐含利率 100 - 期货价格两个合约的隐含利率差除以 25bp 步长MOVE_SIZE_BP 25得到期望变动次数number_of_movesfed_meeting_probabilities把变动次数的小数部分换算为「加息/降息 X bp 的概率」与「不变动的概率」分别计算会议前一天与会议当天的概率形成「会前 vs 会后」两组对比输出。核心组件rate_limit_callback 限流回调实现见 shared_libraries/callbacks.py。它作为before_model_callback挂在所有 Agent 上目的是最小化429: Resource Exhausted错误。核心逻辑常量RATE_LIMIT_SECS 60、RPM_QUOTA 1000注释说明可按需调整以限制 LLM API 查询速率回调上下文CallbackContext.state中维护timer_start与request_count当窗口内请求数超过RPM_QUOTA时计算距离RATE_LIMIT_SECS窗口结束的剩余时间并time.sleep(delay)等待随后重置计数器。这展示了 ADK 回调机制的一种典型用法在不修改任何 Agent 业务逻辑的前提下通过回调统一注入横切关注点限流、观测等。环境准备与安装前置条件Google Cloud SDK 与 GCP 项目BigQuery 数据准备和 Agent Runtime 部署都需要一个 Google Cloud 项目。创建项目后安装 Google Cloud SDK 并认证gcloud auth login启用所需 APIgcloud services enable aiplatform.googleapis.com gcloud services enable bigquery.googleapis.com安装依赖克隆本仓库并进入示例目录本仓库为只读镜像克隆地址为https://gitcode.com/GitHub_Trending/ad/adk-samples.gitgit clone https://gitcode.com/GitHub_Trending/ad/adk-samples.git cd adk-samples/python/agents/fomc-research使用 uv 进行依赖管理按 uv 官方安装脚本安装后uv sync --dev该命令会同时安装正式发布的google-adkGoogle Agent Development Kit。依赖清单见 pyproject.toml其中要求 Python3.11并包含google-adk1.31.0、google-cloud-bigquery3.30.0、google-genai1.5.0、pdfplumber0.11.5、diff-match-patch、scikit-learn1.6.1等关键依赖。配置环境变量仓库提供了.env-example模板将其内容按你的项目值修改后保存为.env。若使用bash可将.env变量导出到当前 shellset -o allexport . .env set o allexport非 bash 环境需手动导出。从源码看运行时实际生效的关键变量包括GOOGLE_CLOUD_PROJECT、GOOGLE_CLOUD_LOCATION默认global、GOOGLE_GENAI_USE_VERTEXAI默认True、GOOGLE_GENAI_MODEL默认gemini-2.5-flash、GOOGLE_GENAI_FOMC_AGENT_LOG_LEVEL、GOOGLE_CLOUD_BQ_DATASET默认fomc_research_agent、GOOGLE_GENAI_FOMC_AGENT_TIMESERIES_CODES默认SFRH5,SFRZ5。BigQuery 数据准备compute_probability_tool依赖 BigQuery 中存放 Fed Futures 定价数据的表。仓库 deployment/ 目录提供了样本数据 sample_timeseries_data.csv覆盖 2025-01-29 与 2025-03-19 两次 FOMC 会议字段为timeseries_code,date,value如SFRH5,2025-01-28,95.785。若需分析其他会议必须自行补充数据。在fomc-research/deployment目录下运行 bigquery_setup.py 建表并导入数据python bigquery_setup.py --project_id$GOOGLE_CLOUD_PROJECT \ --dataset_id$GOOGLE_CLOUD_BQ_DATASET \ --location$GOOGLE_CLOUD_LOCATION \ --data_filesample_timeseries_data.csv从脚本源码看其行为细节如下--project_id、--dataset_id为必填--location可选默认us-east1--data_file可选指向 CSV 路径自动创建数据集已存在则复用建表timeseries_dataschema 为timeseries_code STRING (REQUIRED)、date DATE (REQUIRED)、value FLOAT (REQUIRED)CSV 导入默认WRITE_APPEND追加写入可选WRITE_TRUNCATE/WRITE_EMPTY表名timeseries_data与price_utils.py中查询语句FROM {DATASET_NAME}.timeseries_data严格对应。运行 Agent方式一ADK 命令行在fomc-research目录下执行adk run fomc_research启动输出会包含一条用于实时跟踪 Agent 日志的命令形如tail -F /tmp/agents_log/agent.latest.log方式二ADK Dev UI在fomc-research目录下执行adk web .终端会打印一个 URL用浏览器打开即可。UI 初始为空白需在左上角下拉框中选择fomc_research加载 Agent。若既想保存交互日志又想实时跟踪可运行adk web . fomc_research_log.txt 21 tail -f fomc_research_log.txt示例交互以 Hello. What can you do for me? 开启对话首个提示后输入日期 2025-01-29交互大致如下$ adk run . Log setup complete: /tmp/agents_log/agent.20250405_140937.log To access latest log: tail -F /tmp/agents_log/agent.latest.log Running agent root_agent, type exit to exit. user: Hello. What can you do for me? [root_agent]: I can help you analyze past Fed Open Market Committee (FOMC) meetings and provide you with a thorough analysis report. To start, please provide the date of the meeting you would like to analyze. If you have already provided it, please confirm the date. I need the date in ISO format (YYYY-MM-DD). user: 2025-01-29 [analysis_agent]: Here is a summary and analysis of the January 29, 2025 FOMC meeting, based on the available information: ...若 Agent 在完成分析前中途停止可尝试让它继续见下文 Troubleshooting。部署到 Agent Runtime1. 初始化 GCP 项目与授权先按照 Google Cloud 官方文档完成 Agent Runtime 的项目初始化配置。随后需要为 Reasoning Engine Service Agent 授予 BigQuery 权限export RE_SAservice-${GOOGLE_CLOUD_PROJECT_NUMBER}gcp-sa-aiplatform-re.iam.gserviceaccount.com gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --memberserviceAccount:${RE_SA} \ --conditionNone \ --roleroles/bigquery.user gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --memberserviceAccount:${RE_SA} \ --conditionNone \ --roleroles/bigquery.dataViewer2. 构建 wheel 包在fomc-research目录下构建 wheeluv build --wheel --out-dirdeployment这会在deployment目录生成形如fomc_research-0.1.0-py3-none-any.whl的文件。注意deploy.py 中硬编码的AGENT_WHL_FILE fomc_research-0.1-py3-none-any.whl与 README 描述的产物名存在版本号差异实际部署前请确保deployment目录中的 wheel 文件名与deploy.py中的常量一致或按实际产物调整。3. 创建 Agent Runtime 资源cd deployment python3 deploy.py --create成功后输出一个 Agent Runtime 资源名形如projects/************/locations/us-east1/reasoningEngines/7737333693403889664末尾数字串即 Agent Runtime 资源 ID。从deploy.py源码看--create通过vertexai.agent_engines.create(AdkApp(agentroot_agent), requirements[...], extra_packages[...])完成部署且要求环境变量GOOGLE_CLOUD_PROJECT、GOOGLE_CLOUD_LOCATION、GOOGLE_CLOUD_STORAGE_BUCKET均已配置也可用--project_id、--location、--bucket显式传入。4. 与已部署 Agent 交互部署成功后可用 deployment/test_deployment.py 与之交互。把资源 ID 存入环境变量并运行export RESOURCE_ID... export USER_IDany string python test_deployment.py --resource_id$RESOURCE_ID --user_id$USER_ID会话大致如下Found agent with resource ID: ... Created session for user ID: ... Type quit to exit. Input: Hello. What can you do for me? Response: I can create an analysis report on FOMC meetings. To start, please provide the date of the meeting you want to analyze. I need the date in YYYY-MM-DD format. Input: 2025-01-29 Response: I have stored the date you provided. Now I will retrieve the meeting data. ...需要说明这是一个演示用、非生产级CLI仅用于展示如何通过 Agent Runtime API 与已部署 Agent 交互。其核心代码逻辑如下from vertexai import agent_engines remote_agent vertexai.agent_engines.get(RESOURCE_ID) session remote_agent.create_session(user_idUSER_ID) while True: user_input input(Input: ) if user_input quit: break for event in remote_agent.stream_query( user_idUSER_ID, session_idsession[id], messageuser_input, ): parts event[content][parts] for part in parts: if text in part: text_part part[text] print(fResponse: {text_part})5. 删除 Agent使用之前返回的资源 ID 删除python3 deployment/deploy.py --delete --resource_id$RESOURCE_ID备选方案Google Agents CLI如需生产级版本与更多部署选项可使用 Google Agents CLI。一次性安装uvx google-agents-cli setup后基于本示例创建项目agents-cli create my-fomc-research -a adkfomc-research该 CLI 会引导选择部署选项并提供自动化 CI/CD 部署脚本等生产级能力。Troubleshooting 常见问题Malformed function call偶尔 Agent 会返回 Malformed function call 错误。这是 Gemini 模型的已知问题预期在后续模型版本中修复。最简单的处理方式是重启 UIAgent 会自动重置。Agent 中途停止Agent 偶尔会在完成某个中间步骤后停下。此时通常只需告诉它「继续」continue或类似的继续操作指令即可让工作流接着往下执行。免责声明本示例仅用于说明性目的并非面向生产环境。它作为 Agent 的基础示例和起点供个人或团队在此基础上开发自己的 Agent。该示例未经严格测试可能包含缺陷或限制也不包含生产环境通常需要的特性与优化如健壮的错误处理、安全措施、可扩展性、性能考量、完善的日志与高级配置选项。基于本示例做任何衍生开发、测试、安全加固与部署责任由使用者自负在将衍生 Agent 用于真实或关键系统前务必进行充分审查、测试并实施适当的安全防护。延伸阅读如需在仓库内继续深入可重点阅读 fomc_research/agent.py编排入口、fomc_research/sub_agents/各子 Agent 及提示词、fomc_research/tools/工具实现、fomc_research/shared_libraries/限流回调、PDF 处理与概率计算以及 deployment/BigQuery 建表与 Agent Runtime 部署脚本。【免费下载链接】adk-samplesA collection of sample agents built with Agent Development Kit (ADK)项目地址: https://gitcode.com/GitHub_Trending/ad/adk-samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考