原力注入

TradingAgents-CN 项目:多智能体设计与交互分析

TradingAgents-CN 多智能体设计与交互分析

引言:从大模型技术到业务价值的思考

大模型如何创造商业价值?这是当前 AI 领域最核心的问题之一。

从技术视角看,像 OpenClaw 这样的 Agent Infra(智能体基础设施)提供了构建多智能体系统的底层能力——状态管理、工具绑定、消息路由、记忆系统。然而,基础设施本身并不直接产生价值,真正的价值来自于将技术与具体业务场景的深度融合。

智能投研正是这样一个极具代表性的场景:

  • • 业务复杂度高:股票分析涉及技术面、基本面、新闻面、情绪面等多个维度,单一模型难以同时处理
  • • 决策质量要求高:投资决策直接影响资金安全,需要多方论证和风险控制
  • • 信息时效性强:市场瞬息万变,分析必须基于实时数据
  • • 可解释性需求:投资建议需要有清晰的推理链条,不能是"黑箱"输出

本文以 TradingAgents-CN 为案例,为你拆解智能投研场景下的多智能体设计与交互流程。我们不仅关注技术实现(每个智能体如何与 LLM 交互、Prompt 如何设计),更关注背后的业务逻辑——为什么需要多智能体?为什么需要辩论机制?为什么需要两层裁判?这些设计决策如何服务于投资分析的核心目标?

Image

通过本文,你将理解:

  1. 1. 多智能体架构的业务价值:如何通过职责拆分和角色制衡提升分析质量
  2. 2. Prompt 工程的实战模式:不同类型智能体如何采用不同的 Prompt 策略
  3. 3. 状态流转的设计哲学:信息如何在智能体之间传递、汇聚、收敛
  4. 4. 辩论与裁判机制:如何模拟真实投资委员会的决策流程
  5. 5. 记忆系统与经验积累:如何让系统从历史决策中持续学习

项目地址:https://github.com/hsliuping/TradingAgents-CN
上游项目:https://github.com/TauricResearch/TradingAgents


1. 系统整体视角:为什么需要多智能体

传统单一 LLM 分析面临的核心瓶颈:

  • • 上下文有限:一次性将所有数据(行情、财务、新闻、情绪)喂给一个模型,Token 消耗大、质量下降
  • • 角色混淆:单 LLM 难以同时扮演技术分析师、基本面分析师、风险官等多个相互制衡的角色
  • • 缺乏博弈机制:投资决策的合理性来自多方观点的碰撞,单一输出无法模拟市场中的多空对立

TradingAgents-CN 的多智能体架构将分析拆分为三个阶段、十二个专职智能体,每个智能体只负责一个独立子任务,通过状态传递和辩论机制最终收敛到投资决策。

注:代码中还定义了一个独立的中国市场分析师(China Market Analyst),但该智能体未接入主分析图,不参与当前的单股分析流程。


2. 智能体全景图

下图展示了单股分析流程中十二个智能体的三阶段协作架构:

Image
┌─────────────────────────────────────────────────────────────┐
│                     阶段一:信息收集                           │
│                                                             │
│   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 信息收集阶段(四位分析师)

四位分析师构成信息收集矩阵,覆盖股票分析的四个维度,职责边界严格分离,互不交叉。

Image

市场分析师

对应图中的 Market Analyst 节点,负责从技术面维度分析股票的价格行为与量价关系。

属性
值
职责
技术面分析:K 线走势、均线、MACD、RSI、布林带
LLM 类型
快速模型(quick_thinking_llm)
工具
get_stock_market_data_unified
(自动识别 A 股/港股/美股)
输出
state["market_report"]

职责设计意图: 纯技术面,不关心公司基本面,只从价格行为和量价关系出发,降低主观干扰。

基本面分析师

对应图中的 Fundamentals Analyst 节点,负责从财务数据维度评估公司估值与盈利能力。

属性
值
职责
财务数据分析:PE、PB、PEG、收入、利润、估值区间
LLM 类型
快速模型
工具
get_stock_fundamentals_unified
(最大调用 1 次)
输出
state["fundamentals_report"]

职责设计意图: 强制要求真实数据,Prompt 中明确禁止编造,输出目标价区间供后续智能体参考。

新闻分析师

对应图中的 News Analyst 节点,负责捕捉近期新闻事件中的短期催化剂和风险因素。

属性
值
职责
近期新闻事件分析:财报、合作、政策、监管、行业动态
LLM 类型
快速模型
工具
get_stock_news_unified
输出
state["news_report"]

职责设计意图: 捕捉短期催化剂和风险事件,优先抓取 15-30 分钟内的实时新闻,为辩论阶段提供时效性材料。

社交媒体分析师

对应图中的 Social Media Analyst 节点,负责从社交平台提取投资者情绪信号。

属性
值
职责
投资者情绪分析:雪球、股吧、微博财经大 V
LLM 类型
快速模型
工具
get_stock_sentiment_unified
输出
state["sentiment_report"]

职责设计意图: 量化市场情绪,弥补纯量化数据的不足,为散户与机构观点差异提供参考。


3.2 投研辩论阶段(三位辩论者)

辩论阶段的核心设计理念:用对立观点的碰撞替代单一视角的主观判断。

Image

多头研究员

对应图中的 Bull Researcher 节点,负责从乐观视角构建看涨论据。

属性
值
职责
构建看涨论据,反驳空头观点
LLM 类型
快速模型
调用方式
llm.invoke(prompt)
(纯文本,无工具)
输入
四份分析报告 + 辩论历史 + ChromaDB 历史记忆
输出
investment_debate_state.bull_history

职责设计意图: 强制乐观视角,防止分析陷入单方面悲观。通过 {current_response} 接收上一轮空头论点,实现真正的针对性反驳。

空头研究员

对应图中的 Bear Researcher 节点,负责从悲观视角构建看跌论据。

属性
值
职责
构建看跌论据,揭露风险与弱点
LLM 类型
快速模型
调用方式
llm.invoke(prompt)
(纯文本,无工具)
输入
四份分析报告 + 辩论历史 + ChromaDB 历史记忆
输出
investment_debate_state.bear_history

职责设计意图: 强制悲观视角,质疑多头假设,提醒潜在风险。轮流辩论机制确保每一方都能回应对方的最新论点。

投研经理

对应图中的 Research Manager 节点,作为辩论裁判综合多空双方观点。

属性
值
职责
综合多空辩论,输出中立的投研结论
LLM 类型
深度模型(deep_thinking_llm)
调用方式
llm.invoke(prompt)
(带重试机制)
输入
完整辩论历史 + ChromaDB 历史记忆
输出
state["investment_plan"]

职责设计意图: 作为辩论裁判,不偏向任何一方,提炼出有据可查的投研结论。使用深度模型确保综合推理质量,是多头/空头之争的"仲裁者"。


3.3 决策与风险阶段(五位决策者)

本阶段将投研结论转化为可执行的交易指令,并通过多角度风险辩论进行最终把关。

Image

交易员

对应图中的 Trader 节点,负责将研究结论转化为可执行的交易指令。

属性
值
职责
综合所有报告,给出具体的买/卖/持有指令和目标价
LLM 类型
快速模型
调用方式
llm.invoke([SystemMessage, HumanMessage])
输入
投研结论(investment_plan)
输出
state["trader_investment_plan"]

职责设计意图: 将研究结论转化为可执行的交易指令,Prompt 强制要求提供目标价、置信度和风险评分,不允许回避。

风险辩论三方

对应图中的 Risky Analyst、Safe Analyst 和 Neutral Analyst 三个节点,分别从激进、保守、中性三个角度评估交易决策的风险。

属性
值
职责
分别从激进、保守、中性三个角度评估交易员决策的风险
LLM 类型
快速模型
调用方式
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 类型
深度模型
调用方式
llm.invoke(prompt)
(最多重试 3 次,失败返回"持有")
输入
风险辩论历史 + 交易员计划 + ChromaDB 历史记忆
输出
state["final_trade_decision"]

职责设计意图: 最终决策者,使用深度模型确保推理深度。设有明确的失败兜底机制(3 次重试失败→返回"持有"),保证系统稳健性。


4. 各智能体与 LLM 的 Prompt 交互分析

本章从 Prompt 工程的角度,完整引用每个智能体在代码中的实际 Prompt,并分析其设计模式及背后的考量。所有内容均以源码为准。

4.1 Prompt 设计模式概览

系统中的 Prompt 采用了三种不同的构建策略,针对不同的任务复杂度:

Image
策略
使用场景
代码位置
ChatPromptTemplate
 + MessagesPlaceholder
市场/基本面/新闻/社交分析师
支持动态消息历史注入,适合 ReAct 循环
完整 f-string 拼接
多头/空头研究员、投研经理、风险委员会主席
一次性注入所有上下文,适合纯文本推理
显式 [{"role": "system"}, {"role": "user"}] 列表
交易员
明确角色分离,System 定义角色约束,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"]})

4.2.2 第二阶段:Human Prompt(触发报告生成)