【Datawhale AI 夏令营】金融文档分析检索增强生成系统的架构演变与方法论进展
# **金融文档分析检索增强生成系统的架构演变与方法论进展**
- **第一部分:基础原则和基线系统分析**
- **第一部分:金融领域检索增强生成范式的解构**
- **第二部分:基线剖析:流水线的二分法**
- **同步轨迹 (SimpleRAG)**
- **异步改进 (AsyncSimpleRAG)**
- **核心缺陷批判**
- **第二部分:高级 RAG 实施指南**
- **第三部分:RAG 的基石:通过 MinerU 实现高保真文档智能**
- **多模态实践:赋予视觉数据文本声音**
- **第 4 节:检索的艺术:最大化精确度和召回率**
- **4.1. 超越向量搜索:混合检索的潜力**
- **4.2. 等级融合:互惠等级融合 (RRF)**
- **4.3. 最终改进:通过重排序实现精准度**
- **第五部分:打造领域专家:模型微调**
- **5.1.嵌入模型的微调**
- **5.2. LLM 的指令调优**
- **5.3. 使用 Unsloth 进行高效微调的实用指南**
- **第三部分:前沿和未来方向**
- **第六部分:下一代架构:图和代理**
- **6.1. 智能的结构化:RAG 中知识图谱简介**
- **6.2. 构建更智能的系统:自校正和反思型 RAG**
- **第 7 节:结论:RAG 卓越的可行路线图**
- **可操作的路线图**
第一部分:基础原则和基线系统分析
第一部分:金融领域检索增强生成范式的解构
金融分析领域对自动问答系统提出了一系列独特而艰巨的挑战。其主要任务不仅仅是信息提取,还包括构建一个可追溯、多模态的问答系统,以便能够处理密集、复杂且内容丰富的公司财务报告,这些报告通常以可移植文档格式 (PDF) 呈现。此类文档构成了丰富的文本数据、表格结构、图形表示和脚注,其含义不仅通过词汇内容传达,还通过其结构和视觉呈现来传达。在这一领域的成功取决于满足答案准确性和来源可验证性这两个不可或缺的双重约束。每个生成的回复都必须符合事实,并必须附上其来源的精确引用——即具体的文件和页码——这一规定反映了金融行业严格的审计和合规标准。
检索增强生成 (RAG) 范式从根本上解决了这一挑战。规范的 RAG 工作流程遵循一个逻辑上的三部分流程:
- 解析和分段:来自指定知识库的文档经过解析过程以提取其内容,随后将其分段为更小、更易于管理的单元或“块”。
- 检索:用户提交查询后,系统会在分段单元集合中执行搜索,以识别形成答案所需的最相关信息。
- 生成:检索到的句段与原始查询合并,并作为上下文信息提供给大型语言模型 (LLM),后者随后合成最终的综合答案。
虽然该标准模型提供了一个功能上的出发点,但要达到最佳性能,尤其是在竞争激烈的环境下,需要远远超越初步实施的阶段。目标并非找到一个单一的、普遍适用的解决方案,而是追求一种整体优化方法。该方法以构成任何高性能 RAG 系统基础的三大关键支柱为目标:
- 数据保真:确保源文档的数字化呈现尽可能完整和准确,并保留所有文本、结构和视觉信息。
- 精确度和召回率:开发一种复杂的检索机制,能够以外科手术般的精准度识别最相关的信息,同时确保不遗漏任何关键上下文。
- 领域专业化:通用人工智能模型(包括检索和生成)的调整,使其能够理解金融领域独特的词汇、语义和任务需求。
从基础的基准实现到复杂的竞赛级系统的发展轨迹,标志着架构的深刻蜕变。下表概述了这一转变,展示了 RAG 流程每个组成阶段的范式转变。
Stage | Baseline Approach | Advanced Approach | Underlying Principle |
---|---|---|---|
Parsing | PyMuPDF (Text-only extraction) | MinerU (Layout-aware, multi-modal) | From Text Extraction to Document Intelligence |
Chunking | Page-level | Semantic/Structural (e.g., by section, table) | From Arbitrary Division to Contextual Integrity |
Retrieval | Single-pass Vector Search | Multi-stage Hybrid Search (BM25 + Vector -> RRF -> Reranker) | From Similarity Search to Relevance Funnel |
Generation | Generic Pre-trained LLM | Fine-tuned, Instruction-aware LLM | From Generalist Scribe to Domain Expert |
本文将作为引领这一演变的全面指南。首先,本文将剖析一个具有代表性的基线实现,阐明其固有的局限性,然后提供一份详细实用的剧本,用于实现定义 RAG 技术先锋的先进技术。
第二部分:基线剖析:流水线的二分法
本文提供的基线代码(参考代码1)为构建 RAG 系统提供了一个宝贵的案例研究。它精心设计了两种不同的实现:一种是简单的同步流水线,非常适合教学目的;另一种是高性能异步流水线,它暗示了生产级系统的需求。对这两种实现的分析揭示了 RAG 的核心逻辑,以及架构选择对于性能和可扩展性至关重要。
同步轨迹 (SimpleRAG)
SimpleRAG 类体现了经典的线性 RAG 工作流。它的设置方法遵循清晰易懂的顺序:从 JSON 文件加载分段单元,迭代每个单元以生成相应的嵌入向量,然后将这些单元及其向量添加到内存中的 SimpleVectorStore 中。该逻辑易于理解,可以很好地介绍系统的基本组件。
然而,它的主要价值在于教育意义,因为它的设计包含一个严重的性能瓶颈。嵌入过程封装在 load_and_embed_chunks 中,其中包含一个 for 循环,该循环会针对每个单独的文本段对嵌入模型的应用程序编程接口 (API) 执行阻塞网络调用:emb = get_text_embedding([text])。在同步模型中,程序必须等待每个 API 调用完成后才能启动下一个 API 调用。对于包含数千个段的知识库,总设置时间是所有单个 API 延迟的总和,这使得它对于任何合理规模的数据集而言都极其缓慢。这种线性、顺序的处理模式体现了一种不适用于实际应用的设计,因为在实际应用中,设置和查询延迟都是关键的性能指标。
异步改进 (AsyncSimpleRAG)
AsyncSimpleRAG 类与其辅助类 AsyncEmbeddingModel 和 AsyncLocalLLMClient 相结合,代表了架构上的重大进步。它利用 Python 的 asyncio 库来管理并发操作,解决了 RAG 受 I/O 限制的特性。这不仅仅是一项优化,更是为实现高吞吐量而进行的根本性重新设计。
促进这一改进的关键机制列举如下:
- 异步输入/输出:诸如 aiofiles 和 httpx.AsyncClient 之类的库用于非阻塞文件和网络操作。当程序向嵌入 API 或 LLM API 发起请求时,它不会在等待响应期间阻塞执行。相反,它会交出控制权,从而允许 asyncio 事件循环处理其他任务,例如调度其他 API 请求。
- 并发控制:一个关键特性是在 embed_texts_batch 和 batch_process_async 方法中使用 asyncio.Semaphore。信号量是一种同步原语,用于限制并发任务的数量。在这种情况下,它可以防止系统向嵌入服务器或 LLM 服务器发送过多的并发请求,从而避免 API 速率限制、服务器过载或连接超时。通过设置 max_concurrent 限制,信号量可确保请求流稳定、高吞吐量,从而在处理速度和系统稳定性之间取得平衡。
- 强大的错误处理:AsyncEmbeddingModel 包含一个实用的回退机制。如果异步批量嵌入请求失败,其 except 块会拦截异常,并优雅地降级为针对该特定批次的同步调用。这体现了弹性设计的原则,确保影响单个批次的瞬时网络错误不会导致整个流程失败。
由此产生的性能差异是巨大的。同步流水线可以类比为单车道公路,每辆车都必须等待前一辆车的通行。相比之下,异步流水线类似于多车道高速公路,多辆车辆可以并行行驶。鉴于 RAG 系统的性能主要受网络延迟制约,重叠这些 I/O 操作的能力意味着大型批处理流程所需的总时间并非由所有延迟的总和决定,而是由最长的几个操作的持续时间决定,仅受并发限制的限制。这种架构
对于任何用于高容量批处理或面向用户的实时应用程序的 RAG 系统来说,模式都是先决条件。
核心缺陷批判
尽管拥有复杂的异步架构,但基线实现的有效性从根本上受到其数据处理和建模策略固有局限性的限制。
- 数据保真度的灾难性损失:该系统的“原罪”在于它依赖 PyMuPDF 进行文档解析。虽然 PyMuPDF 能够提取文本内容,但它将 PDF 视为线性字符流,很大程度上忽略了赋予文档意义的二维空间布局。对于财务报告而言,这会导致信息的灾难性损失。包含最关键定量数据的表格被扁平化成难以辨认的文本和数字的混乱。图表与其解释性标题之间至关重要的语义联系被不可逆转地切断。与之形成鲜明对比的是,像 MinerU 这样的“文档智能”工具利用计算机视觉模型进行布局分析,从而明确识别和保留表格、图表、标题和列表等结构。1
由于未能捕捉这些结构化和多模态信息,基线系统从一开始就依赖于严重退化且不完整的知识库表示。 - 初步分割:按页面划分文档的策略过于简单,却效率低下。财务报告中一个单一、连贯的论点或一个大型复杂的表格很容易跨越多个页面。通过在页面边界处进行任意划分,基线系统破坏了这种语义上下文。这使得 RAG 系统几乎不可能回答需要综合分页符两侧信息的问题,因为所需的上下文永远不会出现在单个检索到的片段中。
- 通才困境:基线系统采用通用的预训练嵌入和语言模型。这些模型虽然功能强大,但缺乏领域特定知识。通用的嵌入模型可能无法理解金融术语中微妙而关键的语义区别;例如,它可能无法辨别“收入”和“销售额”通常可以互换,而“净收入”和“营业收入”则代表着含义迥异的不同金融概念。同样,通用的法学硕士(LLM)在被要求生成答案时,可能无法遵循严格的忠实性标准,可能会以省略源文本中关键限定词的方式进行虚构或总结。这凸显了明显的性能瓶颈,只有通过基于特定领域数据对模型进行微调才能克服。
总而言之,虽然基线代码为高性能 RAG 架构提供了一个优秀的模板,但其简单的数据处理方法和对通用模型的依赖从根本上损害了其有效性。迈向最先进系统的道路必须从弥补这些基础缺陷开始。
第二部分:高级 RAG 实施指南
第三部分:RAG 的基石:通过 MinerU 实现高保真文档智能
RAG 系统能够获得的最显著的提升,就是提升其源头知识库的质量。“垃圾进,垃圾出”的原则非常适用于 RAG;如果所依据的信息不完整或损坏,即使是完美的检索和生成流程也会失效。因此,超越基线的第一步,也是最关键的一步,是用复杂的文档智能解决方案取代基本的文本提取。
MinerU 代表了这种范式转变,即从简单的“解析器”到“文档智能”工具。它利用先进的机器学习模型,以保留文档原始语义完整性的方式理解文档的结构和内容。
1
其关键功能直接弥补了基线的不足,包括:
- 高级布局分析:与单纯读取文本流的工具不同,MinerU 使用计算机视觉模型(例如 doclayout_yolo)来分析页面的视觉布局。它能够区分单列和多列,识别并删除页眉和页脚等无关元素,并确定文本的正确、类似人类的阅读顺序。这确保了信息的逻辑流得以保留。
- 表格识别和转换:这可以说是 MinerU 在金融领域最关键的功能。它可以自动检测 PDF 中的表格,并将其转换为结构化的机器可读格式(例如 Markdown 或 HTML)。此操作将将扁平、直观的数据表示转换为语义丰富的文本块,其中的行和列均已明确定义。这使得表格中包含的定量数据能够被下游 RAG 组件正确搜索和解释。
- 结构保存:MinerU 识别并标记结构元素,例如标题(多层级)、列表和段落。这种结构化输出对于实施更智能的分段策略至关重要。现在,您可以创建与文档逻辑部分对应的分段,而不是基于页数或字符数进行任意划分,从而保留上下文的完整性。
- 集成 OCR 和多语言支持:该工具可自动检测扫描的 PDF 或包含乱码文本的页面,并应用光学字符识别 (OCR) 技术提取内容。它支持数十种语言和手写文本,使整个数据采集流程更加健壮,并能适应各种文档格式和质量。1
多模态实践:赋予视觉数据文本声音
MinerU 提取图像和图表的能力是至关重要的第一步;然而,这些视觉元素仍然无法被基于文本的检索系统访问。关键的第二步是使这些视觉信息可搜索。这可以通过使用视觉语言模型 (VLM),例如 Qwen-VL 或 LLaVA 来实现。
工作流程如下:
- MinerU 解析 PDF 并提取所有图像、图表及其相关标题。
- 每张提取的图像都作为输入传递给 VLM。
- VLM 会生成丰富、详细的图像文本描述。对于条形图,这样的描述可能是:“一张比较 2021 年至 2023 年收入增长的条形图。2021 年的收入为 5000 万美元,2022 年增长至 6500 万美元,2023 年达到 7200 万美元,呈现出持续的上升趋势。”
- 生成的描述以及原始标题随后将存储为与该图像关联的片段的“内容”。
通过将视觉数据转换为描述性文本,此过程使基于文本的嵌入和检索系统能够完全访问图表和图形中包含的丰富信息。仅此一项增强功能就解锁了基线系统完全不可见的庞大关键数据存储库。
第 4 节:检索的艺术:最大化精确度和召回率
一旦建立了高保真知识库,优化的下一个前沿就是检索系统。目标是构建一个复杂的多阶段“漏斗”,逐步细化搜索结果,从而最大限度地提高提供给 LLM 的上下文的相关性,同时控制计算复杂度。这代表着从简单的一步式相似性搜索迈向一个强大的流程,旨在实现高召回率(检索所有潜在相关信息)和高准确率(过滤无关噪声)。
4.1. 超越向量搜索:混合检索的潜力
基准方法完全依赖于向量搜索,它擅长识别与给定查询在语义或概念上相似的文档。对于诸如“讨论公司盈利能力”之类的查询,即使没有精确的词汇,向量搜索也能有效地定位与收益、利润和收入相关的部分。然而,它有一个明显的弱点:它可能无法处理依赖于特定关键词、首字母缩略词或标识符的查询。查询“2023 年第二季度的 EBITDA 利润率”需要这些术语的精确匹配,而纯语义搜索可能无法检索到这些术语,或者给出的相关性分数可能较低。
为了克服这一限制,高级方法采用了第二种检索方法:Okapi BM25。BM25 是一种久经考验且高效的词汇(基于关键词)搜索算法。
它根据文档中包含的查询词的统计特性对文档进行排序,并考虑三个主要因素:
- 词频 (TF):查询词在文档中出现的频率。 BM25 采用了饱和效应,即超过某个阈值后,某个词条的额外出现会导致相关性得分的递减,从而防止长文档获得不公平的优势。5
- 逆文档频率 (IDF):某个词条在整个文档集合中的稀有度或常见度。稀有词条的权重更高,因为它们被认为信息量更大。6
- 文档长度归一化:根据文档长度相对于文档集合中平均文档长度的比率进行调整,这有助于减轻对较长文档的偏好。4
BM25 计算效率高,并且非常擅长匹配财务报告中常见的特定技术术语。
5
因此,最佳策略是混合、多路径召回方法。对于每个传入查询,系统并行执行两项搜索:
- 向量搜索,用于识别语义相关的片段。
- BM25 搜索,用于识别词汇匹配的片段。
这种双管齐下的方法确保了全面的覆盖范围,既能捕捉概念相似性,又能精确关联关键词,从而最大限度地提高检索所有相关信息的概率。
4.2. 等级融合:互惠等级融合 (RRF)
混合召回策略会生成两个独立的候选文档排序列表。关键挑战在于如何将这些列表合并为一个统一的、一致的排名。诸如简单串联之类的简单方法并非最佳方案;更重要的是,向量搜索(例如余弦相似度)和 BM25 生成的相关性得分处于不同的、无法比较的尺度上。
7
解决这个问题的优雅方法是倒数排名融合 (RRF)。RRF 是一种纯粹基于排名而非得分来合并多个结果集的方法。
8,9
公式简单但功能强大
8,10
:
RRF\_Score(d)=r∈R∑k+rankr(d)1
其中:
- d 表示文档。
- R 表示排序列表的集合(在本例中,分别为向量搜索的列表和 BM25 的列表)。
- textrank_r(d) 表示文档 d 在列表 r 中的位置(排名)。
- k 是一个常数,通常设置为 60\。
RRF 之所以高效,原因如下:
- 分数不可知论:通过仅使用排名,它完全规避了分数不可比的问题,使其成为融合异构系统结果的理想工具。7
- 强调高排名:倒数函数 1 / (k + 排名) 会大力奖励在任何组成列表中排名靠前的文档。通过向量搜索或 BM25 排名第一的文档将显著提升其最终的综合得分。
- 稳健性和平滑性:常数 k 起着平滑因子的作用。它可以防止排名 1 和排名 2 之间的分数差异过大,例如与排名 10 和排名 11 之间的差异相比。已证明,k=60 的常用值可以通过对排名较低的项目创建更渐进的权重下降来获得良好的结果。
RRF 阶段的输出是一个单一、统一的候选文档列表,其排序比任何一种检索方法单独输出的排序结果都更稳健。此列表构成最终精度调整步骤的输入。
4.3. 最终改进:通过重排序实现精准度
混合召回和融合阶段旨在广撒网,优先考虑召回,以确保不遗漏任何重要信息。这种方法的自然结果是,该过程不可避免地会检索到一些半相关或“嘈杂”的文档。将这些嘈杂的背景信息提供给 LLM 可能会导致混乱、事实不准确或答案不够简洁。检索漏斗的最后阶段旨在以精准度修剪此列表。
这就是重排序器的指定角色。从架构上看,用于初始检索(双编码器)和重排序(交叉编码器)的模型是不同的。双编码器会为查询和每个文档分别生成一个向量表示,然后使用计算效率更高的运算(例如余弦相似度)进行比较。相反,交叉编码器会将查询和单个文档一起作为一对,并通过完整的 Transformer 模型进行处理。这使得查询和文档之间能够建立深度、token 级别的注意力机制,从而获得更准确、更细致的相关性得分。
13
对于此任务,BAAI BGE-Reranker 系列中的模型是绝佳选择。
14,15
这些是功能强大的开源交叉编码器模型,专门针对重排序任务进行训练。实际实现非常简单:
- 从 RRF 融合列表中选择前 N 个候选(例如,前 20 个)。
- 为每个候选词创建一个形式为 (query, document_content) 的词对。
- 使用 FlagEmbedding 等库将此词对列表传递给 BGE-Reranker 模型。
- 该模型将为每对词对输出一个新的、高度准确的相关性得分。
- 根据新的得分对文档进行排序,并选出最终的前 K 个文档(例如,前 3-5 个)。
最终的文档集代表了现有质量最高、最相关的上下文。通过将这些清晰、高信号的上下文提供给 LLM,最终生成答案的质量和准确性将得到显著提升。
整个多阶段检索过程可以概念化为一个管理计算资源的经济系统。每个阶段都应用了一种渐进式的将计算成本更高的分析转移到规模越来越小、价值越来越高的文档集。
- 第 1 阶段(召回率): 此阶段为低成本的批量处理阶段。向量和 BM25 搜索经过高度优化,且每个文档的计算成本低廉。目标是高效地扫描整个知识库,以最低的成本生成大量潜在候选列表(例如,前 50-100 个)。
- **第 2 阶段(融合):**RRF 计算量小,几乎不增加任何开销。其功能是智能地组织召回率阶段生成的清单,而不会产生大量成本。
- 第 3 阶段(重新排序): 此阶段为高成本的专家评估阶段。交叉编码器的完整 Transformer 推理比向量相似性检查的计算成本高得多。但是,此成本仅适用于一小部分经过预先筛选的高潜力候选列表(例如,RRF 列表中的前 20 个)。
这种“漏斗”架构巧妙地解决了速度与准确率之间的经典权衡问题。它通过采用更经济、更快速的方法来首先创建高质量的候选列表,从而避免了将昂贵的专家评估应用于整个数据库这一计算上不可行的任务。这为理解和论证高级检索流程的复杂性提供了一个强大的思维模型。
检索方法 | 匹配类型 | 相对速度 | 相对准确率 | 流程中的主要角色 |
---|---|---|---|---|
向量搜索 | 语义(含义) | 非常快 | 良好 | 第一阶段:召回率。查找概念上相似的文档。 |
BM25 | 词汇(关键词) | 非常快 | 良好 | 第一阶段:召回率。查找与术语完全匹配的文档。 |
重排序器(交叉编码器) | 上下文(交互) | 慢 | 优秀 | 第三阶段:准确率 对一小部分候选集进行重新排序,以实现最大相关性。 |
第五部分:打造领域专家:模型微调
即使拥有完善的知识库和高精度检索系统,RAG 系统的性能也会受到其底层 AI 模型能力的限制。通用的预训练模型对世界有一般性的理解,但缺乏金融分析等特定领域所需的专业知识。微调是对这些通用模型进行调整的过程,从而教会它们目标领域的特定语言、语义关系和任务格式,最终将它们转化为领域专家。
5.1.嵌入模型的微调
微调嵌入模型的目标是重塑其内部向量空间,以更好地反映金融语言的语义细微差别。这需要确保在金融语境中语义相似的查询和文档片段在向量空间中的位置更接近,从而实现更准确的检索。
一种强大的技术是对比学习,它利用由提供的 train.json 文件构建的训练数据。这需要以三元组的形式创建训练样本:
- 锚点:来自 train.json 条目的用户问题。
- 正例:对应的真实答案片段的内容。
- 硬负例:与正例片段来自同一文档的其他片段。这些是特别有效的训练信号,因为它们通常在主题上相似,并且可能包含重叠的关键词,从而迫使模型学习导致它们成为错误答案的细微差别。
通过对这些三元组进行训练,模型学会吸引正样本段的向量更靠近锚点(问题)向量,同时排斥困难负样本段的向量。这直接优化了模型在特定领域内的检索任务。
5.2. LLM 的指令调优
大型语言模型的微调有两个主要目标,这两个目标对于在本次比赛中取得成功都至关重要:
- 忠实度:训练 LLM 使其答案严格基于提供的上下文。这可以降低“幻觉”的风险,即模型可能基于其内部知识而非源文档生成看似合理但实际上不正确的信息。
- 控制:训练 LLM 以提交所需的精确 JSON 格式生成输出 ({‘answer’: ‘…’, ‘filename’: ‘…’, ‘page’: ‘…’})。这消除了对脆弱的输出解析的需求,并确保模型的响应始终是机器可读且格式正确的。
这是通过对指令格式的数据集进行监督式微调来实现的。train.json 中的每个条目都可以转换为具有以下结构的训练示例:
{
“instruction”:“根据以下上下文,回答用户的问题ion,并以指定的 JSON 格式提供源文件名和页码。",
“context”: “[此问题检索到的块的内容]”,
“question”: “”,
“output”: “{‘answer’: ‘train.json 中的答案’, ‘filename’: ‘train.json 中的文件名’, ‘page’: ‘train.json 中的页码’}”
}
通过对数千个这样的示例进行训练,LLM 学会了如何成为一名忠实顺从的金融分析师助手,可靠地将检索到的上下文转换为格式良好且准确的答案。
5.3. 使用 Unsloth 进行高效微调的实用指南
从历史上看,大型模型的微调是一项资源密集型过程,只有拥有强大 GPU 集群的组织才能进行。然而,像 Unsloth 这样的框架已经将这项功能大众化,即使硬件资源有限的个人和团队也能轻松使用。资源。
18
Unsloth 是一个能够显著加快微调速度并降低内存需求的库,通常支持在单个消费级或免费云 GPU 上对大型模型进行微调。
19
其主要功能包括:
- 速度和内存效率:与标准微调脚本相比,Unsloth 的训练渲染速度最高可提高 2 倍,并且显存占用量显著减少。19
- QLoRA 集成:Unsloth 的核心利用了QLoRA(量化低秩自适应)。该技术通过冻结 LLM 的绝大部分权重并仅训练一小部分额外的“低秩”适配器层来运行。此外,这些计算使用 4 位量化执行,从而大幅减少了模型及其梯度在训练过程中的内存占用。18
- 易用性:Unsloth 提供了一个简单的高级 API,抽象了以下复杂性:量化和 LoRA 设置。用户只需几行代码即可准备一个模型进行高效的微调。
使用 Unsloth 设置模型的概念代码块演示了这种简单性:
from unsloth import FastLanguageModel# 加载4位量化模型
model, tokenizer = FastLanguageModel.from_pretrained(model_name = "unsloth/Meta-Llama-3.1-8B-bnb-4bit",max_seq_length = 2048,load_in_4bit = True,
)# 为模型添加LoRA适配器以支持训练
model = FastLanguageModel.get_peft_model(model,r = 16, # LoRA矩阵秩target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],lora_alpha = 16,lora_dropout = 0,bias = "none",
)# 现在,“模型”已准备好与指令格式的数据集一起传递给 Hugging Face Trainer
通过使用 Unsloth 等工具,强大的模型微调技术从理论上的可能性转变为针对金融领域 RAG 系统优化的切实可行的步骤。
第三部分:前沿和未来方向
第六部分:下一代架构:图和代理
虽然第二部分中概述的高级策略可以提供最先进的 RAG 系统,但该领域仍在快速发展。除了比赛的直接需求之外,还有两个新兴的架构范式有望释放更强大的功能:将知识表示为结构化图谱,以及构建能够推理自身流程的系统。这些前沿技术将 RAG 从简单的检索和生成流程推向更复杂的自动推理形式。
6.1. 智能的结构化:RAG 中知识图谱简介
即使解析完美,基于段的方法的一个根本局限性在于,知识库仍然是孤立的、非结构化的文本片段的集合。这使得回答“多跳”问题变得极其困难——这类查询需要连接可能位于不同段甚至不同文档中的不同信息。例如:“X 公司 2022 年年度报告中提到的哪位董事同时也是 Y 公司董事会成员,正如其最新的代理声明中所述?” 回答这个问题需要识别实体并随后遍历它们之间的关系,而标准检索正是这项任务的答案。不太合适。
这正是 GraphRAG 发挥作用的领域。该方法涉及将知识库的非结构化文本转换为结构化的 知识图谱 (KG)。
知识图谱是一种类似网络的数据结构,由以下部分组成:
- 节点(或实体): 这些节点代表关键概念或现实世界中的对象,例如人物(例如“John Smith”)、组织(例如“公司 X”)、财务术语(例如“收入”)和日期。
- 边(或关系): 这些边代表实体之间的连接,例如 SERVES_ON_BOARD_
OF、REPORTED_IN 或 IS_CEO_OF。
LLM 本身可以用来自动构建此图。使用 MinerU 等工具解析文档后,LLM 会被提示通读文本并提取所有相关实体及其之间的关系。
然后,这些提取出的(主语、谓语、宾语)三元组将用于填充图数据库,例如 Neo4j。
这种方法的强大之处在于能够查询数据中的关系。系统不仅可以搜索包含关键字的片段,还可以执行图遍历。为了回答上面提出的多跳问题,系统将执行以下步骤:
- 找到“公司 X 2022 年年度报告”的节点。
- 遍历 HAS_DIRECTOR 边以识别所有连接的董事节点。
- 对于每个主管节点,遍历其传出边,以确定是否有任何节点通过 SERVES_ON_BOARD_OF 关系连接到“公司 Y”节点。
这种对结构化连接进行推理的能力将 RAG 系统从一个简单的信息检索器提升为一个强大的分析工具,能够发现仅隐含在原文中的见解。
22
6.2. 构建更智能的系统:自校正和反思型 RAG
标准的 RAG 流程是一个静态的前馈过程。它检索信息并生成答案,但它没有机制来识别其检索是否次优或答案是否存在缺陷。RAG 开发的下一个前沿是构建能够推理自身行为并纠正自身错误的“代理”系统。这通常被称为自校正或自反思型 RAG。
该领域的两种主要方法是校正检索式自动生成 (CRAG) 和自检索式自动生成 (Self-RAG)。
23,24
- 校正检索式自动生成 (CRAG):CRAG 的核心思想是在流程中引入一个自评估步骤。检索到一组初始文档后,一个轻量级的“检索评估器”模型会对其与查询的相关性进行评级。系统可以根据此评级触发不同的操作。如果检索到的文档被认为高度相关,则继续进行生成。如果文档不相关或含糊不清,系统可以采取纠正措施,例如重新表述原始查询使其更加具体,或者,如果系统认为其内部知识库不足,则执行网络搜索以查找补充的最新信息。23,25
这使得系统对较差的初始检索更具鲁棒性。 - 自 RAG:这是一种更深度集成的方法,它通过生成特殊的“反射标记”来训练 LLM 控制整个 RAG 流程。26
该模型会学习动态地判断给定查询是否需要检索。如果决定检索,它可以生成其他标记来评估每个检索段落的相关性,并评估其自身生成的响应的真实性和准确性。24,27
这将自校正逻辑直接嵌入到 LLM 本身中,从而创建一个高度自适应且可控的系统。
这些动态、循环工作流程的实现可能非常复杂。LangChain 的LangGraph 等框架就是为此目的专门设计的。LangGraph 允许开发者将 RAG 流程定义为状态图,其中节点表示操作(例如“检索”、“评分”、“生成”),边表示引导流程的条件逻辑。
24
这使得它成为构建 CRAG 和 Self-RAG 所需的复杂反馈回路的理想工具。
这些代理架构的出现代表了 RAG 系统设计的根本性转变。传统的 RAG 系统是一个数据处理流水线;它执行固定的线性步骤序列。具有多级检索漏斗的高级系统是一个更复杂但仍然基本上是线性的流水线。然而,自校正系统不再是线性的。它包含循环和条件逻辑。它的执行路径可能是:检索 -> 评估 -> 相关性低?-> 如果是,则重写查询 -> 再次检索 -> 评估 -> 相关性高?-> 生成。这代表着从静态流水线到简单但强大的自主代理的转变。该系统具备某种“元认知”能力——它可以推理自身的内部状态、信息质量以及满足请求的最佳策略。这种能力将使未来的 RAG 系统能够处理模糊性、从错误中恢复,并以更高的可靠性和智能处理更复杂的任务。
架构 | 核心理念 | 解决问题 | 关键挑战 |
---|---|---|---|
GraphRAG | 将知识表示为实体和关系的网络。 | 回答需要连接事实的复杂、多跳问题oss 多个文档。 | 从非结构化文本准确构建知识图谱的复杂性。 |
自校正 RAG (CRAG/Self-RAG) | 创建一个具有反馈回路的代理系统,以评估和改进其自身的检索和生成步骤。 | 通过动态地从不良检索或模糊性中恢复,提高 RAG 的稳健性和可靠性。 | 由于额外的自我评估和潜在的循环步骤,延迟和系统复杂性增加。 |
第 7 节:结论:RAG 卓越的可行路线图
本报告绘制了从功能有限但功能有限的基线 RAG 系统到代理推理 AI 前沿的路线图。这一历程强调,在财务分析等高要求领域取得卓越成就并非取决于单一算法,而是取决于对流程每个阶段质量的整体承诺。即使是最复杂的法学硕士 (LLM) 也无法克服知识库的缺陷,而最先进的检索算法也只能与其背后的模型一样有效。
通往最先进系统的道路建立在三大优化基础之上:
- 数据保真度:必须将捕捉源文档的全部丰富内容放在首位。这需要超越简单的文本提取,转向像 MinerU 这样的文档智能平台,以保留布局、结构和多模态内容。
- 检索精度:检索过程必须构建为一个多阶段漏斗,旨在最大限度地提高相关性。这包括将 BM25 的词汇强度与向量搜索的语义能力相结合,将结果与 RRF 融合,并使用高精度重排序器来选择最终的最佳上下文。
- 模型专业化:通用模型必须经过调整才能成为领域专家。这需要对嵌入模型进行微调以理解金融语义,并对 LLM 进行指令调整以确保其响应忠实于源码并格式化以便于控制。
对于竞争环境中的参与者,建议采用务实的分层实施方法,以最大限度地提高每一步的分数。
可操作的路线图
-
第 1 层(最高优先级和影响力):
-
**过渡到 MinerU 进行解析:**用 MinerU 替换 PyMuPDF,以创建高保真、结构化和多模态的知识库。这一修改将释放表格和图表中包含的大量信息,从而提供最大的分数提升潜力。
-
**执行完整测试集:**修改基线脚本以处理 test.json 中的所有问题(TEST_SAMPLE_NUM = None)。这确保了完整的提交并充分利用了系统的全部功能。
-
第二层(准确率大幅提升):
-
**实施重排序:**使用 BAAI/bge-reranker-large 等模型添加重排序步骤。这将显著提高提供给 LLM 的上下文的准确率,减少噪音并提升生成答案的质量。
-
第三层(获得竞争优势):
-
**实施完全混合搜索:**将 BM25 与向量搜索集成,并使用 RRF 融合结果。这将提高召回率,尤其是对于包含特定术语的查询。
-
**微调 LLM:**使用 Unsloth 等框架对 LLM 进行指令调整。重点应放在忠实于上下文并严格遵守所需的 JSON 输出格式。
-
第四层(力争达到最佳水平):
-
**微调嵌入模型:**根据 train.json 文件创建一个对比训练集,以微调嵌入模型。这将提高初始检索阶段的准确率。
-
**实现高级分块:**利用 MinerU 输出中的结构化信息(标题、章节)创建语义连贯的片段,而不是依赖基于页面的拆分。
-
第五层(探索性研究):
-
对于那些渴望在现有方案之外进行创新的人,建议探索第三部分中的概念。可以尝试使用 LLM 从文档构建小规模的知识图谱,或者使用检索评估器实现简单的自校正循环。
通过系统地完成这些层级,团队可以将简单的基线转变为高度复杂、强大且准确的 RAG 系统,能够在最高水平上竞争。