AI 金融分析三步流水线:Dexter 如何把复杂问题拆成可执行计划
【免费下载链接】dexterAn autonomous agent for deep financial research项目地址: https://gitcode.com/GitHub_Trending/dexter19/dexter
把"评估特斯拉 2024 年 Q3 财务健康"这类问题抛给 Dexter 这个开源自主智能体,它不会直接甩一个答案——而是先把问题拆开:取数、算指标、对比同业,再整理出结论。这套任务分解的精髓,是一条不断重复的三步流水线。本文带你从代码层面走一遍它的运行方式。
🔁 运行原理一句话:智能体就像坐在工位上的分析师
先抛开代码,说说 Agent Loop(智能体循环,即"思考→行动→总结"反复跑的闭环)。Dexter 干活的方式很像一位金融分析师:先查资料,再核对数据够不够,整理一下看过的东西,最后给出结论。"查资料"就是调工具,"整理"就是把结果压成摘要,"给结论"就是最终回答。
关键在于:每一轮循环结束,模型自己决定下一步——觉得数据还不够,就再调一次工具,进入下一轮;觉得够了,就停掉循环,输出答案。没有人为写死的分支逻辑,"该不该继续"由模型实时判断。
🧩 三步流水线:复杂问题被一层层拆开
① 工具映射:什么问题调什么工具
为什么需要:金融问题的信息需求五花八门——基本面、行情、财报,不可能指望模型"凭感觉"乱查。得先让模型知道自己手里有什么牌。
怎么实现:src/tools/registry.ts 里的getToolRegistry()把所有工具注册在一个地方,每个工具都带一段描述(做什么、什么时候用):get_financials管财务报表,get_market_data管股价和新闻,read_filings管 SEC 文件。用户问估值,模型自己挑get_financials;问行情,挑get_market_data。映射靠描述驱动,而不是写死的 if-else。
② 摘要压缩:原始数据不全量塞进上下文
为什么需要:一份完整财报动辄上万 token,如果每次工具结果都原样塞进上下文,几轮之后窗口就爆了,分析进行不下去。必须"留重点、扔冗余"。
怎么实现:先总结,再继续。src/agent/compact.ts 会调一个快速模型,把已经积累的各次工具结果压成一份结构化摘要——原始问题、关键数字、还缺哪些数据——后续轮次里用这份摘要替换原始结果。文件里的注释说得很直白:与其丢掉旧工具结果(信息永久丢失),不如让快速 LLM 把它们总结掉。换句话说,模型永远基于"关键信息"推理,而不是原始数据堆。
③ 迭代熔断:maxIterations 上限怎么兜底
为什么需要:万一模型一直觉得"数据还不够"呢?不设上限,它可能无限取数、无限循环,那就是失控的 API 账单和卡死的过程。熔断机制给整个过程一个"下班时间"。
怎么实现:一个常量和一个 while 条件:
const DEFAULT_MAX_ITERATIONS = 10;这个常量配合 src/agent/agent.ts 主循环里的while (ctx.iteration < this.maxIterations),到了上限就强制停手,并如实汇报"未能在限定步数内完成"。上限是可配置的——定时任务场景设 6,主交互流程给 10。
📊 案例走查:特斯拉 2024 Q3 财务健康是怎么一步步得出的
假设你问"评估特斯拉 2024 年 Q3 的财务健康状况",整个过程沿这条时间线推进:
| 步骤 | 动作 | 典型工具 |
|---|---|---|
| 1 | 识别关键要素:特斯拉、2024Q3、财务健康 | 纯推理,不调工具 |
| 2 | 取 10-Q 季报和三大报表 | read_filings / get_financials |
| 3 | 算流动比率、负债水平、营收增速 | get_financials + 模型推理 |
| 4 | 取同业(福特、通用等)数据做对比 | get_market_data |
| 5 | 权衡供应链与竞争因素,给出最终结论 | 摘要压缩 + 最终回答 |
这里有两个细节值得注意。先说第 3 步:模型不自己算数,它拿工具返回的数字做比率推导;再说第 4 步:如果它觉得对比不充分,会再发起一轮工具调用——这正是 Agent Loop 里"迭代"二字的体现。到了第 5 步,如果上下文已经涨得较大,压缩机制会介入,先把前面的结果压成摘要,再落笔写结论。
🧭 实现要点速览
想读源码的话,最值得一看的是 src/agent/agent.ts 的核心循环——一句话:每轮先调模型,有工具调用就执行并把结果塞回去,没有工具调用就认为完工、给出答案:
while (ctx.iteration < this.maxIterations) { const response = await callModel(messages); if (!hasToolCalls(response)) return finalAnswer; // 无工具调用即完成 const toolMessages = await executeTools(response); messages.push(...toolMessages); // 结果回填,进入下一轮 }循环里还配了一个 Scratchpad(scratchpad,字面意思"草稿本"):把本次运行每次工具调用和结果都落到磁盘,方便随时复盘它到底做了什么。把工具描述拼进指令的系统提示则放在 src/agent/prompts.ts。循环、工具清单、压缩逻辑这三块,就是任务分解的完整骨架。
🛠 上手与注意事项
三步跑起来:
git clone https://gitcode.com/GitHub_Trending/dexter19/dexter cd dexter && bun install # 按 env.example 在 .env 里填好 API key,然后 bun start最后说句实话:maxIterations 上限意味着复杂问题最多只有十来轮挖掘,数据没取全时它可能直接认输;行情与财务数据的准确性则取决于上游 API,输出仅供研究参考,别拿去当真实交易的依据。
【免费下载链接】dexterAn autonomous agent for deep financial research项目地址: https://gitcode.com/GitHub_Trending/dexter19/dexter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考