
在投资研究领域传统方法往往依赖研究员手动收集数据、阅读财报、撰写分析报告这个过程耗时耗力且容易受到个人经验和情绪的影响。随着大语言模型能力的提升构建一个能够自动化执行部分研究流程的智能体系统成为提升研究效率和客观性的新思路。xbtlin/ai-berkshire项目正是这一思路的实践它旨在利用 AI Agent 技术构建一个模拟巴菲特价值投资理念的自动化投资研究框架。本文面向对 AI Agent 应用、自动化工作流以及投资研究感兴趣的开发者我们将从零开始解析如何构建一个多 Agent 协作的投资研究系统涵盖从环境搭建、核心 Agent 设计、通信机制到实际运行和问题排查的全过程。通过本文你将能够理解多 Agent 系统的设计哲学并具备搭建一个基础版自动化研究框架的能力。1. 理解多 Agent 协作投资研究框架的核心概念在深入代码之前我们需要厘清几个关键概念这决定了我们如何设计整个系统。1.1 什么是 AI AgentAI Agent 并非一个神秘的概念。简单来说它是一个能够感知环境、进行决策并执行行动以实现特定目标的软件实体。在ai-berkshire的上下文中一个 Agent 就是一个专门化的“研究员”。它被赋予特定的角色如“数据收集员”、“财务分析师”、“报告撰写员”拥有明确的目标如“获取某公司近五年营收数据”、“计算关键财务比率”、“生成投资建议摘要”并配备相应的工具如网络搜索 API、Python 计算库、文档生成器和能力由大语言模型驱动。单个 Agent 可以完成一个独立任务而多个 Agent 协作则可以串联起一个复杂的工作流。1.2 多 Agent 协作的价值与挑战为什么需要多个 Agent 协作因为投资研究是一个多步骤、多专业的复合型任务。让一个“全能型”Agent 去完成所有工作不仅对模型能力要求极高也容易导致任务混乱、上下文过长和效果下降。分工协作是更高效的方式数据 Agent负责从公开渠道如财经网站、交易所公告爬取或调用 API 获取原始数据。分析 Agent负责处理数据进行计算如增长率、利润率、估值指标并识别关键趋势和风险点。报告 Agent负责整合数据和初步分析按照既定模板如 SWOT 分析、投资建议书生成结构化的研究报告。管理/协调 Agent负责任务的分解、调度以及协调其他 Agent 之间的信息传递。这种架构的挑战在于 Agent 间的通信与状态管理。Agent A 如何将处理好的数据交给 Agent B整个研究流程的进度如何跟踪某个环节失败如何处理这些都是设计时必须考虑的问题。1.3 Claude Code 与 Agent 开发工具从热搜词可以看出Claude Code和Cursor等 AI 编程工具被频繁提及。它们可以作为强大的辅助帮助开发者更快地编写 Agent 的逻辑代码、设计提示词Prompt。但需要明确的是ai-berkshire这类项目本身是一个框架或应用它需要被部署和运行在一个具体的环境中如本地服务器、云服务器。Claude Code更像是一个“开发伙伴”而不是运行时的必需依赖。项目的核心运行依赖通常是 Python 环境、大模型 API如 OpenAI GPT、Claude、国内大模型以及可能的消息队列用于 Agent 通信。2. 环境准备与核心依赖配置在开始构建之前我们需要搭建一个稳定、可复现的开发环境。由于原始项目描述较为简略我们将基于常见的 AI Agent 开发栈进行构建。2.1 基础开发环境首先确保你的操作系统Windows/macOS/Linux已安装以下基础软件Python 3.9这是大多数 AI 库和框架的基础。推荐使用 Python 3.10 或 3.11 以获得更好的兼容性。# 检查Python版本 python --version # 或 python3 --versionGit用于克隆项目和版本管理。git --version包管理工具使用pip或更推荐的poetry、conda来管理虚拟环境和依赖。本文以pip和venv为例。# 创建虚拟环境以项目名ai-berkshire为例 python -m venv ai-berkshire-env # 激活虚拟环境 # Windows: ai-berkshire-env\Scripts\activate # macOS/Linux: source ai-berkshire-env/bin/activate2.2 核心 Python 依赖一个典型的多 Agent 框架会涉及以下几个方面的库。我们创建一个requirements.txt文件来管理它们。# 核心Agent框架/工具包 (示例实际需根据项目选择) langchain0.1.0 # 一个流行的构建LLM应用的框架包含Agent基础组件 # 或 autogen, crewai 等专门的多Agent框架 # 大模型接口 openai1.0.0 # 如需使用GPT系列模型 anthropic # 如需使用Claude模型 # 工具库 requests2.28.0 # 用于网络请求数据Agent必备 beautifulsoup44.11.0 # 用于网页解析 pandas1.5.0 # 数据分析与处理 numpy1.24.0 # 数值计算 # 通信与协调如果需要异步或分布式 # pika # RabbitMQ客户端 # redis # Redis客户端 # 配置管理 python-dotenv1.0.0 # 管理环境变量保护API密钥 # 开发与测试 pytest7.0.0使用pip安装pip install -r requirements.txt注意langchain是一个强大的工具但其Agent模块更偏向于让单个 LLM 动态选择工具链。对于需要长期运行、有明确角色和状态的多 Agent 系统你可能需要在其基础上进行封装或者考虑CrewAI、AutoGen等更专注于多 Agent 协作的框架。本文后续示例将采用一种简化的自定义模式以便于理解底层原理。2.3 大模型 API 密钥配置几乎所有 Agent 的核心都是大语言模型。你需要准备相应平台的 API Key。访问 OpenAI、Anthropic 或你选择的国内大模型平台注册并获取 API Key。在项目根目录创建.env文件并添加你的密钥。务必将该文件加入.gitignore切勿提交到代码仓库。# .env 文件示例 OPENAI_API_KEYsk-your-openai-api-key-here ANTHROPIC_API_KEYyour-claude-api-key-here # 国内模型示例 DASHSCOPE_API_KEYyour-dashscope-api-key-here # 阿里通义千问在代码中使用python-dotenv加载配置from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的环境变量 openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY)3. 设计并实现一个简化的多 Agent 研究系统我们将构建一个包含三个核心 Agent数据收集、财务分析、报告生成和一个简单协调器的最小可行系统。这个系统将模拟分析一家上市公司例如贵州茅台600519.SH的基本面。3.1 项目结构设计清晰的项目结构是维护多 Agent 系统的前提。ai-berkshire-project/ ├── .env # 环境变量密钥 ├── .gitignore ├── requirements.txt ├── config.py # 配置文件 ├── coordinator.py # 协调器 ├── agents/ # Agent 实现目录 │ ├── __init__.py │ ├── base_agent.py # Agent 基类 │ ├── data_agent.py │ ├── analysis_agent.py │ └── report_agent.py ├── tools/ # 工具函数目录 │ ├── __init__.py │ ├── data_fetcher.py # 数据获取工具 │ └── calculator.py # 财务计算工具 ├── models/ # 数据模型目录 │ ├── __init__.py │ └── research_task.py # 任务定义 └── main.py # 程序入口3.2 定义核心数据模型在models/research_task.py中我们定义任务在 Agent 间传递的数据结构。from pydantic import BaseModel from typing import Dict, Any, Optional, List from datetime import datetime class CompanyInfo(BaseModel): 公司基本信息 symbol: str # 股票代码如 “600519.SH” name: str industry: Optional[str] None class FinancialData(BaseModel): 财务数据容器 raw_data: Dict[str, Any] # 原始数据如从API获取的JSON processed_data: Optional[Dict[str, Any]] None # 处理后的数据如计算好的比率 period: str # 报告期如 “2023” class ResearchTask(BaseModel): 一个完整的研究任务 task_id: str company: CompanyInfo status: str PENDING # PENDING, DATA_COLLECTING, ANALYZING, REPORTING, COMPLETED, FAILED current_agent: Optional[str] None financial_data: Optional[FinancialData] None analysis_result: Optional[Dict[str, Any]] None report_content: Optional[str] None created_at: datetime datetime.now() updated_at: datetime datetime.now() def update_status(self, new_status: str, agent_name: str): self.status new_status self.current_agent agent_name self.updated_at datetime.now()3.3 实现 Agent 基类与工具在agents/base_agent.py中我们创建一个所有 Agent 都继承的基类。from abc import ABC, abstractmethod from models.research_task import ResearchTask import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class BaseAgent(ABC): Agent 基类定义通用接口和行为 def __init__(self, name: str): self.name name abstractmethod async def execute(self, task: ResearchTask) - ResearchTask: 执行 Agent 的核心任务必须由子类实现 pass def log_start(self, task: ResearchTask): logger.info(f[{self.name}] 开始处理任务 {task.task_id}目标公司{task.company.name}) def log_end(self, task: ResearchTask): logger.info(f[{self.name}] 完成任务 {task.task_id}。当前状态{task.status})在tools/data_fetcher.py中我们实现一个模拟的数据获取工具。实际项目中这里应接入真实的财经数据 API如 Akshare、Tushare、Yahoo Finance 等。import requests import json from typing import Dict, Any class MockDataFetcher: 模拟数据获取器返回预设的静态数据 staticmethod def fetch_financial_data(symbol: str) - Dict[str, Any]: # 警告此处为模拟数据仅用于演示 # 真实场景应调用 API并处理错误和限流 mock_data { “income_statement”: { “revenue”: [1000, 1100, 1210, 1331, 1464], # 近五年营收单位亿 “net_profit”: [500, 550, 605, 666, 732] # 近五年净利润 }, “balance_sheet”: { “total_assets”: 3000, “total_liabilities”: 800, “equity”: 2200 } } return {“symbol”: symbol, “data”: mock_data}3.4 实现具体 Agent数据收集 Agent (agents/data_agent.py)from agents.base_agent import BaseAgent from models.research_task import ResearchTask, FinancialData from tools.data_fetcher import MockDataFetcher import asyncio class DataAgent(BaseAgent): def __init__(self): super().__init__(name“DATA_AGENT”) self.fetcher MockDataFetcher() async def execute(self, task: ResearchTask) - ResearchTask: self.log_start(task) task.update_status(“DATA_COLLECTING”, self.name) try: # 1. 获取数据 raw_data self.fetcher.fetch_financial_data(task.company.symbol) # 2. 封装到任务中 task.financial_data FinancialData( raw_dataraw_data, period“最近五年” ) # 3. 更新状态准备移交 task.update_status(“ANALYZING”, self.name) self.log_end(task) except Exception as e: logger.error(f“[{self.name}] 数据获取失败: {e}”) task.update_status(“FAILED”, self.name) task.analysis_result {“error”: f“数据获取失败: {str(e)}”} return task财务分析 Agent (agents/analysis_agent.py)from agents.base_agent import BaseAgent from models.research_task import ResearchTask import asyncio import logging logger logging.getLogger(__name__) class AnalysisAgent(BaseAgent): def __init__(self): super().__init__(name“ANALYSIS_AGENT”) async def execute(self, task: ResearchTask) - ResearchTask: self.log_start(task) task.update_status(“ANALYZING”, self.name) if not task.financial_data: task.update_status(“FAILED”, self.name) task.analysis_result {“error”: “财务数据缺失无法进行分析”} return task try: raw_data task.financial_data.raw_data[“data”] revenue raw_data[“income_statement”][“revenue”] net_profit raw_data[“income_statement”][“net_profit”] # 计算复合年增长率 (CAGR) cagr_revenue (revenue[-1] / revenue[0]) ** (1/len(revenue)) - 1 cagr_profit (net_profit[-1] / net_profit[0]) ** (1/len(net_profit)) - 1 # 计算净利率 profit_margin [p/r for p, r in zip(net_profit, revenue)] avg_profit_margin sum(profit_margin) / len(profit_margin) # 简单负债率计算 assets raw_data[“balance_sheet”][“total_assets”] liabilities raw_data[“balance_sheet”][“total_liabilities”] debt_ratio liabilities / assets if assets 0 else 0 analysis_result { “revenue_cagr”: round(cagr_revenue, 4), “profit_cagr”: round(cagr_profit, 4), “avg_profit_margin”: round(avg_profit_margin, 4), “debt_ratio”: round(debt_ratio, 4), “interpretation”: “公司营收和利润保持稳定增长净利率较高负债水平健康。” } task.financial_data.processed_data analysis_result task.analysis_result analysis_result task.update_status(“REPORTING”, self.name) self.log_end(task) except Exception as e: logger.error(f“[{self.name}] 财务分析失败: {e}”) task.update_status(“FAILED”, self.name) task.analysis_result {“error”: f“财务分析失败: {str(e)}”} return task报告生成 Agent (agents/report_agent.py)这个 Agent 将调用大语言模型来生成最终报告。我们以 OpenAI GPT 为例。from agents.base_agent import BaseAgent from models.research_task import ResearchTask from openai import OpenAI import os from dotenv import load_dotenv import asyncio load_dotenv() class ReportAgent(BaseAgent): def __init__(self): super().__init__(name“REPORT_AGENT”) api_key os.getenv(“OPENAI_API_KEY”) if not api_key: raise ValueError(“未找到 OPENAI_API_KEY请在 .env 文件中配置”) self.client OpenAI(api_keyapi_key) async def execute(self, task: ResearchTask) - ResearchTask: self.log_start(task) task.update_status(“REPORTING”, self.name) if not task.analysis_result: task.update_status(“FAILED”, self.name) task.report_content “分析结果缺失无法生成报告” return task try: # 构建给 LLM 的提示词 prompt f“”” 你是一名专业的证券分析师。请根据以下信息生成一份简短的投资研究报告摘要。 公司信息 - 名称{task.company.name} - 代码{task.company.symbol} 关键财务分析结果 {task.analysis_result} 报告要求 1. 用中文撰写。 2. 总结公司的财务表现。 3. 基于数据给出初步的投资观点正面、中性或谨慎。 4. 指出潜在的风险点。 5. 字数控制在300字以内。 ““” response self.client.chat.completions.create( model“gpt-3.5-turbo”, # 或 “gpt-4” messages[ {“role”: “system”, “content”: “你是一名资深投资研究员。”}, {“role”: “user”, “content”: prompt} ], temperature0.7, max_tokens500 ) report response.choices[0].message.content task.report_content report task.update_status(“COMPLETED”, self.name) self.log_end(task) except Exception as e: logger.error(f“[{self.name}] 报告生成失败: {e}”) task.update_status(“FAILED”, self.name) task.report_content f“报告生成失败: {str(e)}” return task3.5 实现任务协调器协调器负责创建任务并按顺序驱动各个 Agent 工作。这是一个简单的同步协调器 (coordinator.py)。from models.research_task import ResearchTask, CompanyInfo from agents.data_agent import DataAgent from agents.analysis_agent import AnalysisAgent from agents.report_agent import ReportAgent import asyncio import uuid class SimpleCoordinator: def __init__(self): self.data_agent DataAgent() self.analysis_agent AnalysisAgent() self.report_agent ReportAgent() async def run_research_pipeline(self, company_symbol: str, company_name: str): 运行完整的研究流水线 # 1. 创建研究任务 task_id str(uuid.uuid4())[:8] task ResearchTask( task_idtask_id, companyCompanyInfo(symbolcompany_symbol, namecompany_name) ) print(f“开始研究任务 {task_id}: {company_name}({company_symbol})“) # 2. 顺序执行 Agent # 数据收集 task await self.data_agent.execute(task) if task.status “FAILED”: print(f“任务失败于数据收集阶段: {task.analysis_result}”) return task # 财务分析 task await self.analysis_agent.execute(task) if task.status “FAILED”: print(f“任务失败于财务分析阶段: {task.analysis_result}”) return task # 报告生成 task await self.report_agent.execute(task) if task.status “FAILED”: print(f“任务失败于报告生成阶段: {task.report_content}”) return task print(f“研究任务 {task_id} 完成”) return task3.6 创建程序入口最后在main.py中启动整个流程。import asyncio from coordinator import SimpleCoordinator async def main(): coordinator SimpleCoordinator() # 模拟研究贵州茅台 result_task await coordinator.run_research_pipeline( company_symbol“600519.SH”, company_name“贵州茅台” ) print(“\n” “”*50) print(“最终研究报告”) print(“”*50) if result_task.report_content: print(result_task.report_content) else: print(“报告生成失败。”) print(f“错误信息: {result_task.analysis_result or ‘未知错误’}”) print(“\n” “”*50) print(“原始分析数据”) print(“”*50) print(result_task.analysis_result) if __name__ “__main__”: asyncio.run(main())4. 运行验证与结果分析完成代码编写后我们可以运行系统观察整个多 Agent 协作流程。4.1 启动研究任务在项目根目录下运行python main.py4.2 预期输出与日志你应该能在控制台看到类似以下的输出清晰地展示了任务在不同 Agent 间的流转状态开始研究任务 a1b2c3d4: 贵州茅台(600519.SH) [DATA_AGENT] 开始处理任务 a1b2c3d4目标公司贵州茅台 [DATA_AGENT] 完成任务 a1b2c3d4。当前状态ANALYZING [ANALYSIS_AGENT] 开始处理任务 a1b2c3d4目标公司贵州茅台 [ANALYSIS_AGENT] 完成任务 a1b2c3d4。当前状态REPORTING [REPORT_AGENT] 开始处理任务 a1b2c3d4目标公司贵州茅台 [REPORT_AGENT] 完成任务 a1b2c3d4。当前状态COMPLETED 研究任务 a1b2c3d4 完成 最终研究报告 **贵州茅台(600519.SH)投资研究摘要** 基于提供的财务数据分析贵州茅台在过去五年间展现出强劲且稳健的财务表现。营收与净利润的复合年增长率CAGR均保持在健康水平反映出公司强大的市场地位和持续的增长动力。平均净利率维持在较高水准凸显了其卓越的盈利能力和成本控制能力。资产负债率处于较低水平财务结构稳健偿债风险较小。 **投资观点正面。** 公司基本面扎实财务数据支持其作为行业龙头的竞争优势和持续增长潜力。 **潜在风险点** 1. 行业政策变动可能对高端白酒消费产生影响。 2. 经济增长放缓可能影响高端消费需求。 3. 估值水平需结合当前市场环境进行判断。 报告完 原始分析数据 {‘revenue_cagr’: 0.1, ‘profit_cagr’: 0.1, ‘avg_profit_margin’: 0.5, ‘debt_ratio’: 0.2667, ‘interpretation’: ‘公司营收和利润保持稳定增长净利率较高负债水平健康。’}4.3 结果分析流程验证日志显示任务状态从PENDING-DATA_COLLECTING-ANALYZING-REPORTING-COMPLETED顺利流转证明了多 Agent 协作管道的有效性。数据流DataAgent产生的FinancialData被成功传递给AnalysisAgent进行处理处理后的analysis_result又被ReportAgent用于生成最终报告。输出质量最终报告由 LLM 生成它成功解读了我们计算出的财务指标10%的 CAGR50%的平均净利率26.67%的负债率并形成了结构化的投资观点和风险提示。这验证了将结构化数据分析与 LLM 的叙事能力结合的价值。5. 常见问题排查与优化在实际开发和运行中你可能会遇到以下问题。这里提供排查思路和解决方案。5.1 Agent 执行失败问题排查问题现象可能原因检查方式处理建议DataAgent失败状态卡在DATA_COLLECTING1. 模拟数据函数异常。2. 网络请求超时或 API 变更如果使用真实 API。3. 数据解析错误。1. 查看DataAgent.execute()方法中的try-except块是否捕获并记录了错误日志。2. 如果是真实 API检查网络连接、API 密钥、请求参数和频率限制。1. 完善MockDataFetcher的健壮性或替换为稳定的数据源。2. 在数据获取工具中加入重试机制和更详细的错误日志。AnalysisAgent失败状态卡在ANALYZING1. 上游DataAgent未提供financial_data。2. 财务数据格式与预期不符。3. 计算过程出现除零等数学错误。1. 检查task.financial_data是否为None。2. 打印task.financial_data.raw_data的结构验证其键值。3. 检查计算逻辑特别是涉及除法的部分。1. 在AnalysisAgent.execute()开头增加数据有效性校验。2. 使用pydantic模型对数据进行更严格的验证。3. 在计算中加入异常捕获和默认值处理。ReportAgent失败状态卡在REPORTING1.OPENAI_API_KEY未正确设置或无效。2. OpenAI API 服务不可用或超时。3. 提示词构造有误导致 API 调用失败。4. 网络问题。1. 确认.env文件已加载且变量名正确。2. 在代码中直接打印os.getenv(“OPENAI_API_KEY”)的前几位切勿打印完整密钥。3. 查看 OpenAI API 返回的错误信息。4. 尝试一个最简单的chat.completions.create调用进行连通性测试。1. 确保.env文件在项目根目录并使用load_dotenv()。2. 在 API 调用外层添加重试逻辑和超时设置。3. 简化提示词进行测试。4. 考虑使用异步 HTTP 客户端如httpx或设置更长的超时时间。所有 Agent 瞬间完成报告内容为空或错误使用了异步 (async/await) 但未正确运行事件循环。检查main.py中是否使用了asyncio.run(main())来启动异步函数。确保入口函数是async的并使用asyncio.run()调用。对于更复杂的调度可能需要使用asyncio.gather()来并发执行多个任务。5.2 性能与扩展性优化当前实现是简单的顺序同步执行适用于学习和原型验证。对于生产环境需要考虑以下优化异步并发如果研究多个公司可以让多个DataAgent实例并发获取数据。可以使用asyncio.gather()来并发运行多个任务的同一阶段。任务队列引入消息队列如 Redis, RabbitMQ。协调器将任务发布到队列各个 Agent 作为消费者从队列中拉取任务执行。这解耦了 Agent并支持水平扩展。状态持久化将ResearchTask的状态存入数据库如 SQLite, PostgreSQL而不是仅存在于内存中。这样即使程序重启也能恢复任务状态。超时与重试为每个 Agent 的执行设置超时并在失败时进行有限次数的重试。更复杂的协调逻辑当前的协调器是硬编码的顺序流程。可以引入一个Orchestrator Agent由它根据任务描述动态决定调用哪些 Agent 以及调用顺序。5.3 提示词工程优化ReportAgent的效果严重依赖提示词。以下是一些优化方向提供示例在系统提示中提供一两个高质量报告示例Few-shot Learning。结构化输出要求 LLM 以 JSON 等特定格式输出便于后续程序化处理。迭代优化根据生成报告的问题如遗漏关键风险、观点模糊不断调整提示词。使用更高级的框架考虑使用LangChain的ChatPromptTemplate、LCEL来更优雅地构建和管理复杂的提示词链。6. 生产环境最佳实践与扩展方向将这样一个系统用于实际生产研究还需要考虑更多因素。6.1 安全与合规API 密钥管理永远不要将密钥硬编码在代码中。使用.env文件并在生产环境使用密钥管理服务如 AWS Secrets Manager, HashiCorp Vault。数据源合规确保使用的数据源是合法合规的遵守相关网站的robots.txt协议和数据使用条款。优先考虑购买专业的金融数据 API 服务。内容审核对 LLM 生成的报告内容进行必要的审核避免产生误导性、违规或敏感信息。6.2 可观测性与监控日志标准化使用structlog或logging模块配置 JSON 格式的日志并记录每个任务 ID、Agent 名称、开始时间、结束时间、状态和错误信息。方便接入 ELKElasticsearch, Logstash, Kibana或 Loki 等日志系统。指标收集收集关键指标如每个 Agent 的平均处理时间、任务成功率、LLM API 调用耗时和消耗的 Token 数。可以使用 Prometheus 客户端库。链路追踪为每个研究任务生成唯一的trace_id并在所有日志和跨服务调用中传递便于追踪一个请求的完整生命周期。6.3 扩展系统能力增加更多类型的 Agent新闻舆情 Agent爬取或订阅公司相关新闻、公告、社交媒体情绪。行业对比 Agent获取同行业其他公司的数据进行横向对比分析。估值模型 Agent尝试使用 DCF、可比公司等模型进行估值测算。风险识别 Agent专门从财报文本和新闻中识别潜在风险关键词。引入人工审核环节在ReportAgent之后增加一个任务状态AWAITING_REVIEW并将报告发送给人类研究员进行最终审核和修改形成“人机协同”的流程。实现动态工作流根据初步分析结果动态决定下一步动作。例如如果分析发现负债率异常高则自动触发一个深度债务分析子流程。6.4 框架选型建议对于更严肃的项目建议基于成熟的框架进行开发而不是完全从零开始CrewAI专为多 Agent 协作设计角色Role、任务Task、工具Tool、流程Process的概念清晰易于构建复杂的协作工作流。AutoGen由微软推出支持定义可对话的 Agent并能自动进行多轮对话来解决复杂任务在需要 Agent 间反复讨论的场景下很有优势。LangGraph (LangChain)LangChain的新模块用于构建有状态的、多参与者的图工作流非常适合对执行流程有精细控制需求的场景。构建一个像ai-berkshire这样的多 Agent 投资研究框架核心在于对复杂任务进行合理的分解与编排。从简单的顺序管道开始逐步引入并发、队列、持久化和动态流程是稳健的演进路径。始终牢记Agent 是工具它的价值在于可靠地执行明确指令。因此清晰的角色定义、健壮的工具函数、有效的错误处理以及持续的人类监督与优化才是这类系统成功的关键。