参考对象:写作风格参考《彭博商业周刊》的叙事方式,用具体人物的工作场景切入,将技术方案融入故事线中。
凌晨两点,上海陆家嘴某私募基金的研究室里还亮着灯。
张琳盯着屏幕上那份刚发布的宁德时代2023年年报,300多页的PDF,她已经翻了四个小时。明天上午九点要向投委会汇报,而她还在找一组关键数据——公司储能业务在海外各地区的营收占比。
她记得在年报里看到过,但忘了具体在哪一页。搜索"储能",跳出了47个结果;搜索"海外",跳出了82个结果。她试着组合关键词,但年报里的表述是"境外"而不是"海外",是"电能存储"而不是"储能"。
手机响了,是基金经理发来的消息:"储能出海的数据找到了吗?"
张琳揉了揉眼睛,打开了一个问答界面,输入:"宁德时代2023年储能业务在境外各地区的营收分别是多少?占总营收比例如何?"
十秒后,屏幕上跳出答案:
> <strong>储能业务境外营收</strong>:189.47亿元,同比增长87.6%>
> <strong>分地区构成</strong>:
> – 欧洲:78.3亿元(占比41.3%)
> – 北美:52.1亿元(占比27.5%)
> – 亚太(不含中国):41.8亿元(占比22.1%)
> – 其他地区:17.27亿元(占比9.1%)
>
> <strong>数据来源</strong>:年报第156页"分产品、分地区营业收入情况"表格
>
> <strong>同比变化</strong>:2022年储能业务境外营收101.0亿元,2023年增长87.6%,增速高于境内市场的34.2%
张琳愣住了。她花了四个小时没找到的数据,AI用了十秒。更让她惊讶的是,答案不仅给出了数字,还指出了具体页码,甚至做了同比分析。
这就是基于RAG技术构建的上市公司年报智能问答系统,正在改变金融从业者与海量财务文档的交互方式。
金融分析师的困境:数据海洋里的溺水者
中国A股市场有5000多家上市公司,每家每年发布年报、半年报、季报,再加上临时公告、招股说明书、再融资预案——一个覆盖全市场的研究员,每年需要阅读的文档超过10万页。
这不是夸张。以一份典型的年报为例:
– <strong>页数</strong>:200-400页
– <strong>字数</strong>:15-30万字
– <strong>表格</strong>:50-100个
– <strong>财务指标</strong>:数百个
传统的分析 workflow 是这样的:收到年报PDF → 人工翻阅目录 → 定位关键章节 → 提取财务数据 → 录入Excel → 计算分析指标 → 撰写研究报告。一份深度研报,从数据收集到成稿,往往需要3-5个工作日。
痛点不仅仅是慢,更是”找不到”和”看不全”。
找不到:用户问”公司海外储能业务的毛利率变化”,但年报里可能写的是”境外电能存储业务毛利情况”,关键词不匹配就搜不到。
看不全:一份年报里关于某个业务的数据可能分散在多个章节——主营业务分析里有收入数据,成本分析里有毛利率数据,风险提示里有市场格局描述。人工阅读很难保证不遗漏。
算不准:财务分析需要大量计算,比如同比、环比、占比、复合增长率。人工计算容易出错,而且不同分析师的计算口径可能不一致。
某券商研究所做过统计:分析师平均每天花在数据查找和整理上的时间超过4小时,占工作总时间的40%以上。而因为数据遗漏或计算错误导致的研报勘误,平均每个分析师每年会发生2-3次。
方案核心:让AI成为分析师的”第二大脑”
这个系统的目标不是替代分析师,而是把他们从繁琐的数据查找和整理工作中解放出来,让他们把精力集中在需要人类判断的环节——商业模式分析、竞争格局研判、投资价值评估。
技术实现上,这套方案有三个关键环节:
第一步:把PDF变成结构化的知识
年报PDF的解析是个技术难点。这些文档不是简单的文字排版,而是包含复杂表格、多级标题、图表注释的混合文档。传统的PDF解析工具(如PyPDF2、pdfplumber)能提取文字,但面对以下场景就力不从心了:
– <strong>跨页表格</strong>:一个财务表格可能横跨3-4页,需要识别并合并
– <strong>层级标题</strong>:"第三节 公司业务概要"下面有"一、主营业务",下面还有"(一)产品构成",需要保留层级关系
– <strong>图表关联</strong>:文字里提到"详见图3-1",需要知道图3-1在哪、是什么内容
解决方案是采用专业的文档解析引擎(如TextIn、庖丁解文),通过边界框(bounding box)定位文档中的关键区域——文字块、标题、表格、图片——然后按照阅读顺序重组为结构化的Markdown格式。
“`
解析后的结构化数据示例:
第三节 公司业务概要
一、报告期内公司所处行业情况
#### (一)行业发展概况
2023年全球新能源汽车销量达到1,465万辆,同比增长35.4%。其中,中国新能源汽车销量949.5万辆,占全球销量的64.8%。
表3-1:全球主要新能源汽车市场销量情况
| 地区 | 2023年销量(万辆) | 同比增速 |
|---|---|---|
| 中国 | 949.5 | 37.9% |
| 欧洲 | 301.5 | 19.2% |
| 北美 | 180.2 | 42.1% |
*数据来源:IEA Global EV Outlook 2024*
“`
第二步:构建金融专用的知识库
解析后的文档需要进一步处理,构建适合金融问答的知识库。这里有几个关键设计:
1. 多粒度分块策略
不同类型的内容采用不同的分块方式:
– <strong>章节级</strong>:对于"公司概况"、"行业分析"等描述性内容,按章节分块,保留完整上下文
– <strong>表格级</strong>:对于财务数据表格,整张表格作为一个块,确保数据完整性
– <strong>句子级</strong>:对于关键结论、风险提示,细粒度分块,提高检索精度
2. 金融实体标注
在分块时标注金融领域的关键实体,便于后续精准检索:
– <strong>时间实体</strong>:2023年、2023Q3、报告期内、同比
– <strong>公司实体</strong>:公司名称、子公司、关联公司
– <strong>指标实体</strong>:营业收入、净利润、毛利率、ROE、资产负债率
– <strong>业务实体</strong>:动力电池、储能系统、锂电池材料
3. 结构化数据入库
财务三张表(资产负债表、利润表、现金流量表)的数据提取为结构化格式,存入关系型数据库。这样对于"某公司2023年净利润是多少"这类问题,可以直接查表,而不是从文本中检索。
第三步:意图识别与多路检索
用户的问题千差万别,系统需要先识别问题类型,再选择最合适的检索策略:
问题类型识别:
| 问题类型 | 示例 | 处理策略 |
|---|---|---|
| 事实查询 | "2023年营收多少?" | 结构化数据查询 |
| 计算题 | "毛利率同比变化多少?" | 提取数据→计算→生成答案 |
| 对比分析 | "和比亚迪相比如何?" | 分别查询两家公司数据→对比 |
| 开放性问题 | "公司竞争优势是什么?" | 文本检索+大模型生成 |
多路检索策略:
– <strong>向量检索</strong>:将用户问题embedding,在向量库中召回语义相似的文本块
– <strong>关键词检索</strong>:提取问题中的金融实体(公司名、时间、指标),在结构化数据库中精准匹配
– <strong>SQL查询</strong>:对于明确的数据查询,生成SQL语句直接查询财务数据库
“`python
def route_question(question):
intent = classify_intent(question) # 分类问题类型
entities = extract_entities(question) # 提取金融实体
if intent == "fact_query" and entities.has("财务指标"):
# 事实查询且有明确指标 → SQL查询
sql = generate_sql(entities)
data = execute_sql(sql)
return generate_answer_from_data(data)
elif intent == "calculation":
# 计算题 → 提取原始数据后计算
chunks = vector_search(question)
data = extract_numbers(chunks)
result = calculate(data)
return generate_answer_with_calculation(result)
else:
# 开放性问题 → RAG生成
chunks = vector_search(question)
return rag_generate(question, chunks)
“`
第四步:答案生成与溯源
金融领域的问答对准确性要求极高,不能"差不多就行"。系统需要做到:
1. 答案溯源:每个数据点都要标注来源,比如”年报第156页表3-2″
2. 计算过程透明:如果是计算得出的结果,要展示计算步骤,比如”毛利率 = (营业收入 – 营业成本) / 营业收入 = (1,000 – 800) / 1,000 = 20%”
3. 不确定性提示:如果检索到的信息不足以回答问题,要明确告知用户,而不是编造答案
落地效果:从”人找数据”到”数据等人”
某头部券商研究所部署该系统后,对分析师的工作效率进行了三个月的跟踪:
| 指标 | 使用前 | 使用后 | 提升 |
|---|---|---|---|
| 单份年报数据提取时间 | 4-6小时 | 30-60分钟 | 80%+ |
| 数据查找准确率 | 约85% | 约95% | +10% |
| 研报撰写周期 | 3-5天 | 1-2天 | 60%+ |
| 数据勘误次数(人均/年) | 2-3次 | <1次 | 70%+ |
更深层的变化是工作模式的转变。
以前,分析师是"人找数据"——带着问题去翻文档,文档是死的,人是活的。现在,是"数据等人"——分析师把问题抛给系统,系统从海量文档中精准定位答案。
一位资深分析师说:"以前我写一份研报,70%的时间花在找数据和核对数据上,只有30%的时间在思考。现在反过来了,系统帮我处理了繁琐的部分,我可以把精力放在真正有价值的地方——判断这些数据意味着什么,对投资有什么启示。"
技术延展:从年报问答到投研助手
年报问答只是金融AI应用的起点。沿着这个方向,还可以做更多:
研报自动生成:基于年报数据,自动生成财务分析、同业对比、风险提示等研报章节,分析师在此基础上修改完善,而不是从零开始写。
多文档交叉验证:同时查询公司年报、行业研报、新闻资讯,交叉验证信息。比如公司说”市场占有率第一”,系统可以自动检索第三方机构的行业报告进行验证。
风险预警:设置监控规则,当某家公司的财务指标出现异常(如应收账款激增、现金流恶化)时,自动推送预警。
合规审查:在研报发布前,自动检查是否涉及敏感信息、是否符合披露规范。
这些场景的共同点是:<strong>把金融从业者从重复性、规则性的工作中解放出来,让他们专注于需要人类智慧和判断的环节。</strong>
写在最后
回到凌晨两点的陆家嘴。
张琳把AI生成的答案复制到PPT里,又花了十分钟核对了一遍数据来源——第156页的表格,没错。她关上电脑,看了眼时间,凌晨两点半,还能睡四个小时。
走出写字楼,江风吹来,她突然想起三年前刚入行的时候。那时候没有这些工具,一份年报要翻整整两天,经常通宵。有一次她把"归属于母公司股东的净利润"看成了"净利润",导致整个估值模型出错,被基金经理骂了半个小时。
现在,AI帮她避免了这些低级错误。但她知道,这并不意味着她的工作变轻松了。相反,市场对分析师的要求越来越高——以前大家比拼的是谁找数据更快,现在比拼的是谁对数据的解读更深、对趋势的判断更准。
技术替代的是重复劳动,放大的是人类的价值。
当AI能在十秒内找到那一行数据,分析师的价值就不再是"找得到",而是"看得懂"和"想得深"。
*本文技术方案参考了基于RAG的上市公司财报智能问答系统实现,该系统已在多家券商、基金公司、私募机构的投研场景中落地应用。*


