2. 金融RAG基础

在金融场景中,大模型“张口就来”的代价远高于一般行业:一个编造的财务指标、一条不存在的监管条款,都可能直接触发合规风险或投资误判。检索增强生成(Retrieval-Augmented Generation,RAG)正是为缓解这一问题而生的工程范式。本节先建立RAG的整体认知框架,再聚焦金融文本的特殊性,最后定位幻觉的主要来源,为后续的检测与评测打下基础。

一、核心原理:RAG如何把“记忆”变成“查证”

纯生成式模型依赖参数中压缩的知识,本质是概率续写,无法保证事实准确,也无法给出可追溯的依据。RAG的核心思想是:在生成之前,先从外部知识库中检索出与问题相关的证据,再让模型基于这些证据作答。这样,模型的角色从“凭记忆回答”转变为“阅读理解后作答”。

一个完整的RAG链路包含三个关键阶段:索引、检索、生成。索引阶段将金融文档切分为片段(chunk),通过嵌入模型转为向量并存入向量库;检索阶段将用户问题同样向量化,通过相似度计算召回Top-K片段;生成阶段把问题与召回片段拼接为提示词,交由大模型生成答案。其数据流可概括为下图。

金融RAG数据流与幻觉风险点 金融文档 年报/公告/研报 切分与向量化 chunk + embedding 向量库检索 Top-K 召回 大模型生成 基于证据作答 风险点① 索引失真 表格切碎、单位丢失 时间口径错位 风险点② 检索偏差 召回不相关或漏召 相似度≠事实相关 风险点③ 生成越界 无视证据编造数字 混淆口径与来源

理解这条链路的关键在于:RAG并不能“消灭”幻觉,它只是把幻觉的产生位置从模型参数转移到了索引、检索和生成三个环节。检测与评测工作,本质上就是在这三个环节上分别布点。

二、金融文本特点:为什么通用RAG方案不够用

金融语料与通用网页文本差异显著,直接套用通用RAG方案往往效果不佳。其特殊性主要体现在以下方面:

  • 高度结构化与半结构化并存:财报包含大量三线表、合并报表附注,PDF解析后表格结构极易错乱,数字与表头错位会直接导致检索到错误证据。
  • 术语密集且同义表达多:“净利润”与“归属于母公司股东的净利润”含义不同,“营收”与“营业总收入”口径有别,嵌入模型若不能区分,召回结果就会张冠李戴。
  • 时效性与版本敏感:监管规则、评级结论、财务数据都有明确有效期,旧版本条款被召回会生成过时甚至违规的答案。
  • 数字与单位精度要求极高:亿元与万元、同比与环比、单季与累计,任何一处口径混淆都会造成事实性错误。
  • 合规与免责约束强:答案不能构成投资建议,引用需可溯源,这对生成阶段的提示词设计和后处理提出额外要求。
在金融RAG中,检索质量往往比生成模型规模更决定最终答案的可信度。把预算优先投入到文档解析、切分策略和元数据治理上,通常比换更大的模型收益更明显。

三、典型应用场景与幻觉风险来源

金融RAG的落地场景大致可分为四类,每类场景对幻觉的容忍度和检测重点各不相同:

应用场景 典型任务 主要幻觉风险 检测重点
智能投研问答 财报指标查询、业绩归因 数字编造、口径混淆 数值与原文比对
合规与监管咨询 条款检索、合规判断 引用失效条款、张冠李戴 条款编号与版本核验
客服与产品解释 费率、规则、流程说明 遗漏限制条件、过度承诺 条件完整性检查
风控与信贷辅助 企业画像、风险摘要 证据不足仍下结论 结论与证据一致性

结合前述链路,金融RAG的幻觉风险可归纳为三个来源层:

  1. 数据层:PDF解析错误、表格结构丢失、OCR识别偏差、元数据(时间、来源、版本)缺失,导致“证据本身就不对”。
  2. 检索层:切分粒度过粗或过细、嵌入模型不匹配金融语义、Top-K设置不当,导致“对的证据没被找到”或“错的证据被召回”。
  3. 生成层:模型忽略召回内容、对多片段进行错误拼接、在证据不足时强行作答,导致“有证据却答错”或“无证据也敢答”。
实践中常见误区:只盯着生成层做提示词优化,却忽视数据层和检索层的问题。若召回片段本身包含错误数字,再强的提示词也无法保证答案正确。检测方案必须覆盖全链路。

四、复盘:一个典型的幻觉案例

某投研问答系统被问及“某公司2023年第三季度归母净利润同比增速”。系统召回了三份片段:一份是半年报的累计数据,一份是单季度数据但单位为万元,一份是券商研报的预测值。生成模型将半年报累计增速与单季数据混用,给出了一个看似合理却错误的百分比。

复盘该案例,问题并非出在模型能力,而是:切分时未保留“报告期”和“单位”元数据,检索时未按时间与口径过滤,生成时未要求标注数据来源。对应的改进配置示例如下:

# 检索过滤条件示例(伪代码)
filter = {
  "report_period": "2023Q3",      # 锁定报告期
  "metric": "归母净利润",          # 锁定指标口径
  "unit": "元",                    # 统一单位
  "source_type": ["定期报告"]      # 排除研报预测
}
top_k = 5
rerank = True                      # 启用重排序
require_citation = True            # 强制标注来源片段