打造顶尖RAG系统:企业RAG挑战赛的技术启示
思路真的巨清晰,大家可以拿这个项目当模板来学习,真的很不错【实习/社招都可以拿来做项目】
打造顶尖RAG系统:企业RAG挑战赛的技术启示 检索增强生成(Retrieval-Augmented Generation,RAG)是一种将大型语言模型(LLM)与外部知识库结合的技术,能够提供精准、上下文相关的答案。
在企业RAG挑战赛中,参赛者需要在2.5小时内解析100份公司年度报告(每份PDF最长可达1000页),并构建一个基于这些报告的问答系统。Ilya Rice凭借其高效且实用的系统,在两个奖项类别和最优技术(SotA)排行榜上均夺得第一。本文将深入剖析他的制胜策略,分享构建高性能RAG系统的核心经验。
挑战概览
企业RAG挑战赛的任务是基于100份随机选取的公司年度报告,快速构建一个能够回答100个随机生成问题的系统。这些问题基于预定义模板,要求明确答案,例如:
- 数值型:如"Accuray Incorporated在2022年第二季度风险管理上花费了多少?"
- 名称型:如"Zegona Communications plc的首席执行官是谁?"
- 布尔型:如"2021年第二季度Global Medical REIT Inc.的债务权益比是否高于Zegona Communications plc?" 每个答案必须附带报告中证据所在的页面引用,确保系统准确无误,避免"幻觉"(hallucination)。参赛者在2.5小时内需完成PDF解析、数据库构建,并尽可能快速回答问题。
制胜系统架构
Ilya的系统融合了多项技术创新,以下是其核心组件和实现细节:

- PDF解析:从复杂文档中提取结构化数据 年度报告是复杂的PDF文件,包含表格、图表、多列文本和格式化元素。Ilya选择了IBM开发的Docling解析器,并对其进行了定制优化:
- 挑战:旋转90度的表格、图像与文本混合的图表、字体编码问题(如类似凯撒密码的乱码文本)。
- 解决方案:
- 通过GPU加速(租用NVIDIA 4090 GPU,小时费用仅0.7美元),将100份报告的解析时间缩短至约40分钟。
- 使用正则表达式清理噪声文本,对编码问题严重的文档运行OCR。
- 定制Docling,生成包含完整元数据的JSON,转换为Markdown和HTML格式,保留表格结构。
- 效果:相比其他参赛者,解析速度极快,同时保证了高质量的文本提取。
- 数据摄取:构建高效的知识库
解析后的报告被转换为干净的Markdown文本,并进一步处理以构建知识库:
- 分块(Chunking):
- 每页文本按300个token(约15句话)分割,添加50个token的重叠以确保语义连贯。
- 每个分块记录其所属页面编号,便于后续引用。
- 向量化:
- 为每份报告单独创建FAISS向量数据库,避免公司数据混淆。
- 使用IndexFlatIP索引,通过余弦相似度计算相关性,保证搜索精度。
- 嵌入模型选用text-embedding-3-large ,将文本转化为高维向量platform.openai.com/docs/models...
- 优势:独立数据库设计大幅缩小搜索空间,提升检索效率。
3. 检索:精准获取相关信息
检索是RAG系统的关键环节,决定了LLM是否能获得回答问题所需的上下文。Ilya的检索流程如下:

- 向量搜索:
- 对查询进行向量化,检索最相关的30个分块。
- 通过元数据提取这些分块所属的完整页面(去重后)。
- LLM重排序:
- 使用GPT-4o-mini对页面进行相关性评分(0到1),结合向量搜索得分(权重0.3)和LLM评分(权重0.7),选出最相关的前10页。
- 优化技巧:一次请求评分3页,降低成本(每问题约1美分)并提高评分一致性。
- 父页面检索:
- 尽管分块提高了检索精度,但完整页面可能包含次要但重要的细节。因此,检索到的分块仅作为指向父页面的指针,最终将整页纳入上下文。
4. 增强:灵活的提示工程
增强阶段将检索到的上下文与用户查询整合,Ilya采用了模块化的提示设计:

- 提示存储:
- 在prompts.py中存储提示,分为核心指令、响应格式(Pydantic schema)、示例问答对和上下文模板。
- 模块化设计便于测试不同提示配置(如单样本提示的效果比较)。
- 特点:通过f-string拼接上下文和查询,简化操作,同时支持快速迭代。

- 生成:智能回答与路由

生成阶段是RAG的"最后一步",Ilya通过以下技术确保答案精准且格式规范:
- 查询路由:
- 单公司查询:通过正则表达式从问题中提取公司名称,匹配对应数据库,缩小100倍搜索范围。
- 多公司比较:如"Apple和Microsoft谁的收入更高?"。LLM首先生成子问题(如"Apple的收入是多少?"),分别处理后比较答案。
- 提示工程:
- 结构化输出(Structured Output, SO):使用Pydantic/JSON schema定义响应格式(如推理过程、相关页面、最终答案),确保一致性。
- 思维链(Chain of Thought, CoT):引导LLM逐步推理,减少错误和幻觉。例如,明确要求分析指标与问题的匹配度。
- 单样本提示:每个提示包含一个精心设计的问答示例,强化模型对复杂情况的理解。
- SO重解析:对不支持SO的模型,验证输出是否符合schema,若不符合则重新提示修正,达100%合规。
- 答案类型处理:
- 根据问题类型(数值、名称、布尔)使用不同提示,处理细节如货币单位、负值、单位转换(如"千元"需加三个零)。
6. 探索但未采用的技术
Ilya尝试了表格序列化,将大表格转为简洁的上下文无关字符串(如"股东权益2021年:577,782百万日元")。然而,测试表明Docling的表格解析已足够优秀,序列化反而降低了信噪比,因此未在最终系统中使用。 系统性能
- 速度:初始目标是10分钟内回答100个问题,Ilya的系统仅用2分钟完成,充分利用OpenAI的token配额(GPT-4o-mini每分钟200万token)。
- 准确性:
- 使用100个手动回答的问题作为验证集,迭代优化系统。
- 最终系统在专有模型(GPT-4o-mini、o3-mini)和开源模型(Llama 3.3 70b、Llama 8b)上表现优异,Llama 8b超越80%参赛者。
- 成本:LLM重排序成本极低,每问题约1美分。
核心经验
Ilya的成功并非依赖单一"魔法"技术,而是通过系统性优化和对任务的深入理解实现的。以下是关键启示:
- 高质量解析是基础:定制化的Docling解析器确保了从复杂PDF中提取可靠数据。
- 精准检索至关重要:LLM重排序显著提升上下文相关性,性价比高。
- 智能路由简化问题:单公司和多公司查询的高效分离大幅提高效率。
- 提示工程是艺术:结构化输出、思维链和单样本提示的结合,校准模型偏差,处理复杂细节。
- 细节决定成败:深入分析问题和报告的细微差别,明确"解释自由度"(如"CEO"定义的边界),是构建高质量系统的关键。
结语
企业RAG挑战赛展示了RAG系统的巨大潜力。Ilya Rice的胜利源于对每个环节的细致打磨,从解析到生成,无不体现了对细节的极致追求。他的系统代码已开源(GitHub: IlyaRice/RAG-Challenge-2),包括部署和运行指南,值得一试。
json
{
"target":"简单认识我",
"selfInfo":{
"genInfo":"大厂面试官,中科院自动化所硕士(人工智能),从事数据闭环业务、RAG、Agent等,承担技术+平台的偏综合性角色。善于调研、总结和规划,善于统筹和协同,喜欢技术,喜欢阅读新技术和产品的文章与论文",
"contactInfo":"abc061200x, v-adding disabled",
"slogan":"简单、高效、做正确的事",
"extInfo":"喜欢看电影、喜欢旅游、户外徒步、阅读和学习,不抽烟、不喝酒,无不良嗜好"
}
}