FinAgent-从多数据源分析、Agent 编排到 Debate / Memory / Reflection 的工程化落地(二)
4. 数据与分析底座:系统为什么不是空转 Agent
在很多 Agent 项目里,“智能”往往主要体现在模型推理本身,外部数据只是临时补充。这种方式在演示场景中没有太大问题,但一旦进入股票分析这种高噪声、高时效、高依赖外部信息的场景,就会很快暴露出短板。模型可以负责理解和综合,但如果输入数据本身不稳定、不完整,或者没有被整理成适合推理的结构,Agent 再聪明也只能在模糊甚至错误的上下文上做判断。
FinAgent 在这一点上的设计思路非常明确:先把数据和分析底座打牢,再把 Agent 放上去。 换句话说,Agent 不是系统的全部,而是建立在数据获取、特征处理、信息补充和统一抽象之上的推理层。也正因为如此,FinAgent 的“智能分析”并不是让模型对着原始世界直接作答,而是先通过一系列工程化模块把原始输入转化为高质量上下文。

4.1 多数据源:先解决“有没有数据”和“数据稳不稳”
股票分析系统的第一道门槛,不是策略,也不是模型,而是数据可用性。现实世界中的金融数据天然存在很多问题:接口可能不稳定,返回结构可能不一致,不同市场的数据覆盖也并不均衡。单一数据源一旦失败,整条分析链路就会受到影响。因此,FinAgent 没有把自己绑定在某一个行情服务上,而是围绕多数据源和 fallback 机制来组织底层能力。
在仓库中,这一层主要由 data_provider/ 目录承担。系统接入了多个行情提供方,例如 AkShare、Tushare、Pytdx、Baostock、yfinance、Longbridge 等,并通过统一的数据获取管理器对外暴露一致接口。对上层来说,它并不需要关心这次行情是从哪个提供方成功获取的,也不需要为不同市场写一套完全不同的调用逻辑。真正承担复杂度的是数据层本身,它负责做优先级选择、失败回退、格式兼容和市场差异适配。
这种设计看似“基础”,但其实非常关键。很多金融系统失败,并不是因为模型效果不够,而是因为对外部依赖的脆弱性估计不足。FinAgent 选择从一开始就接受一个事实:数据源会失败,网络会波动,接口会变。与其假设外部世界稳定,不如把“不稳定”当作前提条件,让系统具备自动切换和降级能力。对股票分析这样的场景来说,这种工程思路的意义远大于单次分析里多跑一个指标。
4.2 结构化特征准备:让 Agent 站在处理过的数据上推理
即使成功拿到了行情数据,Agent 也不应该直接面对原始表格或零散数字。原始数据固然真实,但它并不天然适合推理。让模型自行从 K 线、均线、量能、涨跌、波动等基础信息里抽象结构,不仅成本高,而且容易产生歧义。更好的方式,是先由系统完成一层结构化分析,再把中间结果交给 Agent 做综合判断。
FinAgent 中的这一层工作,主要由趋势分析和相关服务模块承担。系统会围绕价格走势、均线关系、成交量、换手、筹码结构等信息,先提炼出一组更适合决策的分析特征。例如,某只股票当前是否处于多头排列、价格相对短期均线是偏离还是回踩、成交量是放量还是缩量、筹码集中度是否健康,这些信息对人类分析师和智能体而言都比原始日线数据更直接。
这种设计有两个明显好处:
- 降低 Agent 的上下文理解负担 – 模型不需要在一堆低层数据中自己寻找模式,而是能基于已经整理过的特征进行更高层次的综合推理。
- 提高系统输出的一致性 – 因为基础特征是由程序逻辑统一提取的,所以不同请求、不同模式下的分析至少有一套共享的“底层事实”,不会完全依赖模型在每次调用中临场发挥。
从工程视角看,这一层实际上是 FinAgent 的“分析前处理器”。它把原本属于人类分析师的部分基本功,固化成系统可重复执行的流程。也正是这一步,让 Agent 更像是在做“判断”,而不是在补做底层数据清洗。
4.3 情报增强:行情之外,系统还要理解市场在发生什么
如果说行情和技术特征回答的是“这只股票现在是什么状态”,那么新闻、公告和舆情回答的则是“为什么会这样,以及接下来可能发生什么”。在真实投资决策里,这两类信息缺一不可。只看技术面,容易忽略突发风险和情绪催化;只看新闻,又会失去对价格结构和节奏的判断能力。因此,FinAgent 在数据底座之外,还专门引入了搜索与情报增强层。
这一层主要由搜索服务模块承担。系统并不依赖单一搜索提供方,而是支持多种搜索引擎与外部信息源,并对搜索结果进行统一整理、筛选和上下文化。对 Agent 来说,它看到的不是零散网页链接,而是一组经过提炼的新闻摘要、事件线索和可能影响判断的外部信息。
这部分设计背后的逻辑非常清晰:金融分析从来不是封闭世界问题。价格变化往往是信息驱动的,尤其是在高波动和事件敏感的市场环境下,单纯依赖历史行情很容易滞后。因此,FinAgent 不把外部搜索当成附属能力,而是把它视为分析链路中的关键组成部分。技术面负责解释结构,情报层负责解释扰动,而 Agent 则站在两者之上完成综合判断。
值得注意的是,这里的搜索能力并不是为了让系统“看起来更聪明”,而是为了增强分析的现实感和时效性。一个仅靠历史行情做出的结论,往往只适用于平稳场景;而一个能同时感知外部事件的系统,才有机会在复杂市场里保持更高的适应能力。
4.4 从底座到推理:FinAgent 的真正分工方式
把多数据源、技术特征提取和情报增强放在一起看,就能更清楚地理解 FinAgent 的分工方式。它并不是把所有工作都丢给模型,而是把任务拆成两类:
- 系统更擅长的事情 – 抓取数据、做格式统一、计算基础指标、筛选外部信息、建立稳定服务接口。这些工作适合由程序和规则来完成,因为它们强调一致性和确定性。
- 模型和智能体更擅长的事情 – 整合多维证据、处理冲突信号、形成自然语言解释、给出综合判断。这些工作更依赖推理和表达,适合交给 Agent 层完成。
这种分工方式使 FinAgent 避免了两个常见误区:它没有把所有智能都前置为规则系统,否则系统会僵化;也没有把所有判断都后置为模型自由发挥,否则系统会缺乏稳定性。相反,它在数据与分析底座和 Agent 推理层之间建立了一种相对平衡的关系:底座负责把世界整理得尽可能清楚,Agent 负责在这个基础上做有约束的判断。
从这个角度看,FinAgent 的数据与分析层并不是配角,而是整个智能系统成立的前提。没有这层基础,后面的多 Agent、Debate、Memory 和 Reflection 都会变成“在不可靠输入上的复杂推理”。而只有当前面的世界被尽量整理好,后面的智能才真正有机会发挥价值。
5. Agent 架构设计:从单 Agent 到多 Agent,再到 Debate 模式
如果说数据与分析底座解决的是“系统看到了什么”,那么 Agent 架构解决的就是“系统如何思考”。这也是 FinAgent 最有辨识度的部分之一。它没有把全部推理逻辑塞进一次模型调用,而是根据任务复杂度、成本和解释需求,设计了多层次的 Agent 组织方式:单 Agent、多 Agent,以及进一步的 Debate 模式。

nt 组织好系统提示词、用户问题、当前上下文以及可用工具定义。随后,Agent 进入一个带 step 限制的循环:如果模型判断还需要更多证据,就调用工具;如果信息已经足够,就输出最终结论。工具调用结果会回流到上下文中,供后续步骤继续消费。这使得单 Agent 不再是一次性回答器,而是一个能够 “边查边想边答”的受控执行器 。
这种模式的优势非常明显:结构简单、链路短、成本较低,也更适合响应速度要求高的任务。对于信息相对明确的问题,单 Agent 往往已经足够有效,不需要引入额外的角色拆分和协作开销。更重要的是,由于工具系统是结构化注册的,单 Agent 的推理过程并不是完全黑盒,系统仍然能够追踪它调用了哪些能力、基于什么证据得出了当前判断。
但单 Agent 也有天然局限。它虽然能调用多个工具,却仍然只有一个核心推理中心。技术面、风险面、情报面之间的权衡,最终都在同一个上下文窗口里完成。当问题变得更复杂、信息冲突更明显时,单一 Agent 容易陷入“一个人格同时扮演所有角色”的状态:它既要做事实收集者,也要做风险控制者,还要做最终裁决者。这样做不是不能跑,而是很难在复杂任务中保持长期稳定性和解释性。
因此,在单 Agent 之外,FinAgent 很自然地演进出了第二层结构。
5.2 多 Agent:让不同角色分阶段协作
FinAgent 的多 Agent 模式由 AgentOrchestrator 驱动。与单 Agent 的“一个核心执行器”不同,这里系统会把一次分析任务拆成多个有明确职责的阶段性角色,例如:
- 技术分析 Agent
- 情报收集 Agent
- 风险评估 Agent
- 技能专家 Agent
- 最终决策 Agent
每个 Agent 只负责自己最擅长的那一部分推理,然后把结果写回共享上下文,供后续阶段使用。
这样的拆分方式并不是为了形式上的“多智能体”,而是有明确业务含义的。股票分析本来就是一个多视角决策过程:技术分析关心趋势、均线、量价结构;情报分析关心新闻、事件和市场情绪;风险分析关心负面信号和不确定性;最终决策则需要综合不同来源的观点,并给出操作建议。把这些任务压缩在一个 Agent 里当然可行,但一旦任务复杂度提高,拆分角色会更自然,也更容易控制。
在 FinAgent 中,多 Agent 协作并不是完全自由讨论,而是典型的“流水线式协同”。前面的 Agent 负责建立局部判断,后面的 Agent 基于这些判断继续推进。这种模式比完全放任的群体对话更稳,因为它保留了明确的阶段边界,也便于后续做超时控制、失败降级和结果追踪。
从工程角度看,多 Agent 模式带来了几个重要变化:
- 推理过程更容易被解释 – 你可以清楚地知道当前结论更多来自技术面、情报面还是风险面,而不是只看到一个综合后的黑盒答案。
- 职责更容易扩展 – 后续如果要加入新的专家角色,并不一定要重写整个分析器,只需要把新的 Agent 插入现有流程并定义清楚输入输出边界即可。
- 更细粒度的质量控制 – 某个阶段失败时,系统可以选择降级继续,而不是整条分析链路直接中断;某个阶段表现不稳定时,也更容易单独观察和优化。
不过,多 Agent 依然不是终点。它虽然完成了角色分工,但大多数情况下仍然是“依次分析、顺序传递”。而在股票分析这种本身充满不确定性的场景里,仅仅分工还不够,系统还需要一种显式处理分歧和冲突的机制。这就是 Debate 模式存在的原因。
5.3 Debate 模式:让分歧显性化,而不是隐藏在一个结论里
FinAgent 的 Debate 模式是其 Agent 架构里最有特色的一层。与单 Agent 或多 Agent 的顺序协作不同,Debate 模式引入了明确对立的立场角色:Bull、Bear,以及最终负责汇总裁决的 Moderator。系统不再默认“分析一定会自然收敛”,而是主动让不同观点围绕同一只股票展开结构化博弈。
这种设计的价值在于,它把许多原本隐含在模型内部的冲突,显式地暴露了出来。在真实的股票分析中,看多和看空往往都能找到证据:价格趋势可能支持看多,但风险事件又可能支持谨慎;短期情绪可能偏热,但中期结构并不稳。传统单模型很容易直接把这些矛盾压缩成一句模棱两可的话,而 Debate 模式则允许系统先把两种立场充分表达出来,再通过多轮 rebuttal 和 moderator 汇总形成最终判断。
在 FinAgent 中,Debate 不是简单的“多回答几次”,而是有明确的:
- 状态组织
- 轮次控制
- 收敛机制
Bull 与 Bear 会分别基于共享上下文提出论点,如果没有快速达成信号收敛,就继续进行反驳和修正。Moderator 则负责在争论结束后综合所有轮次,形成最终的 dashboard 或总结性结论。也就是说,这不是一种无边界的辩论,而是一种被工程化约束过的结构化冲突推理流程。
从系统设计角度来看,Debate 模式有三点很值得关注:
- 增强推理的可解释性 – 最终结论不再只是一个神秘的输出,而是可以回溯到不同立场的论据和交锋过程。
- 更适合处理高不确定性场景 – 相比于一次性拍板,博弈过程更容易暴露潜在风险和信号矛盾。
- 为后续学习提供更丰富的素材 – 系统不仅能记录“最终结论对不对”,还可以记录 Bull 和 Bear 各自的判断、收敛过程,以及哪一方在历史上更接近真实结果。这种信息对后续的记忆、反思和技能提炼非常重要。
当然,Debate 模式的代价也很明显:更多角色意味着更多模型调用、更长延迟和更高成本;更复杂的协作流程也意味着更高的调试难度。因此,FinAgent 没有把 Debate 作为唯一模式,而是把它作为一种在高复杂度任务下可选的增强路径。这样的设计既务实,也更符合真实系统的使用逻辑。
5.4 从架构角度看,FinAgent 在 Agent 上真正做了什么
把单 Agent、多 Agent 和 Debate 模式放在一起看,FinAgent 在 Agent 架构上的真正特点,并不只是“用了很多智能体”,而是它在试图构建一个有层次的推理系统:
- 单 Agent – 负责轻量、高效、低成本的通用分析路径。
- 多 Agent – 负责通过角色拆分提升可解释性和组织性。
- Debate 模式 – 进一步把分歧和冲突变成显式可管理对象。
不同模式之间并不是彼此替代关系,而更像是同一系统在不同复杂度和不同目标下的多种运行姿态。
这也意味着,FinAgent 的 Agent 设计并不是单纯追求“越复杂越好”。恰恰相反,它保留了足够多的简化路径,使系统可以在成本、速度和分析深度之间做现实权衡。这一点在实际工程中非常重要,因为一个只能以最重模式运行的 Agent 系统,往往很难长期稳定地进入真实业务场景。
FinAgent 在 Agent 架构上的核心探索,不是让更多智能体参与,而是让不同层级的推理方式以可切换、可协作、可追踪的形式并存于同一个系统之中。
6. Skills:把交易知识做成可插拔能力模块
如果说多 Agent 解决的是“谁来分析”,那么 Skills 解决的就是 “分析时依据什么领域知识” 。这也是 FinAgent 区别于许多普通 Agent 系统的一个重要亮点。它没有把所有交易策略、市场经验和领域规则都硬编码进一个冗长的系统提示词,而是尝试把这些知识拆成一组 可插拔、可路由、可组合的能力模块 。
这种设计的意义非常大。因为在股票分析场景里,所谓“策略知识”本身就是高度多样化的。不同交易者会关注不同模式,有的人重趋势,有的人重反转,有的人偏好题材龙头,有的人更看重均线结构。如果把这些知识全部揉进一个统一 prompt,一方面会让提示词膨胀,另一方面也很难根据具体市场环境动态调整。Skill 机制的出现,本质上是在尝试把“策略经验”从静态提示中解耦出来,变成系统可管理的资源。
6.1 Skill 的本质:不是代码插件,而是结构化策略知识
FinAgent 中的 Skill 并不等同于传统意义上的 Python 插件。它更接近一种“可被 Agent 理解和调用的交易策略描述单元”。这些 skill 可以用 YAML 或 SKILL.md 的形式定义,内容通常包括:技能名称、描述、适用场景、核心规则、依赖工具、补充说明等。也就是说,Skill 首先是一段结构化领域知识,而不是一段可执行代码。
这种表达方式很有意思,因为它把策略经验留在了自然语言和结构化配置的交界处。对于 Agent 来说,Skill 不需要先被翻译成一套复杂规则引擎,系统可以直接把它们整理进 prompt,让模型在推理时带着这些策略视角去解释市场。而对于开发者来说,新增或调整 skill 的成本也更低,不一定每次都要改核心执行代码。
从更高的层面看,这是一种对“知识模块化”的尝试。它假设一个金融分析系统中的很多经验,并不一定要被写死成程序逻辑,也不一定只能存在于人工经验里,而是可以以一种介于规则和语义之间的形式被收纳、复用和演化。

6.2 Prompt 注入:让 Agent 带着策略视角去分析
Skill 在 FinAgent 中最直接的用法,是作为 prompt 的增强内容注入到 Agent 执行流程里。系统在构建 AgentExecutor 或 AgentOrchestrator 时,会先通过 SkillManager 加载所有可用 skill,再根据配置或上下文激活其中的一部分。随后,这些已激活 skill 的 instructions 会被拼接进 Agent 的系统提示词中。
这一步非常关键,因为它决定了 Agent 不再只是一个通用金融分析助手,而是一个 “带着某些交易策略偏好和判断框架”的分析器 。比如,当某些 skill 被激活时,Agent 会更关注特定的走势结构、量价关系或风险边界;而当激活的 skill 集合变化时,分析视角也会随之变化。
这种方式相比“把所有策略都写进默认 prompt”有两个优势:
- 更灵活 – 系统可以根据任务类型、用户偏好甚至市场环境启用不同 skill,而不需要维护一个越来越难控制的超级提示词。
- 更可维护 – 每个 skill 都有自己的定义边界,修改某一类策略知识不会直接污染整体系统提示,也更利于后续做版本管理和效果比较。
从这个角度看,Skill 为 FinAgent 提供的是一种“策略上下文管理能力”。Agent 看到的不是毫无差别的市场,而是经过 skill 选择之后、带有某种专业视角的市场。
6.3 Skill Router:不是所有技能都要同时上场
如果所有 skill 都无差别启用,系统很快会陷入另一个问题:信息过载。股票分析中常见的策略知识很多,但并不是每一次分析都需要它们全部参与。某些 skill 更适合趋势上行市场,某些更适合震荡市,某些则只在用户明确提出某种交易视角时才真正有意义。因此,FinAgent 没有停留在“加载 skill”这一步,而是进一步设计了 Skill Router。
Skill Router 的作用,是根据当前上下文决定应该选择哪些 skill 参与本次分析。它的判断依据通常有三类:
- 用户是否显式指定了某些 skill
- Technical Agent 是否识别出某种市场 regime
- 如果前两者都没有给出足够信号,则采用默认 fallback 策略集合
这意味着 Skill 不只是静态配置,而是会随着上下文变化动态路由。对于系统来说,这种机制能显著降低无意义的 prompt 膨胀,同时让每次分析更聚焦于当前最相关的策略视角。这也是一个很值得强调的亮点:FinAgent 不是简单做“技能库”,而是在尝试做“技能选择”。
从更一般的 Agent 设计角度看,Skill Router 其实是在回答一个常见但经常被忽视的问题:当系统拥有越来越多专业知识模块时,应该如何在运行时决定哪些知识参与当前决策?FinAgent 给出的答案是:通过上下文驱动的路由,而不是默认全开。
6.4 Skill Agent 与 Skill Aggregator:把技能真正纳入多 Agent 流程
Skill 在 FinAgent 中并不只停留在 prompt 注入层。在多 Agent 的 specialist 模式下,系统会根据 Router 选择出的 skill,创建对应的 SkillAgent 参与分析流程。每个 SkillAgent 可以被理解为一个“站在某种交易策略立场上的专家角色”,它会基于共享上下文,从对应策略视角给出自己的判断。
这样一来,Skill 就不再只是辅助提示词,而是进入了多 Agent 的协作结构中。技术分析、情报分析、风险分析之外,系统又多了一层“策略专家意见”。这使得 FinAgent 的分析过程更接近真实投研或交易决策中的常见情形:基础事实由数据和分析模块提供,综合判断由多角色完成,而特定策略视角则作为专家意见参与最终权衡。
当多个 SkillAgent 都给出意见之后,系统还会通过 Skill Aggregator 对它们进行聚合。这个聚合过程不是简单投票,而是带权重的共识形成。权重既可以来自当前 opinion 的 confidence,也可以进一步结合 skill 的历史表现、回测结果等信息。最终聚合后的 skill consensus 会被写回上下文,供最终决策 Agent 使用。
这一设计很有代表性,因为它说明 FinAgent 对 skill 的理解不是“装饰性的提示模块”,而是“能够参与协作、能够被评估、能够影响最终决策的知识角色”。换句话说,Skill 已经从“写在 prompt 里的经验”进一步走向了“有身份、有输出、有权重的系统组件”。
6.5 Skill 机制的价值:把领域经验从大 Prompt 中解放出来
如果把这一章的内容抽象一下,就能看到 Skill 机制在 FinAgent 中真正承担的角色:它是在给 Agent 系统补一层“可管理的领域知识结构”。
传统做法往往只有两个极端:要么完全依赖规则系统,把策略写死成条件判断;要么完全依赖大模型,把所有经验堆进一个系统提示词。前者可控但僵硬,后者灵活但容易失控。FinAgent 的 Skill 机制则试图走中间路线:让领域知识既保留一定的自然语言表达能力,又具备可加载、可路由、可聚合、可评估的系统属性。
这种路线还带来了一个更长远的可能性。因为一旦 skill 被系统化管理,它就不再只是人工配置项,而有机会进入后续的学习闭环:新的 lesson 可以被抽象成 skill,历史表现可以反过来影响 skill 权重,不同市场环境下 skill 的适用性也可以被持续观察。也就是说,Skill 机制既服务于当前分析,也为未来的“策略知识进化”提供了容器。
因此,Skill 在 FinAgent 中的意义远不只是“多几条交易策略”。它更像是这个系统在 Agent 之外建立的一层专业知识接口,让领域经验不再只能存在于人工脑海里,或者淹没在越来越长的提示词中,而是能够以模块化方式进入智能分析流程,成为整个系统的一部分。
参考:
FinAgent
