4. 金融数据采集与预处理

在金融RAG系统中,知识库的质量上限往往在数据进入向量库之前就已经被决定。模型再强,也无法从一份错位的财报表格、一段被截断的公告正文或一条重复了二十次的新闻中稳定检索出正确答案。本章聚焦数据进入RAG管道前的“第一公里”,围绕数据源识别、多格式解析、清洗去重、标准化与合规处理五个环节,建立可复用的金融数据预处理流水线。

一、核心原理:金融数据的“三高”特征

金融数据与通用网页文本存在显著差异,可归纳为“三高”:高结构化密度(财报、行情、监管报表中数字与表格占比极高)、高时效敏感(公告、研报、舆情的时间戳直接决定检索价值)、高合规约束(内幕信息、客户隐私、未公开数据不可入库)。因此,预处理不是简单的“清洗文本”,而是要在保留金融语义结构的同时,完成合规过滤与元数据绑定。

关键认知:RAG检索单元(chunk)的质量 = 解析保真度 × 清洗彻底度 × 元数据完整度 × 合规安全度。任一维度归零,整体检索效果即归零。

二、数据源识别与优先级分层

金融RAG常见数据源可分为四类,建议按“权威性—时效性—解析难度”三维打分后分层接入:

数据源类型典型示例解析难点建议优先级
监管披露交易所公告、年报、招股书PDF双栏、表格跨页、扫描件P0(必须)
行情与财务Wind/同花顺导出、XBRL字段口径不统一、单位混用P0
研报与资讯券商研报、财经新闻版权、去重、观点时效P1
内部文档风控报告、投研纪要权限隔离、脱敏P1(需审批)

识别阶段要同步记录来源、发布时间、作者/机构、权限等级四类元数据,它们将作为后续检索过滤和引用溯源的基础。

三、多格式解析:PDF、表格与文本

PDF是金融文档的主力格式,也是最容易“丢结构”的环节。推荐采用“版面分析+结构化抽取”两段式策略:先用版面模型识别标题、正文、表格、页眉页脚区域,再对表格区域单独做单元格还原。

# 以 pdfplumber 为例:保留表格结构并输出为 Markdown
import pdfplumber

with pdfplumber.open("annual_report.pdf") as pdf:
    for page in pdf.pages:
        # 过滤页眉页脚(按坐标裁剪)
        body = page.crop((0, 60, page.width, page.height - 60))
        text = body.extract_text()
        for table in body.extract_tables():
            # 将二维列表转为 Markdown 表格,保留行列关系
            md = "\n".join(["| " + " | ".join(c or "" for c in row) + " |"
                            for row in table])
            print(md)

对于Excel/CSV类财务数据,重点是表头识别与单位归一;对于纯文本公告,则需按“标题—段落—脚注”切分,避免把风险提示与正文混为一个chunk。

实操建议:解析后立即写入一条“解析日志”,记录文件哈希、页数、表格数、失败页号。后续去重和排障都依赖这份日志。

四、清洗、去重与标准化

清洗的目标是去除噪声但保留金融语义。常见操作包括:去除HTML标签与乱码、合并断行、统一全半角、修正OCR错字(如“0”与“O”、“1”与“l”)。去重则分三层:文件级(MD5/SimHash)、段落级(MinHash+LSH)、语义级(向量相似度阈值)。

标准化是金融场景的重中之重,建议统一以下口径:

  • 时间:全部转为ISO 8601(如2024-03-31T00:00:00+08:00),并保留原始时区字段。
  • 金额:统一为“元”,保留原始单位与币种,避免“万元/亿元”混用导致检索歧义。
  • 实体:股票代码、公司简称、统一社会信用代码建立映射表,消解“茅台/贵州茅台/600519”指代同一实体。
  • 指标:营收、净利润等字段名对齐到内部指标字典。
# 标准化示例:金额与时间归一
def normalize_amount(value, unit):
    factor = {"元": 1, "万元": 1e4, "亿元": 1e8}
    return float(value) * factor.get(unit, 1)

def normalize_time(raw):
    # 输入 "2024年3月31日" -> "2024-03-31"
    return raw.replace("年", "-").replace("月", "-").replace("日", "")

五、合规处理与元数据绑定

合规是金融RAG的红线。预处理阶段必须完成三件事:敏感信息识别(身份证号、银行卡号、手机号)、权限标签注入(公开/内部/机密)、可追溯来源记录(原文URL、页码、抓取时间)。对于未公开信息或客户隐私,应在入库前直接阻断,而非依赖检索时过滤。

风险提示:切勿将含内幕信息或客户身份信息的文档直接向量化。一旦进入向量库,删除与审计成本极高,且可能触发合规责任。

六、案例复盘:一份年报的预处理链路

以某上市公司年报PDF为例,完整链路为:文件哈希去重 → 版面分析 → 正文与表格分离 → 表格转Markdown → 金额/时间标准化 → 实体链接到股票代码 → 敏感信息扫描 → 注入来源与权限元数据 → 输出为结构化JSON。复盘中最常见的误区是“先切chunk再清洗”,导致表格被切断、脚注与正文错配;正确顺序应是先解析与标准化,再按语义边界切分。

金融数据预处理流水线 监管披露 PDF 年报 / 公告 / 招股书 行情与财务表格 Excel / CSV / XBRL 研报与资讯文本 新闻 / 研报 / 舆情 多格式解析 版面分析 表格还原 正文/脚注分离 解析日志 清洗与标准化 去噪 / 去重 时间/金额归一 实体链接 指标对齐 合规处理 敏感识别 权限标签 来源追溯 阻断入库 结构化 JSON + 元数据 进入切分与向量化管道

完成上述链路后,数据才真正具备“可检索、可追溯、可合规”的资格。下一阶段才是切分策略与向量化,而本章的每一步都会直接影响最终检索的准确率与可信度。