FinanceRAG获奖方案解读:ACM-ICAIF ’24的FinanceRAG挑战赛
ACM-ICAIF '24 FinanceRAG Challenge提供一套整合的文本和表格财务数据集。这些数据集旨在测试系统检索和推理财务数据的能力。参与者将受益于 Github 上的基线示例和官方提交代码,其位于FinanceRAG,以及在 huggingface 上的简化的数据集访问,其位于Linq-AI-Research/FinanceRAG。
核心问题
- 金融领域的复杂性:金融文档包含大量专业术语、缩写和数值表格,传统RAG系统难以高效处理。
- 长上下文问题:金融文档通常篇幅较长,直接输入大语言模型会导致性能下降。
- 检索精度:如何从大规模语料中准确提取与查询最相关的文档。
亚军方案
通过优化查询扩展、语料优化和长上下文管理等技术打造的针对金融领域的高性能检索增强生成(RAG)系统,在ACM-ICAIF ’24的FinanceRAG挑战赛中取得了第二名的成绩。
方法与技术亮点
围绕RAG系统的三个阶段展开:预检索(Pre-Retrieval)、检索(Retrieval)和生成(Generation)。以下是对每个阶段的详细分析。
1. 预检索(Pre-Retrieval)
预检索阶段的目标是对查询和语料进行优化,以提高后续检索的效率和准确性。
-
查询扩展(Query Expansion):
- 问题:金融领域的查询往往包含缩写、模糊含义或需要多步推理。
- 方法:通过OpenAI/GPT-4o-mini对查询进行改写、关键词提取和假设文档生成。
- 延展:查询扩展技术在自然语言处理中已有广泛应用,但论文通过结合金融领域的特定需求(如缩写解析和数值推理),进一步提升了查询的语义表达能力。
- 实验结果:通过对比不同查询扩展方法的NDCG@10指标,发现结合原始查询和关键词提取的方法效果最佳。
-
语料优化(Corpus Optimization):
- 问题:金融语料规模庞大,直接检索效率低下。
- 方法:对语料进行摘要提取和表格数据分离。摘要提取使用OpenAI/GPT-4o生成,表格数据分离针对MultiHiertt数据集(包含大量表格信息)。
- 延展:语料优化技术可以进一步结合领域知识,例如针对财务报表中的数值表格,可以提取关键指标(如收入、利润)并生成结构化的中间表示。
2. 检索(Retrieval)
检索阶段的核心是通过多级重排序器(Multi-Reranker)提高检索精度。
- 重排序器(Reranker):
- 问题:传统基于嵌入相似度的检索方法难以捕捉复杂的语义关系。
- 方法:使用多级重排序器模型,首先通过轻量级模型提取前200条相关语料,再通过更精确的模型进一步筛选出前10条。
- 延展:重排序器模型的选择可以结合任务需求,例如金融领域需要支持多语言和数值推理的模型。论文中使用的模型包括jina-reranker-v2-base-multilingual和gte-multilingual-reranker-base。
- 实验结果:通过对比不同重排序器模型的性能,最终在公共排行榜上达到了NDCG@10 0.63996的分数。
3. 生成(Generation)
生成阶段的目标是在长上下文输入下生成准确、简洁的回答。
-
长上下文管理(Long Context Management):
- 问题:大语言模型在处理超过32k tokens的上下文时性能显著下降。
- 方法:将输入语料分为两部分,分别处理后融合结果。例如,将前10条语料和后10条语料分别输入模型,最后融合生成最终答案。
- 延展:长上下文管理技术可以进一步结合注意力机制优化,例如通过稀疏注意力机制减少计算复杂度。
- 实验结果:通过限制上下文大小并优化答案格式,生成的回答在准确性和效率上均优于直接输入长上下文的方法。
-
答案格式优化(Answer Format Optimization):
- 问题:金融专家通常需要具体的数值答案,而非冗长的解释。
- 方法:通过提示工程(Prompt Engineering)引导模型输出关键信息。
- 延展:提示工程可以进一步结合领域知识,例如设计特定的提示模板,要求模型直接输出数值结果或简要分析。
优点与创新
- 预检索消融分析:通过全面的消融研究优化了预检索技术,增强了整体检索效果。
- 准确的检索算法:开发了基于多个重排模型的准确检索算法,提高了检索语料库的相关性。
- 高效的长上下文管理:设计了一种有效管理长上下文大小的方法,显著提升了响应的质量和准确性。
- 高性能的RAG系统:开发了一个高性能的、特定于金融领域的检索增强生成(RAG)系统,并在ACM-ICAIF’24 FinanceRAG竞赛中获得了第二名。
- 多种重排模型的组合:使用了多种重排模型,并通过实验确定了最适合每个数据集的重排模型。
- 上下文大小管理策略:针对LLM上下文大小增加带来的性能下降问题,提出了有效的上下文大小管理策略。
- 查询扩展技术的应用:采用了多种查询扩展技术,如释义、关键词提取和假设文档的创建,以提高检索过程的有效性。
- 表格提取和摘要的使用:在处理大规模语料库时,使用了摘要和表格提取技术,特别是针对包含大量表格数据的MultiHiertt数据集。
仓库结构
FinanceRAG/
├── financerag/ # 主模块目录
│ ├── common/ # 通用工具函数
│ ├── generate/ # 响应生成代码
│ ├── rerank/ # 检索文档重排序代码
│ └── retrieval/ # 文档检索代码
├── dataset/ # 数据集存储文件夹
├── paper/ # 论文文件夹
├── pre_retrieval.py # 预检索脚本
├── prepare_dataset.py # 数据集下载和准备脚本
├── prompt.json # 预检索提示配置
├── requirements.txt # Python 依赖项
├── rerank.py # 重排序脚本
└── run.sh # 运行完整流程的脚本
代码片段功能
rerank.py
:定义了重排序脚本的命令行参数,包括任务选择、模型选择、前 K 个结果重排序、批量大小等。FinQATask.py
:定义了FinQA
任务的元数据,包括任务名称、描述、数据集路径、任务类型等。financerag/generate/openai.py
:实现了一个与 OpenAI API 交互的类OpenAIGenerator
,用于生成响应,支持并行处理。pre_retrieval.py
:包含加载提示模板、扩展查询和压缩语料库等功能。financerag/retrieval/
:包含多种检索方法的实现,如DenseRetrieval
(基于编码器的密集检索)和BM25Retriever
(基于词法模型的检索)。financerag/common/loader.py
:实现了数据集加载的功能,包括加载语料库和查询数据集。
环境要求
- Python:3.10+
- CUDA:12.2+
- API 密钥:需要 OpenAI API 密钥和 Kaggle API 密钥及用户名。
- Python 包:具体依赖项见
requirements.txt
。
快速开始
- 克隆仓库:
git clone https://github.com/cv-lee/FinanceRAG.git
cd FinanceRAG
- 创建
.env
文件:
touch .env
- 写入
.env
文件:
# .env
OPENAI_API_KEY=YOUR_OPENAI_API_KEY
KAGGLE_USERNAME=YOUR_KAGGLE_USERNAME
KAGGLE_KEY=YOUR_KAGGLE_KEY
- 执行完整流程:
bash run.sh
故障排除
- Flash Attention 安装问题:可以在
run.sh
脚本中取消注释pip uninstall -y transformer - engine
,若问题仍然存在,可参考官方 [Flash Attention GitHub 仓库](https://github.com/Dao - AILab/flash - attention)。 - 检索速度慢:可以在
run.sh
中使用--batch_size
参数调整批量大小。
论文
可以在 Arxiv 上查看完整论文。
相关文章:
FinanceRAG获奖方案解读:ACM-ICAIF ’24的FinanceRAG挑战赛
ACM-ICAIF 24 FinanceRAG Challenge提供一套整合的文本和表格财务数据集。这些数据集旨在测试系统检索和推理财务数据的能力。参与者将受益于 Github 上的基线示例和官方提交代码,其位于FinanceRAG,以及在 huggingface 上的简化的数据集访问,…...
Linux LED驱动(gpio子系统)
0. gpio子系统 gpio子系统是linux内核当中用于管理GPIO资源的一套系统,它提供了很多GPIO相关的API接口,驱动程序中使用GPIO之前需要向gpio子系统申请。 gpio子系统的主要目的就是方便驱动开发者使用gpio,驱动开发者在设备树中添加gpio相关信息…...
场外期权交易和结算方式的区别是什么?
场外期权交易的核心在于双方协商一致的合约条款。这些条款包括但不限于期权的类型(看涨或看跌)、执行价格、到期日、合约规模以及支付的期权费。由于每份合约都是独一无二的,因此交易双方需要具备高度的专业知识和谈判技巧,下文为…...
自注意力的机制内涵和设计逻辑
在自注意力机制中,查询(Q)、键(K)和值(V)的交互过程是核心设计,其背后的数学和语义内涵可以从以下角度理解: 1. 数学视角:动态加权聚合 自注意力机制的公式可…...
VIM学习笔记
1. ex模式 vim中,按:触发的命令行模式,称为 ex模式,具体命令参见如下笔记: https://blog.csdn.net/u010250151/article/details/51868751?ops_request_misc%257B%2522request%255Fid%2522%253A%2522814b671a9898c95…...
Windows系统docker desktop安装(学习记录)
目前在学习docker,在网上扒了很多老师的教程,终于装好了,于是决定再装一遍做个记录,省的以后再这么麻烦 一:什么是docker Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个…...
操作系统学习笔记——[特殊字符]超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白!
💡超详细 | 如何唤醒被阻塞的 socket 线程?线程阻塞原理、线程池、fork/vfork彻底讲明白! 一、什么是阻塞?为什么线程会阻塞?二、socket线程被阻塞的典型场景🧠 解法思路: 三、线程的几种阻塞状…...
GIC驱动程序对中断的处理流程
承接上一篇,我们来讲讲GIC的处理流程: 我们先来看看老版本的CPU是怎么去处理中断的: 这种的话,基本上就是一开始就确定你有多少个中断,就为你分配好了多少个irq_desc,这样子每一个硬件中断,也就…...
罗庚机器人:机器人打磨领域的先行者
近日,记者在广东罗庚机器人有限公司(以下简称罗庚机器人)总经理蒲小平处了解到,该公司是一家研发与为客户提供高精度自适应机器人打磨抛光集成工艺的高科技企业,是机器人打磨领域的先行者。在国内外机器人打磨抛光应用…...
如何在 Java 中对 PDF 文件进行数字签名(教程)
Java 本身并不原生支持 PDF 文件,因此若要对 PDF 进行数字签名,您需要使用一些专用的软件。本教程将演示如何使用 JPedal PDF 库来对 PDF 文件进行数字签名。 步骤: • 下载 JPedal 并将 Jar 文件添加到项目中 • 创建一个 PKCS#12 密…...
一文了解:北斗短报文终端是什么,有哪些应用场景?
在通信技术飞速发展的今天,人们已习惯于依赖地面基站和互联网实现即时通信。然而,当自然灾害突发、远洋航行遇险或深入无人区勘探时,传统通信手段往往失效。北斗短报文终端——这一由中国自主研发的卫星通信技术,正以“无网络通信…...
【KWDB创作者计划】_KWDB应用之实战案例
【KWDB 2025 创作者计划】_KWDB应用之实战案例 本文是在完成KWDB数据库安装的情况下的操作篇,关于KWDB的介绍与安装部署,可以查看上一篇博客: https://blog.itpub.net/70045384/viewspace-3081187/ https://blog.csdn.net/m0_38139250/article/details/…...
JavaScript中的运算符与语句:深入理解编程的基础构建块
# JavaScript中的运算符与语句:深入理解编程的基础构建块 在JavaScript编程的世界里,运算符和语句就像是构建大厦的基石,它们是编写高效、灵活代码的基础。今天,我们就来深入了解一下这些重要的元素。 ## 一、运算符:…...
MySQL——学习InnoDB(1)
MySQL——学习InnoDB(1) 文章目录 MySQL——学习InnoDB(1)1. InnoDB的前世今生1.1 诞生发展1.2 核心设计1.3 关键进化 2. InnoDB和MyISAM在性能和安全上的区别2.1 性能对比2.2 安全对比 3. InnoDB架构图(内存结构磁盘结…...
QT中多线程写法
转自个人博客:QT中多线程写法 1. QThread及moveToThread() 使用情况: 多使用于需要将有着复杂逻辑或需要一直占用并运行的类放入子线程中执行的情况,moveToThread是将整个类的对象移入子线程。 优缺点: 优点:更符合…...
css 二维码始终显示在按钮的正下方,并且根据不同的屏幕分辨率自动调整位置
一、需求 “求职入口” 下面的浮窗位置在其正下方,并且浏览器分辨的改变(拖动浏览器),位置依旧在最下方 二、实现 <div class"btn_box"><div class"btn_link id"js-apply">求职入口<di…...
STM32 认识STM32
目录 什么是嵌入式? 认识STM32单片机 开发环境安装 安装开发环境 开发板资源介绍 单片机开发模式 创建工程的方式 烧录STM32程序 什么是嵌入式? 1.智能手环项目 主要功能有: 彩色触摸屏 显示时间 健康信息:心率&#…...
关于 CSDN的C知道功能模块 的详细解析,包括 新增的AI搜索(可选深度思考) 和 智能体功能 的具体说明及对比分析
以下是关于 CSDN的C知道功能模块 的详细解析,包括 新增的AI搜索(可选深度思考) 和 智能体功能 的具体说明及对比分析: 一、C知道核心功能模块详解(基础功能) (参考前文内容,此处略…...
Vue--组件练习案例
图片轮播案例: <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Title</title></head><body><!--轮播图片--><div id"app"><h1>轮播图</h1…...
Sentinel源码—1.使用演示和简介一
大纲 1.Sentinel流量治理框架简介 2.Sentinel源码编译及Demo演示 3.Dashboard功能介绍 4.流控规则使用演示 5.熔断规则使用演示 6.热点规则使用演示 7.授权规则使用演示 8.系统规则使用演示 9.集群流控使用演示 1.Sentinel流量治理框架简介 (1)与Sentinel相关的问题 …...
空间信息可视化——WebGIS前端实例(二)
技术栈:原生HTML 源代码:CUGLin/WebGIS: This is a project of Spatial information visualization 5 水质情况实时监测预警系统 5.1 系统设计思想 水安全是涉及国家长治久安的大事。多年来,为相应国家战略,诸多地理信息领域的…...
高并发内存池(前言介绍)
高并发内存池项目介绍 1.项目介绍2.项目的知识储备要求3.了解池化技术及内存池4.本次项目中内存池解决的问题5.malloc 1.项目介绍 此项目是实现一个高并发的内存池,它的原型是google的一个开源项目tcmalloc,tcmalloc全程Thread-Caching Mallocÿ…...
误译、值对象和DDD伪创新-《分析模式》漫谈56
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第14章“类型模型设计模板模式”原文: Examples of such object types are the classic built-in data types of programming environments: inte…...
Java单例模式:实现全局唯一对象的艺术
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式? 单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,…...
机器学习项目二:帕金森病检测
目录 下载数据 一、导入相关包 二、数据加载 三、特征工程 四、构建模型 五、评估与可视化 六、程序流程 七、完整代码 一、导入相关包 # 导入库部分 import numpy as np # 数值计算基础库 import pandas as pd # 数据处理库 from sklearn.preprocessing import MinMaxS…...
FreeDogs:AI、区块链与迷因文化的深度融合
引言 在 Web3 时代,人工智能(AI)、区块链技术和迷因文化的结合催生了一种全新的去中心化生态系统。FreeDogs 项目作为这一领域的创新代表,通过独特的技术与文化融合模式迅速受到关注。它利用 AI 驱动的智能营销网络推动迷因文化的…...
《组合优于继承:构建高内聚低耦合模块的最佳实践》
《组合优于继承:构建高内聚低耦合模块的最佳实践》 一、引言:编程范式中的选择 在软件设计中,继承和组合是两个重要的设计模式。继承(Inheritance)常被用来实现代码复用,但滥用继承容易导致脆弱的类层次结构,增加耦合度和维护成本。而组合(Composition)通过将功能分解…...
机器学习02——RNN
一、RNN的基本概念 定义 循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络架构。它与传统的前馈神经网络(如多层感知机)不同,RNN具有“记忆”功能,能够利用前一时…...
Java基础——面试自我总结
1、String类中常用方法和equals区别 答:对于和equals这两个都是用来比较判断是否相等,其中用来判断两个变量的值是否相等,变量的值的类型分为基本数据类型和引用数据类型。对于,基本数据类型是直接进行值比较,而对于引…...
低功耗设计:Level Shift的种类(以SAED EDK 32/28nm工艺库为例)
在多电压设计中,当信号从一个电压域跨越到另一个电压域时,需要使用电压转换器(Level Shift)。它的工作方式类似于缓冲器,但其输入和输出使用不同的电压,作用是将一个逻辑信号从一个电压转换为另一个电压,并在输入到输出…...
UE5 Chaos :渲染网格体 (Render Mesh) 和模拟网格体 是如何关联的?为什么模拟网格体 可以驱动渲染网格体?
官方文献:https://dev.epicgames.com/community/learning/tutorials/pv7x/unreal-engine-panel-cloth-editor 这背后的核心是一种常见的计算机图形学技术,通常称为代理绑定 (Proxy Binding) 或 表面变形传递 (Surface Deformation Transfer)。 关联机制…...
Fiddler为什么可以看到一次HTTP请求数据?
1、作为代理服务器 Fiddler作为代理服务器,拦截了设备与互联网服务器之间的所有HTTP和HTTPS流量。当客户端(如浏览器)发送请求时,请求先到达Fiddler,然后由Fiddler转发到目标服务器;服务器的响应也会返回给…...
RAG(Retrieval-Augmented Generation)召回算法是检索增强生成模型中的关键组件
RAG(Retrieval-Augmented Generation)召回算法是检索增强生成模型中的关键组件,其核心目标是从大规模文档库中高效检索与输入查询相关的信息,以辅助生成模型产生更准确的回答。以下是该算法的关键点解析: ### 1. **核…...
[NOIP 2003 普及组] 栈 Java
import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int n Integer.parseInt(br.readLine());int[] dp new int[n 1];dp[0] 1; // 空序列只有一种…...
5.5 GitHub数据秒级分析核心揭秘:三层提示工程架构设计解析
GitHub Sentinel Agent 分析报告功能设计与实现 关键词:GitHub 数据分析, 提示工程设计, Pull Request 分析, Issues 跟踪, 竞品对比 项目进展报告生成功能设计 报告生成模块是 GitHub Sentinel 的核心功能,通过三层嵌套式提示工程架构实现深度分析: #mermaid-svg-vdHRUan…...
PE文件(十五)绑定导入表
我们在分析Windows自带的一些程序时,常常发现有的程序,如notepad,他的IAT表在文件加载内存前已经完成绑定,存储了函数的地址。这样做可以使得程序是无需修改IAT表而直接启动,这时程序启动速度变快。但这种方式只适用于…...
如何快速部署基于Docker 的 OBDIAG 开发环境
很多开发者对 OceanBase的 SIG社区小组很有兴趣,但如何将OceanBase的各类工具部署在开发环境,对于不少开发者而言都是比较蛮烦的事情。例如,像OBDIAG,其在WINDOWS系统上配置较繁琐,需要单独搭建C开发环境。此外&#x…...
Multimodal-CoT与MCP的融合医疗AI编程路线探析
引言 在医疗AI领域,多模态数据融合与模块化系统设计是提升诊断精度和临床实用性的关键。Multimodal Chain-of-Thought(Multimodal-CoT)通过构建多源数据的推理链增强决策透明度,而Model Context Protocol(MCP)作为标准化接口协议,为AI系统提供灵活的数据源集成能力。两…...
基于单片机的智能养生油炸炉系统设计与实现
标题:基于单片机的智能养生油炸炉系统设计与实现 内容:1.摘要 本文针对传统油炸炉功能单一、无法满足现代养生需求的问题,设计并实现了基于单片机的智能养生油炸炉系统。通过采用STC89C52单片机作为控制核心,结合温度传感器、液位传感器、继电器等硬件&…...
MySQL流程控制
一:介绍 在 MySQL 中,流程控制语句用于控制存储过程和自定义函数中的程序流程。主要的流程控制语句包括:IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句 (1):if条件…...
在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
如果在show ip route的时候出现没有设置最后的通道Gateway of last resort is not set Switch#show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA exte…...
Java雪花算法
以下是用Java实现的雪花算法代码示例,包含详细注释和异常处理: 代码下面有解析 public class SnowflakeIdGenerator {// 起始时间戳(2020-01-01 00:00:00)private static final long START_TIMESTAMP 1577836800000L;// 各部分…...
【中大厂面试题】TCP 校招 java 后端最新面试题
TCL(一面) 1. Spring 初始化Bean前要做什么?有几种方式 在 Spring 容器调用 Bean 的初始化方法(如 init-method、PostConstruct 等)之前,会按顺序完成以下关键步骤:实例化 → 属性注入 → Aw…...
【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图
背景需求: 用Python,对白色255背景的图片进行了透明化、制作点状或线段的描边裁剪线 【教学类-102-10】剪纸图案全套代码09——Python线条虚线优化版04(原图放大白背景)+制作1图2图6图24图-CSDN博客文章浏览阅读1k次,点赞27次,收藏8次。【教学类-102-10】剪纸图案全套代…...
【数据库系统概论】第3章 SQL(四)视图(超详细)
视图(View)是数据库中的虚拟表 通过执行查询定义并存储在数据库中,可以像普通表一样被查询和使用。 视图本身并不存储数据,而是基于一个或多个表的查询结果动态生成。 视图的概念 视图( View )是由其它表或视图上的查询所定义…...
HTTP:六.HTTP代理相关介绍
什么是HTTP代理 代理是指获授权代表他人执行操作的人员,代理服务器在在线世界中提供此操作。 代理服务器 充当用户和互联网之间的网关,并防止访问网络以外的任何人。通过 Web 浏览器定期访问互联网,使用户能够直接与网站连接。但是代理充当中间人,代表用户与网页通信。 当…...
【Python爬虫】详细工作流程以及组成部分
目录 一、Python爬虫的详细工作流程 确定起始网页 发送 HTTP 请求 解析 HTML 处理数据 跟踪链接 递归抓取 存储数据 二、Python爬虫的组成部分 请求模块 解析模块 数据处理模块 存储模块 调度模块 反爬虫处理模块 一、Python爬虫的详细工作流程 在进行网络爬虫工…...
深入解析UML图:版本演变、静态图与动态图详解
目录 前言1 UML的版本演变1.1 UML 1.x阶段:统一的开始1.2 UML 2.x阶段:功能的扩展与深化 2 UML图的分类概述3 UML静态图详解3.1 类图(Class Diagram)3.2 对象图(Object Diagram)3.3 组件图(Comp…...
老旧测试用例生成平台异步任务与用户通知优化
在现代 Web 开发中,异步任务处理和用户通知是两个重要的功能。由于老旧测试平台【测试用例生成平台,源码分享】进行智能化升级后,未采用异步任务处理,大模型推理时间较长,导致任务阻塞,无法处理其他任务&am…...
数据结构初阶:队列
本篇博客主要讲解队列的相关知识。 目录 1.队列 1.1 概念与结构 1.2 队列头文件(Queue.h) 1.2.1 定义队列结点结构 1.2.2 定义队列的结构 1.3 队列源代码(Queue.h) 1.3.1 队列的初始化 1.3.2 队列的销毁 1.3.3 入队---队尾 1…...