当五个智能体跑在同一套数据上,给出五个不同的价值结论时,架构师的真正考题才刚开始。价值投资本身就是多维证据的判断过程——财务、护城河、管理层、风险、预期差——天然适合用多智能体拆成不同岗位;但拆完之后,怎么把这些结论合起来才是核心问题。你会发现,真正决定系统成败的不是模型选得多强,而是投票机制这个决策协议设计得多清晰。这篇文章写给正在搭建智能体决策平台的架构师,也写给想把“多智能体”真正用进投研流程的工程师,我尽量把机制选型、权重计算、坑和实例一次讲透。
1. 价值投资为什么特别适合多智能体架构
1.1 价值判断是结构化证据的组合,而不是一次整体猜测
价值投资和短线投机的最大差异,在于它把“便宜”和“值得买”拆成了很多层证据。你说一只股票低估,至少需要回答:财务报表上的现金流是不是真的稳,行业地位能不能让利润持续,管理层有没有在做损害股东利益的动作,当前价格比内在价值低多少,而市场是不是已经price in了这件事。每一层都对应完全不同的数据和分析方法,一个人硬啃都会分身乏术,一个模型硬啃也是如此。
多智能体系统在这种场景下的意义,不是模拟一个“更聪明的分析师”,而是把一个模糊的全局判断,改成一组清晰的局部判断。每个智能体只负责一条证据链。财务智能体只算估值区间,护城河智能体只评估行业结构,情绪智能体只监测预期差,风控智能体只负责反驳。这样做的直接好处是:某个智能体犯了错,影响范围是局部的,不会被包装成一个看似完整但实际很虚的结论。
但多智能体带来的工程复杂度也是真实的。角色越多,输出格式越不可控,有的智能体喜欢给高分,有的永远只说“中性”,都需要规范化。而最核心的问题永远是:当这几位“分析师”吵起来,系统该听谁的。这个“听谁的”不是模型问题,而是投票机制的设计问题,也是架构师真正能发挥价值的地方。
1.2 投票机制本质是决策协议,不是统计平均
我见过一个还挺典型的团队:五个智能体跑得很“专业”,有财务分析、有行业扫描、有舆情监控,最后接一层np.mean(),把几个得分一平均就当作综合结论。模型越好,结果越平庸。为什么?因为少数派发现的重大风险被温和派稀释掉了。一个智能体给出强烈的“卖出”信号,另一个给出“轻仓买入”,平均完变成了“持有”,可实际风险并没有因为我们选择平均就消失。
投票机制在这里应该被理解成决策协议:它规定了每个智能体怎么表达观点、观点如何转换成分数、哪些信号拥有一票否决权、最终结果怎么被审计。这不是一个统计技巧,而是一组显式的规则。架构师要做的是把这组规则清晰地设计出来,并保证它符合价值投资的判断逻辑,而不是简单把智能体输出倒进同一个池子。
协议设计至少要回答几个问题:投票权重是固定还是随历史表现变化?置信度能不能作为票数的乘数?负面信号是不是可以越过加权平均直接阻断决策?当七个智能体出现四五种意见时,系统是选边站,还是要做一个折中排序?这些没有标准答案,但必须被明确回答。一个架构,如果连“三票买入、两票卖出、一票中性”会怎样都没定义,那它就不算完成了设计。
2. 投票机制的设计空间:从简单多数到否决权
2.1 简单多数制和加权投票只是起点
最简单的投票,就是每只智能体一票,信号取多数。这个机制在代理数量少、角色完全同质时勉强能用,但价值投资场景里几乎不可用。因为不同角色掌握的信息量和判断精度不一样,财务智能体算出的安全边际,可能比舆论情绪智能体给出的短期噪音重要得多。这时候架构师一定会走向加权投票。
加权投票的基本公式可以表达为:
总得分 = Σ( 智能体权值 × 票值 × 置信度 )票值是把智能体信号映射成的数值,例如买入=1、持有=0、卖出=-1。置信度是智能体对这个结论有多确定。权值初始可以由架构师根据角色重要程度设定,后期根据历史准确率滚动调整。举个例子,财务智能体历史预测胜率更高,它的权值应该慢慢上升;情绪智能体连续几个月判断偏移,权值就该下调。
但要注意,权值调整容易走向过度拟合。我实际操作中会比较克制,建议给每个权值设上下限,比如财务智能体的权值范围是0.1到0.35,不允许衰减到0,也不允许一个智能体一家独大。这样既保留了长期校准能力,又不会让某个智能体因为几次运气好就变成“永久权威”。
2.2 需要排序或者多选时,试试 Borda 计数和批准投票
多数制和加权投票解决的是“买还是卖”这种二选一或三选一问题。但如果系统目标是“这五只候选股票,哪两只最值得进组合”,问题就变成了排序。排序题用投票,有几个比简单举手表决更合适的机制。
Borda 计数是我在候选池排序场景里用得最多的方案。每个智能体给候选公司排出名次,第一名的公司得N分、第二名得N-1分,以此类推,最后加总。它的好处是强制每个智能体表达完整偏好,而不是只表达第一选择。批准投票则适用于另一种场景:每只智能体独立判断“这只股票是否达到了我的买入门槛”,达到就投一票,最后统计通过率。它把复杂的相对排序问题,简化成了标准是否达成的问题。
给你一个简单对照表,方便选型:
| 场景 | 推荐机制 | 典型规则 |
|---|---|---|
| 单标的买/卖/持有 | 加权多数投票 | 加权分数超阈值才行动 |
| 多候选股进组合 | Borda计数 | 按排名计分,加总排序 |
| 判断是否达到安全边际 | 批准投票 | 超过设定准入门槛即投赞成票 |
| 高风险信号拦截 | 否决权机制 | 风控触发后直接阻断买入 |
我的经验是,投资决策里别只用一种投票机制。可以把买入阶段设计成批准投票与加权投票的叠加,把仓位排序阶段改用Borda计数,这样每一层的输出都是“这道题该有的答案类型”,而不是拿一个模型硬套所有场景。
2.3 否决权:给少数派一个断点
我做价值智能体系统时,有一个原则:多数票可以决定常规操作,但极端风险必须能拦住整个系统。这里需要给某个智能体或某类信号配置否决权。
比如风控智能体一旦检测到财务造假信号、审计非标、重大合规风险,投出“否决”时,无论其他智能体如何乐观,最终决策都是放弃。这个机制借鉴了现实里投资委员会的规矩——风控经理有权叫停项目,不需要投票。
否决权必须绑定明确条件,否则会滥用。不能设计成风控智能体说“我觉得不行”就否决,而是要设置可验证的触发词,例如识别到“应收账款增速连续三年高于营收增速”或“审计意见不是标准无保留”时自动进入否决通道。这样系统行为可解释,也要在审计日志里留下是哪条证据触发的否决。
3. 投票如何落到工程实体:数据接口、校准与计算
3.1 先定义每个智能体的输出协议,这是最容易忽略的第一步
我在很多项目里看到的问题,不是没有投票逻辑,而是智能体输出的东西五花八门,有的给文本研报,有的给0-10分,有的直接给股价目标。最后投票层为了兼容这些格式,硬写各种解析规则,越写越脆。正确做法是先定死输出协议,让所有智能体按同一个 JSON Schema 返回结果。
一个建议的最小输出结构大概是这样的:
{ "agent_id": "moat_analyst", "signal": "buy", "confidence": 0.72, "time_horizon_months": [6, 24], "evidence": ["市占率连续五年提升", "毛利率高于行业均值5个百分点"], "risk_factors": ["行业价格战风险未被充分对冲"], "veto": false }signal 字段只用枚举值,buy、hold、sell、strong_buy、strong_sell,不要允许自由发挥;confidence 必须是0到1之间的小数;veto 是布尔值,用来触发否决逻辑。这样设置完之后,投票层代码只依赖信号和置信度,证据字段只作为审计素材,基本不参与计算。
让每个智能体按要求输出,需要在提示词里给明确的格式例子,并在代码里做schema校验。校验不通过就丢弃该智能体本轮投票,或者标记为重试,绝不能靠正则硬解析,否则系统会以你意想不到的方式悄悄出错。
3.2 置信度校准,别把模型的原生概率当真
大部分大模型给出的置信度都很“自信”,一个模型可能90%的结论都给出0.9以上的置信度,但实际准确率并没有那么高。投票系统如果直接拿置信度当乘数,结果会被系统性高估。所以必须对置信度做校准。
最简单的方法是用Brier分数持续监控校准质量。Brier分数等于预测置信度和实际结果之间误差的平方和,越低代表越准。举例来说,如果一个智能体给出0.8置信度,那么它后续被验证正确的频率应该接近80%,如果实际只有60%,说明它高估了信心,系统需要在加权时对这个智能体的置信度打折。
实际工程上,我会给每个智能体维护一份校准曲线,把置信度按0.1分桶,记录命中率。如果某个桶的命中率和置信度差值超过0.15,我就在投票计算时对该代理的confidence做一次变换,比如乘以一个校准系数。这个细节非常关键,因为投票系统的输出对乘数极其敏感,置信度虚高会让少数高置信度智能体过度主导最终决策。
3.3 并行计算与审计快照,投票也要可重放
多智能体系统一大优势是能并行分析同一标的多类数据,工程上应该有意识地利用这一点。投票计算本身很轻,但每个智能体的推理阶段可能要消耗大量token和外部数据查询时间,所以任务调度要设计成可并行、可重试、可超时。
还有一点容易被忽略:投票不是纯实时运算,它必须可以追溯。我会把每一轮的输入数据、每个智能体的原始输出、投票参数和最终决策都存成一份不可篡改的快照。目的很简单,当某个决策之后被市场证明是错的,架构师要能复盘出是哪个数据源带偏了哪个智能体,是权重设计不合理,还是阈值本身有问题。没有这份快照,后面的优化全凭感觉,走不了太远。
4. 多智能体投票的经典陷阱
4.1 同质化传染:两个“不同”智能体可能共享错误
很多架构师以为,只要模型不同、角色不同,智能体就是“独立”的。实际完全不是。两个智能体背后的模型可能是同一套开源体系,训练语料高度重叠;甚至即使是不同厂商的模型,也可能在热门报告、共同新闻源上学习到同样的错误观点。它们投票时看似是两票,本质上是同一票的变体。
同质化会让多数投票失去意义。解决方案不是追求智能体数量多,而是要让每个智能体在数据路径上隔离。可以用不同数据源、不同的推理框架、不同的思维链提示,甚至刻意给其中一个智能体安排一个少有人用的反向假设。比如在一组买方分析智能体里安排一个“破产审计智能体”,它的职责就是尽量找极端负面证据,从机制上保证系统能听到反对声音。
4.2 信息源重叠:看起来五票,实际上是一票五遍
与同质化传染相关但更隐蔽的,是信息源的重叠。五个智能体可能都在读同一份公司季报,只是分析角度不同。这本身没问题,但如果三个智能体都依赖同一个第三方数据服务,而该服务的一次错误被三份分析同时引用,系统就可能把错误当成了共识。
我的解决办法是给每个智能体建立“数据源指纹”。格式化日志里除了记录智能体输出,还记录它读了哪些外部数据。如果发现多个智能体共享某一错误源,要能追溯回上游修正。更进一步的方案是把外部数据按来源拆分,给每个智能体限定可用数据子集,避免互相污染。
4.3 权重坍塌与自反馈循环
权重动态调节如果走太远,会变成赢家通吃。一个智能体连续几次判断正确,权重被系统自动上调,上调后主导更多决策,如果它运气不错又正确几次,权重继续上调,最后其他智能体的意见几乎形同虚设。这等于多智能体系统孵化出了一个“隐形独裁者”。
应对方法包括:给权值设置严格上下限;每N轮做一次归一化;引入随机抖动防止卡死在局部最优;更重要的是,要周期性用新鲜样本重新滚动回测权值,而不是让小样本运气固化进长期参数。我在系统里还会记录权重变化轨迹,如果发现某个智能体权重曲线一路飙涨,会主动触发审查。
4.4 时间错位:输给了过期图表数据
价值投资关注长期,但决策输入有时效性。一个智能体可能读了一份三个月前的分析报告,另一份读的是最新公告,两者投票的时间基准不一样。投票机制如果不处理时间错位,就会出现“部分智能体还在用旧世界的信息投票”的问题。
工程上的解决思路并不复杂:每个智能体输出必须带数据时间戳;投票计算前检查时间戳一致性;如果某个智能体的数据源明显落后,它本轮可以被降权或标记为“补采”。在这个问题上,宁缺毋滥,拿不准结论的智能体应该输出 abstain(弃权),而不是硬给一个过期信号。
5. 简化实现:价值智能体委员会的实际配置
5.1 五类角色怎么划分
设计一个落地系统时,我不建议一开始就上八个角色,五个比较合适,既能覆盖价值投资的核心维度,又不会让投票层复杂到难以解释。
| 智能体角色 | 核心任务 | 初始权重 | 特殊权限 |
|---|---|---|---|
| 财务估值智能体 | 分析现金流、利润表,产出估值区间和安全边际 | 0.25 | 无 |
| 护城河智能体 | 评估行业结构、竞争优势、转换成本 | 0.20 | 无 |
| 管理层质量智能体 | 分析股权结构、历史诚信、资本配置能力 | 0.15 | 无 |
| 风险审计智能体 | 寻找极端负面证据、财务操纵信号 | 0.15 | 一票否决 |
| 预期差智能体 | 判断市场是否已计入关键信息,衡量温度 | 0.25 | 无 |
这套配置的核心理念是:正面证据需要多方共同确认,负面风险只要足够明确就应阻断。权重总和不是1也没关系,关键是在投票公式里保持一致,并确保总得分拥有可解释的参考区间。
5.2 关键参数设多高:阈值、权重、衰减
参数设置是我踩坑最多的地方。最开始我凭直觉把买入阈值设为0.5,结果系统常年不出买入信号,回测效果极差;调低到0.2,信号又频繁得像噪音。后来才明白,阈值必须和“基准分布”对照。做法是先跑三个月历史数据,把所有候选标的的总得分做成分布,再选择分布中的某个分位数作为阈值。比如:只允许得分超过历史90分位的股票进入买入候选。
权重衰减我建议使用半衰期逻辑。每个智能体的历史胜率不是永久生效,而应该随着时间指数衰减,让近三个月的表现在权重更新中占更高比例。我用过一个很简单的公式:
窗口权重 = 胜率α × 近三月命中率β其中α和β都在0到1之间,β参数建议设置在0.6左右,既保持历史信息,又给近期表现足够敏感性。这个值不能太高,否则一次偶然误判就会引发权重震荡。
5.3 跑一个完整例子
假设系统评估一家虚拟公司“某新能源配件公司”(代码MKT-X),五个智能体分别返回了如下结果:
| 智能体 | 信号 | 置信度 | 权值 | 加权贡献 |
|---|---|---|---|---|
| 财务估值 | strong_buy(1.2) | 0.80 | 0.25 | 0.240 |
| 护城河 | buy(1.0) | 0.65 | 0.20 | 0.130 |
| 管理层质量 | hold(0) | 0.55 | 0.15 | 0.000 |
| 风险审计 | hold(0) | 0.90 | 0.15 | 0.000 |
| 预期差 | buy(1.0) | 0.55 | 0.25 | 0.138 |
总得分是0.508。如果买入阈值是0.45,系统会输出“买入候选”。但我还会跑一个二次校验:风险审计智能体尽管本轮没有触发否决,其对“高额应收账款”的备注会被单独呈现,人工或规则层快速review后确认不是造假信号,决策才会进入下一步。这个例子能比较直观地说明,投票不是只算一次总分,而是“加权计分+否决开关+证据复核”三件事的组合动作。
6. 故障排查速查表与架构落地建议
6.1 高频问题和对应处理
| 现象 | 可能原因 | 排查方法 | 处理方式 |
|---|---|---|---|
| 所有智能体结论高度一致,买入信号泛滥 | 数据源重叠或同质化 | 检查数据源指纹 | 拆分数据子集,安排反向智能体 |
| 置信度普遍接近0.95以上 | 置信度未校准 | 计算Brier分数 | 引入校准曲线并打折 |
| 某智能体权重飙升,其他智能体影响力归零 | 权重坍塌 | 查看权重变化轨迹 | 限幅、重归一化、周期性回测 |
| 加权分数很高,实盘表现却一般 | 阈值失真或时间错位 | 检查阈值分位和输入时间戳 | 重新计算历史阈值分布 |
| 风控否决很少触发 | 触发词定义过窄 | 复盘被拒绝案例和漏报案例 | 扩充可验证触发条件,增加规则覆盖率 |
| 投票结果不稳定,每次重跑结论不同 | 模型随机性过大 | 复跑多轮观察分布 | 提高采样次数或降低温度,给结论加一致性检查 |
6.2 三条我始终随身携带的架构建议
第一条,永远从单智能体起步,再拆多智能体。先让一个智能体把基础分析做扎实,确认输出格式和数据链路没有问题,然后再复制角色并及时引入差异。直接一步到位搭五六个角色,调试成本会成倍增加,出了问题你都不知道该怪谁。
第二条,给系统一个“分裂开关”。我做过一个设计:当各智能体得分方差低于平均值一半时,系统会主动怀疑是否存在同质化流程;当方差过高,系统又会警告“决策置信度不足”。投票机制不能只输出一个数字,还要输出分歧度。分歧度本身是很有价值的信号。
第三条,所有投票参数都必须版本化。阈值、权重、校准曲线、触发词表,每一次调整都记录版本号,和当时的回测结果绑定。这样才能在几个月后回答“为什么那段时间系统购入了某只股票”,也才能让多智能体投票系统从一个“看起来酷”的技术方案,变成一个能持续优化、可负责任的决策基础设施。
我自己的体会是,投票机制真正难的地方,不是算法难写,而是设计理念要克制。多智能体系统很容易把复杂度推高,但好的决策协议一定是可以给人类解释清楚的。如果你设计的投票规则,连团队里的另一位架构师都很难三两句话说清它的逻辑,那它大概率也不适合放进真金白银的投资决策链路。