遇見 Dexter:當 AI 學會自己查財報
发布于 2026-02-09 00:01:01(微信公众号导出记录)。
本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。
原文链接:查看原文
OCR 转写有效文字约 6822 字;代码、流程图和版式以文末原始排版图为准。
正文(本地 OCR 转写)
original wex7ce EI V1ajero 2826年2月9日 08:01 中国台湾 偶然在G1tHub上刷到一個專案,看了一下發现有點意思。这是一CLI工具,你给它
一個自然语言的間题,它會自已规刺步里、调用工具、查数據,最後给你一個答案。就像有
個金融分析師助理在你翰活。 先看看效果 DEXTER t lor ceg fisa s FIB a KE i5et
$2.40
你不需要告诉它查什磨接口,不需要代碼,直接用自然語言問就行了。 整體架構 先看整體架,不算福,但設計得摇乾净: 用户提局 D.L1 界面 - Ink/Resrt seAgentRunner Hioc
生级签案 代理需琪
1. 满L
2.统行工具
3.更所状图
工具系统 LLM决策下一多 智名路出餐 堂国股综工具 新数器工具 报需工具 Financlsl Datasets API 核心思路就是:读LLM来决定下一步該做什度,而不是硬缩碼一個流程。 代理循環:它自己思考 最有短的是這因代理循项的設計。它不是一次性把活韩完,而是一步步来: 执行工具 生成答案 用户提图 記到 Scratchpad 返回给用户 更新上下文 初始化 创 Scratchpad 领用次数/相似度 橡查限制 用LLM LM返回决簧 有工具调用 超酒选代次数? 生成答案生成答案 用LLM 执行工具
為什磨要這楼設計? 因為有些同题不是一步能搞定的。比如你同「分析一下须果的投资價值;,它可能需要: L.先查财猜数操
2.看完数後现還需要查一下行案到比
3.现遗缺少最新的新
1.最後综合所有信息给出结输
如果一次性把所有可能的工具都额用一遍,既浪費又不一定有用。它自已判下一步需要什 度,曾更重活。 關键代码遥积: //离化的代理循環 while [iteration < maxIterations) { /11.辉用LLN做法策 const response = awalt cattModel(currentPronpt); //2.有tool_calls?就明率健生成答案了 If [!hasToolcalls(response)) { return generateFinalAnswer(scratchpad.getFullcontext()); //3.有tool_calls?纳行工具或收集结票 for (const toolcall of response.tool_calls)( const result = await executeTool(toolcall); scratchpad.addResult{result);//得到策配本 上下文太畏?清理善的结果 if (estimateTokens (context) > THRESHoLD)( scratchpad. clearoldestResults (KEEP_CoUNT) :
5.椭建下一次达代的提示
currentPranpt = buildIterationPronpt(scratchpad-getResults());
Scratchpad:它的筆記本」 每次查询,Dexter 都會制建一個Scratchpad,就像给 AI 配了一低董记本。运個董记本記 了:
-
一開始同了什度問题
-
用了哪些工具
-
每個工具返回了什度结果
-
AI中附有通赐些思考
套入SONL文件 城用计数 dexter/scratchpadr*-jsonl 用户随量 相似度剂 建Scr 内存流障 Jaccard 0.7 工具现用 上下文清理 A1压考 硫超持久化 持久化格式:每個查询生成一個JSONL文件,每行一條記錄: {"type”:"init"."content":"须果和特斯拉嗯個更值得投资?","tinestanp":"2a26-82 {type":"tool_result,"toolNane*:financial_scarch,"args":{"query”:"AA {"type":"thinking”."content":我對比-下南家公司的估情指情...","timestang”:
三大能力:
L.防重试:通過Jaccard相似度橡测,不會重查一样的束西
2.控成本:需上下文太长時,自勐清理蔷结果
3.可追溯:每次查齿都有完整記条,出問题能查日陆
去重通辑: /1检测相低查牌 findS1m1 larQuery (newouery, previousQueries] const newwords = tokenize(newQuery): 分府 for (const prev of previousQueries){ const similarity - jaccard(newwords, tokenize(prev)); if [similarity >= B,7) return prev; 相似座期值 return nutl;
工具系统:三唇架構 工具系统分了三屠,每唇联责清晰:
建绎工具 进行执行
上下文管理
SC 文 WM推 ETviajero 為什座需要路由? 因為用户的提問是自然語言,不是结横化的API跟用。比如你貌“看看频果最近表現如何」, 它需要理解:
- 「表现;可能指股价,也可能指财務
最近;是多長時間?
- 暴要混用哪些具的API?
路由屠用另一個LLM来做这件事,把自然語言翻成具經的工具据用: 11路由量工作流程 func: async (input) => {
111.用LLH理解用户意黑
consl { response } = await callLlm(input.query. { tools: ALL_FINANCE_TOOLS, { /12.提取工具属用 const toolcalls = response.tool_calls; /13,签行执行(多图工具可以同時跑) const results = aivalt Promise.all( LoolCalls.map(tc => FINANCE_TooL_MAP.get(tc-nane) invoke(tcargs)) } ;
4.合饼解果
return combineResults{results);
金融工具群解 Dexter显大的值在於它集成了警富的金融数抽工具。這些工具都是封Financial Datasets API 的封装,AI 能钩像分析師一楼查敏撼。 工具全景圆 get_flings 其他数據 get_news 金徽工具 情格数 get_prices 财瘤辐表 get_income_statements
價格数據工具 get_price_snapshot·取最新格 用示例 get_price_snapshot(( ticker: AAPL }) //返回数城 'price": 178.52, 'se'z inafuryp. "change_percent': 1.33. '000Pezs i.amlax.
- volure": 52340000,
"open": 176.80, "high": 179.12,
- lp": 176.28
get_prices-史格数據 胡用示例 get pricest{ ticker: "AAPL*, start_date: 2024-01-01", interval: “day }) 返回数據 {"date": "2024-01-B2", "open': 182.5. "high*: 185.8, "low': 181.2.
财務報表工具 get_income_statements-利潮表 /调用示例 get_income_statenents ({ ticker: "AAPL*, period: "annual*, //annual/quarterly/ ttn Linit: 5 >) 返四数媒(5年年度利强表) "fiscal_date":"2023-09-30", "revenue': 383285668999. "cost_of_revenue": 214137886e, "gross_profit*: 169148000000, "net_incone': 96958aa099, 座史数據
get_balance_sheets·资至負债表get_cash_flow_statements·現金流量 表get_all_financial_statements·一次性孩取三張报表(效率更高) 估值指標工具 get_key_ratios_snapshot-最新估值指棵 //期用示例 get_key_ratias_snapshot(( ticker: *APL= }) /返四数球 "narket_cap': 28066e8899000,
-
pb_ratia*: 45.2,
-
dividend_yield*: .5,
-
eps": 6.16.
-
revenue_per _share": 24.5.
"enterprisc_value': 275900088800 get_key_ratios·愿史估值指标(用於超分析) SEC文件工具 get_filings-取 SEC文件元数據 旗用示例 get_filings({ ticker: "AAPL*, filing_type: *16-Ka, // 10-K / 10-Q / 8-K Linit: 5 }) 返回数策
"filing_type*: "1B-K", '.20-TI-Ezaz. .04ep Bu1T. "report_date': *2023-09-30′,
- --/Ao6*=s*//:sd.m
get_10K_riling_itens-取 10·K的具错益前 1/调用示例 get_10K_tiling_itens ({ ticker: "AAPL*, accession_unbcr: "6e89320193 23-e68188",
- .-.-
// Item-1: Business
// Item-1A: Risk Factors
// Item-7: HD6A
})
//返四数城
"Iten-1": "Apple Inc. designs, manufactures...,
"Item-iA": "The Conpany's business 1s subject to...
.+suotieuedo ja sinnsay. iat-ua11.
get_1oQ_filing_itens-学轻童前 get_8K_filing_itens-重大事件公告
其他工具
get_news·公司新Mget_insider_trades·内部交易(高管買賣記
公司折get_insider_trades
get_news
条)get_analyst_estimates-分析预期和目标借get_segmented_revenues
分收入
如何使用Dexter
安装
1,克隆事案
git clone https://github.com/virattt/dexter-git
cd dexter
2.安额做難(需曼Bun)
11e15ut unq 配置增要量 #3. cp env.example -env 书编帽,cnV,填入API密编 通行 放触交互模式 bun start 登模式(白触重截) Aap unq 支持的模型 Dexter支持多烟LLM 提供商,通遇模型名耦前领自動罐别: 示例模型 提供商 claude-3.5-sonnet Anthropic claude- Google gem1n1-2.5-f1ash gen1n1 - grok-beta grok- XAI ollama: 本地 ollama: 1lama3 OpenA1 無前额 gpt -40 () 使用示例 效励後,直接输入問题 >须果最新的财极怎磨样? 對比—下特斯拉和比亞进的估信 分析英律達的投资價值,用DCF方法 查一下最近有哪些科技公司在回股票 技能系统 Dexter支持自定技能,比如内置的DCF估值技能: nane: dcf-valuation description: DCF 估值分析 ## DCF Valuation Skill []Step 1: Gathcr financial data
-
[1 Step 2: Calculate FCF growth rate
-
[1 Step 3: Estinate WACC
[] 5tep 4: Projcct futurc cash flows
- [] Step 5: Calculate present value
你可以添加自己的技能到 /.dexter/skills/目,Dexter 自勐現亚加板。 技能系統:把專家知識寫成文檔 遍個設計我置得显巧妙。有些任(比如DCF估值)有一套固定流程,如果把流程硬缩碼 进代碼理售很死板。 Dexter 的做法是:把流程寡成 Markdown 文件,LLM 可以直接懂亚行。
效果:你想加一個新的分析模型,只需要窝個Markdown文件,不需要改代码 技能目结横:
- /-dexter/skills/
— dcf-valuation/
- SKILL .nd
/ssfjeue-ad 5KILL.nd your-skitl/ 5KILL .nd
CLI界面:用React寫終端 这個也提有意思的。它用的是Ink(React for CLI),不是俩統的chalk/ora。 yfeld 事件流 tosl.proyres thirkng toe_start tool_end
除入框 答家属示
- ETviaje
事件题助的状感管理: //Hook訂愿代理事件 const handleEvent = (event) => { switch (event.type) { case 'thinking': break; 1,1je1s 100ol. 0s03 case 'tool_start': setWorkingState({ status:tool', toolNane: event.tool ); break; case 'tool progress': 1 0 updateProgress(event ,message); 11置時更新造座 break; :,auop. ases setAnswer(event answer); break; :{ 代理流式输出事件 for awalt (const event of agent.run(query)) { handleEvent [event ) : } 好處:
-
组件化组UI,代碼清晰
-
事件翻動,代理不關心UI怎磨渲染
-
實時顯示进度,體验更好
多模型支持與成本侵化 Dexer 支持多個LLM提供商,遗做了一些成本化。 支持的提供商 11通通前级白動遮择提供商 "claude-': ChatAnthropic, "genini-': ChatGoogleGenerativeAI. "grok-':ChatopenAI, // XAI API openrouter:': ChatopenAI, // OpenRouter "ewelnoseus : 1eue1lo. Anthropic提示缓存 11敬用系统提示弱级存 function buildAnthropicMessages (systenPrompt, userPrompt) ( return [ new SystemMessage({ content: [{ type: 'text", text: systenPrompt, cache_control: { type: ‘ephemeral'}//照键 1 new HumanMessage(userPrompt) 1: } 效果:系统提示词缓存後,输入成本降低约99% 快速模型分流 const FAST MODELS = { openai: *gpt-4o-mini', anthropic: 'claude-haiku-4-5′ google:“gemini-2.5-flash', 轻量级任移(如摘要)自動使用快速模型,前省成本。 能用在哪? 这固專案雅然是做金融的,但它的架精模式其實挺通用的: 财報解慎 股票分析 病歷分析 珍建謢 金融 估值建模 物查詢 Dexter架辑 故障排查 運维 监控告警 法规检索 法律 日查詢 台同密查 别例分析号
實用俱值: 到於想學習AIAgent開發的開發者,这個專案是一因很好的参考。代碼質量不猫,结橘清 晰,容易改。而且它的金融工具封装也可以直接用在其他项目理。 如果你想自已勤手改改看,可以: L.换成其他数源(比如你自己爬的数)
2.加一些自定裁技能(比如技術分析指標)
3.换成 Web UI(Ink 可以换成 React)
1.做成不同的领域(醫痕、法律、罩商)
專案地址:https://github.com/virattt/dexter
技術: Bun + TypeScript + LangChain + Ink + Financial Datasets API
所需API:
-
OpenAI API(或其他 LLM)
-
Financial Datasets API(金融数)
-
Exa API(可逻,網絡搜索)
原始排版图
原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。
![]()

