RAG全流程冠军思路! 实习or跳槽or项目实战

打造顶尖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的系统融合了多项技术创新,以下是其核心组件和实现细节:

  1. PDF解析:从复杂文档中提取结构化数据 年度报告是复杂的PDF文件,包含表格、图表、多列文本和格式化元素。Ilya选择了IBM开发的Docling解析器,并对其进行了定制优化:
  • 挑战:旋转90度的表格、图像与文本混合的图表、字体编码问题(如类似凯撒密码的乱码文本)。
  • 解决方案:
    • 通过GPU加速(租用NVIDIA 4090 GPU,小时费用仅0.7美元),将100份报告的解析时间缩短至约40分钟。
    • 使用正则表达式清理噪声文本,对编码问题严重的文档运行OCR。
    • 定制Docling,生成包含完整元数据的JSON,转换为Markdown和HTML格式,保留表格结构。
  • 效果:相比其他参赛者,解析速度极快,同时保证了高质量的文本提取。
  1. 数据摄取:构建高效的知识库

解析后的报告被转换为干净的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. 增强:灵活的提示工程

github.com/IlyaRice/RA...

增强阶段将检索到的上下文与用户查询整合,Ilya采用了模块化的提示设计:

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

生成阶段是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的成功并非依赖单一"魔法"技术,而是通过系统性优化和对任务的深入理解实现的。以下是关键启示:

  1. 高质量解析是基础:定制化的Docling解析器确保了从复杂PDF中提取可靠数据。
  2. 精准检索至关重要:LLM重排序显著提升上下文相关性,性价比高。
  3. 智能路由简化问题:单公司和多公司查询的高效分离大幅提高效率。
  4. 提示工程是艺术:结构化输出、思维链和单样本提示的结合,校准模型偏差,处理复杂细节。
  5. 细节决定成败:深入分析问题和报告的细微差别,明确"解释自由度"(如"CEO"定义的边界),是构建高质量系统的关键。

结语

企业RAG挑战赛展示了RAG系统的巨大潜力。Ilya Rice的胜利源于对每个环节的细致打磨,从解析到生成,无不体现了对细节的极致追求。他的系统代码已开源(GitHub: IlyaRice/RAG-Challenge-2),包括部署和运行指南,值得一试。

abdullin.com/ilya/how-to...

json 复制代码
{
   "target":"简单认识我",
   "selfInfo":{
        "genInfo":"大厂面试官,中科院自动化所硕士(人工智能),从事数据闭环业务、RAG、Agent等,承担技术+平台的偏综合性角色。善于调研、总结和规划,善于统筹和协同,喜欢技术,喜欢阅读新技术和产品的文章与论文",
        "contactInfo":"abc061200x, v-adding disabled",
        "slogan":"简单、高效、做正确的事",
         "extInfo":"喜欢看电影、喜欢旅游、户外徒步、阅读和学习,不抽烟、不喝酒,无不良嗜好"
   } 
}
相关推荐
Danta41 分钟前
百度网盘一面值得look:我有点难受🤧🤧
前端·javascript·面试
极客先躯3 小时前
高级java每日一道面试题-2025年4月21日-基础篇[反射篇]-如何使用反射获取一个类的所有方法?
java·面试·反射·基础篇
知心宝贝3 小时前
🔍 从简单到复杂:JavaScript 事件处理的全方位解读
前端·javascript·面试
DarrenPig3 小时前
【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
matlab·开源·github·simulink·交流
DKPT4 小时前
正则表达式与python使用
笔记·python·学习·面试·正则表达式
quququ_21384 小时前
Java面试:探索Spring Boot与微服务的深度挑战
java·spring boot·微服务·面试·技术栈
Aqua Cheng.4 小时前
25.4.22华为--算法真题整理(2025年4月22日)
java·算法·leetcode·华为·面试
码流怪侠5 小时前
arnis 在 GitHub 上短短三月暴增 7k star 🔥
github
懒懒小徐5 小时前
大厂面试:MySQL篇
面试·职场和发展