RAG 的魔力在于细节
The magic of RAG lies in the details
Ilya Rice

-
整体感知1:公司年报PDF相对来说格式比较稳定,既不像Word排版简单,又不像PPT形式多样,还算比较适中的难度,但图表解析、长文理解也是一大难题,免不了在开头的解析环节费一番功夫。 -
整体感知2:总量100篇文档在索引环节对工程的压力会小很多。真实世界中的文档格式更加多样,文档数量巨大,技术选型和比赛中的方法一定会有较大差异,需要因地制宜,量体裁衣。
-
整体感知3:比赛显然简化了评估的难度,但就算是如此简单的规则,作者也提到存在大量的歧义、无法明确定义、模棱两可的问题,为此,作者向比赛组织者提出了几十个问题来明确比赛的评估准则。在现实生活中,问题类型远远不止四类,每个人心中对答案的好与坏也不尽相同,那么大模型该怎么做呢?或者除了大模型,还需要什么样的机制来处理?
-
解析:作者首先夸奖了IBM的docling工具(比赛由IBM赞助),但肯定不完善,自己重写了一些方法,并用GPU加速 -
清洗:写了十几个正则表达式来处理PDF解析错乱的问题,但仍有问题,最终直接用了OCR来做 -
表格:公司年报中含有大量表格,由于行列表头和单元格值距离太远导致语义连贯性被打破,进而回答出错,作者花了大量篇幅讲解“表格序列化”是一个很好的思路,但最终没有用 -
分块:使用了一种比较常见的Recursive Splitter(递归切分器),参数为300 token + 50 overlap。没有使用高大上的语义切分,“切片的精度对我的检索系统几乎没有影响”……

subject_core_entity: Shareholders' equity
information_block: Shareholders' equity for the years from 2012/3 to 2022/3 are as follows: ¥637,422 million (2012/3), ¥535,422 million (2013/3), ¥679,160 million (2014/3), ¥782,556 million (2015/3), ¥540,951 million (2016/3), ¥571,983 million (2017/3), ¥511,242 million (2018/3), ¥525,064 million (2019/3), ¥513,335 million (2020/3), ¥577,782 million (2021/3), and ¥1,274,570 million (2022/3).
-
向量索引使用的是Faiss -
向量模型使用的是text-embedding-3-large -
召回算法使用的是Flat,也就几乎暴力的相似度计算,未使用ANN加速 -
混合搜索(向量+BM25)很好,但没用 -
没用传统的rerank模型(实在要用,作者推荐jina ai的reranker),而是自己用GPT-4o-mini写了一个LLM reranking算法 -
检索到的chunk要关联其所对应的页面(Parent Page Retrieval),因为页面包含的信息更多,上下文语义更丰富
-
模块化拼接提示词:提高灵活度、清晰度 -
缩小搜索空间:由于所有的问题都含有“公司名”,所以在一开始对问题中的公司名进行识别,然后查询时,只查询和该公司名相关联的数据表,可以缩小100倍搜索空间,更重要的是准确率有很大提升 -
子问题拆解:有些问题涉及多家公司指标的问答,简单的直接检索效果不好,需要将原始问题拆分为多个子问题,逐一检索然后回答 -
CoT思维链:简单的 Think step by step 是不够的,必须清晰地指导模型如何进行推理。解释推理步骤、目标并提供示例,明确提示模型从不同的角度分析内容 -
结构化输出 & 自我修复:使用json模式定义各个字段:推理过程、摘要、引用、最终答案,有些模型没有强制json能力,那么需要“回退机制/自我修复机制”,来让模型修复自己出错的json结构体 -
One-shot:为每个提示词添加了一个【精心设计】的问答示例对 -
模糊问题的指令优化:同前所述,站在模型角度思考问题,对于模糊的问题,需要澄清其隐含含义
-
速度:GPT-4o-mini每分钟200万token,以25个问题为一批进行处理,系统仅用2分钟就完成了全部100个问题(在不同的场景下,有时候我们在平衡速度和质量,有时候我们为了保证一方而牺牲另一方,这是永恒的话题。) -
质量:Llama 3.3 70b仅落后o3-mini几分,即使是小型Llama 8b在整体排名中也超过了80%的参与者(开源小模型为什么能逼近商业大模型,可能和赛题复杂度、精心优化的工程环节有关,辩证看待)
-
比赛说明:https://abdullin.com/erc/ -
比赛对应的GitHub:https://github.com/trustbit/enterprise-rag-challenge -
冠军llya Rice的方案原文:https://abdullin.com/ilya/how-to-build-best-rag/ -
冠军llya Rice的开源实现GitHub:https://github.com/IlyaRice/RAG-Challenge-2/