第 3 章 · 02 四大专家 Agent 本节摘要:本节精读 Director 通过 handoffs 调度的四个专家 Agent——情绪(Sentiment)、量化(Quant)、风控(Risk)、执行(Execution)。它们是 Orchestrator-Worker 模式里的「Worker」,各司其职。本节逐个拆解 里这四个 Agent 的实例化代码:模型选型(情绪用便宜的 gpt-4o-mini,其余三个用 gpt-4.1)、工具(只有情绪 Agent 带 )、 、 、 ,以及它们各自被追加的「结构化输出约定」(risk/quant/execution 都在 systemprompt 后补了一段「当收到消息时,它包含…请提供…」)。
本节摘要:本节精读 Director 通过 handoffs 调度的四个专家 Agent——情绪(Sentiment)、量化(Quant)、风控(Risk)、执行(Execution)。它们是 Orchestrator-Worker 模式里的「Worker」,各司其职。本节逐个拆解
workers.py里这四个 Agent 的实例化代码:模型选型(情绪用便宜的 gpt-4o-mini,其余三个用 gpt-4.1)、工具(只有情绪 Agent 带exa_search)、output_type="str"、max_loops=1、context_length=16000,以及它们各自被追加的「结构化输出约定」(risk/quant/execution 都在 system_prompt 后补了一段「当收到消息时,它包含…请提供…」)。读完本节,你理解了 AutoHedge 的「专业分工」如何落到代码,以及为什么这样配置。
内容来源:原项目源码
autohedge/workers.py、autohedge/prompts.py、autohedge/tools/exa_search_tool.py,精读并套用体系化模板。
阅读完本节,你应当能够:
tools。output_type="str"、max_loops=1、context_length=16000 的统一含义。先看 workers.py 第 26-69 行四个专家的定义,一张表对照:
| Agent | agent_name | model_name | tools | 追加的结构化约定 |
|---|---|---|---|---|
| 情绪 | Sentiment-Agent |
gpt-4o-mini |
[exa_search] |
无(用 SENTIMENT_PROMPT 原文) |
| 风控 | Risk-Manager |
gpt-4.1 |
无 | 仓位/最大回撤/风险敞口/风险评分 |
| 执行 | Execution-Agent |
gpt-4.1 |
无 | 订单类型/数量/入场/止损/止盈/有效期 |
| 量化 | Quant-Analyst |
gpt-4.1 |
无 | ticker/technical_score/volume_score 等 |
四个都设 max_loops=1、verbose=True;后三个还设了 output_type="str" 与 context_length=16000。注意 ALL_AGENTS 列表的顺序是 [sentiment, risk, execution, quant]——这不影响 handoffs 行为(handoffs 不依赖顺序),只是定义时如此。
workers.py 第 26-33 行:
sentiment_agent = Agent( agent_name="Sentiment-Agent", system_prompt=SENTIMENT_PROMPT + _SYSTEM_SUFFIX, model_name="gpt-4o-mini", verbose=True, max_loops=1, tools=[exa_search], )
逐项解读:
agent_name="Sentiment-Agent":handoffs 时 Director 用它识别目标。model_name="gpt-4o-mini":四个专家里唯一用 mini 的。情绪分析的核心是调 exa_search 读新闻再打分,LLM 主要做「读 + 总结 + 打 0~1 分」,轻量任务,用便宜的 mini 省钱。tools=[exa_search]:唯一带工具的专家。exa_search 来自 autohedge.tools.exa_search_tool,调 Exa API 联网搜新闻(第 2 章讲过需要 EXA_API_KEY)。max_loops=1:单轮——读新闻、打分、输出,不迭代。output_type 和 context_length——用 swarms 的默认值。这是定义上的小不一致(其他三个都显式设了)。exa_search 的签名(exa_search_tool.py):
def exa_search(query: str) -> str: """Exa Web Search Tool ...""" api_key = os.getenv("EXA_API_KEY") ...
它接受一句自然语言 query,返回 JSON 格式的搜索结果字符串。swarms 会把这个函数作为 function calling 工具暴露给 LLM,LLM 自己决定何时调用、传什么 query。
💡 核心心法:情绪 Agent 是「LLM + 联网」的典型组合——LLM 负责理解任务、生成搜索词、解读返回;工具(
exa_search)负责突破 LLM 的「知识截止」局限。这种「LLM 当大脑,工具当手脚」的模式,是 Agent 区别于 Chatbot 的根本。
workers.py 第 35-45 行:
risk_agent = Agent( agent_name="Risk-Manager", system_prompt=RISK_PROMPT.strip() + "\n\nWhen you receive a message, it will contain:\nStock, Thesis, Quant Analysis.\n\nProvide risk assessment including:\n1. Recommended position size\n2. Maximum drawdown risk\n3. Market risk exposure\n4. Overall risk score" + _SYSTEM_SUFFIX, model_name="gpt-4.1", output_type="str", max_loops=1, verbose=True, context_length=16000, )
关键差异:
system_prompt 是拼接三段:RISK_PROMPT.strip()(基础角色) + 一段「当收到消息时…请提供…」(结构化输出约定,第 4 章第 2 节专讲) + _SYSTEM_SUFFIX(时间注入,第 4 章第 3 节专讲)。output_type="str":强制返回纯字符串(而非 dict/list)。context_length=16000:把上下文窗口设为 16000 token——因为风控要读量化 Agent 长长的数值分析,需要足够上下文。风控 Agent 不带工具——它不联网、不查价,只基于上游(量化)传来的输入做推理。这是有意的设计:风控应该是「审视」而非「采集」,信息源越单一越好审计。
workers.py 第 47-57 行:
execution_agent = Agent( agent_name="Execution-Agent", system_prompt=EXECUTION_PROMPT.strip() + "\n\nWhen you receive a message, it will contain:\nStock, Thesis, Risk Assessment.\n\nGenerate trade order including:\n1. Order type (market/limit)\n2. Quantity\n3. Entry price\n4. Stop loss\n5. Take profit\n6. Time in force" + _SYSTEM_SUFFIX, model_name="gpt-4.1", output_type="str", max_loops=1, verbose=True, context_length=16000, )
结构与风控 Agent 完全对称——三段拼接的 system_prompt、gpt-4.1、output_type="str"、context_length=16000。差异只在追加的约定:它要求产出 6 项订单字段(订单类型/数量/入场价/止损/止盈/有效期)。
⚠️ 现实澄清:执行 Agent 名字叫「Execution」,但它只生成订单结构文本,不真的下单——股票端没有任何券商 API;Solana 端的下单在另一套工具(
ultra_tools.py,第 8 章)。README 说的「完全自主交易」在股票端是夸大的,执行 Agent 实为「订单草拟 Agent」。
workers.py 第 59-69 行:
quant_agent = Agent( agent_name="Quant-Analyst", system_prompt=QUANT_PROMPT.strip() + "\n\nWhen you receive a message, it will contain:\nStock and Thesis from your Director.\n\nGenerate quantitative analysis with: ticker, technical_score (0-1), volume_score (0-1), trend_strength (0-1), volatility, probability_score (0-1), key_levels (support, resistance, pivot)." + _SYSTEM_SUFFIX, model_name="gpt-4.1", output_type="str", max_loops=1, verbose=True, context_length=16000, )
同样三段拼接。它追加的约定最有「结构化数据」味——明确要求产出 ticker、technical_score (0-1)、volume_score (0-1)、trend_strength (0-1)、volatility、probability_score (0-1)、key_levels (support/resistance/pivot) 这一串字段。
⚠️ 现实澄清:这里有个重大设计缺陷——量化 Agent 要求产出 0~1 的
technical_score等指标,但它没有任何工具去算真实的技术指标。它不带tools=[...],也就是说这些数值是 LLM 凭空生成的,不是从行情算出来的。项目里有yfinance依赖,但 workers.py 的 Agent 并未挂载任何取行情/算指标的工具。这是「营销说自主量化,实则 LLM 瞎编数字」的典型——第 10 章会专门批判。
后三个专家都设了这三项,逐个说清:
| 参数 | 值 | 含义 |
|---|---|---|
max_loops |
1 |
单轮推理,不自我反思迭代(与 Director 一致) |
verbose |
True |
打印每次 LLM 调用的详细日志,便于调试 |
context_length |
16000 |
上下文窗口 16000 token,够装上游的长输出 |
context_length=16000 是个有意思的选择——gpt-4.1 实际支持更大的窗口(128K+),但这里主动设小到 16K。可能意图:限制上下文 = 限制单次成本,同时避免长输入让 LLM 分心。教学项目这样设无伤大雅。
💡 核心心法:注意情绪 Agent 没设
output_type与context_length——这是定义上的不一致,大概率是作者写到情绪时漏了。功能上能用(走默认值),但能看出代码不够规整。
把四个专家与 Director 串起来,数据流(逻辑上,实际由 Director 自由决定):
Director 接到任务 │ handoff(股票 + 假设) ▼ 情绪 Agent ──(联网搜新闻)──► 情绪打分 │ 量化 Agent ──(基于假设)──► 技术指标(注:无真实工具) │ 风控 Agent ──(假设+量化)──► 仓位/回撤/敞口/评分 │ 执行 Agent ──(假设+风控)──► 订单结构 6 字段 │ ▼ Director 综合产出
注意:这只是逻辑流,实际 Director 是否按此顺序、是否全叫、是否重复叫,全靠 LLM 自己判断(handoffs 是隐式的,第 3 节详讲)。
exa_search——「LLM 当大脑,工具当手脚」的典型,突破知识截止。max_loops=1(单轮)、verbose=True(打日志)、context_length=16000(限上下文降本);情绪漏设 output_type/context_length 是不一致。下一节,我们看 Director 与这四个专家之间的「handoffs」到底是什么机制——它如何决定交接、交接后控制流怎么走、与工具调用有何区别。