☰
百亿token手搓投资Agent:五层架构与多角色辩论实战
2026/10/14 7:12:52 网站建设 项目流程

1. 从零拆解一个投资Agent的骨架设计

1.1 为什么是“手搓”而不是“调包”

看到“百亿token手搓”这个说法,很多人的第一反应是:都烧了这么多token了,为什么不直接上现成的框架?我一开始也这么想,但真正动手做过一轮之后才明白,投资类Agent和普通的问答机器人完全是两码事。普通对话Agent可以容忍模糊、可以胡说八道,用户顶多觉得“这AI不太聪明”。但投资Agent不行,它输出的每一个数字、每一条推理链,都可能直接影响真金白银的决策,容错率极低。

所谓“手搓”,核心含义是不依赖某个大而全的Agent框架来包办一切,而是自己把数据管道、推理循环、工具调用、记忆管理、风控校验这几个模块一层层搭起来。框架能帮你省掉胶水代码,但省不掉你对业务逻辑的思考。尤其是投资场景,数据源的清洗规则、指标的计算口径、推理的约束条件,这些东西框架给不了你,只能自己写。

我踩过的第一个坑就是过早引入框架。当时用了一个流行的Agent编排库,结果发现它默认的“思考-行动-观察”循环对投资分析来说太粗糙了——它会把一次财报数据查询和一次情绪分析混在同一个推理步里,导致中间结果无法追溯。后来我把循环拆成“数据采集→特征计算→多空辩论→风险审查→结论生成”五个独立阶段,每个阶段单独控制prompt和工具集,整个系统的可解释性才上来。

所以“手搓”的本质是对推理流程的完全掌控。你清楚每一步在干什么、用了什么数据、为什么得出这个中间结论。这在投资场景里不是可选项,是必选项。

1.2 整体架构:五层分离的设计哲学

一个能跑起来的投资Agent,我把它拆成五层。这个分层不是拍脑袋想的,是反复重构之后稳定下来的结构。

第一层是数据接入层。负责从各类数据源拉取原始数据,包括行情数据、财务数据、公告文本、舆情信息等。这一层的关键是统一数据格式和时间对齐。不同数据源的时间戳精度不一样,有的到秒,有的到天,如果不做对齐,后面计算指标时会出现“用未来数据算过去”的严重错误。

第二层是特征计算层。把原始数据加工成Agent能理解的中间表示。比如把原始K线转成波动率、动量、换手率等指标,把公告文本转成结构化的事件标签。这一层我坚持用确定性代码实现,不用LLM,因为数值计算必须精确可复现。

第三层是推理决策层。这是LLM真正发挥作用的地方。我设计了一个“多角色辩论”机制:一个角色负责看多,一个角色负责看空,还有一个中立角色负责总结分歧点。三个角色共享同一份特征数据,但prompt的立场不同,最后通过投票或加权得出初步结论。

第四层是风控校验层。对推理结论做硬性约束检查。比如仓位建议不能超过预设上限,止损位必须明确,单次建议涉及的标的数量不能超过阈值。这一层是纯规则引擎,不经过LLM,防止模型在极端行情下输出激进建议。

第五层是记忆与反馈层。记录每次决策的完整上下文和后续实际表现,用于定期回测和prompt迭代。这一层让Agent具备“从历史中学习”的能力,但学习的方式不是在线更新模型参数,而是通过检索相似历史场景来调整当前推理的参考权重。

这五层之间通过明确定义的接口通信,每层的输出都是下一层的输入,且每层都有独立的日志记录。这样做的好处是,当最终结论出现偏差时,我可以快速定位是哪一层的哪个环节出了问题,而不是面对一个黑箱束手无策。

1.3 百亿token到底花在哪里了

很多人好奇百亿token的消耗分布。我拉了一下自己的账单记录,大致比例如下:

消耗环节占比说明
多角色辩论推理约45%每次决策需要3-5个角色各跑一轮,且要多次采样取共识
长文档解析约25%财报、研报、公告的全文理解,单篇动辄数万字
历史回测约20%对过去数年的决策点逐一重放,验证策略稳定性
记忆检索与总结约10%对历史决策记录做摘要和索引,供后续检索

可以看到,辩论推理是大头。为什么需要多轮采样?因为投资决策对一致性要求很高,单次采样随机性太大。我的做法是每个角色跑3次,取多数一致的结论作为该角色的输出,然后再进入跨角色辩论。这样虽然token消耗翻了3倍,但结论的稳定性明显提升。

长文档解析的消耗也不容小觑。一份年报动辄两三百页,如果直接塞进上下文,不仅贵,而且模型容易“迷失在中间”。我的优化策略是分层摘要:先用小模型对每个章节做摘要,再用大模型对摘要做二次整合,最后只把整合后的关键信息送入推理层。这样能把单份年报的token消耗压到原来的三分之一左右。

2. 核心模块的细节实现与避坑指南

2.1 数据管道:清洗比采集更重要

数据接入听起来简单,实际上是最耗时的环节。我大概花了整个项目40%的时间在数据清洗上。几个关键点:

时间对齐是第一条红线。行情数据通常是秒级或分钟级,财务数据是季度级,公告是事件级。如果不做对齐,很容易出现“用收盘后发布的公告去解释当天盘中走势”这种逻辑错误。我的做法是统一用“决策时点”作为基准,所有数据只取该时点之前已经发布的部分。这个规则听起来简单,但实现时要处理很多边界情况,比如公告的发布时间戳和实际可获取时间可能有延迟。

缺失值处理不能一刀切。财务数据缺失和行情数据缺失的处理方式完全不同。行情缺失可以用前值填充或插值,但财务数据缺失往往意味着公司没有披露,这时候填充反而会引入偏差。我的策略是:行情类缺失做插值,财务类缺失标记为“未披露”并让模型知道这个信息本身就有意义。

异常值检测要结合业务逻辑。纯统计方法(比如3σ原则)在金融数据上经常误杀。比如某天换手率突然放大,统计上是异常,但业务上可能是重大事件导致的,这个“异常”恰恰是重要信号。我的做法是统计检测和事件检测并行,只有两者都触发才标记为需要人工复核的异常。

实操心得:数据管道的日志要记录每个字段的来源、处理方式和时间戳。后期排查问题时,这份日志能帮你省下大量时间。

2.2 多角色辩论机制的设计细节

多角色辩论是我认为最有价值的设计。具体实现上,我定义了三个基础角色:

  • 看多角色:prompt中明确要求“寻找所有支持上涨的证据,对利空因素给出反驳或弱化解释”
  • 看空角色:与看多对称,要求“寻找所有支持下跌的证据,对利多因素给出质疑”
  • 中立角色:不预设立场,负责梳理双方论据、指出逻辑漏洞、给出概率化判断

每个角色都能访问相同的工具集,包括财务指标查询、舆情检索、历史相似场景检索等。但它们的检索策略不同:看多角色会优先检索正面新闻和超预期指标,看空角色则相反。这种检索偏差是刻意设计的,目的是让辩论更充分。

辩论的终止条件不是“达成一致”,而是“分歧点明确”。很多时候多空双方就是无法说服对方,这本身就是重要信息——说明当前标的存在重大不确定性。中立角色会把分歧点列出来,并给出“在何种条件下看多逻辑成立、在何种条件下看空逻辑成立”的条件化结论。

这里有个坑:不要让角色之间直接对话。我试过让看多和看空角色互相回复,结果它们很快陷入互相攻击的循环,token消耗暴涨但信息增量很少。后来改成“各自独立输出→中立角色汇总”的星型结构,效率高很多。

2.3 风控校验层的硬规则设计

风控层是纯代码实现的,不经过LLM。规则大概有这几类:

仓位约束。单次建议的仓位变化不超过总仓位的某个百分比,具体数值根据账户风险等级设定。这个约束是硬性的,如果推理层给出的建议超限,风控层会直接截断并记录一条警告。

止损约束。任何买入建议必须附带明确的止损条件,可以是价格止损,也可以是逻辑止损(比如“如果下季度营收增速低于X%则退出”)。没有止损条件的建议会被风控层打回。

集中度约束。单次建议涉及的标的数量、行业分布都有上限。防止Agent在某个热门赛道上过度集中。

流动性约束。建议的仓位规模不能超过标的近期日均成交量的某个比例,避免建议本身影响市场价格。

这些规则看起来简单,但参数设定需要结合具体账户情况反复调整。我的经验是先用保守参数跑一段时间,观察风控层拦截了多少建议、拦截的原因分布,再逐步放宽。一开始就设得很宽松,等于没有风控。

2.4 记忆系统的检索策略

记忆系统不是简单的“存下来、查出来”。投资场景的记忆检索有几个特殊要求:

时间衰减。越久远的记忆权重越低,但衰减速度不是线性的。我的做法是给每条记忆打一个“时效分”,根据决策类型不同,衰减曲线也不同。比如宏观判断的记忆衰减慢,个股事件的记忆衰减快。

相似度计算要结合结构化特征。纯文本相似度不够用,还要考虑市场状态(波动率水平、趋势强度)、标的特征(行业、市值、估值分位)等结构化维度。我最终用的是文本嵌入和结构化特征的加权组合。

检索结果要重新排序。初步检索出Top-K条记忆后,再用一个轻量模型对每条记忆与当前场景的相关性做二次打分,只保留高分的前几条送入推理层。这一步能显著减少无关记忆对推理的干扰。

3. 完整实操流程:从数据到决策的全链路

3.1 决策触发与数据准备

整个流程的起点是决策触发。触发方式有两种:定时触发(比如每天开盘前跑一次)和事件触发(比如某标的出现异常波动或重大公告)。事件触发的响应速度要求更高,所以数据准备策略也不同。

定时触发时,我会提前把大部分数据准备好,决策时只需要拉取最新增量。事件触发时,需要快速拉取相关数据,这时候数据源的响应速度就成了瓶颈。我的做法是对关键数据源做本地缓存,缓存更新频率根据数据类型设定,行情类高频更新,财务类低频更新。

数据准备完成后,会生成一个“决策上下文包”,包含:当前市场状态摘要、标的特征向量、相关记忆检索结果、可用工具列表。这个包会作为后续所有推理步骤的共享输入。

3.2 多轮辩论的完整执行记录

我截取一次实际决策的简化记录来说明流程。假设决策时点是某日开盘前,标的是某消费行业公司。

第一轮:独立分析。看多角色输出:营收连续三个季度加速,毛利率企稳回升,舆情正面占比65%,给出“偏多”判断。看空角色输出:估值处于历史80%分位,机构持仓拥挤度高,近期有大股东减持公告,给出“偏空”判断。中立角色输出:双方论据都成立,核心分歧在于“业绩加速能否抵消估值压力”。

第二轮:针对性补充。中立角色提出需要补充两个信息:一是历史上类似估值分位下,业绩加速标的的后续表现;二是大股东减持的规模和节奏。系统自动调用历史检索工具和公告解析工具,获取补充信息。

第三轮:条件化结论。基于补充信息,中立角色给出条件化判断:如果减持规模低于流通股的某个比例,且下季度业绩预告超预期,则看多逻辑成立;否则看空逻辑占优。最终结论附带明确的触发条件和观察指标。

整个流程跑了三轮,消耗token约数万,耗时约两分钟。这个速度和成本对于日频决策来说是可以接受的。

3.3 风控校验与最终输出

推理层输出后,进入风控校验。假设推理层建议“买入,仓位增加2%”,风控层检查:仓位变化在允许范围内,通过;止损条件明确,通过;标的集中度未超限,通过;流动性约束满足,通过。最终输出建议。

如果任何一项不通过,风控层会返回修改意见,推理层需要重新生成建议。我设定最多重试两次,两次都不过就放弃本次决策并记录异常。

最终输出格式是结构化的,包含:建议动作、建议仓位、止损条件、核心逻辑摘要、主要风险点、需要持续跟踪的指标。这个格式是固定的,方便后续回测和复盘。

3.4 回测与迭代的实操方法

回测不是简单地把历史数据跑一遍。我的做法是逐决策点重放:对历史上每个决策时点,用当时可获取的数据重新跑一遍完整流程,记录输出,然后与实际后续表现对比。

回测中最容易犯的错误是未来函数。比如用了后来才发布的财务数据,或者用了事后修正过的行情数据。我的防范措施是:所有数据都带版本号,回测时严格使用决策时点对应的数据版本。

迭代方面,我主要调整三类东西:prompt的措辞、辩论角色的数量、风控规则的参数。每次只调一类,观察回测指标的变化。回测指标我关注三个:方向准确率、风险调整后收益、最大回撤。三个指标要同时看,单独优化任何一个都容易过拟合。

4. 常见问题与排查技巧实录

4.1 模型输出不稳定的排查思路

模型输出不稳定是最高频的问题。同样的输入,跑两次结论相反,这在投资场景里是致命的。排查思路按优先级排列:

第一,检查温度参数。推理层我最终把温度设到很低,接近确定性输出。但即使这样,由于浮点计算的微小差异,极端情况下仍可能出现不一致。所以关键决策我会跑三次取多数。

第二,检查上下文长度。上下文过长时,模型对中间部分的注意力会下降,导致关键信息被忽略。我的做法是严格控制送入推理层的token数量,超长内容先做摘要。

第三,检查prompt的歧义。有些措辞在不同语境下理解不同。比如“近期”这个词,模型可能理解为三天,也可能理解为三个月。所有时间相关的表述我都改成明确的天数。

第四,检查工具返回结果的格式。如果工具返回的JSON格式有细微变化,模型可能解析失败但不会报错,而是基于错误理解继续推理。所有工具返回都做了严格的格式校验。

4.2 数据延迟导致的决策偏差

数据延迟是另一个隐蔽的坑。有一次回测表现很好,实盘却差很多,排查后发现是回测时用了修正后的财务数据,而实盘时用的是原始数据,两者有差异。

解决方案是建立数据版本管理机制。每个数据点都记录:原始值、修正值、修正时间、修正原因。回测时根据决策时点选择对应版本。实盘时只用当时可获取的版本。

另外,对于公告类数据,要区分“发布时间”和“可获取时间”。有些公告在非交易时段发布,实际可获取时间是下一个交易时段开始。这个细节对短线决策影响很大。

4.3 辩论陷入僵局的破解方法

多空辩论有时会陷入僵局,双方各执一词,中立角色也无法判断。这种情况我遇到过几次,破解方法有这几个:

引入第三方视角。比如从产业链上下游的角度看,或者从跨市场比较的角度看。有时候A股看不清的,看看港股或美股的同类标的表现,会有启发。

降低决策粒度。如果日频决策僵持不下,就退到周频看趋势。粒度放粗后,噪音减少,分歧往往自然消解。

标记为“不确定”并放弃决策。这是最后的手段。投资中“不决策”也是一种决策。当分歧无法弥合时,空仓等待比强行决策更安全。

4.4 常见问题速查表

问题现象可能原因排查动作解决方向
输出结论前后矛盾温度过高或上下文过长检查温度参数和token数降低温度,压缩上下文
回测好实盘差未来函数或数据版本不一致核对数据时间戳和版本建立版本管理机制
辩论无休止终止条件不明确检查辩论轮次上限设定最大轮次和分歧标记
风控频繁拦截规则参数过严统计拦截原因分布逐步放宽参数
记忆检索不准相似度计算维度单一检查检索结果相关性增加结构化特征权重
工具调用失败返回格式变化或超时检查工具日志增加格式校验和重试

避坑技巧:每次修改prompt或参数后,不要只看单次结果,要跑一批历史决策点看整体指标变化。单次结果好可能是运气,整体提升才是真的改进。

4.5 成本控制的几个实用手段

百亿token听起来多,但分摊到每次决策其实可控。几个降本手段:

分层用模型。简单任务用轻量模型,复杂推理才用大模型。比如文档摘要用轻量模型,多角色辩论用大模型。

缓存复用。相同的数据查询结果缓存起来,避免重复调用。尤其是历史回测时,大量查询是重复的。

批量处理。多个标的的决策可以批量跑,共享部分上下文,减少重复计算。

定期清理记忆。低价值的记忆及时归档或删除,减少检索时的计算量。

这些手段综合下来,我的单次决策成本比最初降低了约60%,而决策质量没有明显下降。

5. 一些个人体会和后续可扩展的方向

这个Agent跑了一段时间,最大的体会是:投资Agent的核心竞争力不在模型,而在数据质量和流程设计。模型能力是公开的,大家都能用,但数据清洗的细致程度、辩论机制的设计、风控规则的合理性,这些才是差异化的来源。

另一个体会是不要追求全自动。我目前的定位是“决策辅助”而非“决策替代”。Agent输出建议,人来最终拍板。这样既利用了Agent的信息处理能力,又保留了人的判断力和责任感。完全自动化的投资系统,在可预见的未来我都不太放心。

后续可以扩展的方向有几个:一是引入更多非结构化数据,比如供应链数据、卫星图像数据等;二是优化辩论机制,引入更多元的角色视角;三是完善反馈闭环,让记忆系统能更智能地识别“哪些历史经验在当前场景下真正适用”。

这个项目我还会继续迭代,有新发现再分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询