从 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,说明两个向量完全相反
缩略词列表
缩略词 全称
LLM Large Language Model(大语言模型)
Agent 智能体(无全称,是人工智能领域的通用术语)
LangChain LangChain(框架名称,无全称)
Vector DB Vector Database(向量数据库)
IE Information Extraction(信息抽取)
EPS Earnings Per Share(每股收益)
API Application Programming Interface(应用程序编程接口)
OpenAI OpenAI(公司名称,开发了GPT系列模型)
ChromaDB ChromaDB(向量数据库名称,无全称)
Yahoo Finance Yahoo Finance(金融数据平台名称,无全称)
Plotly Plotly(数据可视化库名称,无全称)

核心概念与联系:金融投研 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 EngineeringReAct 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文件或者直接显示出来!


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

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

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

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

余弦值的范围是[-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×BAB

其中:

  • A⋅BA \cdot BAB 是向量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 = 32AB=(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.7417A=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.77496B=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.774963232.833320.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同比增长=(去年QxEPS今年QxEPS去年QxEPS)×100%

举例说明

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

  1. 第一步:计算分子1.46−1.26=0.201.46 - 1.26 = 0.201.461.26=0.20
  2. 第二步:计算分母1.261.261.26
  3. 第三步:计算比值0.20/1.26≈0.15870.20 / 1.26 \approx 0.15870.20/1.260.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社区

更多推荐