TradingAgents-CN 项目:多智能体设计与交互分析
TradingAgents-CN 多智能体设计与交互分析
引言:从大模型技术到业务价值的思考
大模型如何创造商业价值?这是当前 AI 领域最核心的问题之一。
从技术视角看,像 OpenClaw 这样的 Agent Infra(智能体基础设施)提供了构建多智能体系统的底层能力——状态管理、工具绑定、消息路由、记忆系统。然而,基础设施本身并不直接产生价值,真正的价值来自于将技术与具体业务场景的深度融合。
智能投研正是这样一个极具代表性的场景:
• 业务复杂度高:股票分析涉及技术面、基本面、新闻面、情绪面等多个维度,单一模型难以同时处理 • 决策质量要求高:投资决策直接影响资金安全,需要多方论证和风险控制 • 信息时效性强:市场瞬息万变,分析必须基于实时数据 • 可解释性需求:投资建议需要有清晰的推理链条,不能是"黑箱"输出
本文以 TradingAgents-CN 为案例,为你拆解智能投研场景下的多智能体设计与交互流程。我们不仅关注技术实现(每个智能体如何与 LLM 交互、Prompt 如何设计),更关注背后的业务逻辑——为什么需要多智能体?为什么需要辩论机制?为什么需要两层裁判?这些设计决策如何服务于投资分析的核心目标?
通过本文,你将理解:
1. 多智能体架构的业务价值:如何通过职责拆分和角色制衡提升分析质量 2. Prompt 工程的实战模式:不同类型智能体如何采用不同的 Prompt 策略 3. 状态流转的设计哲学:信息如何在智能体之间传递、汇聚、收敛 4. 辩论与裁判机制:如何模拟真实投资委员会的决策流程 5. 记忆系统与经验积累:如何让系统从历史决策中持续学习
项目地址:https://github.com/hsliuping/TradingAgents-CN
上游项目:https://github.com/TauricResearch/TradingAgents
1. 系统整体视角:为什么需要多智能体
传统单一 LLM 分析面临的核心瓶颈:
• 上下文有限:一次性将所有数据(行情、财务、新闻、情绪)喂给一个模型,Token 消耗大、质量下降 • 角色混淆:单 LLM 难以同时扮演技术分析师、基本面分析师、风险官等多个相互制衡的角色 • 缺乏博弈机制:投资决策的合理性来自多方观点的碰撞,单一输出无法模拟市场中的多空对立
TradingAgents-CN 的多智能体架构将分析拆分为三个阶段、十二个专职智能体,每个智能体只负责一个独立子任务,通过状态传递和辩论机制最终收敛到投资决策。
注:代码中还定义了一个独立的中国市场分析师(China Market Analyst),但该智能体未接入主分析图,不参与当前的单股分析流程。
2. 智能体全景图
下图展示了单股分析流程中十二个智能体的三阶段协作架构:
┌─────────────────────────────────────────────────────────────┐
│ 阶段一:信息收集 │
│ │
│ Market Analyst → Social Analyst → News Analyst │
│ ↓ ↓ ↓ │
│ [技术指标报告] [情绪分析报告] [新闻事件报告] │
│ │
│ Fundamentals Analyst │
│ ↓ │
│ [基本面报告] │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 阶段二:投研辩论 │
│ │
│ Bull Researcher ⇄ Bear Researcher │
│ (多轮辩论,N 由研究深度控制) │
│ ↓ │
│ Research Manager(裁判) │
│ ↓ │
│ [投研结论 / 投资计划] │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 阶段三:决策与风险 │
│ │
│ Trader │
│ ↓ │
│ [初步交易建议] │
│ ↓ │
│ Risky Analyst ⇄ Safe Analyst ⇄ Neutral Analyst │
│ (条件流转循环,每轮内决定继续辩论还是转入裁判) │
│ ↓ │
│ Risk Judge(裁判) │
│ ↓ │
│ [最终交易决策 → 结构化信号] │
└─────────────────────────────────────────────────────────────┘3. 各智能体职责设计详解
本章逐一介绍每个智能体的职责定义、LLM 交互方式和设计意图,按三个阶段分别展开。
3.1 信息收集阶段(四位分析师)
四位分析师构成信息收集矩阵,覆盖股票分析的四个维度,职责边界严格分离,互不交叉。
市场分析师
对应图中的 Market Analyst 节点,负责从技术面维度分析股票的价格行为与量价关系。
get_stock_market_data_unified | |
state["market_report"] |
职责设计意图: 纯技术面,不关心公司基本面,只从价格行为和量价关系出发,降低主观干扰。
基本面分析师
对应图中的 Fundamentals Analyst 节点,负责从财务数据维度评估公司估值与盈利能力。
get_stock_fundamentals_unified | |
state["fundamentals_report"] |
职责设计意图: 强制要求真实数据,Prompt 中明确禁止编造,输出目标价区间供后续智能体参考。
新闻分析师
对应图中的 News Analyst 节点,负责捕捉近期新闻事件中的短期催化剂和风险因素。
get_stock_news_unified | |
state["news_report"] |
职责设计意图: 捕捉短期催化剂和风险事件,优先抓取 15-30 分钟内的实时新闻,为辩论阶段提供时效性材料。
社交媒体分析师
对应图中的 Social Media Analyst 节点,负责从社交平台提取投资者情绪信号。
get_stock_sentiment_unified | |
state["sentiment_report"] |
职责设计意图: 量化市场情绪,弥补纯量化数据的不足,为散户与机构观点差异提供参考。
3.2 投研辩论阶段(三位辩论者)
辩论阶段的核心设计理念:用对立观点的碰撞替代单一视角的主观判断。
多头研究员
对应图中的 Bull Researcher 节点,负责从乐观视角构建看涨论据。
llm.invoke(prompt) | |
investment_debate_state.bull_history |
职责设计意图: 强制乐观视角,防止分析陷入单方面悲观。通过 {current_response} 接收上一轮空头论点,实现真正的针对性反驳。
空头研究员
对应图中的 Bear Researcher 节点,负责从悲观视角构建看跌论据。
llm.invoke(prompt) | |
investment_debate_state.bear_history |
职责设计意图: 强制悲观视角,质疑多头假设,提醒潜在风险。轮流辩论机制确保每一方都能回应对方的最新论点。
投研经理
对应图中的 Research Manager 节点,作为辩论裁判综合多空双方观点。
| 深度模型(deep_thinking_llm) | |
llm.invoke(prompt) | |
state["investment_plan"] |
职责设计意图: 作为辩论裁判,不偏向任何一方,提炼出有据可查的投研结论。使用深度模型确保综合推理质量,是多头/空头之争的"仲裁者"。
3.3 决策与风险阶段(五位决策者)
本阶段将投研结论转化为可执行的交易指令,并通过多角度风险辩论进行最终把关。
交易员
对应图中的 Trader 节点,负责将研究结论转化为可执行的交易指令。
llm.invoke([SystemMessage, HumanMessage]) | |
state["trader_investment_plan"] |
职责设计意图: 将研究结论转化为可执行的交易指令,Prompt 强制要求提供目标价、置信度和风险评分,不允许回避。
风险辩论三方
对应图中的 Risky Analyst、Safe Analyst 和 Neutral Analyst 三个节点,分别从激进、保守、中性三个角度评估交易决策的风险。
llm.invoke(prompt) | |
state["trader_investment_plan"] | |
risk_debate_state |
职责设计意图: 三角制衡机制,防止决策偏向单一风险偏好,模拟投资委员会中不同风险容忍度的委员。三方辩论以条件循环方式运行(Risky → Safe → Neutral → Risky →…),由 should_continue_risk_analysis 决定是继续辩论还是转入 Risk Judge,与投研辩论的轮流机制完全对称。注意:辩论三方读取的是 state["trader_investment_plan"](交易员的初步决策),而风险委员会主席读取的是 state["investment_plan"](投研经理的结论)——这是一个架构上的重要不对称设计。
风险委员会主席
对应图中的 Risk Judge 节点,作为最终决策者综合风险辩论结果。
| 深度模型 | |
llm.invoke(prompt) | |
state["final_trade_decision"] |
职责设计意图: 最终决策者,使用深度模型确保推理深度。设有明确的失败兜底机制(3 次重试失败→返回"持有"),保证系统稳健性。
4. 各智能体与 LLM 的 Prompt 交互分析
本章从 Prompt 工程的角度,完整引用每个智能体在代码中的实际 Prompt,并分析其设计模式及背后的考量。所有内容均以源码为准。
4.1 Prompt 设计模式概览
系统中的 Prompt 采用了三种不同的构建策略,针对不同的任务复杂度:
ChatPromptTemplateMessagesPlaceholder | ||
[{"role": "system"}, {"role": "user"}] 列表 |
4.2 市场分析师(Market Analyst)
文件:tradingagents/agents/analysts/market_analyst.py
市场分析师实现了两阶段 LLM 交互——第一次决定工具调用,第二次基于工具数据生成分析报告。
4.2.1 第一阶段:System Prompt(工具调用决策)
你是一位专业的股票技术分析师,与其他分析师协作。
📋 **分析对象:**
- 公司名称:{company_name}
- 股票代码:{ticker}
- 所属市场:{market_name}
- 计价货币:{currency_name}({currency_symbol})
- 分析日期:{current_date}
🔧 **工具使用:**
你可以使用以下工具:{tool_names}
⚠️ 重要工作流程:
1. 如果消息历史中没有工具结果,立即调用 get_stock_market_data_unified 工具
- ticker: {ticker}
- start_date: {current_date}
- end_date: {current_date}
注意:系统会自动扩展到365天历史数据,你只需要传递当前分析日期即可
2. 如果消息历史中已经有工具结果(ToolMessage),立即基于工具数据生成最终分析报告
3. 不要重复调用工具!一次工具调用就足够了!
4. 接收到工具数据后,必须立即生成完整的技术分析报告,不要再调用任何工具
📝 **输出格式要求(必须严格遵守):**
## 📊 股票基本信息
- 公司名称:{company_name}
- 股票代码:{ticker}
- 所属市场:{market_name}
## 📈 技术指标分析
[在这里分析移动平均线、MACD、RSI、布林带等技术指标,提供具体数值]
## 📉 价格趋势分析
[在这里分析价格趋势,考虑{market_name}市场特点]
## 💭 投资建议
[在这里给出明确的投资建议:买入/持有/卖出]
⚠️ **重要提醒:**
- 必须使用上述格式输出,不要自创标题格式
- 所有价格数据使用{currency_name}({currency_symbol})表示
- 确保在分析中正确使用公司名称"{company_name}"和股票代码"{ticker}"
- 不要在标题中使用"技术分析报告"等自创标题
- 如果你有明确的技术面投资建议(买入/持有/卖出),请在投资建议部分明确标注
- 不要使用'最终交易建议'前缀,因为最终决策需要综合所有分析师的意见
请使用中文,基于真实数据进行分析。LLM 调用方式:
chain = prompt | llm.bind_tools(tools)
result = chain.invoke({"messages": state["messages"]})