1. 从单模型拍脑袋到多智能体开会这套系统到底在解决什么金融交易决策这件事最忌讳的就是一个人说了算。现实中的成熟投资机构投研、风控、交易执行、合规审核是分开的岗位各管一摊互相制衡。可早期把大语言模型往交易场景里塞的做法基本就是让一个模型从头到尾把活全干了——读财报、判断趋势、给仓位建议全在一个上下文里完成。结果就是模型一旦在某一步产生幻觉后面所有推理都建立在错误前提上而且没有任何机制能把它拉回来。多智能体LLM系统要解决的核心问题就是把这个一言堂拆成圆桌会议。每个智能体被赋予明确的角色边界和工具权限有的专门做宏观数据解读有的盯技术指标有的负责风险评估还有一个扮演唱反调的角色专门挑逻辑漏洞。它们各自独立推理最后通过一个协调机制汇总意见。这套思路在业内常被称为LLM powered autonomous agents的协作范式本质上是把软件工程里的关注点分离原则搬到了模型推理层面。我最初接触这类架构时第一反应是这不就是把一次调用拆成五次调用成本翻五倍吗。但实测下来发现精细化决策带来的收益远不止成本这一个维度。单个模型在复杂金融场景下的准确率大概在六成上下浮动而多智能体交叉验证后关键判断的一致性能拉到八成以上。原因很简单金融数据本身充满噪声和矛盾信号单一视角必然有盲区多个独立视角的碰撞反而能过滤掉大量伪信号。这套系统适合谁参考如果你是有一定编程基础、想把自己的量化策略或投研流程做智能化升级的从业者那这套架构值得深挖。如果你只是想找个模型帮你看看K线那单模型对话就够了没必要上多智能体。判断标准很直接你的决策链条里是否存在多个需要独立判断、且彼此可能冲突的环节。有就适合没有就别过度设计。2. 拆解多智能体协作的底层机制角色分工与信息流转2.1 为什么角色不能随便分边界模糊是最大的坑很多人搭多智能体系统第一步就栽在角色定义上。常见错误是给每个智能体写一段模糊的提示词比如你是一个专业的金融分析师请分析市场。这种定义等于没定义因为三个智能体拿到同样的输入大概率会输出高度相似的内容协作就退化成了重复劳动。正确的做法是给每个智能体划定不可重叠的职责域和明确的输出格式。我一般会从三个维度切分数据源维度谁看宏观、谁看微观、时间维度谁看长周期、谁看短周期、立场维度谁看多、谁看空、谁中立。举个例子一个典型的分工是这样的智能体角色核心职责输入数据输出格式宏观分析师解读利率、通胀、政策信号经济日历、央行公告方向性判断置信度技术面分析师识别趋势、支撑阻力价格序列、成交量关键价位信号强度风险官评估回撤风险、仓位上限波动率、相关性矩阵风险等级建议仓位反方辩手挑战其他智能体的假设前三者输出逻辑漏洞清单这张表的关键在于最后一列——输出格式必须结构化。如果让智能体自由发挥写一段话协调者根本没法做程序化汇总。我踩过的坑就是早期让模型输出自然语言结果汇总环节又得再调一次模型去解析白白增加延迟和出错概率。后来改成强制JSON输出整个流程顺畅了不止一个档次。2.2 信息流转的三种模式选错了整个系统就废了多智能体之间的信息怎么传直接决定了系统的能力上限。目前主流有三种模式我按复杂度从低到高排第一种是流水线模式智能体A的输出直接喂给智能体BB再喂给C。这种模式实现简单但有个致命问题错误会逐级放大。A如果判断错了B和C再厉害也救不回来。金融场景里这种单向依赖特别危险因为市场信号本身就是概率性的不是确定性的。第二种是并行投票模式所有智能体同时拿到相同输入各自独立输出最后投票或加权汇总。这种模式抗单点故障能力强但缺点是智能体之间没有交互无法互相启发。我实测下来这种模式适合信号相对明确的场景比如财报季的业绩判断。第三种是辩论模式也是我现在主推的。智能体先各自出初步结论然后进入多轮交叉质询反方辩手专门挑刺被质疑的智能体必须给出回应或修正。这个过程通常跑两到三轮最后收敛出一个综合判断。辩论模式的计算开销最大但在处理矛盾信号时效果最好。有一次测试中宏观分析师看多、技术面看空辩论两轮后风险官指出两者的时间窗口不一致——宏观看的是季度级别技术面看的是日线级别根本不在一个维度上吵架。这个洞察单靠任何一个智能体都发现不了。2.3 协调者的角色定位它不是领导是裁判很多教程把协调者智能体描述成总指挥我觉得这个定位有误导性。协调者不应该有决策权它的职责是组织流程、检查格式、触发辩论、汇总结果。一旦让协调者拥有最终拍板权整个系统又退化成了单模型决策前面所有分工都白费了。我的做法是让协调者只做三件事验证每个智能体的输出是否符合预设格式、检测结论之间是否存在显著冲突、在冲突时启动辩论轮次。至于最终决策交给一个独立的加权算法权重根据历史表现动态调整。这样设计的好处是协调者本身即使被提示注入攻击也无法直接操纵最终结果安全性高了一个量级。3. 从零搭一套可跑的多智能体交易决策框架3.1 环境准备中最容易被忽略的三个细节动手之前有几个基础工作必须先做扎实否则后面调试会让你怀疑人生。第一是密钥管理。使用LLM时如何防止密钥等鉴权信息泄露这是所有生产级应用的第一道坎。我见过太多人把API Key硬编码在代码里然后不小心推到公开仓库。正确做法是用环境变量加载并且在代码里加一层校验——如果检测到密钥出现在日志或异常堆栈中直接中断执行。更稳妥的方案是引入一个密钥代理层所有模型调用都经过代理转发业务代码永远接触不到真实密钥。第二是模型选型。不同智能体对模型能力的要求不一样。反方辩手需要强推理能力可以用参数规模大一些的模型格式检查这种机械活用小模型甚至规则引擎就够了。全都上最强模型成本会失控。我的经验是核心推理角色用大模型辅助角色用小模型整体成本能压到全大模型方案的三成左右。第三是超时和重试策略。LLM调用失败是常态尤其是并发请求多的时候。llm request failed: provider rejected the request schema or tool payload 这类报错十有八九是请求体格式有问题或者触发了频率限制。必须给每个调用设置合理的超时时间并且实现指数退避重试。我一般设三次重试间隔分别是1秒、4秒、16秒超过就降级到备用模型或返回默认值。3.2 智能体基类的设计把重复代码抽干净不管有多少个智能体它们的骨架是一样的接收输入、构造提示词、调用模型、解析输出、返回结构化结果。把这部分抽成一个基类子类只需要定义角色提示词和输出schema。import json import time from abc import ABC, abstractmethod class BaseAgent(ABC): def __init__(self, name, model_client, max_retries3): self.name name self.client model_client self.max_retries max_retries abstractmethod def build_prompt(self, context): 子类实现根据上下文构造提示词 pass abstractmethod def output_schema(self): 子类实现定义输出字段和类型 pass def parse_output(self, raw_text): 解析模型输出强制JSON格式 try: return json.loads(raw_text) except json.JSONDecodeError: # 尝试提取JSON片段 start raw_text.find({) end raw_text.rfind(}) 1 if start 0 and end start: return json.loads(raw_text[start:end]) raise ValueError(f{self.name} 输出无法解析为JSON) def run(self, context): prompt self.build_prompt(context) for attempt in range(self.max_retries): try: response self.client.chat(prompt, schemaself.output_schema()) return self.parse_output(response) except Exception as e: if attempt self.max_retries - 1: raise time.sleep(2 ** (attempt 1))这个基类里有个细节值得说parse_output里做了JSON片段提取的兜底。模型有时候会在JSON前后加一段解释文字直接json.loads会失败。先尝试整体解析失败后再定位花括号提取能救回大部分格式问题。3.3 辩论轮次的实现怎么让智能体真正吵起来辩论模式的核心不是让智能体互相骂而是让它们针对具体分歧点进行有依据的回应。实现上分三步第一步协调者对比各智能体的输出找出结论冲突的字段。比如宏观分析师给出看多置信度0.7技术面分析师给出看空置信度0.6这两个就是冲突项。第二步把冲突项和双方的原始论据打包发给反方辩手让它生成质询问题。质询问题必须具体不能是你为什么看多这种空泛问题而应该是你的看多结论基于利率下行预期但当前通胀数据超预期这个矛盾如何解释。第三步把质询问题分别发给原智能体要求它们在限定字数内回应并且必须明确表态是维持原判还是修正。回应完成后协调者重新汇总如果冲突仍然存在进入下一轮。我实测下来两轮辩论能解决大约七成的分歧剩下的三成通常是数据本身就有矛盾这时候系统会输出一个低置信度标记提示人工介入。这个设计很重要——系统要能承认自己不确定而不是强行给一个答案。4. 实测中暴露的问题与针对性修复方案4.1 智能体趋同为什么你的多智能体最后变成了复读机这是最常见也最隐蔽的问题。表面上你有五个智能体实际上它们输出的内容高度相似协作完全失效。根本原因是提示词的同质化——如果所有智能体都基于同一份市场数据、用相似的语气提问模型很容易收敛到同一个答案。修复方案有三个层次。最直接的是差异化输入给不同智能体喂不同的数据切片。宏观分析师只看经济指标技术面只看价格数据风险官只看波动率和相关性。输入不同输出自然分化。更深一层是对抗性提示。在反方辩手的系统提示里明确写你的任务是找出其他分析中的逻辑漏洞而不是附和它们。我甚至会在提示里加一句如果你找不到任何问题说明你没有认真分析用这种压力迫使它真正去挑刺。最彻底的是引入随机性。在调用模型时设置不同的temperature参数让部分智能体偏向保守、部分偏向激进。但要注意temperature不能设太高否则输出会变得不可靠。我的经验值是核心分析角色用0.3反方辩手用0.7格式检查用0。4.2 延迟爆炸五个智能体串行跑一次决策要等三分钟多智能体系统天然比单模型慢因为调用次数成倍增加。如果全部串行执行一次完整决策跑下来可能要几分钟这在快速变化的市场里是不可接受的。优化思路是能并行的绝不串行。第一轮各智能体独立分析完全可以并行发起用异步IO同时调用。Python里用asyncio.gather就能实现五个智能体的首轮分析耗时基本等于最慢那个的时间而不是五个之和。辩论轮次因为存在依赖关系必须串行但可以设置最大轮次上限和提前终止条件。如果某一轮结束后所有冲突都已解决直接跳出不用跑满预设轮次。我一般设最大三轮实际平均只跑1.8轮。还有一个技巧是缓存中间结果。如果两次决策之间市场数据没有显著变化宏观分析师的输出可以直接复用不用重新调用模型。这个缓存的有效期要根据数据更新频率来定日线级别数据缓存一小时问题不大。4.3 输出格式漂移模型偶尔不按schema输出怎么办即使你在提示词里明确要求JSON格式模型偶尔还是会输出一段自然语言或者JSON字段名拼错。这种情况在并发量大的时候尤其明显。除了前面基类里的JSON片段提取兜底我还加了一层schema校验。用pydantic定义每个智能体的输出模型解析后立即校验字段类型和取值范围。校验失败就触发重试重试时在提示词里追加一句上次输出格式有误请严格按照以下schema输出并附上schema定义。实测下来加上这层校验后格式错误率从百分之十几降到了百分之一以下。注意schema校验不要设得太严。比如置信度字段你定义成0到1的浮点数但模型可能输出0.75或0.75字符串。解析时要做类型转换而不是直接报错。过于严格的校验会导致大量无谓重试反而拖慢系统。5. 让系统真正可用的几个工程化考量5.1 可观测性出了问题你得知道是哪一步崩的多智能体系统的调试难度远高于单模型因为一次决策涉及多次调用、多个角色、多轮交互。没有完善的可观测性出了问题你根本不知道是哪个智能体、哪一轮出的错。我的做法是给每次决策生成一个追踪ID所有智能体的输入输出、耗时、token消耗都记录到这个ID下。日志格式用结构化的JSON方便后续检索和分析。关键字段包括智能体名称、轮次、输入摘要、输出摘要、耗时、是否触发重试、最终是否被采纳。这些数据积累起来后还能做智能体表现分析。比如统计每个智能体的输出被最终决策采纳的比例如果某个智能体的采纳率长期低于两成说明它的角色定位或提示词有问题需要调整。这个反馈闭环是系统持续优化的基础。5.2 降级策略模型服务挂了系统不能跟着挂生产环境里模型服务不可用是必然事件。可能是网络抖动、可能是服务商限流、也可能是模型本身出了故障。系统必须有降级方案不能一挂全挂。我的降级策略分三级。第一级是重试加备用模型主模型调用失败后自动切换到备用模型提示词和schema保持不变。第二级是规则兜底如果所有模型都不可用用预设的规则引擎给出一个保守决策比如维持当前仓位不变。第三级是人工介入系统输出明确的告警信息提示当前无法自动决策需要人工处理。这里有个原则降级后的决策必须比正常决策更保守。模型不可用时宁可不动也不要基于不完整信息做出激进判断。金融场景里少赚比亏钱好得多。5.3 成本控制多智能体不等于烧钱多智能体系统的token消耗是单模型的数倍如果不加控制成本会很快失控。几个实用的省钱技巧第一按需调用。不是每次决策都需要跑满所有智能体。如果市场波动率低于某个阈值可以只跑风险官和宏观分析师跳过技术面和辩论环节。第二分级模型。前面提过辅助角色用小模型。第三压缩上下文。给智能体的历史数据不要全量塞进去做摘要或只保留最近N条。第四设置预算上限。给每次决策设一个token预算超了就强制终止返回当前最优结果。我算过一笔账一套五个智能体、平均跑两轮的系统单次决策成本大约在单模型的四到六倍。但如果它能帮你避免一次错误的重仓决策这个成本完全可以接受。关键是要让成本可预期、可控制而不是月底看账单时才发现超支。6. 这套架构还能往哪些方向延伸多智能体LLM在金融交易决策上的应用目前还处于比较早期的阶段。我自己在跑这套系统的过程中看到几个值得继续深挖的方向。一个是记忆机制的引入。现在的智能体每次决策都是失忆的不记得上次判断对不对。如果给每个智能体加一个历史表现记忆库让它能参考自己过去的准确率来调整当前的置信度决策质量应该还能再上一个台阶。这个思路和 llm wiki知识库 的理念有相通之处都是让模型能够积累和调用长期知识。另一个是与量化策略的融合。纯LLM决策在数值计算上不如传统量化模型精确但它在解读非结构化信息新闻、公告、研报上有独特优势。把两者结合让LLM负责定性判断、量化模型负责定量计算可能是个更务实的路线。还有一个是多市场适配。不同市场的有效性、波动特征、信息传播速度都不一样同一套智能体配置未必通用。需要针对不同市场做参数调优和角色调整。这个工作量不小但做成了价值很大。我在实际使用中最大的体会是多智能体系统的价值不在于某个智能体有多强而在于整个协作流程能否稳定地产生比单模型更好的判断。这需要大量的调试、观测和迭代没有一蹴而就的方案。但方向是对的值得投入时间打磨。