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":"喜欢看电影、喜欢旅游、户外徒步、阅读和学习,不抽烟、不喝酒,无不良嗜好"
   } 
}
相关推荐
T___T1 天前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人1 天前
普通公司对账系统的现实困境与解决方案
java·后端·面试
勤劳打代码1 天前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
努力学算法的蒟蒻1 天前
day10(11.7)——leetcode面试经典150
面试
进击的野人1 天前
JavaScript 中的数组映射方法与面向对象特性深度解析
javascript·面试
南山安1 天前
以腾讯面试题深度剖析JavaScript:从数组map方法到面向对象本质
javascript·面试
橘颂TA1 天前
【剑斩OFFER】算法的暴力美学——二分查找
算法·leetcode·面试·职场和发展·c/c++
lkbhua莱克瓦241 天前
Java基础——常用算法4
java·数据结构·笔记·算法·github·排序算法·快速排序
John Song1 天前
git多个账号管理
git·github
java1234_小锋2 天前
Spring事件监听的核心机制是什么?
java·spring·面试