从 0 到 1 搭建你的第一个金融投研 Agent(附架构图与核心代码)

关键词:金融投研 Agent、LangChain、大语言模型 LLM、向量数据库 ChromaDB、信息抽取、事件驱动、量化分析

摘要:本文将以「搭建一个能帮你分析苹果公司财报、看新闻、画趋势图的投研小助手」为目标,用「把大象装冰箱」的三步式思维,带你从 0 到 1 拆解金融投研 Agent 的核心逻辑,理解它为什么像「金融界的哆啦A梦口袋+放大镜+计算器」,并用 Python + LangChain + GPT-4o-mini + ChromaDB + Yahoo Finance + Plotly 写出完整可运行的代码。不管你是刚入门AI的小白,还是想在金融领域试水AI的程序员,读完这篇都能拥有自己的第一个投研小工具!


背景介绍:金融投研为什么需要「哆啦A梦」?

目的和范围

目的

很多人做金融投研都会遇到三个「超级头疼的问题」:

  1. 信息太多了,根本看不完:苹果出财报、库克演讲、中美贸易摩擦新闻、股价K线图……一周下来几百条内容,看的头晕眼花还抓不住重点;
  2. 知识太杂了,根本串不起来:想知道「苹果Vision Pro发布后对2024Q3营收的影响」,得先找Vision Pro的销量新闻、找2024Q2的AR/VR营收数据、找分析师对Q3的预测、找苹果供应链的股票联动——手动找简直像大海捞针;
  3. 重复工作太多了,根本没时间思考:每个季度都要整理财报的核心指标(营收、净利润、毛利率、EPS)、每个月都要对比竞品的股价趋势——这些活要是让机器干,我们就能专心做更有价值的判断了!

这三个问题,正是大语言模型(LLM)+ Agent技术能完美解决的!Agent就像「金融界的哆啦A梦」——它有「搜索引擎」这个任意门(找信息),有「记忆面包」这个向量数据库(记信息),有「计算器」这个量化工具(算数据),还有「放大镜」这个LLM本身(分析信息)。

范围

为了让大家能轻松上手,我们的投研Agent不会搞太复杂——它只做这3件事:

  1. 回答公司基本面问题:比如「苹果2024Q2的净利润是多少?毛利率同比增长了多少?」;
  2. 回答事件驱动问题:比如「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」;
  3. 画简单的量化分析图:比如「帮我画苹果2024年1月到6月的收盘价趋势图,对比一下谷歌和微软的」。

等你把这3件事做好了,再慢慢扩展功能(比如加实时预警、加股票推荐、加回测系统)就容易多啦!

预期读者

这篇文章适合三类人:

  1. 刚入门AI的小白:你不需要懂太多深度学习,只要会一点点Python基础(比如会写print、会用pip安装包),就能跟着做;
  2. 想在金融领域试水AI的程序员:你可能懂Python,但对LangChain、向量数据库、金融数据接口不太熟,这篇文章会帮你快速入门;
  3. 对金融投研感兴趣的普通人:你可能不懂编程,但可以先看看Agent的逻辑,等以后学会Python了再动手——或者直接用我们提供的代码,找个会Python的朋友帮你跑!

文档结构概述

我们的文章结构就像「搭积木」——先搭地基(核心概念),再搭框架(系统架构),再装零件(核心代码),最后装饰一下(实际应用、未来趋势)。具体分为以下几个部分:

  1. 背景介绍:就是现在这部分,告诉你为什么要做投研Agent;
  2. 核心概念与联系:用「给小学生讲故事」的方式,解释LLM、Agent、LangChain、向量数据库、信息抽取这些核心概念,还要画架构图和流程图;
  3. 问题拆解与解决思路:把「搭建投研Agent」这个大问题,拆成「找数据」「存数据」「理解问题」「调用工具」「整合答案」五个小问题,逐个解决;
  4. 数学模型与公式:简单讲一下向量数据库用到的「余弦相似度」,还有计算EPS同比增长的公式——别担心,都是初中数学就能看懂的;
  5. 项目实战:完整可运行的代码:先讲开发环境怎么搭,再一步一步写代码,每一行代码都有详细的注释;
  6. 实际应用场景:看看我们的投研Agent能在哪些地方用到(比如个人投资者选股、基金公司研究员辅助、券商投顾写报告);
  7. 工具和资源推荐:给大家推荐一些好用的金融数据接口、LLM平台、Agent框架;
  8. 行业发展与未来趋势:用表格讲一下投研Agent的发展历史,再聊聊未来可能遇到的挑战(比如数据准确性、合规性、黑箱问题);
  9. 总结:学到了什么?:用「小学生能听懂的话」再回顾一遍核心概念;
  10. 思考题:动动小脑筋:给大家留几个小问题,鼓励大家进一步思考和扩展;
  11. 附录:常见问题与解答:解答大家可能遇到的问题(比如怎么申请OpenAI API Key、怎么解决网络问题);
  12. 扩展阅读 & 参考资料:给大家推荐一些好的书籍、文章、视频。

术语表

为了让大家不会被「专业术语」吓到,我们先列一个简单的术语表——后面还会用「讲故事」的方式再解释一遍哦!

核心术语定义
术语专业定义通俗比喻
大语言模型(LLM)一种基于深度学习的语言模型,通过训练海量的文本数据,能够理解和生成人类语言金融界的「超级大脑+翻译官+分析师」——它读过几乎所有的公开文本(财报、新闻、研报),能听懂你的问题,还能给你分析出结论
Agent一种能够自主感知环境、做出决策、执行动作的智能体金融界的「哆啦A梦助手」——它不是只会回答问题的机器人,而是会主动帮你找数据、存数据、算数据、整合答案的小助手
LangChain一个用于开发LLM应用的框架,提供了很多现成的工具(比如连接LLM、连接向量数据库、连接外部API)金融界的「工具箱」——里面有扳手(连接LLM)、螺丝刀(连接向量数据库)、钳子(连接外部API),你不需要自己造工具,直接拿过来用就行
向量数据库(Vector DB)一种专门用来存储和检索「向量」的数据库——向量就是把文字、图片、音频等非结构化数据转换成的一串数字金融界的「记忆面包+搜索引擎」——它能把所有的财报、新闻、研报都「吃」进去(转换成向量存起来),然后当你问问题时,它能快速找到最相关的内容(像搜索引擎一样,但比搜索引擎更懂「语义」)
信息抽取(Information Extraction,IE)从非结构化文本(比如财报、新闻)中提取结构化信息(比如公司名称、时间、营收、净利润)的技术金融界的「放大镜+摘抄本」——它能从厚厚的财报中,快速找到你需要的核心数据,然后抄在一个整齐的表格里
事件驱动(Event-Driven)一种根据特定事件(比如公司发布财报、产品发布、政策变化)来做出决策的投资策略金融界的「闹钟+温度计」——当有重要事件发生时,它会像闹钟一样提醒你,然后像温度计一样测量这个事件对股价的影响
相关概念解释
术语解释
财报上市公司定期发布的财务报告,包括资产负债表、利润表、现金流量表——相当于公司的「体检报告」
EPS(每股收益)净利润除以总股本——相当于「每一股股票赚了多少钱」,是衡量公司盈利能力的重要指标
毛利率(营业收入-营业成本)除以营业收入——相当于「每卖100块钱的东西,赚了多少毛利」,是衡量公司产品竞争力的重要指标
余弦相似度一种用来衡量两个向量之间相似程度的指标——值越接近1,说明两个向量越相似;值越接近0,说明两个向量越不相似;值越接近-1,说明两个向量完全相反
缩略词列表
缩略词全称
LLMLarge Language Model(大语言模型)
Agent智能体(无全称,是人工智能领域的通用术语)
LangChainLangChain(框架名称,无全称)
Vector DBVector Database(向量数据库)
IEInformation Extraction(信息抽取)
EPSEarnings Per Share(每股收益)
APIApplication Programming Interface(应用程序编程接口)
OpenAIOpenAI(公司名称,开发了GPT系列模型)
ChromaDBChromaDB(向量数据库名称,无全称)
Yahoo FinanceYahoo Finance(金融数据平台名称,无全称)
PlotlyPlotly(数据可视化库名称,无全称)

核心概念与联系:金融投研 Agent 到底是怎么工作的?

故事引入

想象一下,你是一个刚上小学三年级的小朋友,你妈妈让你帮她做一件事:「今天晚上我们要做苹果派,你帮我找一下我们家的苹果,然后数一下有多少个,再挑几个又大又红的,最后告诉我苹果够不够做派(妈妈说需要6个)。」

你会怎么做呢?

  1. 首先,你得理解妈妈的问题:「找苹果」「数苹果」「挑苹果」「判断够不够」——这四个步骤你得记清楚;
  2. 然后,你得调用「工具」:
    • 找苹果:调用「你的眼睛」这个工具,去厨房、客厅、冰箱里找;
    • 数苹果:调用「你的手指头」这个工具,一个一个数;
    • 挑苹果:调用「你的眼睛+手」这个工具,看颜色红不红、摸起来硬不硬;
    • 判断够不够:调用「你的脑子」这个工具,把数出来的苹果数和6比一下;
  3. 最后,你得整合答案:比如「妈妈,我找到了8个苹果,其中有5个又大又红的,还差1个,要不要我去楼下便利店买?」

哇!你看——你刚才的整个过程,其实就是一个简单的Agent!而我们要搭建的金融投研Agent,就是把「你」换成「LLM」,把「眼睛、手指头、脑子」换成「搜索引擎、向量数据库、量化工具」,把「找苹果做派」换成「找苹果公司的信息做投研」!

是不是很简单?接下来,我们就用「给小学生讲故事」的方式,详细解释一下金融投研Agent的核心概念!

核心概念解释(像给小学生讲故事一样)

核心概念一:大语言模型(LLM)——金融界的「超级大脑+翻译官+分析师」

想象一下,你有一个超级厉害的哥哥,他读过所有的小学课本、中学课本、大学课本、百科全书、报纸、杂志、小说——哦不对,他还读过所有的上市公司财报、新闻、研报、政策文件!

这个哥哥有三个超能力:

  1. 超能力一:理解你的问题:不管你说的是中文、英文、还是夹杂着数字和符号的话(比如「帮我算一下苹果2024Q2的EPS同比增长了多少」),他都能听懂;
  2. 超能力二:生成人类语言:不管你问的是简单的问题(比如「苹果2024Q2的净利润是多少」),还是复杂的问题(比如「Vision Pro发布后对苹果2024Q3营收的影响」),他都能用通俗易懂的话给你解释清楚;
  3. 超能力三:推理和分析:如果你给他一些数据(比如苹果2024Q2的AR/VR营收是15亿美元,2023Q2是12亿美元),他能帮你推理出「AR/VR营收同比增长了25%」;如果你给他一些新闻(比如「Vision Pro正式版发布后,首周销量突破了100万台」),他能帮你分析出「这对苹果2024Q3的营收是利好消息」。

这个超级厉害的哥哥,就是大语言模型(LLM)!现在最有名的LLM有OpenAI的GPT系列(比如GPT-4o、GPT-4o-mini)、Google的Gemini系列、Anthropic的Claude系列——我们今天要用的是GPT-4o-mini,因为它既便宜又好用!

核心概念二:Agent——金融界的「哆啦A梦助手」

刚才的超级哥哥虽然厉害,但他有一个致命的缺点:他记不住太多东西(虽然他读过很多书,但你问他昨天看的苹果2024Q2财报里的具体数字,他可能记不太准),而且他不会主动帮你找东西(比如你问他「苹果最近一周有什么利好新闻」,他只能靠他脑子里的旧知识回答,不会去网上找最新的新闻),更不会画图和算复杂的数学题(比如你让他画苹果2024年1月到6月的股价趋势图,他只能给你描述一下,不会给你画出来)。

那怎么办呢?我们需要给这个超级哥哥配一个「哆啦A梦助手」——这个助手有三个宝贝:

  1. 宝贝一:记忆面包(向量数据库):把所有的财报、新闻、研报都「吃」进去(转换成向量存起来),当超级哥哥记不住的时候,助手就从记忆面包里找出来给他看;
  2. 宝贝二:任意门(外部API):比如「搜索引擎任意门」(去网上找最新的新闻)、「金融数据任意门」(去Yahoo Finance找股价数据)、「计算器任意门」(去算复杂的数学题)、「画图任意门」(去画股价趋势图);
  3. 宝贝三:任务清单(Prompt Engineering):告诉超级哥哥和助手「第一步做什么、第二步做什么、第三步做什么」,比如「第一步先从记忆面包里找苹果2024Q2的财报,第二步用计算器任意门算EPS同比增长,第三步用人类语言把答案说出来」。

这个配了三个宝贝的超级哥哥,就是金融投研 Agent!它不是只会回答问题的机器人,而是会自主感知环境(比如知道有没有最新的新闻)、做出决策(比如知道该用哪个宝贝)、执行动作(比如去网上找新闻、去算数学题、去画图)、整合答案的小助手!

核心概念三:LangChain——金融界的「工具箱」

刚才的哆啦A梦助手有三个宝贝,但如果我们要自己造这三个宝贝,那可太麻烦了——比如造记忆面包(向量数据库)需要懂深度学习和数据库,造任意门(外部API)需要懂HTTP请求,造任务清单(Prompt Engineering)需要懂怎么和LLM沟通。

那怎么办呢?我们有一个现成的工具箱——这个工具箱里已经有了造记忆面包的「面粉和酵母」(连接向量数据库的工具)、造任意门的「木材和钉子」(连接外部API的工具)、造任务清单的「纸和笔」(Prompt Engineering的模板)——你不需要自己造材料,直接拿过来组装就行!

这个现成的工具箱,就是LangChain!它是现在最流行的LLM应用开发框架,不管你是想做投研Agent、客服机器人、还是学习助手,都能用它快速搭出来!

核心概念四:向量数据库(ChromaDB)——金融界的「记忆面包+语义搜索引擎」

想象一下,你有一个超级大的书包,里面装了所有的上市公司财报、新闻、研报——有几万本甚至几百万本!如果妈妈让你找「苹果2024Q2的财报里的净利润数字」,你会怎么做呢?

你可能会一本一本地翻——那可太费时间了,翻一天都不一定能找到!

那有没有更聪明的办法呢?有!你可以先把每本书的核心内容「浓缩」成一张小卡片(比如苹果2024Q2财报的小卡片上写着「公司名称:苹果;时间:2024Q2;净利润:217亿美元;毛利率:43.3%;EPS:1.46美元」),然后把这些小卡片按「相似程度」排好(比如把所有苹果公司的小卡片放在一起,把所有2024Q2的小卡片放在一起)——这样当你找「苹果2024Q2的财报里的净利润数字」时,你就能快速找到苹果公司的那堆小卡片,再找到2024Q2的那一张,然后直接看到净利润数字!

这个「浓缩」小卡片的过程,就是把非结构化文本转换成向量;这个按「相似程度」排小卡片的书包,就是向量数据库;我们今天要用的向量数据库是ChromaDB——因为它是免费的、开源的、而且非常容易上手!

那什么是「语义相似程度」呢?比如你找「苹果Vision Pro的销量」,普通的搜索引擎只会找包含「苹果」「Vision Pro」「销量」这三个词的内容,但向量数据库能找「语义上相关」的内容——比如「苹果头显的销售情况」「Vision Pro首周的订单量」「AR/VR设备的市场份额」这些内容,虽然没有完全包含你找的三个词,但语义上是相关的,向量数据库也能找出来!

是不是很厉害?这就是向量数据库和普通搜索引擎的最大区别!

核心概念五:信息抽取——金融界的「放大镜+摘抄本」

刚才的小卡片上的内容(比如「公司名称:苹果;时间:2024Q2;净利润:217亿美元」),是怎么从厚厚的财报里「浓缩」出来的呢?

这就需要用到**信息抽取(IE)**技术了!信息抽取就像一个「放大镜+摘抄本」——它先拿着放大镜仔细看厚厚的财报,然后把你需要的核心信息(比如公司名称、时间、营收、净利润)抄在一个整齐的小卡片上!

信息抽取有两种方法:

  1. 方法一:规则抽取——比如你给它定一个规则「找到‘净利润’这个词,然后看它后面跟着的数字和单位」,它就会按照这个规则找;
  2. 方法二:LLM抽取——比如你给LLM说「帮我从这段财报里提取公司名称、时间、营收、净利润、毛利率、EPS,然后用JSON格式输出」,它就会帮你提取!

我们今天要用的是LLM抽取——因为它更灵活,不需要你定复杂的规则!

核心概念六:事件驱动——金融界的「闹钟+温度计」

想象一下,你有一个「股票闹钟+温度计」——当有重要事件发生时(比如苹果发布财报、库克演讲、中美贸易摩擦升级),它会像闹钟一样提醒你;然后它会像温度计一样测量这个事件对股价的影响(比如是利好还是利空、影响有多大)!

这个「股票闹钟+温度计」,就是事件驱动!事件驱动是一种非常流行的投资策略——很多基金公司和券商都在用!

我们的投研Agent虽然不会做实时预警(以后可以扩展),但它能根据特定事件来分析股价的影响——比如你问它「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」,它就能帮你找到答案!

核心概念之间的关系(用小学生能理解的比喻)

刚才我们讲了六个核心概念——LLM、Agent、LangChain、向量数据库、信息抽取、事件驱动——它们就像一个团队,一起合作完成金融投研的任务!

团队角色分配
核心概念团队角色通俗比喻
Agent队长负责指挥整个团队,告诉大家第一步做什么、第二步做什么、第三步做什么
LLM核心队员(分析师)负责理解问题、推理分析、生成答案
LangChain后勤部长负责给团队提供工具(比如连接LLM、连接向量数据库、连接外部API)
向量数据库档案管理员负责存储和检索所有的财报、新闻、研报
信息抽取档案整理员负责把厚厚的财报、新闻、研报整理成整齐的小卡片
事件驱动情报员负责收集和分析重要事件对股价的影响
团队合作流程

想象一下,你是一个投资者,你问这个团队一个问题:「帮我分析一下苹果2024年6月发布Vision Pro正式版后,对2024Q3营收的影响。」

这个团队会怎么合作呢?

  1. 第一步:队长(Agent)接收问题:队长先把问题记下来;
  2. 第二步:队长(Agent)分配任务:队长告诉后勤部长(LangChain)「给我提供三个工具:档案管理员(向量数据库)、情报员(事件驱动)、金融数据任意门(Yahoo Finance)」;
  3. 第三步:情报员(事件驱动)收集事件信息:情报员先从金融数据任意门(Yahoo Finance)找「Vision Pro正式版发布的时间(2024年6月7日)」,再从档案管理员(向量数据库)找「最近一周关于Vision Pro的新闻」,然后整理成「事件清单」;
  4. 第四步:档案管理员(向量数据库)找历史数据:档案管理员找「苹果2023Q2的AR/VR营收数据」「苹果2024Q2的AR/VR营收数据」「分析师对苹果2024Q3 AR/VR营收的预测」,然后整理成「数据清单」;
  5. 第五步:核心队员(LLM)推理分析:核心队员把「事件清单」和「数据清单」拿过来,用它的超能力推理分析「Vision Pro发布后对2024Q3营收的影响」;
  6. 第六步:核心队员(LLM)生成答案:核心队员用通俗易懂的话把答案说出来;
  7. 第七步:队长(Agent)把答案告诉你:队长把核心队员生成的答案传给你!

是不是很清晰?接下来,我们就用专业的架构图和Mermaid流程图把这个团队合作流程画出来!

核心概念原理和架构的文本示意图(专业定义)

我们的金融投研Agent的核心架构可以分为五层:

  1. 用户交互层:负责接收用户的问题,然后把答案传给用户——可以是网页、微信公众号、钉钉机器人、或者直接在命令行里输入;
  2. Agent协调层:负责整个Agent的协调和调度——包括理解用户的问题、规划任务步骤、分配任务给各个工具、整合各个工具的返回结果;
  3. LLM层:负责理解问题、推理分析、生成答案、信息抽取——我们用的是GPT-4o-mini;
  4. 工具层:负责给Agent提供各种工具——包括向量数据库工具(ChromaDB)、金融数据工具(Yahoo Finance)、数据可视化工具(Plotly)、网络搜索工具(Tavily Search,后面会讲);
  5. 数据层:负责存储各种数据——包括结构化数据(比如财报的核心指标、股价数据)和非结构化数据(比如财报原文、新闻、研报)。

文本示意图如下:

┌─────────────────────────────────────────────────────────────────────────────┐
│                              用户交互层(User Interface)                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐ │
│  │  命令行输入   │  │  网页界面     │  │  微信公众号   │  │  钉钉机器人   │ │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
                                      ↓
┌─────────────────────────────────────────────────────────────────────────────┐
│                            Agent协调层(Agent Orchestration)                │
│  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐        │
│  │  问题理解模块     │  │  任务规划模块     │  │  结果整合模块     │        │
│  └──────────────────┘  └──────────────────┘  └──────────────────┘        │
└─────────────────────────────────────────────────────────────────────────────┘
                                      ↓
┌─────────────────────────────────────────────────────────────────────────────┐
│                                LLM层(LLM Layer)                            │
│  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐        │
│  │  理解与生成模型   │  │  推理分析模型     │  │  信息抽取模型     │        │
│  │  (GPT-4o-mini) │  │  (GPT-4o-mini) │  │  (GPT-4o-mini) │        │
│  └──────────────────┘  └──────────────────┘  └──────────────────┘        │
└─────────────────────────────────────────────────────────────────────────────┘
                                      ↓
┌─────────────────────────────────────────────────────────────────────────────┐
│                              工具层(Tool Layer)                            │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐ │
│  │  向量数据库   │  │  金融数据     │  │  数据可视化   │  │  网络搜索     │ │
│  │  (ChromaDB) │  │  (Yahoo Fin)│  │  (Plotly)   │  │  (Tavily)   │ │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
                                      ↓
┌─────────────────────────────────────────────────────────────────────────────┐
│                              数据层(Data Layer)                            │
│  ┌──────────────────┐              ┌──────────────────┐                    │
│  │  结构化数据       │              │  非结构化数据     │                    │
│  │  ┌──────────────┐│              │  ┌──────────────┐│                    │
│  │  │  财报核心指标 ││              │  │  财报原文     ││                    │
│  │  │  股价数据     ││              │  │  新闻         ││                    │
│  │  │  分析师预测   ││              │  │  研报         ││                    │
│  │  └──────────────┘│              │  └──────────────┘│                    │
│  └──────────────────┘              └──────────────────┘                    │
└─────────────────────────────────────────────────────────────────────────────┘

Mermaid 架构图与交互关系图

为了让大家更直观地看到这个架构,我们用Mermaid画两个图:一个是ER实体关系图(表示各个核心概念之间的关系),另一个是交互关系图(表示整个Agent的工作流程)。

ER实体关系图(Mermaid)

ER实体关系图用来表示各个「实体」(比如用户、Agent、LLM、工具、数据)之间的「关系」(比如用户提问给Agent、Agent调用LLM、Agent调用工具、工具访问数据)。

提问/接收答案

调用理解/推理/生成/抽取

调用

访问/存储

USER

string

user_id

用户唯一标识

string

question

用户问题

AGENT

string

agent_type

ReAct Agent

string

prompt_template

任务规划模板

LLM

string

model_name

GPT-4o-mini

string

api_key

OpenAI API Key

TOOL

string

tool_name

ChromaDB/Yahoo Finance/Plotly/Tavily

string

tool_type

向量数据库/金融数据/数据可视化/网络搜索

DATA

string

data_type

结构化/非结构化

string

data_source

财报/新闻/研报/Yahoo Finance

交互关系图(Mermaid)

交互关系图用来表示整个Agent的工作流程——从用户提问开始,到Agent把答案传给用户结束。

注意:Mermaid流程节点中不要有括号、逗号等特殊字符,所以我们会把一些长的名字简化一下(比如把「ReAct Agent」简化成「ReActAgent」,把「ChromaDB向量数据库」简化成「ChromaDB」,把「Yahoo Finance金融数据接口」简化成「YahooFinance」,把「Tavily网络搜索工具」简化成「Tavily」,把「Plotly数据可视化工具」简化成「Plotly」)。

是

ChromaDB

YahooFinance

Tavily

Plotly

否

用户输入问题

ReActAgent接收问题

ReActAgent调用LLM理解问题

需要调用工具吗

ReActAgent规划调用哪个工具

调用哪个工具

ReActAgent调用ChromaDB检索相关数据

ReActAgent调用YahooFinance获取股价数据

ReActAgent调用Tavily搜索最新新闻

ReActAgent调用Plotly画趋势图

工具返回结果给ReActAgent

ReActAgent把工具结果传给LLM

LLM推理分析生成答案

ReActAgent把答案传给用户

结束


问题拆解与解决思路:把「搭建投研Agent」这个大问题拆成小问题

问题背景

刚才我们讲了金融投研Agent的核心概念和架构,但如果我们要直接写代码,可能还是会觉得无从下手——因为「搭建投研Agent」这个问题太大了!

那怎么办呢?我们可以用**「把大象装冰箱」的三步式思维**——不对,我们可以用**「更细的五步式思维」**——把「搭建投研Agent」这个大问题,拆成五个小问题,逐个解决!

问题描述

我们的目标是搭建一个能做这三件事的投研Agent:

  1. 回答公司基本面问题:比如「苹果2024Q2的净利润是多少?毛利率同比增长了多少?」;
  2. 回答事件驱动问题:比如「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」;
  3. 画简单的量化分析图:比如「帮我画苹果2024年1月到6月的收盘价趋势图,对比一下谷歌和微软的」。

问题拆解

我们把这个大问题拆成五个小问题:

  1. 小问题一:怎么获取金融数据?——包括结构化数据(比如财报核心指标、股价数据)和非结构化数据(比如财报原文、新闻);
  2. 小问题二:怎么存储和检索金融数据?——把非结构化数据转换成向量,存到向量数据库里,然后当用户问问题时,快速找到最相关的内容;
  3. 小问题三:怎么让Agent理解问题和规划任务?——用Prompt Engineering告诉Agent「怎么理解问题」「怎么规划任务步骤」「怎么调用工具」;
  4. 小问题四:怎么让Agent调用工具?——用LangChain把各个工具(ChromaDB、Yahoo Finance、Plotly、Tavily)包装成Agent能调用的格式;
  5. 小问题五:怎么让Agent整合答案和输出结果?——用LLM把各个工具的返回结果整合起来,生成通俗易懂的答案,或者画出漂亮的趋势图。

问题解决

接下来,我们就逐个解决这五个小问题!

小问题一:怎么获取金融数据?

我们需要获取两类数据:结构化数据和非结构化数据。

结构化数据的获取

结构化数据就是「整齐的表格数据」——比如财报的核心指标(营收、净利润、毛利率、EPS)、股价数据(开盘价、收盘价、最高价、最低价、成交量)。

我们用Yahoo Finance来获取结构化数据——因为它是免费的、开源的、而且数据非常全!我们可以用Python的yfinance库来连接Yahoo Finance。

非结构化数据的获取

非结构化数据就是「不整齐的文本数据」——比如财报原文、新闻、研报。

我们用Tavily Search来获取最新的新闻——因为它是专门为LLM设计的网络搜索工具,搜索结果非常准确,而且能直接返回文本内容!我们可以用Python的tavily-python库来连接Tavily Search。

我们还可以用SEC EDGAR来获取美国上市公司的财报原文——因为它是美国证券交易委员会的官方网站,所有美国上市公司的财报都在这里!不过SEC EDGAR的API有点复杂,我们今天就先不用了——我们可以手动下载苹果2024Q2的财报PDF,然后用Python的PyPDF2库来提取文本内容。

小问题二:怎么存储和检索金融数据?

我们用ChromaDB来存储和检索非结构化数据——因为它是免费的、开源的、而且非常容易上手!

具体步骤如下:

  1. 第一步:把非结构化数据切成小块——因为LLM的上下文窗口是有限的(比如GPT-4o-mini的上下文窗口是128k tokens,也就是大约10万字),如果我们把整个财报都传给LLM,它可能处理不过来——所以我们要把非结构化数据切成「小块」(比如每块1000个token);
  2. 第二步:把小块转换成向量——用「Embedding模型」把每一小块文本转换成一串数字(向量)——我们用的是OpenAI的text-embedding-3-small模型,因为它既便宜又好用;
  3. 第三步:把向量存到ChromaDB里——把向量和对应的小块文本一起存到ChromaDB里;
  4. 第四步:当用户问问题时,检索最相关的小块——把用户的问题也转换成向量,然后用「余弦相似度」在ChromaDB里找最相关的前N个小块(比如前5个)。
小问题三:怎么让Agent理解问题和规划任务?

我们用Prompt Engineering和ReAct Agent来让Agent理解问题和规划任务!

什么是Prompt Engineering?

Prompt Engineering就是「怎么和LLM说话」——就像你怎么和你的超级哥哥说话一样,如果你说的话很清楚、很具体,他就能给你更好的答案;如果你说的话很模糊、很笼统,他可能就不知道该怎么办。

什么是ReAct Agent?

ReAct Agent是一种非常流行的Agent架构——它的名字来源于「Reasoning(推理)」和「Acting(行动)」两个词。ReAct Agent的工作流程是:

  1. Thought(思考):Agent先思考「我现在需要做什么?」;
  2. Action(行动):Agent然后采取行动「调用某个工具」;
  3. Observation(观察):Agent接着观察「工具返回了什么结果」;
  4. 重复:Agent重复「思考-行动-观察」这个流程,直到它觉得不需要再调用工具了;
  5. Answer(答案):Agent最后生成答案。

我们可以用LangChain的create_react_agent函数来创建ReAct Agent!

小问题四:怎么让Agent调用工具?

我们用LangChain的Tool类来把各个工具(ChromaDB、Yahoo Finance、Plotly、Tavily)包装成Agent能调用的格式!

具体步骤如下:

  1. 第一步:定义工具函数——比如定义一个「get_stock_price」函数,用来获取股价数据;
  2. 第二步:用Tool类包装工具函数——给工具起个名字、写个描述(告诉Agent这个工具是用来做什么的);
  3. 第三步:把包装好的工具传给ReAct Agent。
小问题五:怎么让Agent整合答案和输出结果?

我们用LLM把各个工具的返回结果整合起来,生成通俗易懂的答案!如果用户需要画图,我们就用Plotly画趋势图,然后保存成HTML文件或者直接显示出来!


数学模型与公式:简单但重要的初中数学

余弦相似度:向量数据库的核心

刚才我们讲了,向量数据库用「余弦相似度」来衡量两个向量之间的相似程度——那什么是余弦相似度呢?

想象一下,你有两个向量A和B——它们就像两个从原点出发的箭头。余弦相似度就是这两个箭头之间的夹角的余弦值!

余弦值的范围是[-1, 1]:

  • 如果两个箭头的方向完全相同,夹角是0度,余弦值是1——说明两个向量完全相似;
  • 如果两个箭头的方向垂直,夹角是90度,余弦值是0——说明两个向量完全不相似;
  • 如果两个箭头的方向完全相反,夹角是180度,余弦值是-1——说明两个向量完全相反。

余弦相似度的数学公式是:
cosine similarity(A,B)=A⋅B∥A∥×∥B∥ \text{cosine similarity}(A, B) = \frac{A \cdot B}{\|A\| \times \|B\|} cosine similarity(A,B)=∥A∥×∥B∥A⋅B​

其中:

  • A⋅BA \cdot BA⋅B 是向量A和向量B的点积——也就是把两个向量对应的元素相乘,然后加起来;
  • ∥A∥\|A\|∥A∥ 是向量A的模长——也就是把向量A的所有元素的平方加起来,然后开平方根;
  • ∥B∥\|B\|∥B∥ 是向量B的模长——和向量A的模长计算方法一样。
举例说明

假设我们有两个向量:

  • 向量A = [1, 2, 3]
  • 向量B = [4, 5, 6]

我们来计算一下它们的余弦相似度:

  1. 第一步:计算点积:A⋅B=(1×4)+(2×5)+(3×6)=4+10+18=32A \cdot B = (1 \times 4) + (2 \times 5) + (3 \times 6) = 4 + 10 + 18 = 32A⋅B=(1×4)+(2×5)+(3×6)=4+10+18=32;
  2. 第二步:计算向量A的模长:∥A∥=12+22+32=1+4+9=14≈3.7417\|A\| = \sqrt{1^2 + 2^2 + 3^2} = \sqrt{1 + 4 + 9} = \sqrt{14} \approx 3.7417∥A∥=12+22+32​=1+4+9​=14​≈3.7417;
  3. 第三步:计算向量B的模长:∥B∥=42+52+62=16+25+36=77≈8.77496\|B\| = \sqrt{4^2 + 5^2 + 6^2} = \sqrt{16 + 25 + 36} = \sqrt{77} \approx 8.77496∥B∥=42+52+62​=16+25+36​=77​≈8.77496;
  4. 第四步:计算余弦相似度:cosine similarity(A,B)=323.7417×8.77496≈3232.833≈0.9746\text{cosine similarity}(A, B) = \frac{32}{3.7417 \times 8.77496} \approx \frac{32}{32.833} \approx 0.9746cosine similarity(A,B)=3.7417×8.7749632​≈32.83332​≈0.9746。

哇!余弦相似度约等于0.9746——非常接近1!说明向量A和向量B非常相似!

EPS同比增长:衡量公司盈利能力的重要指标

EPS同比增长是指「今年某一季度的EPS和去年同一季度的EPS相比,增长了多少百分比」——它是衡量公司盈利能力的重要指标!

EPS同比增长的数学公式是:
EPS同比增长=(今年Qx的EPS−去年Qx的EPS去年Qx的EPS)×100% \text{EPS同比增长} = \left( \frac{\text{今年Qx的EPS} - \text{去年Qx的EPS}}{\text{去年Qx的EPS}} \right) \times 100\% EPS同比增长=(去年Qx的EPS今年Qx的EPS−去年Qx的EPS​)×100%

举例说明

假设苹果2024Q2的EPS是1.46美元,2023Q2的EPS是1.26美元——我们来计算一下它的EPS同比增长:

  1. 第一步:计算分子:1.46−1.26=0.201.46 - 1.26 = 0.201.46−1.26=0.20;
  2. 第二步:计算分母:1.261.261.26;
  3. 第三步:计算比值:0.20/1.26≈0.15870.20 / 1.26 \approx 0.15870.20/1.26≈0.1587;
  4. 第四步:转换成百分比:0.1587×100%≈15.87%0.1587 \times 100\% \approx 15.87\%0.1587×100%≈15.87%。

哇!苹果2024Q2的EPS同比增长了约15.87%——非常不错!


项目实战:完整可运行的代码

开发环境搭建

在开始写代码之前,我们需要先搭建开发环境——我们用的是Python 3.10或更高版本!

第一步:安装Python

如果你还没有安装Python,可以去Python的官方网站(https://www.python.org/)下载最新版本的Python,然后按照提示安装——安装的时候记得勾选「Add Python to PATH」!

第二步:创建虚拟环境(可选但推荐)

为了避免依赖冲突,我们最好创建一个虚拟环境——虚拟环境就像一个「独立的小房间」,里面的东西不会影响外面的环境!

打开命令行(Windows用户用CMD或PowerShell,Mac/Linux用户用Terminal),然后输入以下命令:

# 创建虚拟环境(名字叫finance_agent_env)
python -m venv finance_agent_env

# 激活虚拟环境
# Windows用户用CMD:
finance_agent_env\Scripts\activate.bat
# Windows用户用PowerShell:
finance_agent_env\Scripts\Activate.ps1
# Mac/Linux用户用Terminal:
source finance_agent_env/bin/activate

如果虚拟环境激活成功,命令行的开头会出现(finance_agent_env)!

第三步:安装需要的库

我们需要安装以下库:

  • langchain:LLM应用开发框架;
  • langchain-openai:连接OpenAI的LLM和Embedding模型;
  • langchain-chroma:连接ChromaDB向量数据库;
  • langchain-community:连接第三方工具(比如Tavily Search);
  • yfinance:连接Yahoo Finance金融数据接口;
  • plotly:数据可视化库;
  • PyPDF2:提取PDF文本内容;
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐